第14章:Agent 记忆系统——如何让 AI 记得你的约定?
系列导读:记忆是 Agent 区别于单次对话 LLM 的核心特征之一。没有记忆,Agent 每次对话都像第一次认识。
一、没有记忆的 Agent 有多不好用?
想象这个场景:
你:帮我分析这份 Excel 里的销售数据,只关注华东地区。 Agent:好的,分析完成,华东地区销售增长 12%。
你(过了一小时,新开了一个对话):上面的分析结果出了报告吗? Agent:抱歉,我不记得之前的对话…
这就是没有记忆的代价——Agent 无法跨任务保持连贯性,无法积累对你的了解。
二、记忆的四层架构
Layer 1:感知记忆(Sensory Memory)
- 内容:当前输入的原始内容(用户说的话、上传的文件、语音转文字)
- 存储:内存,即时处理
- 生命周期:处理完就丢弃
Layer 2:短期记忆(Short-term Memory)
- 内容:当前任务的对话历史、中间推理过程、工具执行结果
- 存储:LLM 的 context window
- 生命周期:当前任务结束后即可清理
Layer 3:长期记忆(Long-term Memory)
- 内容:跨会话的知识、用户偏好、历史决策、积累的经验
- 存储:向量数据库、关系型数据库
- 生命周期:持续存在,可更新
Layer 4:实体记忆(Entity Memory)
- 内容:从对话中提炼的结构化事实(“张三喜欢 Java”、“项目预算500万”)
- 存储:键值对存储、图数据库
- 生命周期:持续存在,可修正和合并
三、短期记忆设计
短期记忆就是 context window 里维护的对话历史。核心问题是:context 有限,满了之后怎么办?
方案1:滑动窗口
只保留最近的 N 轮对话,更老的丢弃。
if len(messages) > max_context_length:
# 保留系统 prompt + 最新的 N 条
messages = [system_message] + messages[-max_history:]
优点:简单、易实现 缺点:30分钟前一个技术决策说砍就砍,Agent 开始忘事
方案2:摘要压缩
当历史太长时,让 LLM 把旧对话摘要成简短总结。
原始历史(20轮)→ LLM 摘要 → 3句话总结
"用户要求分析华东销售数据,分析了Q1-Q3增长趋势,确认重点产品线是 A 和 B"
优点:保留关键信息 缺点:摘要可能丢细节;有额外 LLM 调用成本
方案3:重要性过滤
给每条对话打分,只保留高重要性的。
打分方式:
- 规则式:包含"决定"“确认"“方案"等关键词的权重高
- 模型式:用一个小模型判断某条信息的重要性
四、长期记忆设计
向量存储(语义记忆)
- 把有价值的信息做 embedding,存入向量库
- 检索时用语义匹配,召回相关历史
- 适合:用户偏好、通用知识、经验总结
User: "我喜欢简洁风格的代码,不要过度注释"
↓
提取关键信息 → embedding → 存入向量库
tag: "用户偏好", "代码风格"
结构化存储(实体记忆)
- 用键值对或图数据库存储提炼的事实
- 适合:具体事实(“服务器 IP 是 xx”、“项目截止日期 yy”)
{
"entities": {
"user_preferences": {
"coding_style": "简洁,少注释",
"communication": "中文",
"detail_level": "high"
},
"project_facts": {
"server_ip": "10.0.1.12",
"deadline": "2026-08-15"
}
}
}
记忆的"存取"时机
什么时候存?
- 用户明确提出偏好
- 讨论了重要决策/结论
- 任务完成后总结的经验
- 检测到首次出现的有意义新信息
什么时候取?
- 每次新任务启动时,检索相关历史背景
- 任务中途遇到不确定信息时,回忆之前的约定
- 生成回答前,检查是否有已知的用户偏好
五、记忆系统设计核心原则
1. 存什么?(取舍)
- 不是什么都存 → context 爆炸、检索噪音
- 只存"有长久价值的信息”:偏好、约定、事实、经验
- 临时中间结果(如一次搜索的中间页面)不存
2. 怎么存?(粒度)
- 太细碎 → 检索噪音大,拿到碎片化信息
- 太粗略 → 关键细节丢失
- 推荐:以"一次完整交互"或"一个关键决策"为单位
3. 什么时候取?(时机)
- 主动检索:任务开始前基于关键词召回
- 按需检索:遇到不确定信息时(“等等,用户之前好像说过…")
- 不要太勤快:每步都查记忆 → 延迟增加
六、记忆压缩技术
当长期记忆库越来越大,怎么解决?
摘要聚合
把一段时间内的多条记录用 LLM 摘要合并:
记录1: "用户喜欢 Go 语言"
记录2: "用户用 Go 写过微服务"
记录3: "用户说我写的 Go 代码风格不对"
↓
摘要: "用户是 Go 开发者,注重代码规范,可参考 gofmt 标准"
过期遗忘
给记忆设 TTL(生存时间),比如一条技能偏好半年没用到就删除。
合并去重
新记录写进去前,先检索是否已有类似记录,有就合并更新。
七、本章小结
- 记忆系统解决 Agent 的"失忆"问题,让它能跨任务积累知识
- 四层记忆:感知 → 短期(context)→ 长期(向量库)→ 实体(结构化)
- 短期记忆要处理 context 溢出:滑动窗口、摘要、重要性过滤
- 长期记忆的存取是"存什么、怎么存、什么时候取"三个核心决策
- 记忆不是越多越好,取舍和时效管理同样重要
思考题
- 如果让你设计一个"VIP 用户记忆系统”(要求记住优先级用户的长期偏好和行为模式),你会在哪些维度上加强?
- 长期记忆如果出现了矛盾信息(用户上周说喜欢 A,这周说喜欢 B),系统该怎么处理?