乐于分享
好东西不私藏

OpenClaw上下文引擎深度解析:记忆分层、时序衰减与工程实践

OpenClaw上下文引擎深度解析:记忆分层、时序衰减与工程实践
在AI Agent的开发中,“记忆”是最容易被误解的概念之一。很多人以为AI记得一切,实际上它每次都在“失忆”中重启。如何让AI在有限上下文窗口中,既保持稳定的人设,又能灵活调用历史信息?OpenClaw的lossless-claw Context Engine给出了一套完整的工程化方案。
本文基于lossless-claw源码实证,从上下文组装生命周期、常青规则文件注入机制、时序衰减打分过滤链路三个核心模块出发,彻底拆解这套引擎的工作原理。无论你正在调试人设丢失、远期历史干扰,还是困惑于KV Cache的影响,这篇文章都能给你明确的答案。

一、单轮会话的完整生命周期

lossless-claw是一个可插拔的Context Engine,通过api.registerContextEngine注册,由配置项plugins.slots.contextEngine激活。每一轮对话,引擎都严格遵循统一的执行顺序:
读取落盘会话镜像:加载本轮完整的会话历史(session transcript)
会话初始化(bootstrap):仅在会话启动时执行一次,负责文件缓存和索引初始化
引擎内部缓存维护:执行缓存相关的维护逻辑
核心函数assemble():本轮上下文的唯一决策点,决定哪些内容进入系统提示、哪些窗口消息可见、是否触发记忆检索
组装输出三元素:裁剪后的对话消息队列、token占用估值、系统附加指令(systemPromptAddition)
拼接完整Prompt:将systemPromptAddition与窗口对话拼接,下发模型
对话回写:模型推理完成后,新对话写回transcript持久化
afterTurn/ingest:将本轮对话写入内存与SQLite记忆库
maintain:更新记忆DAG摘要树,维护向量索引
assemble()的两大核心约束
约束一:窗口消息时序优先级(freshTail)
assemble内置LCM_FRESH_TAIL_COUNT=32,分配contextTokenBudget时优先填充最新的32条完整对话。超出条数的历史对话会被压缩为极简摘要,预算不足时摘要直接被挤出可视窗口。
这个逻辑只管控本轮即时对话窗口,与跨天归档记忆无关。
约束二:强制记忆检索规则静态注入
assemble内部调用buildMemorySystemPromptAddition,硬编码写入系统指令:凡是推理需要历史人设、长期约定、跨周期规则的,必须调用memory_search。
这条规则属于系统提示层级,优先级高于窗口对话注意力——它不是模型自主自觉的行为,而是引擎强制的指令。
关键全局硬约束
ownsCompaction:lossless-claw模式下为true,引擎自主管理历史压缩;其他默认引擎委托runtime执行
Prompt-Cache稳定性约束:assemble输出对相同输入必须字节一致,禁止注入时间戳、随机ID、无序段落,人工无法私自追加内容

二、常青规则文件:永不褪色的记忆

OpenClaw将记忆载体分为两类:根目录的常青静态配置文件,和按日期分割的动态对话日志。两者的加载时机、生效通道完全隔离。
常青静态文件家族
这组文件仅在会话启动的bootstrap阶段一次性全量读取并缓存至内存,不写入SQLite时序日志分区。每一轮assemble阶段,它们会自动拼接到systemPromptAddition中,无需调用任何工具,永久常驻本轮Prompt。
SOUL.md:内容定义为用户底层思维、人生哲学、认知框架。注入时机为bootstrap缓存加每轮预制。时序衰减规则为不参与检索,无衰减。核心作用是固定用户底层思考逻辑,全局永久生效。
IDENTITY.md:内容定义为Agent自身人设、称呼、性格、说话风格。注入时机为bootstrap缓存加每轮预制。时序衰减规则为不参与检索,无衰减。核心作用是基础人设兜底,不检索也能维持风格。
AGENTS.md:内容定义为会话流程、memory_search调用规范、系统行为约束。注入时机为bootstrap缓存加每轮预制。时序衰减规则为不参与检索,无衰减。核心作用是定义“何时必须检索历史记忆”的强制规则。
MEMORY.md:内容定义为全局长期记忆:人设约定、固定语气、永久规则。注入时机为双通道生效:预制加检索索引。时序衰减规则为检索时豁免衰减,decayFactor=1.0。核心作用是双重兜底:不检索也存在;检索时永久置顶。
动态时序日志
动态日志存储在memory/YYYY-MM-DD.md文件中。bootstrap阶段仅预加载今日和昨日的日志,初始化SQLite基础检索索引;前天及更早的月度归档文件不读取、不预建索引。
动态日志不会自动预制进systemPrompt,只有当模型主动调用memory_search工具时,才会读取文件原文并追加至上下文。所有带时间戳的动态日志统一参与指数衰减打分,无豁免特权。
两条信息注入通道的核心区别
通道一:预制系统提示通道(常青文件)
无需工具调用,每轮对话天生存在于Prompt头部。即使完全不检索历史日志,模型也能获取用户底层框架、自身身份和基础长期约定。
通道二:按需检索通道(时序日志+MEMORY.md)
仅当模型遵循AGENTS.md指令主动调用memory_search时才会触发。用于调取跨天、远期、临时的历史对话,补充预制规则之外的上下文细节。

