8. 请你介绍一下 AI Agent 的记忆机制,并说明在实际开发中应该如何设计记忆模块?
8. 请你介绍一下 AI Agent 的记忆机制,并说明在实际开发中应该如何设计记忆模块?
💡 简要回答
Agent 需要记忆才能在多步任务中保持状态、跨任务积累知识。记忆机制分四层:感知记忆(当前输入的原始内容)、短期记忆(context window 里的对话历史)、长期记忆(存在外部数据库、语义检索召回)、实体记忆(结构化提取的关键事实)。实际设计时要解决三个核心问题:存什么、怎么存、什么时候取出来用,根据信息类型选合适的存储方式,再搭配主动检索和按需检索两种策略使用。
📝 详细解析
没有记忆的 Agent 有多不好用
要搞清楚记忆机制为什么重要,得先感受一下「没有记忆」的 Agent 到底有多难用。
你今天告诉 Agent「我喜欢代码风格简洁、变量命名用英文、不要过度注释」,它帮你完成了今天的任务。明天你重新打开对话,让它帮你写一个新功能,它输出的代码风格完全和昨天说好的不一样,中文注释一堆,变量名也很啰嗦。你很困惑,但对 Agent 来说,昨天的对话压根不存在,每次对话都是全新的开始,之前达成的所有约定都消失了。

这还只是「偏好记忆」的问题。更严重的是「任务状态」的问题:Agent 在执行一个多步任务的过程中,如果没有短期记忆来维持状态,它就不知道自己上一步做了什么、当前处于哪个阶段、已经收集到了哪些信息。你让它「先查资料,再整理成报告」,没有记忆的话,整理报告这一步根本不知道查到了什么。
记忆,是 Agent 从「单次问答工具」变成「真正助手」的关键分水岭。有了记忆,它才能积累对你的了解,才能在多步任务中保持连贯,才能跨任务沉淀知识。
四种记忆类型(从最短暂到最持久)
记忆机制其实可以对应到人类的记忆系统来理解,从最短暂到最持久,分四个层次。

第一层:感知记忆(Sensory Memory)
这是最短暂的一层,就是「当前这次调用的原始输入」,用户发来的这条消息、上传的截图、传入的文档。它的生命周期只有一次调用,处理完就消失,不会主动保留。
类比到人:你刚听到的一句话,如果没有主动去记,几秒后就忘了。感知记忆就是这个「刚进来还没处理」的原始感知。它存在的意义是:模型需要一个「入口」来接收外部信息,这就是感知记忆的角色。
第二层:短期记忆(Short-term Memory)
这是 context window 里的 messages 列表,维持着当前任务执行过程中的完整状态,包括用户说了什么、模型输出了什么、工具调用返回了什么。只要任务还在进行,这些信息就都在;任务结束(对话关闭),这块记忆就清空了。
类比到人:这就像你的「工作台」,桌上摆着的都是正在处理的东西。工作台有大小(token 上限),放满了就得清一清。工作台的特点是「随时可见」,不需要去「找」,直接读就行。
第三层:长期记忆(Long-term Memory)
这是跨任务保留的信息,存在外部数据库里,通常是向量数据库、关系数据库或 Key-Value 存储。任务结束了,信息不会消失,下次需要时去检索拿回来用。
类比到人:这就是你的「档案室」,东西放进去不会丢,但要用的时候需要主动去翻。长期记忆的关键技术是向量数据库,它支持「语义检索」:你不需要知道存的时候用了什么关键词,只要意思相近就能检索到相关内容。这比精确匹配灵活得多,比如你存的是「用户不喜欢冗长的注释」,用「代码风格偏好」去查也能找到它。
第四层:实体记忆(Entity Memory)
这层比长期记忆更精炼,它不是存原文,而是把对话中出现的关键实体和事实主动提取出来,存成结构化字段。比如「用户偏好 Python」「客户预算是 5 万」「项目截止日是 3 月底」,这些是从对话里提炼出来的「结论」,而不是原始对话本身。
类比到人:这就像医生的病历卡,不是把问诊录音存起来,而是结构化地记录「主诉:头痛三天;诊断:偏头痛;用药:布洛芬」。信息密度高,查询快,而且不受原始表述方式影响。
四层记忆横向对比:
| 类型 | 载体 | 容量 | 生命周期 | 访问方式 |
|---|---|---|---|---|
| 感知记忆 | 当次输入 | 极小 | 单次调用 | 即时访问 |
| 短期记忆 | context window | 受 token 限制 | 一次任务 | 直接读取 |
| 长期记忆 | 向量/关系数据库 | 无限 | 持久 | 语义检索 |
| 实体记忆 | 结构化存储 | 无限 | 持久 | 精确查询 |
实际设计记忆模块的三个核心问题
理解了四种记忆类型,设计记忆模块时还要解决三个工程问题。
第一个:存什么?
不是所有内容都值得写入长期记忆,存太多反而会引入噪音,让检索的精准度下降。判断标准其实很简单:「这条信息,下次任务开始时如果知道,会让 Agent 做得更好吗?」

