第14章:Agent 记忆系统——如何让 AI 记得你的约定?

第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 溢出:滑动窗口、摘要、重要性过滤
  • 长期记忆的存取是"存什么、怎么存、什么时候取"三个核心决策
  • 记忆不是越多越好,取舍和时效管理同样重要

思考题

  1. 如果让你设计一个"VIP 用户记忆系统”(要求记住优先级用户的长期偏好和行为模式),你会在哪些维度上加强?
  2. 长期记忆如果出现了矛盾信息(用户上周说喜欢 A,这周说喜欢 B),系统该怎么处理?