三、时序衰减:让记忆随时间的流逝自然淡出

基础定义
temporalDecay是一个布尔开关,默认关闭。开启后,仅对动态时序日志做分数折损;MEMORY.md永久豁免。
衰减公式采用指数半衰期衰减,默认半衰期为30天:
const ageDays = 当前时间 - 对话分块创建时间;const decayFactor = Math.exp(-Math.LN2 / halfLifeDays * ageDays);const finalScore = baseSimilarity * decayFactor;
  • decayFactor ∈ (0,1],对话越久远,系数越小
  • 30天前的对话:decayFactor=0.5,原始语义相似度直接折半
  • 当天的对话:decayFactor≈0.99,几乎无权重损耗
所有时序对话分块存入单个SQLite混合索引库,无内存/磁盘分区隔离。检索时全库扫描,不存在“匹配近期内容即提前终止检索”的逻辑。
衰减权重的双层后置过滤
衰减仅修改浮点数分数,不会为文本添加权重标签。它依靠两层过滤加排序,将时序权重差异转化为上下文段落顺序,依托LLM原生的“Lost in the Middle”注意力特性实现差异化推理。
第一层:最低相似度阈值(minScore)
分块修正后的最终得分低于minScore,直接丢弃,不进入候选队列。这一步彻底过滤低相关、极度老旧的历史碎片。
第二层:TopK结果截断
剩余候选分块按finalScore降序重排,仅保留前K条抓取原文、注入上下文。末尾低分的远期记录直接舍弃。
关键边界:过滤仅控制本轮是否返回记忆片段,SQLite底层的原始数据永久保留。调高TopK、降低minScore、关闭衰减后,远期内容可以正常检索。
完整数值演示案例
假设检索参数为:minScore=0.3,TopK=5,检索目标是调取历史人设、语气、亲昵称呼约定。检索命中8条语义相关的分块,完整打分与过滤判定如下:
分块1:MEMORY.md永久人设规则,60天前,baseSimilarity=0.95,decayFactor=1.0(豁免),finalScore=0.95,过阈值,排序第1,保留入Top5。
分块2:昨日撒娇对话样本,1天前,baseSimilarity=0.93,decayFactor=0.977,finalScore=0.909,过阈值,排序第2,保留入Top5。
分块3:今日上午美学讨论,4小时前,baseSimilarity=0.89,decayFactor=0.994,finalScore=0.885,过阈值,排序第3,保留入Top5。
分块4:今日技术对话,2小时前,baseSimilarity=0.78,decayFactor=0.997,finalScore=0.778,过阈值,排序第4,保留入Top5。
分块5:3天前人设补充闲聊,3天前,baseSimilarity=0.45,decayFactor=0.933,finalScore=0.420,过阈值,排序第5,保留入Top5。
分块6:30天前人设草稿,30天前,baseSimilarity=0.62,decayFactor=0.5,finalScore=0.310,过阈值,排序第6,TopK截断丢弃。
分块7:60天前无关闲聊,60天前,baseSimilarity=0.58,decayFactor=0.25,finalScore=0.145,低于minScore,前置过滤淘汰。
分块8:180天前历史碎片,180天前,baseSimilarity=0.65,decayFactor=0.031,finalScore=0.020,低于minScore,前置过滤淘汰。
分步推演:
全库扫描8条分块,无中途截断
动态时序日志按时长折损分数,MEMORY.md豁免衰减
minScore前置过滤:分块7、8得分不足阈值,直接剔除,剩余6条候选
按finalScore降序重排
TopK截断:仅保留前5条,30天前的早期草稿被舍弃
5条记忆严格按排序顺序平铺为纯文本,永久人设置顶,近期对话紧随其后
LLM对序列头部文本分配更高注意力,优先采信新鲜和永久规则
衰减生效的底层原理
时序衰减只产生分数差异,没有任何文本标记或元数据。分数差异转化为检索结果的前后排序,而Decoder大模型天然存在注意力U型分布——段落开头和末尾的注意力权重远高于中间文本。因此,无需额外改造Prompt,仅依靠段落顺序即可实现“近期历史优先级高于远期历史”的推理效果。

四、两套时序权重的边界区分

