Agent记忆系统
记忆系统是Agent实现持续学习、上下文保持和经验积累的关键组件。 通过合理的记忆架构,Agent能够在长周期任务中保持连贯性, 并从历史交互中学习和改进。本文将深入探讨记忆系统的设计与实现。
预计阅读时间:50分钟·难度:中级
记忆系统概述
为什么需要记忆
LLM本身是无状态的,每次调用都是独立的。但在实际应用中,Agent需要:
- 保持上下文:在多轮对话中记住之前的交流内容
- 学习经验:从成功和失败中学习,避免重复错误
- 积累知识:存储和检索领域知识、用户偏好等
- 任务追踪:记录长周期任务的进度和中间状态
- 个性化服务:记住用户特征,提供个性化体验
记忆类型
| 记忆类型 | 容量 | 持久性 | 典型应用 |
|---|---|---|---|
| 短期记忆 | 有限(上下文窗口) | 会话内 | 当前对话上下文 |
| 工作记忆 | 中等 | 任务周期 | 任务状态、中间结果 |
| 长期记忆 | 理论上无限 | 持久化 | 知识、经验、偏好 |
| 情景记忆 | 可扩展 | 持久化 | 具体事件和经历 |
短期记忆
上下文窗口
短期记忆主要通过LLM的上下文窗口实现。上下文窗口决定了Agent能"记住"多少信息。
主流LLM上下文窗口
- Claude 3:200K tokens(约15万字)
- GPT-4 Turbo:128K tokens(约10万字)
- GPT-3.5 Turbo:16K tokens
- Kimi:超长上下文(200K+)
- DeepSeek:64K tokens
上下文管理
上下文窗口管理策略
1. 截断策略 - 直接截断早期消息 - 保留系统提示和最近N轮对话 2. 摘要策略 - 将早期对话压缩为摘要 - 保留关键信息,减少token占用 3. 选择性保留 - 根据重要性评分保留消息 - 保留工具调用结果等关键信息 4. 滑动窗口 - 维护固定大小的窗口 - 新消息进入,旧消息移出 5. 分层压缩 - 短期:完整保留最近对话 - 中期:压缩为摘要 - 长期:提取关键实体和关系
摘要压缩示例
原始对话(500 tokens):
User: 我想开发一个天气应用
Agent: 好的,我来帮您规划。请问您需要哪些功能?
User: 需要查看实时天气、7天预报、空气质量
Agent: 明白了。您希望支持哪些城市?
User: 主要是一二线城市
Agent: 好的,我来设计应用架构...
压缩后(100 tokens):
[摘要] 用户想开发天气应用,功能包括实时天气、7天预报、空气质量,
覆盖一二线城市。已讨论架构设计方案,正在进行UI设计。长期记忆
向量存储
向量数据库是长期记忆的主流实现方式,通过语义相似度检索相关记忆。
常用向量数据库
- Pinecone:托管服务,易用性好
- Chroma:开源,本地部署方便
- Weaviate:支持混合检索
- Milvus:高性能,适合大规模
- Qdrant:轻量级,支持过滤
记忆存储流程
# 记忆存储流程 1. 信息提取 - 从对话中提取关键信息 - 识别实体、关系、事件 2. 向量化 - 使用Embedding模型将文本转为向量 - 选择合适的嵌入模型(如text-embedding-3) 3. 元数据附加 - 时间戳、来源、重要性等 - 便于后续过滤和排序 4. 存储 - 写入向量数据库 - 建立索引 5. 更新知识图谱(可选) - 提取实体关系 - 更新图谱结构
知识图谱
知识图谱用于存储结构化的知识和关系,适合复杂的推理场景。
知识图谱应用场景
- 用户画像:存储用户偏好、历史行为
- 领域知识:存储专业知识、概念关系
- 任务知识:存储任务模板、解决方案
- 对话状态:跟踪多轮对话中的实体状态
记忆检索
检索策略
常用检索策略
- 语义相似度:根据查询向量找最相似的记忆
- 关键词匹配:结合BM25等传统检索方法
- 时间衰减:优先返回最近的记忆
- 重要性加权:根据记忆重要性排序
- 混合检索:结合多种策略
检索优化
检索优化技巧
- • 使用重排序(Reranking)提高相关性
- • 查询扩展:扩展同义词、相关词
- • 分段检索:按时间、主题分段检索
- • 缓存热点记忆:减少重复检索
- • 自适应检索数量:根据任务复杂度调整
记忆架构设计
分层记忆架构
┌─────────────────────────────────────────┐ │ Agent Core │ ├─────────────────────────────────────────┤ │ ┌─────────────────────────────────┐ │ │ │ 短期记忆(Context Window) │ │ │ │ 当前对话 + 任务状态 │ │ │ └─────────────────────────────────┘ │ │ ↓ │ │ ┌─────────────────────────────────┐ │ │ │ 工作记忆(Redis/内存) │ │ │ │ 任务进度 + 中间结果 │ │ │ └─────────────────────────────────┘ │ │ ↓ │ │ ┌─────────────────────────────────┐ │ │ │ 长期记忆(向量数据库) │ │ │ │ 知识 + 经验 + 偏好 │ │ │ └─────────────────────────────────┘ │ │ ↓ │ │ ┌─────────────────────────────────┐ │ │ │ 知识图谱(Neo4j等) │ │ │ │ 实体 + 关系 + 事件 │ │ │ └─────────────────────────────────┘ │ └─────────────────────────────────────────┘
代码示例
LangChain记忆系统示例
from langchain.memory import ConversationBufferMemory
from langchain.memory import VectorStoreRetrieverMemory
from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings
# 短期记忆:对话缓冲
short_term_memory = ConversationBufferMemory(
memory_key="chat_history",
return_messages=True
)
# 长期记忆:向量存储
embeddings = OpenAIEmbeddings()
vectorstore = Chroma(
embedding_function=embeddings,
persist_directory="./chroma_db"
)
retriever = vectorstore.as_retriever(
search_kwargs={"k": 5}
)
long_term_memory = VectorStoreRetrieverMemory(
retriever=retriever
)
# 使用记忆
from langchain.chains import ConversationChain
chain = ConversationChain(
llm=llm,
memory=short_term_memory,
verbose=True
)
# 保存重要信息到长期记忆
long_term_memory.save_context(
{"input": "用户偏好深色主题"},
{"output": "已记住您的偏好"}
)最佳实践
1. 分层存储
根据信息重要性和访问频率选择合适的存储层, 热点数据放短期,冷数据放长期。
2. 定期压缩
定期将短期记忆压缩为摘要,转移重要信息到长期记忆。
3. 遗忘机制
设计合理的遗忘机制,清除过时或不重要的记忆, 避免记忆膨胀。
4. 隐私保护
敏感信息应加密存储或脱敏处理, 提供记忆删除功能。