Agent 记忆系统
LLM 天生只有上下文窗口这一种记忆:容量有限、按 token 计费、会话结束即消失。Agent 记忆系统的本质,是用工程手段在窗口内外组织信息,让模型"记得住该记的,找得到该找的"。
三层模型
按生命周期与容量划分:
| 层 | 载体 | 容量 | 生命周期 |
|---|---|---|---|
| 工作记忆 | 上下文窗口 | 数千到数十万 token | 单次任务 |
| 任务状态 | 显式状态对象(State) | 结构化、按字段 | 单次任务(可持久化断点续跑) |
| 长期记忆 | 外部存储(向量库/ KV / 数据库) | 无上限 | 跨会话 |
任务状态是最容易被忽略的一层:循环式 Agent 每轮都"重读"整个上下文,对长任务的前几轮注意力会衰减。把"当前子目标、已完成、待办、关键决策"维护成结构化状态,每轮注入提示词头部,等于给了模型一个稳定的任务锚点。LangGraph 的 State、各类框架的 scratchpad 都是这个思路。
短期记忆:上下文管理
上下文内的信息组织直接决定推理质量:
- 工具结果瘦身:大结果摘要入上下文,全文留在可回取的位置;
- 历史压缩:早期轮次只保留决策与关键观察,原始输出滚动淘汰;
- 信息分层排布:系统指令与任务状态放头部(稳定、每轮刷新),最新观察放尾部(注意力最密集区),中部放历史摘要。
上下文管理没有一劳永逸的配置,正确做法是把上下文长度也纳入监控:超过阈值触发压缩,而不是等到模型开始"忘记"早期约束。
长期记忆:写什么、怎么存、怎么找
跨会话记忆由三个策略共同决定,任何一个设计失衡都会让记忆系统变成噪声源。
写入策略:不是什么都值得记
| 策略 | 做法 | 特点 |
|---|---|---|
| 全量记录 | 存下所有对话 | 简单,检索时噪声大 |
| 显式写入 | 模型调用记忆工具主动保存 | 可控,依赖模型的判断 |
| 周期反思 | 会话结束时提炼要点入库 | 质量/成本平衡的常用解 |
生产系统常用组合:会话结束后异步运行一轮"反思",提炼出事实(用户偏好)、事件(做了什么)、经验(什么方案有效)分别入库,并打上时间、主题、重要度标签。
存储形态
- 语义记忆(事实与知识):向量化存储 + 检索,复用 RAG 的全部基础设施;
- 情景记忆(事件与经历):结构化记录 + 时间检索,"上次出现这个问题是什么时候";
- 用户画像(稳定偏好):键值化的档案,随交互增量修订,每轮直接注入而不是检索。
检索策略
查记忆不是"相似度 Top-K"一个动作能覆盖的:先按时间新鲜度与权限过滤,再按语义相关性召回,最后按重要度与近期使用加权。检索出的记忆以明确的元信息标注注入("以下是你对用户的既有了解,可能过时"),让模型对记忆保持校准的信任。
记忆的维护
长期记忆必须回答三个管理问题,否则会随时间腐化:
- 过时:用户半年前的偏好与今天冲突怎么办——带时间戳,冲突时以新为准并显式提示;
- 矛盾:两来源记录冲突怎么办——保留来源与置信度,交给模型裁决或触发澄清;
- 膨胀:检索集越来越大怎么办——定期合并去重、按重要度归档低价值记忆。
最小可用架构
起步阶段不需要复杂系统,三个组件就够:
会话中:上下文 + 任务状态注入
会话尾:反思提炼 → 写入(向量库 + 画像 KV)
会话起:按用户 ID 检索画像 + 相关记忆 → 注入系统提示
这个架构的检索层就是一个小型 RAG——事实上长期记忆与 RAG 共享同一套技术底座,区别只在"库里的内容是什么"与"谁来写入"。当记忆写入与检索也开始由 Agent 自主决策(何时记、记什么、何时查)时,记忆本身也 Agent 化了——这正是记忆与设计模式中反思模式的天然结合点。