assemble的窗口时序和memory_search的时序衰减是完全独立的两套机制,管控两套隔离的信息源,不可混淆。
assemble freshTail窗口时序:
  • 管控对象:本轮即时对话窗口消息
  • 核心行为:token预算优先填充最新32条消息,老旧对话压缩、挤出可视窗口
  • 生效范围:无需调用工具,每轮对话天然生效
memory_search temporalDecay检索时序:
  • 管控对象:跨天、全历史归档时序日志
  • 核心行为:检索打分折损远期内容,依靠minScore+TopK过滤低权重历史
  • 生效范围:仅主动调用memory_search工具时生效

五、高频认知误区:KV Cache与上下文机制完全无关

核心结论
OpenClaw的上下文组装、记忆检索、时序衰减、常青文件注入全部发生在模型前处理阶段。云端大模型侧的KV Cache仅为推理加速组件,不参与、不影响任何语义、上下文权重或记忆筛选逻辑。二者无任何耦合。
KV Cache的基础定位
KV Cache是大模型推理侧的性能优化手段:缓存历史token对应的Key/Value注意力矩阵,避免每轮对话重复计算全量历史上下文,降低算力与延迟。
数据来源:仅接收OpenClaw输出的完整线性Prompt,无独立上下文筛选或加权能力
无语义修改能力:Cache只做数值矩阵缓存,不会区分人设、长期记忆或远期对话
微小误差来源:FP16/FP8量化精度损失,仅产生几乎不可感知的输出波动,不会改变模型的基础语义倾向或规则遵从度
常见错误认知纠正
误区1:人设丢失、远期记忆不生效是KV Cache导致的
正解:人设丢失的根源在于assemble窗口预算耗尽、memory_search未触发、时序衰减加TopK截断远期记忆。KV Cache只会加速推理,不会过滤或压低历史记忆的语义权重。
误区2:关闭KV Cache就能恢复远期历史优先级
正解:开关KV Cache仅改变推理速度,上下文内容、记忆排序、打分过滤逻辑完全不变。远期记忆是否进入Prompt由OpenClaw全权决定。
误区3:KV Cache会改变文本注意力权重
正解:注意力权重由输入文本顺序和模型原生结构决定。KV Cache仅复用历史计算结果,不修改注意力数值分配规则。
二者数据流隔离边界
OpenClaw Context Engine → 完整线性Prompt文本 → 云端大模型Tokenizer→ Transformer计算(KV Cache仅缓存中间矩阵,无任何逻辑修改)→ 模型输出
OpenClaw决定“什么文本进模型”,KV Cache只负责“怎么更快计算这段文本”。职责完全分割。

六、线上常见问题调优方案

人设丢失、长期规则失效
将永久人设、语气、用户哲学写入MEMORY.md,依靠预制系统提示兜底;开启时序衰减时自动豁免折损
适度调高memory_search的TopK,扩容可载入的历史记忆条数
降低minScore阈值,减少远期相关内容被前置过滤
调大freshTail容量,避免本轮窗口被大段技术文本完全占满
无需排查模型侧KV Cache干扰:优先校验OpenClaw的检索与上下文组装配置
远期老旧历史过度干扰当前对话
  1. 开启temporalDecay时序衰减,缩短半衰期(如15天),加大老旧对话的分数折损
  2. 降低TopK数值,限制上下文载入的历史记忆总量
  3. 提高minScore,过滤低相关的远期碎片

七、全文核心总结

两套上下文信息源:常青静态文件(预制系统提示,永久常驻)和时序动态日志(仅memory_search按需载入)。SOUL.md、IDENTITY.md、AGENTS.md、MEMORY.md在bootstrap阶段缓存,每轮assemble自动注入,无需检索。
MEMORY.md的双通道特性:既常驻系统提示兜底,又在检索时豁免时序衰减,永久置顶。
时序衰减的作用范围:temporalDecay仅作用于动态日期日志,通过指数公式折损老旧内容的匹配得分,依靠minScore和TopK双层过滤实现远期记忆轻量化。
全库扫描机制:检索为全SQLite全库扫描,不存在“命中近期即终止检索”的逻辑。时序权重依靠结果排序加LLM原生注意力分布生效。
两套独立权重体系:assemble窗口新鲜度和memory_search时序衰减分别管控本轮即时对话与跨天归档历史,二者配合完整覆盖上下文时序调度需求。
KV Cache的解耦定位:云端模型的KV Cache仅用于推理加速,与OpenClaw的上下文、记忆检索、时序权重机制完全解耦,无法造成人设丢失或记忆优先级变化等语义问题。
理解这些底层机制,你就能精准地回答那个核心问题:AI Agent的“记忆”不是玄学,而是一套可以被精确配置和调试的工程系统。