记忆系统:短期记忆、长期记忆、向量记忆
Agent 要持续完成任务、记住用户偏好,必须有记忆系统。这篇讲 Agent 的三层记忆架构:短期工作记忆、长期对话记忆、向量知识库记忆,各自的作用、实现方式、以及怎么设计合理的记忆机制。
大家好,我是黒漂技术佬。
人有短期记忆和长期记忆,Agent 也一样。普通对话只有当前窗口的上下文,聊多了就忘了前面说过什么。真正的 Agent 需要多层记忆系统,才能记住用户偏好、历史对话、专业知识。
这篇讲 Agent 的记忆体系:短期记忆、长期记忆、向量记忆,分别是什么、怎么实现、有哪些常见问题。
一、为什么需要记忆系统?
普通对话的问题
- 只有当前对话的上下文,关了窗口就全没了
- 对话太长超出上下文窗口,前面的就忘了
- 每次对话都是「第一次见面」,不记得用户是谁、偏好什么
- 没有外部知识库,只能靠模型训练时的知识
Agent 需要的记忆能力
- 记住当前任务的进展:做到哪一步了、中间结果是什么
- 记住用户是谁:名字、偏好、历史对话
- 记住专业知识:企业内部文档、产品手册、FAQ
- 从经验中学习:之前做过类似的任务,这次做得更好
三层记忆架构
┌─────────────────────────────────┐ │ 短期记忆(工作记忆) │ │ 当前对话、当前任务上下文 │ │ 存在上下文窗口里,快但容量小 │ ├─────────────────────────────────┤ │ 长期记忆(对话记忆) │ │ 历史对话记录、用户画像 │ │ 存在数据库里,量大但要检索 │ ├─────────────────────────────────┤ │ 向量记忆(知识库记忆) │ │ 文档、FAQ、产品知识 │ │ 存在向量数据库,语义检索 │ └─────────────────────────────────┘二、短期记忆(工作记忆)
是什么
当前对话轮次里的内容,就是模型的上下文窗口。
- 对话历史
- 工具调用的中间结果
- 当前任务的执行状态
存在哪里
直接在 messages 数组里,每次调用 API 都传过去。
特点
- 快:直接在上下文里,模型立刻能用
- 准:原始信息,没有损失
- 容量有限:受模型上下文窗口限制(4k、8k、32k、128k)
- 临时:对话结束就没了
短期记忆的问题
1. 上下文溢出
对话太长,token 超过模型限制,前面的被截断,就忘了。
2. 长上下文效果下降
虽然很多模型号称 128k 上下文,但实际越长效果越差,中间的内容容易「lost in the middle」。
3. 成本高
上下文越长,每次调用 token 越多,越贵。
优化策略
策略 1:滑动窗口
只保留最近 N 轮对话,老的丢掉。
# 只保留最近10轮iflen(messages)>20:messages=messages[-20:]简单粗暴,适合不重要的闲聊。
策略 2:摘要记忆
老的对话做摘要,用摘要代替原文,节省 token。
[历史摘要] 用户之前问过A、B、C三个问题,主要关心价格和功能。 [最近对话] 用户:那售后呢? 助手:...既保留了关键信息,又省 token。
策略 3:关键信息提取
提取用户的核心信息(名字、偏好、关键事实)存起来,每次拼到系统提示词里。
用户信息: - 姓名:张三 - 职业:程序员 - 偏好:喜欢简洁的回答 - 关注:AI Agent 相关技术三、长期记忆(对话记忆)
是什么
跨会话的记忆,记住用户之前所有的对话和偏好。
- 用户画像:姓名、职业、兴趣、语言风格偏好
- 历史对话记录
- 之前做过的任务、达成的共识
存储方式
存在数据库里(MySQL、PostgreSQL、MongoDB 都行):
表:conversation - id - user_id - message - role (user/assistant) - timestamp - embedding(可选,语义检索用)怎么用
不是把所有历史都塞上下文,而是检索相关的历史拿出来。
方式 1:按时间取最近的
把最近几次对话的摘要拼进去。
方式 2:语义检索
把历史对话向量化,当前问题去检索最相关的历史对话。
用户当前问题:那个API怎么调用? 检索相关历史: - 3天前:用户问过XX接口的鉴权方式 - 1周前:讨论过API的限流规则 把相关历史拼到上下文里,模型就知道「哦之前聊过这个」用户画像(User Profile)
从历史对话里提取结构化的用户信息,存在用户档案里:
{"name":"张三","role":"后端开发","company":"某科技公司","preferences":{"language":"中文","style":"简洁直接","detail_level":"中等"},"interests":["AI Agent","RAG","云原生"],"known_facts":["使用Python开发","团队有5个人","在做智能客服项目"]}每次对话前把用户画像拼到系统提示词里,Agent 就「认识」用户了。
怎么更新画像
- 对话中发现新信息,自动提取更新
- 可以专门让模型判断「这段对话有没有新的用户信息需要记住」
四、向量记忆(知识库记忆)
是什么
外部知识库,比如产品文档、FAQ、内部手册、历史工单……向量化后存在向量数据库里,需要的时候检索出来。
就是 RAG(检索增强生成)那一套。
工作流程
文档 → 分块 → 向量化 → 存入向量数据库 用户提问 → 问题向量化 → 向量检索 → 拿到相关片段 → 拼进上下文 → 模型生成回答跟长期记忆的区别
- 长期记忆:用户的历史对话、个人信息,跟特定用户相关
- 向量记忆:通用知识库,所有用户共享的知识
常用的向量数据库
- Chroma:轻量,本地文件,开发方便
- Pinecone:云服务,托管型
- Weaviate:功能全,开源
- Milvus:开源,高性能,企业级
- Qdrant:开源,Rust 写的,性能好
- pgvector:PostgreSQL 插件,已有 PG 的话方便
检索优化
不是简单搜一下就完了,要优化召回率:
- 混合检索:向量检索 + 关键词检索(BM25)
- 重排序:召回一批之后用 reranker 模型精排
- 查询改写:把用户问题改写成更适合检索的关键词
- 分块策略:合理的 chunk 大小和重叠
RAG 优化是个大学问,后面专门有一篇讲 RAG + Agent 的结合。
五、记忆的读写流程
读记忆(检索)
每次回答问题前,从各层记忆里取相关内容:
用户提问 ↓ ┌─ 读向量记忆:检索相关知识库 ─┐ ├─ 读长期记忆:检索相关历史对话 ┤ └─ 读短期记忆:当前对话上下文 ─┘ ↓ 拼到 prompt 里 ↓ 模型生成回答写记忆(存储)
回答完之后,更新记忆:
对话结束 ↓ ┌─ 写入短期记忆:加入 messages ──┐ ├─ 写入长期记忆:存对话记录 ─────┤ ├─ 更新用户画像:提取新信息 ─────┤ └─ (可选)写入知识库:新的知识 ─┘反思式记忆
更高级的做法:对话结束后,让模型自己总结「这次对话有什么需要记住的?」
请总结这段对话中需要记住的用户信息和关键事实, 格式为JSON,包含preferences和facts两个字段。把总结出来的结构化信息更新到长期记忆里。
六、记忆的常见问题
问题 1:记忆太多,上下文装不下
解决:
- 不是全量塞,而是检索相关的
- 用摘要代替原文
- 分层:重要的留着,不重要的归档
问题 2:记忆过时了
用户偏好变了、知识更新了,旧记忆会误导。
解决:
- 带时间戳,新的优先
- 定期更新知识库
- 用户画像可以覆盖更新,冲突时以最新为准
问题 3:记忆冲突
前后说的不一样,比如用户先说「我用Python」后来又说「我主要写Java」。
解决:
- 以最新的为准
- 可以保留历史版本,但当前用最新的
- 重要的冲突可以主动问用户确认
问题 4:幻觉 + 记忆 = 放大幻觉
检索到的信息如果不准确,模型照着胡说,比纯对话更像真的。
解决:
- 知识库内容要保证质量
- 回答要标注来源
- 不确定的就说不确定,不要编
问题 5:隐私问题
用户对话记录存起来,涉及隐私。
解决:
- 脱敏处理
- 明确告知用户数据用途
- 提供删除记忆的功能
- 遵守相关法规(GDPR、个人信息保护法等)
七、不同类型 Agent 的记忆需求
客服 Agent
- 短期记忆:当前对话上下文,记住用户问过什么
- 长期记忆:用户历史工单、用户等级、偏好
- 向量记忆:产品知识库、FAQ、工单历史
个人助理 Agent
- 短期记忆:当前任务进展
- 长期记忆:用户日程、联系人、偏好、习惯
- 向量记忆:用户的文档、笔记、收藏
数据分析 Agent
- 短期记忆:当前查询上下文
- 长期记忆:历史查询记录、常用指标、用户习惯
- 向量记忆:数据字典、表结构说明、指标定义
代码 Agent
- 短期记忆:当前代码上下文、错误信息
- 长期记忆:项目结构、技术栈、编码规范
- 向量记忆:API 文档、代码库、最佳实践
八、记忆系统设计建议
1. 从简到繁
先做最简单的(滑动窗口短期记忆 + 向量知识库),跑通了再加长期记忆和用户画像。
2. 记忆不是越多越好
塞太多无关记忆反而干扰模型(注意力分散)。相关的才是有用的。
3. 记忆要可管理
- 用户能查看自己的记忆
- 能删除特定记忆
- 能清空所有记忆
4. 重要的记忆放系统提示词
用户名字、核心偏好这种高频重要信息,直接拼在系统提示词最前面,比检索靠谱。
5. 带时间戳
所有记忆都带时间,新的优先,旧的降级。
九、本篇小结
- Agent 记忆分三层:短期记忆(上下文)、长期记忆(用户历史)、向量记忆(知识库)
- 短期记忆:对话上下文,快但容量有限,优化用滑动窗口和摘要
- 长期记忆:跨会话的用户历史和画像,用数据库存,检索相关的使用
- 向量记忆:知识库 RAG,文档向量化,语义检索,所有用户共享
- 记忆读写:回答前检索相关记忆,回答后更新记忆
- 常见问题:上下文溢出、记忆过时、记忆冲突、幻觉放大、隐私
- 设计原则:从简到繁、相关优先、可管理、重要信息放系统提示词
下一篇讲规划能力:Agent 怎么把大任务拆成小步骤、多步推理怎么做、常见的规划方法。
我是黒漂技术佬。