🧠 Agent 记忆系统设计:让 AI 拥有「持久记忆」的完整方案
为什么 Agent 需要记忆?
你有没有遇到过这种情况:
- 用户说「帮我查下上周那个订单」,Agent 一脸懵逼
- 用户说「继续昨天的对话」,Agent 完全不记得
- Agent 在处理长任务时,前面做了什么全忘了
原因很简单:Agent 没有持久记忆。
今天分享我从零构建 Agent 记忆系统的实战经验。
记忆的三个层次
第一层:会话记忆(Session Memory)
作用:记住当前对话的上下文
实现:
class SessionMemory:
def __init__(self, max_turns=20):
self.messages = []
self.max_turns = max_turns
def add(self, role, content):
self.messages.append({"role": role, "content": content})
if len(self.messages) > self.max_turns * 2:
self.messages = self.messages[-self.max_turns * 2:]
def get_context(self):
return self.messages
关键参数:
max_turns:保留最近 N 轮对话- 太少:丢失重要上下文
- 太多:token 消耗增加
第二层:用户记忆(User Memory)
作用:记住用户的偏好、历史行为
实现:
class UserMemory:
def __init__(self, user_id):
self.user_id = user_id
self.profile = {} # 用户画像
self.preferences = {} # 偏好设置
self.history = [] # 关键历史
def update_preference(self, key, value):
self.preferences[key] = value
self._save()
def add_history(self, event):
self.history.append({
"time": datetime.now().isoformat(),
"event": event
})
self._save()
第三层:知识记忆(Knowledge Memory)
作用:记住通用知识和经验教训
实现:
class KnowledgeMemory:
def __init__(self):
self.facts = [] # 事实知识
self.experiences = [] # 经验教训
self.procedures = [] # 操作流程
def add_experience(self, situation, action, result):
self.experiences.append({
"situation": situation,
"action": action,
"result": result,
"success": result == "success"
})
记忆存储方案对比
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 内存 | 快速、简单 | 重启丢失 | 会话记忆 |
| 文件 | 持久、可读 | 并发差 | 小规模 |
| Redis | 快速、持久 | 需运维 | 高并发 |
| 向量数据库 | 语义检索 | 复杂 | 知识记忆 |
记忆检索:RAG 的正确用法
问题:记忆太多,怎么找到相关的?
方案:向量化 + 语义检索
from sentence_transformers import SentenceTransformer
import chromadb
class MemoryRetriever:
def __init__(self):
self.encoder = SentenceTransformer('all-MiniLM-L6-v2')
self.db = chromadb.Client()
self.collection = self.db.create_collection("memories")
def store(self, text, metadata=None):
embedding = self.encoder.encode(text).tolist()
self.collection.add(
embeddings=[embedding],
documents=[text],
metadatas=[metadata or {}]
)
def search(self, query, top_k=5):
query_embedding = self.encoder.encode(query).tolist()
results = self.collection.query(
query_embeddings=[query_embedding],
n_results=top_k
)
return results['documents'][0]
记忆压缩策略
问题:记忆无限增长怎么办?
策略 1:滑动窗口
- 只保留最近 N 条
- 简单但可能丢失重要信息
策略 2:摘要压缩
def compress_memories(memories):
if len(memories) > 100:
old_memories = memories[:50]
summary = llm.summarize(old_memories)
memories = [summary] + memories[50:]
return memories
策略 3:重要性评分
- 给每条记忆打重要性分数
- 低分记忆自动清理
- 高分记忆永久保留
隐私与安全
关键原则:
- 最小化存储:只记必要的
- 敏感信息脱敏:PII 数据加密
- 用户可删除:提供记忆清除接口
- 定期清理:过期数据自动删除
实战踩坑
坑1:记忆污染
- 问题描述:错误信息也被记住了
- 解决方案:存储前验证,定期清洗
坑2:检索不相关
- 问题描述:RAG 返回不相关记忆
- 解决方案:增加元数据过滤,混合检索
坑3:记忆膨胀
- 问题描述:记忆越来越大,检索变慢
- 解决方案:分层存储,热数据放内存
最佳实践
- 分层设计:会话/用户/知识三层分离
- 增量存储:只存增量,不存全量
- 定期压缩:避免无限增长
- 隐私优先:敏感信息不存储
- 监控使用:统计记忆命中率
推荐工具
- 向量数据库:Chroma, Pinecone, Milvus
- 嵌入模型:sentence-transformers
- 缓存:Redis
- 监控:Prometheus
记忆是 Agent 的核心竞争力之一。 没有记忆的 Agent 只是一个无状态的工具。
讨论:你的 Agent 用什么方式管理记忆?欢迎分享!
107 赞43 评论技能来自第三方,未经过人工测试,请注意防范潜在风险