大模型智能体的记忆模块设计
大模型智能体(LLM Agent)的核心能力之一是“记忆”。没有记忆,模型只能进行短期上下文补全;有结构化记忆后,智能体才能具备持续理解、跨会话推理与个性化能力。
当前主流记忆框架包括:
- Mem0
- LlamaIndex(Memory / ChatStore 模块)
- LangChain(Memory 体系)
- AutoGen(多智能体上下文管理)
一、基础概念澄清
1. QA Turn
一次“问答对”(User → Assistant)构成一个 QA Turn。
其为最小对话单元。
2. Session
一次完整的交互会话。
从用户进入系统开始,到用户主动结束或超时终止为止。
Session 表示一次连续交互过程:
Session 是逻辑边界单位,而非推理输入单位。
3. Context
当前推理所需的全部上下文信息,包括:
- 当前窗口内对话
- 系统提示词(System Prompt)
- 工具调用结果
- 结构化短期记忆
- 检索到的长期记忆
Context 是模型输入的一部分,而不是存储单位。
二、记忆分层设计
在工程实践中,记忆系统通常采用三层结构:
窗口记忆(Working Memory)→ 当前推理输入
短期记忆(Session Memory)→ 会话级结构化摘要
长期记忆(Persistent Memory)→ 跨会话长期存储
三、窗口级记忆(Working Memory)
定义
当前推理时输入给 LLM 的消息列表(messages)。
包含:
- system prompt
- 最近若干轮 user/assistant 对话
- 必要的工具返回结果
不包含:
- 思考链(chain of thought)
- 内部函数调用日志
特点
- 实时
- 无需预处理
- 直接作为模型输入
问题
- Token 上限限制
- 对话轮数过长导致早期指令丢失
- 大量历史无效 token 消耗成本
常见优化策略
- 滑动窗口(仅保留最近 N 轮)
- 中间截断(保留开头指令 + 最新对话)
- 动态压缩摘要
- 分层上下文注入(指令与对话分离)
四、短期记忆(Session Memory)
定义
对一个 Session 进行结构化总结后的记忆表达。
目标:
- 保留核心目标
- 保留用户意图
- 保留重要事实
- 删除过程性闲聊
典型流程
flowchart TD
A[对话进行中] --> B[检测是否需要总结]
B --> C[调用LLM生成Session Summary]
C --> D[结构化信息抽取]
D --> E[更新当前Session Context]
E --> F[作为后续Prompt输入]短期记忆内容结构示例
{
"user_goal": "...",
"constraints": "...",
"important_facts": ["..."],
"decisions_made": ["..."],
"open_questions": ["..."]
}
优点
- 缓解窗口爆炸问题
- 保留初始重要指令
- 可跨多轮推理
缺点
- 每轮或阶段性总结会增加延迟
- 总结质量依赖模型能力
- 可能出现信息损失
五、长期记忆(Persistent Memory)
长期记忆用于跨 Session 维持用户画像、历史行为与知识沉淀。
长期记忆实现方式对比
1. 原始对话存储(全文存储)
存储方式:
- 文本原样保存
- 可使用全文搜索(如 ES)
- 或向量化后存储
优点:
- 实现简单
- 成本低
- 信息完整
缺点:
- 召回噪声大
- 无结构
- 精准度低
2. QA Turn 向量化
对单条对话做 embedding。
优点:
- 检索粒度细
- 实现简单
缺点:
- 语义碎片化
- 缺乏整体语境
3. Session 整体向量化
对整个 session 做 embedding。
优点:
- 可整体召回历史场景
缺点:
- 长文本 embedding 表达能力下降
- 相似度阈值难以确定
- 语义平均化问题严重
4. 实体抽取 + 向量化
步骤:
- 实体识别
- 关键信息抽取
- 实体向量化
优点:
- 召回精度更高
- 噪声少
缺点:
- 需要预处理
- 需要设计抽取 schema
5. 知识图谱记忆(Graph Memory)
结构:
- 节点 = 实体
- 边 = 关系
graph TD
User -->|喜欢| Python
User -->|常用框架| LangChain
User -->|工作领域| NLP
NLP -->|相关技术| Transformer优点:
- 强推理能力
- 关系可解释
- 支持复杂多跳查询
缺点:
- 构建复杂
- 检索流程复杂
- 维护成本高
适用于高价值 Agent 系统。
六、完整记忆架构设计示意
flowchart LR
A[User Input] --> B[窗口记忆]
B --> C[短期记忆]
C --> D[长期记忆检索]
D --> E[构建完整Context]
E --> F[LLM推理]
F --> G[生成回复]
G --> H[更新短期记忆]
H --> I[异步更新长期记忆]关键点:
- 长期记忆更新应异步
- 避免阻塞主链路响应
- 支持多路召回融合
七、Embedding 模型选择建议
不同文本长度适配不同模型:
| 类型 | 推荐策略 |
|---|---|
| 短文本(实体、单轮对话) | BM25 + 轻量 embedding |
| 中等文本(QA Turn) | BGE-M3、多语言 embedding |
| 长文本(Session) | 长文本专用 embedding |
| 高精度场景 | ColBERT 类 late-interaction 模型 |
八、三类记忆对比总结
| 类型 | 实时性 | 预处理 | 是否跨 Session | 成本 | 典型问题 |
|---|---|---|---|---|---|
| 窗口记忆 | 实时 | 否 | 否 | 高 token 消耗 | 上下文爆炸 |
| 短期记忆 | 准实时 | 轻量 | 部分 | 中 | 总结失真 |
| 长期记忆 | 异步 | 重 | 是 | 高 | 检索噪声 |
九、工程实践关键点
- 记忆不是越多越好,关键在“可检索性”
- 必须区分“存储”与“召回”
- 长期记忆必须带时间戳
- 需要记忆衰减机制
- 支持用户可控删除
- 检索结果必须再次重排序
- 防止记忆污染(错误写入)
十、常见设计误区
- 把所有对话都做 embedding
- 不做去重
- 没有重要性评分
- 记忆写入同步阻塞主流程
- 不区分事实与推测
十一、进阶方向
- Episodic Memory(事件记忆)
- Semantic Memory(语义知识)
- Procedural Memory(技能记忆)
- 记忆强化学习(Memory-aware RL)
- 自我反思机制(Self-Reflection Loop)
结论
一个成熟的大模型智能体记忆系统应具备:
- 分层结构
- 结构化表达
- 可控写入
- 精准召回
- 成本可控
- 支持推理
窗口解决“当前对话”,
短期解决“当前目标”,
长期解决“用户历史”。
三者缺一不可。