我用教科书式的方法构建了智能体记忆(智能体按需检索)。但在观察其运行后,我彻底推翻了整个设计。架构 + 让我放弃写回机制的失败模式。
摘要
作者描述了将教科书式的智能体记忆设计从按需检索反转为优先注入,以避免延迟和空上下文的自信错误,并详细介绍了架构以及写回机制中危险的自我毒化失败模式。
我的第一个版本的智能体记忆是教科书式的方法:给智能体检索工具,让它自己决定何时获取信息。听起来很合理。但在实践中,它有两个失败模式。要么它在每个琐碎的回合中都花费一次工具调用来获取记忆(无谓的延迟),要么它跳过检索,从空上下文中自信地回答(更糟糕)。让模型自己决定何时需要记忆,是假设它知道自己的无知。但它不知道。所以我把设计反转为优先注入。架构:
* **存储:** 每一轮对话都是一个图节点,标记为 `{role, conversation_id, kind}`。每个对话有一个元摘要记录和一个用户偏好记录,两者都是结构化数据,这样记忆就是可寻址的状态,我可以检查,而不是一个不透明的向量块。
* **提示组装:** 在推理之前,该层构建一个块,包含提炼后的用户摘要、固定偏好以及最近 N 轮原始消息,并用带标签的部分(`<start_of_user_context>...`、`<start_of_previous_messages>...`)表示。智能体在常见路径上零往返地开始,有明确的方向。
* **有界增长:** 一个后台作业保持滚动摘要。当它低于预算(我的配置中约 20k 字符)时,它会累积;超过后,一个更新器智能体将较旧的轮次压缩成观察段落,这样提示就不会无限膨胀。这是对长上下文退化的实际修复:提炼,而不是倾倒。
* **按需深度:** 它仍然拥有进行多跳遍历的工具,可以遍历用户数据的知识图谱,但仅限于注入的摘要不够用时使用。所以它是“固定要点,获取长尾”,只不过固定的部分是对用户生成的摘要,而长尾是一个可以行走的真实图。净效果:工具调用大大减少,并且因为基本信息始终存在,它不再凭空回答。
**那个让我害怕的失败模式(陷阱):** 我让更新器根据对话本身将新边写回图中。不到一天,它就发明了关系(两个人的名字仅仅因为与某个关键词同时出现而被关联),并且声称了一个我明确反对的“决定”,因为那些词出现在我拒绝它们的线程中。然后它把自己生成的坏边作为事实读取,导致错误每轮都在累积。自我毒化的记忆比没有记忆更糟糕。我禁用了写回功能,现在智能体读取的是我维护的图,而且不能根据闲聊重写它。将非结构化的对话转化为可靠图结构是真正未解决的问题,而这正是 RL 遍历工作(Graph-R1)所追求的。
我实际上想请教两个问题:如何判断提取的边是否足够可信以持久化(置信阈值、人工审核队列、或者什么都不做)?以及你们在自己的智能体中如何拆分注入与检索?
相似文章
智能体记忆:剖析
探讨智能体记忆库的组件与设计决策,澄清认知科学术语与工程实现之间的差距。
开始思考“代理记忆”是错误的首要框架
作者认为“代理记忆”是错误的首要框架,因为它混淆了工作状态和持久记忆,导致调试问题。作者主张将混乱的工作状态(应过期)与具有来源和权威的严格持久记忆分开。
智能体记忆不仅仅是基于用户事实的RAG
文章认为,简单的基于RAG的智能体记忆系统在生产中会失败,原因包括过时的偏好、遗漏的关键词和提示注入等问题,并主张采用分层记忆架构,具备主动选择、确定性回退、治理和测试等功能。
如何管理代理记忆而不让其变成杂物抽屉?
关于管理AI系统中代理记忆的实际挑战的讨论,侧重于避免信息过载导致输出质量下降,并提出使用工作流状态和多代理架构等策略。
我曾以为智能体记忆只是存储问题。现在我不这么认为了。
一位开发者重新思考智能体记忆,认为它不仅仅是存储,而是提出了一个带有角色和激活场的活图,用以赋予过去信息适当的权威和上下文。