🏗️ 记忆系统架构
记忆系统是 Agent 实现跨会话、跨任务的知识保持与复用的基础。一个设计良好的记忆架构能让 Agent 从"无状态工具"进化为"有上下文的智能体"。
🧱 多级记忆模型
借鉴人类认知心理学中的 Atkinson-Shiffrin 多存储模型,Agent 的记忆系统同样采用分层设计:
感官记忆(Sensory Memory)
原始的、未经处理的输入信号。在 Agent 语境中对应 用户原始消息、工具返回的原始数据。容量极大但保留时间极短(毫秒~秒级),需要经过注意力机制筛选后进入工作记忆。
工作记忆(Working Memory)
当前任务执行中的临时信息。对应 LLM 推理过程中的中间步骤、当前对话轮次的关键信息。容量有限(约7±2个信息块),与当前任务强相关,任务完成后可丢弃。
短期记忆(Short-Term Memory)
当前会话/任务周期内的上下文信息。对应 LLM 的上下文窗口(Context Window),包含对话历史、工具调用记录、中间推理结果。保留时间从分钟到小时级,受上下文窗口长度限制。
长期记忆(Long-Term Memory)
跨会话持久化的知识。对应 外部向量数据库、知识图谱、文档存储等持久化方案。容量近乎无限,保留时间持久,需要通过检索机制按需加载。
📊 各层级记忆特征对比
| 特征维度 | 感官记忆 | 工作记忆 | 短期记忆 | 长期记忆 |
|---|---|---|---|---|
| 容量 | 极大(原始数据流) | 有限(7±2 信息块) | 中等(几K~几M tokens) | 近乎无限 |
| 保留时间 | 毫秒~秒 | 秒~分钟 | 分钟~小时 | 持久(天~年) |
| 存储位置 | 请求体/响应体 | LLM 内部状态 | 上下文窗口 / KV Cache | 向量库/图数据库/文档存储 |
| 访问速度 | 即时 | 极快 | 快 | 较慢 |
| 检索方式 | 注意力筛选 | 直接引用 | 自注意力机制 | 语义检索 / 关键词 / 图谱查询 |
| 典型实现 | 消息预处理、工具返回解析 | Scratchpad、推理步骤 | Context Window、KV Cache | Pinecone/Weaviate/Neo4j/MongoDB |
| 遗忘策略 | 自动丢弃未关注信息 | 任务完成即清空 | 窗口滑动/超出限制丢弃 | TTL过期/重要性评分/手动管理 |
🔄 记忆存储与检索机制
存储流程
📥 原始输入
→
🔍 注意力筛选
→
💭 工作记忆处理
→
📋 短期记忆暂存
→
🗄️ 长期记忆合并
- 输入捕获:用户消息、工具返回值等原始数据进入感官记忆
- 注意力筛选:通过预定义的注意力规则或 LLM 判断,提取关键信息进入工作记忆
- 上下文编码:工作记忆中的信息被编码为结构化上下文,放入短期记忆(上下文窗口)
- 记忆合并:会话结束后,根据重要性评分将短期记忆中的关键信息持久化到长期记忆
检索流程
❓ 用户查询
→
🔍 短期记忆查找
→
📡 长期记忆检索
→
🔗 结果融合排序
→
✍️ 上下文增强生成
- 短期记忆查找:首先在上下文窗口中查找相关信息(最近的对话、工具调用记录)
- 长期记忆检索:若短期记忆不足,触发向量检索/关键词搜索/图谱查询,从外部存储获取相关知识
- 结果融合:将短期和长期记忆检索结果合并,按相关性排序,去重
- 上下文增强:将检索到的记忆注入当前推理上下文,增强生成的准确性和连贯性
💾 记忆序列化与反序列化
记忆需要在会话挂起/恢复、Agent 迁移、多 Agent 共享等场景下进行序列化与反序列化。
| 方案 | 序列化格式 | 适用场景 | 优缺点 |
|---|---|---|---|
| JSON 快照 | 结构化 JSON | 会话挂起/恢复、调试 | ✅ 简单直观 ❌ 无法存储向量/嵌入 |
| Message List | OpenAI 消息格式 | 多轮对话恢复 | ✅ 与 LLM API 兼容 ❌ 占用空间大 |
| 向量嵌入存储 | Float 数组 + 元数据 | 长期记忆持久化 | ✅ 支持语义检索 ❌ 不可逆(无法还原原文) |
| Summary 压缩 | 自然语言摘要 | 长期对话的上下文压缩 | ✅ 节省空间 ❌ 信息有损 |
| Protobuf/MessagePack | 二进制格式 | 高性能场景、跨语言 | ✅ 紧凑高效 ❌ 可读性差 |
序列化设计原则
- 完整性:序列化后的数据应能完整恢复 Agent 的记忆状态
- 兼容性:版本演进时保持向前/向后兼容
- 可扩展性:支持自定义记忆类型和元数据的扩展
- 安全性:敏感记忆数据应支持加密序列化
- 高效性:大规模记忆数据的序列化/反序列化性能
💡 架构建议
推荐采用混合序列化策略:短期记忆使用 Message List 格式与 LLM 无缝对接;长期记忆使用向量嵌入 + JSON 元数据,兼顾检索效率与可读性;跨 Agent 迁移使用 Protobuf 保证效率和跨语言兼容。