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. 隐私保护

敏感信息应加密存储或脱敏处理, 提供记忆删除功能。

----