引言
大语言模型本身没有真正意义上的个人经历。一次 API 调用结束后,模型不会自动记住用户偏好、项目背景、上一次排查到哪里,也不会知道某个决策为什么被做出。
但 Agent 不一样。Agent 要解决的是连续任务,而不是孤立问答:
|
|
如果每次都从零开始,Agent 会变得很笨:重复搜索、重复询问、忘记约束、覆盖之前的判断,甚至把已经被否定的方案重新拿出来。
所以,记忆系统不是锦上添花,而是 Agent 从“会聊天”走向“能持续工作”的关键能力。
一句话概括:
Agent 记忆机制的核心,不是把所有历史都存起来,而是在正确的时刻,把对当前任务有用的信息放回上下文。
这篇文章从工程视角拆解 Agent 记忆系统:记忆分几类、如何写入、如何检索、如何注入上下文、如何遗忘、如何评估,以及生产环境中最容易踩的坑。
记忆到底解决什么问题
很多人第一次设计 Agent 记忆时,会把它理解成“聊天记录持久化”。这只是最浅的一层。
真正有价值的记忆,解决的是四类问题。
保持连续性
Agent 需要知道之前发生过什么。
例如用户说:
|
|
如果没有记忆,模型不知道“刚才”指什么。它只能猜,猜错之后用户体验会非常差。
连续性包括:
- 上一轮讨论的目标是什么
- 已经尝试过哪些方案
- 哪些方案被用户否定过
- 当前任务执行到了哪一步
- 有哪些未完成事项
这类记忆通常生命周期较短,但对多轮任务非常重要。
积累偏好
用户不会希望每次都重复说明自己的习惯。
例如:
|
|
这些信息不一定属于某一次任务,却会长期影响 Agent 的行为。它们是用户级记忆。
沉淀项目知识
Agent 在一个代码库里工作一段时间后,应该逐渐知道:
- 项目使用什么框架
- 目录结构如何组织
- 测试命令是什么
- 哪些文件不能随便改
- 部署流程是什么
- 团队约定是什么
这类记忆不是用户偏好,而是项目上下文。它让 Agent 不必每次都重新探索整个仓库。
避免重复犯错
有些记忆来自失败经验。
例如:
|
|
这种记忆的价值很高,因为它能减少重复试错。
好的 Agent 不是永远不犯错,而是犯过的错不要反复犯。
记忆与上下文的关系
在讨论记忆之前,要先分清两个概念:Memory 和 Context。
|
|
模型只能看到 Context,看不到外部 Memory。记忆必须经过检索、筛选、压缩、排序,然后被注入到上下文窗口里,才会影响模型输出。
因此,Agent 记忆系统本质上是一条信息供应链:
|
|
这也解释了为什么“存得多”不等于“记得好”。
如果检索不到,等于没存。
如果检索到了但不相关,会污染上下文。
如果相关但表达太长,会挤占当前任务的 token。
如果记忆过期但没有清理,会把 Agent 带向错误决策。
记忆系统的难点不在存储,而在选择。
三类核心记忆
工程上可以把 Agent 记忆分成三类:工作记忆、会话记忆、长期记忆。
|
|
工作记忆
工作记忆就是本次 LLM 调用的上下文窗口。
它通常包含:
- 系统指令
- 开发者指令
- 用户当前请求
- 最近对话
- 工具定义
- 工具调用结果
- 检索出来的外部资料
- 被选中的历史记忆
工作记忆的特点是直接、昂贵、容量有限。
直接,是因为模型只能根据它生成回答。
昂贵,是因为每个 token 都会增加成本和延迟。
容量有限,是因为上下文窗口再大,也不能无节制塞入所有历史。
所以工作记忆的关键不是“保存”,而是“编排”。哪些信息放前面、哪些信息保留原文、哪些信息压缩成摘要、哪些信息应该丢弃,都会影响 Agent 的质量。
会话记忆
会话记忆记录当前对话或当前任务中的过程状态。
例如一个编程 Agent 正在修复测试失败,它需要记住:
- 用户的目标
- 已经读过哪些文件
- 已经运行过哪些命令
- 命令输出中有哪些关键错误
- 当前假设是什么
- 下一步计划是什么
- 哪些方向已经排除
会话记忆通常不需要永久保存,但在一次复杂任务中非常重要。
如果没有会话记忆,Agent 很容易出现三种问题:
- 重复读同一个文件,却忘记刚才已经看过
- 运行同一个命令,却忘记错误原因
- 推翻自己的计划,却不知道为什么推翻
会话记忆可以用滑动窗口、任务状态对象、执行轨迹 trace、阶段性摘要来维护。
长期记忆
长期记忆是跨会话保留的信息。
它可以分为几种类型:
| 类型 | 示例 | 生命周期 |
|---|---|---|
| 用户偏好 | 语言、语气、输出格式、常用技术栈 | 长期 |
| 项目知识 | 架构、目录、测试命令、部署方式 | 项目周期 |
| 决策记录 | 为什么选择 A 而不是 B | 中长期 |
| 经验教训 | 曾经踩过的坑、失败原因、规避方式 | 长期 |
| 领域知识 | 业务术语、产品规则、内部流程 | 随业务变化 |
长期记忆的价值在于复用。它让 Agent 在多次任务之间形成“熟悉感”。
但长期记忆也最危险,因为它可能过期、冲突、泄漏隐私,或者在错误场景中被错误使用。
记忆写入:什么值得被记住
不是所有信息都应该写入记忆。
一条信息是否值得保存,可以用五个问题判断:
|
|
如果答案不清楚,就不要急着写入长期记忆。
值得写入的内容
高价值记忆通常有这些特征:
- 用户明确表达的长期偏好
- 项目中稳定存在的约定
- 反复出现的业务规则
- 已经验证过的经验
- 重要决策及其原因
- 用户纠正过 Agent 的行为
例如:
|
|
这些记忆会在未来改变 Agent 的行为,因此值得保存。
不适合写入的内容
低价值或高风险内容不应该写入长期记忆:
- 一次性的临时输入
- 过于细碎的聊天寒暄
- 未经确认的猜测
- 敏感凭证和密钥
- 用户短期情绪
- 可能快速过期的信息
- 没有适用范围的宽泛总结
例如:
|
|
这些信息要么生命周期太短,要么可信度不足,要么不应该长期保存。
写入触发方式
常见写入策略有三种。
第一种是显式写入。用户明确说“记住这件事”。这种方式可控性最好,适合保存用户偏好和重要约定。
第二种是自动提取。Agent 在任务结束时总结本轮对话,提取可能有用的事实。它效率高,但需要严格过滤,否则很容易写入噪声。
第三种是人工审核后写入。系统先生成候选记忆,由用户或管理员确认。这种方式适合企业场景,尤其涉及隐私、权限和合规时。
实际系统里通常混合使用:
|
|
记忆存储:放在哪里
记忆可以存放在不同介质中,选择取决于规模、检索方式和可治理性。
Prompt 内存储
最简单的方式是把少量记忆直接放进系统提示词。
|
|
优点是实现简单、稳定可见。
缺点是容量很小,而且每次调用都会消耗 token。适合保存非常少、非常稳定、非常重要的规则。
文件存储
文件存储适合项目型 Agent。
例如:
|
|
它的优点是可读、可审查、容易版本管理。缺点是检索能力弱,需要额外的索引或规则。
对于编程 Agent 来说,文件记忆非常实用,因为它能和代码仓库一起演进。
关系型数据库
如果记忆需要权限控制、审计、生命周期管理,关系型数据库更合适。
可以把记忆结构化为:
|
|
这种方式适合多用户、多租户、企业级 Agent。
向量数据库
向量数据库适合语义检索。
当用户问:
|
|
系统可以把问题 embedding 后,在历史记忆中找到语义相近的记录。
向量检索的优点是召回能力强,缺点是可解释性和精确性不如结构化查询。它容易召回“看起来相关但其实不该用”的内容。
所以生产系统通常不会只用向量库,而是混合检索:
|
|
记忆检索:如何找回正确内容
记忆检索的目标不是“找很多”,而是“找对”。
一次典型检索流程如下:
|
|
Scope 过滤
记忆必须有作用域。
常见作用域包括:
- user:只对某个用户生效
- project:只对某个项目生效
- workspace:只对某个工作区生效
- organization:对组织共享
- global:全局规则
没有作用域的记忆很危险。
例如“使用 Go 1.22”这个记忆,可能只适用于某个项目。如果被全局使用,Agent 可能在其他项目里做出错误判断。
相关性重排序
向量检索通常只能完成粗召回,还需要重排序。
重排序可以考虑:
- 与当前任务的语义相关度
- 记忆类型的优先级
- 记忆的新鲜度
- 来源可信度
- 是否被用户确认过
- 是否与当前上下文冲突
一个简单打分模型可以是:
|
|
这不是固定公式,而是一种思路:不要只看相似度。
冲突处理
记忆之间可能互相冲突。
例如:
|
|
如果两个都注入上下文,模型可能摇摆不定。
冲突处理可以遵循几条规则:
- 新事实优先于旧事实
- 用户显式指令优先于自动提取
- 项目内事实优先于全局经验
- 高置信度记忆优先于低置信度记忆
- 冲突无法判断时,向用户确认或重新读取真实环境
记忆系统不应该假装世界永远一致。它必须承认信息会变化。
记忆注入:如何放回上下文
检索到记忆之后,还要决定如何注入 prompt。
注入方式会直接影响模型行为。
原文注入
对短小、明确、不可改写的信息,可以原文注入。
例如:
|
|
优点是准确,缺点是占 token。
摘要注入
对长历史、长讨论、长文档,更适合摘要注入。
例如:
|
|
摘要注入节省 token,但要注意保留决策原因,而不只是保留结论。
分层注入
复杂 Agent 可以把记忆分层放入上下文。
|
|
高优先级记忆靠近系统或开发者指令,低优先级记忆靠近任务补充资料。
这不是为了“控制模型”,而是为了让模型更清楚哪些信息应该被严格遵守,哪些只是参考。
控制注入数量
记忆注入要克制。
一个经验原则是:
|
|
过多记忆会带来上下文污染。模型可能把无关历史当成当前约束,导致回答偏离任务。
遗忘机制:记忆也需要清理
记忆系统如果只写不删,迟早会变成垃圾场。
遗忘不是缺陷,而是必要能力。
时间过期
很多记忆天然有有效期。
例如:
|
|
这类记忆应该设置 expires_at,到期后自动失效。
低频衰减
长期没有被使用的记忆,可以降低权重。
|
|
这些记忆未必立即删除,但不应该继续高优先级注入。
版本替换
当新事实出现时,旧事实应该被替换或标记为历史。
例如:
|
|
比起删除旧记忆,更好的方式是保留变更轨迹:
|
|
这样在排查历史问题时仍然有价值。
用户可删除
用户必须能删除自己的记忆。
尤其是包含偏好、身份、行为习惯、业务信息的记忆,应该提供可查看、可编辑、可删除的入口。
记忆系统越强,越需要可控性。
安全边界
Agent 记忆会长期影响行为,因此安全边界非常重要。
不保存敏感信息
默认不要保存:
- 密码
- API Key
- Token
- 私钥
- 身份证件信息
- 银行卡信息
- 未脱敏的客户数据
- 未授权的内部资料
如果业务必须保存敏感信息,也应该加密、分权、审计,并避免直接注入模型上下文。
防止 Prompt Injection 写入记忆
攻击者可能通过网页、文档、邮件等外部内容诱导 Agent 写入恶意记忆。
例如:
|
|
如果 Agent 自动保存这类内容,下次任务就会被污染。
防护方式包括:
- 外部内容默认不允许写入长期记忆
- 写入前区分“用户指令”和“被读取资料”
- 高风险记忆需要用户确认
- 记忆内容不能覆盖系统级安全规则
- 保存来源和置信度
记忆写入必须有边界。不能让任何被读取的文本都变成 Agent 的信念。
权限隔离
多用户系统中,记忆必须隔离。
不能出现:
|
|
所以每条记忆都应该带上 scope、owner、tenant、access_policy 等元数据。
记忆检索时必须先做权限过滤,再做相关性排序。
记忆评估:如何知道它真的有效
记忆系统不能只凭感觉评估。
可以从四个维度观察。
召回质量
核心问题是:该想起来的时候有没有想起来?
指标包括:
- Recall:相关记忆是否被召回
- Precision:召回结果中有多少真正相关
- Top-K 命中率:前几条里是否包含关键记忆
- 冲突率:是否召回了互相矛盾的信息
如果召回质量差,Agent 会表现得像“没记住”。
注入质量
召回只是第一步,还要看注入是否合理。
可以检查:
- 注入内容是否过长
- 是否挤掉了当前任务关键信息
- 是否把低优先级记忆放得太靠前
- 是否注入了过期信息
- 是否保留了决策原因
很多记忆系统的问题不是“找不到”,而是“塞太多”。
行为提升
最终要看记忆是否改善任务结果。
可以做 A/B 测试:
|
|
观察任务成功率、重复询问次数、重复工具调用次数、用户纠正次数、平均完成时间等指标。
如果记忆系统增加了成本,却没有提升行为,就需要重新设计。
安全与治理
记忆越长期,治理越重要。
需要观察:
- 是否保存了不该保存的信息
- 用户是否能查看和删除记忆
- 记忆来源是否可追踪
- 权限隔离是否可靠
- 被污染的记忆是否能回滚
记忆系统不仅是智能能力,也是数据系统。
一个工程化记忆系统长什么样
可以用下面的结构理解一个完整的 Agent 记忆系统:
|
|
这条链路里任何一环薄弱,记忆效果都会下降。
落地建议
如果你要从零构建 Agent 记忆系统,可以按阶段推进。
第一阶段:先做好会话记忆
先让 Agent 在一次任务中不要忘。
重点做:
- 保留当前任务目标
- 记录已执行步骤
- 记录工具调用结果摘要
- 维护下一步计划
- 定期压缩历史上下文
这一步不需要复杂向量数据库,但能明显改善多轮任务体验。
第二阶段:保存少量长期偏好
先保存最稳定、最明确的用户偏好。
例如:
|
|
这一阶段要支持用户查看和删除。
第三阶段:引入项目记忆
对于编程、写作、运维类 Agent,项目记忆非常重要。
可以维护:
|
|
这类记忆最好放在项目目录中,方便审查和版本管理。
第四阶段:做语义检索和治理
当记忆规模变大后,再引入向量检索、重排序、权限控制、审计日志、过期策略。
不要一开始就把系统做得很重。记忆系统最重要的是质量,而不是架构复杂度。
常见误区
误区一:把所有历史都塞进上下文
这会导致 token 成本上升、注意力分散、上下文污染。
正确做法是检索和筛选,只注入当前任务需要的少量信息。
误区二:自动保存一切
自动保存很容易把噪声、猜测、临时状态甚至攻击文本写入长期记忆。
正确做法是设置写入门槛,区分事实、偏好、推断和外部资料。
误区三:只用向量相似度
相似不等于有用。
记忆检索还要考虑作用域、时间、置信度、权限、冲突和当前任务阶段。
误区四:没有遗忘机制
没有遗忘,记忆会越来越脏。
过期、替换、降权、删除,都是记忆系统的一部分。
误区五:忽视用户控制权
长期记忆涉及用户信任。
用户应该知道 Agent 记住了什么,也应该能修改和删除。
总结
AI Agent 的记忆机制不是简单的聊天记录保存,而是一套围绕“信息如何被复用”的工程系统。
它至少包含六个关键动作:
|
|
好的记忆系统会让 Agent 更稳定、更懂上下文、更少重复劳动。差的记忆系统则会让 Agent 被历史噪声拖累,甚至被错误信息长期污染。
所以,设计 Agent 记忆时要记住一个原则:
记忆不是为了让 Agent 记住更多,而是为了让它在需要时想起正确的事。