Agent Memory 智能体记忆系统
定义
世界上有一种能力叫做Agent Memory,它就像AI的"海马体"——第一次见面时记住你的名字,第二次就再也不叫错...
Agent Memory是智能体存储、检索和管理历史信息的系统机制,让AI Agent能够在多轮对话中保持上下文一致性,记住用户偏好、积累知识、学习经验。
核心原理
1. 记忆类型
| 类型 | 存储位置 | 生命周期 | 用途 |
|---|---|---|---|
| 工作记忆 | 内存/Context | 单次对话 | 当前任务处理 |
| 短期记忆 | Redis/内存 | 数小时~数天 | 会话连续性 |
| 长期记忆 | 数据库/向量库 | 永久 | 知识积累 |
| 情景记忆 | 向量数据库 | 按需检索 | 相似经验调用 |
2. 记忆存储架构
┌─────────────────────────────────────────┐
│ Agent Memory │
├─────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────────┐ │
│ │ Working Mem │ │ Short-term Mem │ │
│ │ (Context) │ │ (Redis) │ │
│ └─────────────┘ └─────────────────┘ │
│ ┌─────────────┐ ┌─────────────────┐ │
│ │ Long-term │ │ Episodic Mem │ │
│ │ (Database) │ │ (Vector Store) │ │
│ └─────────────┘ └─────────────────┘ │
└─────────────────────────────────────────┘
3. 记忆检索机制
- 时间衰减:越近的记忆权重越高
- 重要性加权:用户强调的内容权重高
- 向量相似度:语义相似的记忆优先召回
- 记忆压缩:摘要存储节省空间
OpenClaw实战应用
会话记忆管理
OpenClaw通过上下文管理保持会话连贯性:
# 自动记忆用户偏好
用户: "我喜欢简洁的回答风格"
→ 系统记录: preference.response_style=concise
→ 下次自动使用简洁风格
# 记住已完成的任务
用户: "继续刚才的报告"
→ 检索: 找到上一个会话的上下文
→ 加载: 报告进度和已完成内容
→ 继续: 从中断处开始
知识库集成
OpenClaw支持RAG增强记忆:
# 向量检索相似记忆
用户: "之前那个Python爬虫项目"
→ 向量搜索: "Python 爬虫 项目"
→ 召回: 历史对话中的相关上下文
→ 加载: 提供相关背景信息
持久化存储
{
"session": {
"sessionId": "session_abc123",
"context": {
"preferences": {
"language": "中文",
"response_style": "专业详细"
},
"history": [
{"role": "user", "content": "帮我写个爬虫"},
{"role": "assistant", "content": "已完成..."}
]
},
"long_term_memory": {
"projects": ["爬虫项目", "数据分析"],
"topics": ["AI", "Python"]
}
}
}
代码示例
实现简单记忆系统
class AgentMemory:
"""简单的Agent记忆系统"""
def __init__(self):
self.short_term = [] # 短期记忆
self.long_term = {} # 长期记忆
def add_memory(self, content, memory_type="short"):
"""添加记忆"""
if memory_type == "short":
self.short_term.append({
"content": content,
"timestamp": time.time()
})
# 超过阈值时压缩到长期记忆
if len(self.short_term) > 100:
self._compress_to_long_term()
else:
self.long_term[str(time.time())] = content
def retrieve(self, query, top_k=5):
"""检索相关记忆"""
# 向量相似度检索(简化版)
results = []
for mem in self.short_term:
if self._similarity(query, mem["content"]) > 0.7:
results.append(mem)
return results[:top_k]
def _compress_to_long_term(self):
"""压缩短期记忆到长期记忆"""
summary = self._summarize(self.short_term)
self.long_term[str(time.time())] = summary
self.short_term = []
向量记忆存储
from langchain.memory import VectorStoreRetrieverMemory
from langchain_community.vectorstores import Chroma
# 创建向量记忆存储
vectorstore = Chroma.from_texts(
memory_texts,
embedding=OpenAIEmbeddings()
)
# 创建记忆检索器
retriever = vectorstore.as_retriever(
search_kwargs={"k": 5}
)
# 创建记忆组件
memory = VectorStoreRetrieverMemory(
retriever=retriever,
memory_key="chat_history",
return_messages=True
)
# 在Agent中使用
agent = ConversationalChatAgent.from_llm_and_tools(
llm=llm,
tools=tools,
memory=memory
)
最佳实践
- ✅ 分层存储:区分短期/长期/情景记忆
- ✅ 隐私保护:敏感信息加密存储
- ✅ 记忆压缩:摘要存储减少token消耗
- ✅ 增量更新:避免重复存储相似内容
- ❌ 不要存储所有内容:筛选有价值的信息
- ❌ 避免记忆污染:定期验证记忆准确性