文章

给 Agent 上把锁:为什么 OpenClaw 的长期记忆必须靠 RAG 和重排引擎续命?

AI 摘要

做过 AI Agent 开发的都知道,给大模型装上“长期记忆”听起来很酷,但真跑起来往往是一场灾难。

以我手头的 OpenClaw 项目为例,它的核心特色就是记忆沉淀。但随着系统运转,记忆库里很快就会塞满几百上千个 Markdown 文件。如果每次对话都把这些历史记录一股脑地喂给模型,不仅 Token 账单会瞬间爆炸,模型还会陷入严重的“幻觉”中——它开始把上个月的设定和今天的任务张冠李戴。

一开始,我想走捷径。技术群里最常见的建议是:“把模型的 Temperature(温度值)降到 0 不就行了?强行关掉它的发散思维。”

踩过坑才发现,这招根本没用。

降低温度值,确实能拦住大模型随机生成的离谱胡话,但它解决不了 LLM 产生幻觉的三个底层“基因缺陷”:

第一,概率预测的“鹦鹉学舌”本质。 大模型的底层逻辑依然是高级的文字接龙。当你问它一个问题,它会拆解词汇,然后根据训练语料去寻找概率最高的接续词。哪怕温度值是 0,只要它在预训练时吃过被污染的语料,它依然会理直气壮地输出固化的错误信息。看看现在的开放式模型,强如 GPT-4.5 都能被恶意语料投毒、在回复里夹带广告。数学概率上的“最高”,并不等同于客观世界的“事实”。

第二,庞大上下文带来的“有损压缩”。 退一万步说,就算我狠下心花钱,把 OpenClaw 所有的 md 文件都塞进上下文,模型内部也会因为注意力机制的衰减,自动进行有损压缩。原本清晰的逻辑链条(比如 A 事件导致了 B),会被压缩成一团模糊的“特征关联”。细节一糊,大模型脑补的毛病就犯了。

第三,“讨好型人格”带来的副作用。 现在的模型都经过了 RLHF(人类反馈强化学习)的调教,系统会疯狂奖励那些“听起来连贯、有帮助且礼貌”的回答。这导致了一个致命问题:当模型在记忆里找不到答案时,它的第一反应不是老老实实地说“我不知道”,而是为了讨好你,顺着你的话往下编一个天衣无缝的谎言。

认清了大模型的“讨好本质”,我就明白:绝对不能让它去“回忆”,必须让它去“做阅读理解”。

这就意味着,OpenClaw 必须在模型和记忆库之间,强行焊上一道物理防盗门——RAG(检索增强生成)架构。这套机制在 OpenClaw 里跑起来分三步:

但这套逻辑想要跑通,还有一个最硬核的工程阻碍:在几万字的 md 碎片里,系统怎么知道哪段记忆是“最相关”的?

这就逼着 OpenClaw 必须引入目前检索领域的标配组合拳:Embedding + Reranker

想象一下你在图书馆找书

第一道工序:用 Embedding 搞“粗排海选”。 Embedding(嵌入模型)的作用是把 OpenClaw 的所有文字变成一堆高维数字向量。它极其轻量、速度极快,几毫秒就能从海量文件里捞出距离最近的 100 份记忆碎片。 但它有个致命弱点:它不懂逻辑。它只看语义相似度,比如你问“苹果电脑的性能”,它可能会把包含“红富士苹果很好吃”的文档也捞出来。如果直接把这种垃圾数据喂给大模型,它的注意力瞬间又会被带偏。

第二道工序:用 Reranker 做“逻辑精排”。 为了解决 Embedding 的粗心,必须让 Reranker(重排模型)上场。这玩意儿算力消耗巨大,没法提前预处理。它必须把你问的“问题”和刚刚捞出来的“100份候选记忆”强行拼在一起,丢进深层神经网络里做极其严苛的交叉验证(Cross-Encoder)。 Reranker 就像一个冷酷的逻辑安检员,它能一眼看出“红富士”和“MacBook”在这个语境下毫无关系,直接把干扰项踢掉,最后只挑出最精准的 3 段记忆递给大模型。

为什么不能省掉 Embedding 直接用 Reranker? 因为算力会当场破产。如果让 Reranker 去逐字比对 OpenClaw 所有的历史文件,你问它一句话,它可能得算上几十分钟。

所以,OpenClaw 的记忆底层逻辑最终演变成了今天的样子:用极低代价的 Embedding 圈定范围,用高昂代价的 Reranker 精确制导,最后用 RAG 的铁律锁死 LLM 的脑补空间。

这不是什么过度工程(Over-engineering),而是在当前大模型的固有缺陷下,让一个 Agent 拥有“可靠记忆”的唯一生路。