通常值得存的有三类:用户偏好和习惯(语言风格、技术栈偏好、工作习惯)、任务执行中产生的关键结论和决策(比如「调研发现竞品 A 的定价策略是按用量收费」)、以及外部知识(产品文档、FAQ、历史案例)。
不值得存的:中间推理过程、工具返回的原始数据(日志太啰嗦)、闲聊内容。这些存进去只会稀释有价值的记忆,让检索的信噪比下降。
第二个:怎么存?
根据信息的类型选合适的存储介质,而不是一刀切地全部塞进向量数据库:

- 需要语义检索的内容(文档知识、对话摘要)-> 向量数据库,用 embedding 存储,检索靠相似度
- 结构化的用户偏好、状态字段(语言偏好、项目配置)-> 关系数据库或 Key-Value,支持精确查询,速度快
- 整段文档或知识库 -> 向量数据库,配合 RAG 召回
混合存储是主流做法:结构化的偏好字段用关系数据库精确查,非结构化的知识和历史用向量数据库语义检索,两者配合使用。
第三个:什么时候取出来用?
两种策略,实践中结合使用:

「主动检索」:任务开始前,用当前任务的描述去检索相关记忆,把结果注入 system prompt 作为背景知识。这样 Agent 一开始就带着「历史记忆」进入任务,不需要用户每次重新交代背景。
「被动触发」:Agent 在推理过程中,判断当前步骤需要某类特定知识时,主动发起检索(把「查记忆」封装成一个 Tool,让 Agent 自己决定什么时候调)。这种方式更灵活,但依赖模型判断什么时候该去查。
实践上两种结合:session 开始时做一次主动检索,把关于用户偏好和背景的记忆加载进 system prompt;任务执行过程中,遇到需要专业知识或历史数据的步骤,再让 Agent 按需检索。
完整记忆模块的配合方式
把四层记忆和三个核心问题放在一起,来走一遍一次完整任务里它们是怎么协作的。整个过程可以用「读 -> 用 -> 写」三个阶段来描述。
第一阶段:任务开始前,先「读」记忆

用户发来一个新请求,Agent 不是立刻开始干活,而是先去「翻档案」:从实体记忆里取出用户的结构化偏好(语言偏好、风格要求、过往决策),再用任务描述作为查询词,去长期记忆里做一次语义检索,拿回最相关的历史背景。把这两部分信息拼进 system prompt 的开头,Agent 进入任务时就已经带着完整的「用户画像」,不需要用户重复交代背景。
第二阶段:任务执行中,持续「用」记忆

任务开始执行,短期记忆(messages 列表)全程工作:用户的每一条消息、模型的每一次输出、工具调用返回的每一个结果,都追加进 messages。每次调用 LLM 都把这份完整历史带上,Agent 始终知道自己做到哪一步、前面发现了什么。
如果某个执行步骤需要特定的专业知识(比如查某个 API 的文档、回想某次历史决策),Agent 可以临时发起一次长期记忆检索,把「查记忆」封装成一个 Tool,用当前上下文作为查询词,把检索结果注入到这一步的 context 里,用完即走,不需要永久保留在 messages 中。
第三阶段:任务结束后,主动「写」记忆

任务完成,进行最后一步:把本次任务产生的新知识写回持久化存储。具体来说,如果用户在对话中表达了新的偏好(「以后写函数都要加类型注解」),就更新实体记忆的对应字段;如果任务产生了有价值的结论(「竞品 A 的定价是按用量收费」),就把这条摘要写入长期记忆,embedding 后存入向量数据库,供下次检索。最后,短期记忆(messages 列表)清空,工作台恢复干净,等待下一个任务。
用流程图来看,整条链路是这样的:

「读 -> 用 -> 写」三个阶段形成完整闭环:每次任务开始时把历史积累读进来,执行中靠短期记忆保持连贯,结束后把新知识写回去沉淀。Agent 用得越多,积累越厚,越来越「了解」用户,这才是记忆系统真正的价值所在。
