记忆持久化的核心挑战
Agent的会话记忆在对话结束后就消失了。要让Agent"记住"用户偏好、历史交互和学到的知识,需要将记忆持久化到外部存储。如何存储、如何检索、如何遗忘——这是记忆持久化的三大问题。
存储方案对比
方案一:向量数据库
最主流的记忆存储方案:
class VectorMemory:
def __init__(self, vector_db):
self.db = vector_db
async def store(self, content, metadata=None):
embedding = await self.embed(content)
self.db.insert({
"content": content,
"embedding": embedding,
"metadata": metadata,
"timestamp": datetime.now()
})
async def retrieve(self, query, top_k=5):
query_vec = await self.embed(query)
results = self.db.search(query_vec, top_k=top_k)
return results
优点: 语义检索、灵活查询 缺点: 缺乏结构化关系、时间感知弱
方案二:关系数据库+摘要
class RelationalMemory:
def __init__(self, db):
self.db = db
async def store_interaction(self, user_id, session_data):
# 存储完整交互
self.db.insert("interactions", {
"user_id": user_id,
"session_id": session_data.id,
"summary": await self.summarize(session_data),
"key_points": json.dumps(session_data.key_points),
"timestamp": session_data.start_time
})
async def get_user_context(self, user_id):
"""获取用户上下文"""
interactions = self.db.query(
"SELECT * FROM interactions WHERE user_id = ? ORDER BY timestamp DESC LIMIT 10",
[user_id]
)
return self.build_context(interactions)
优点: 结构化、可精确查询 缺点: 无法语义检索
方案三:知识图谱
class GraphMemory:
def __init__(self, graph_db):
self.db = graph_db
async def store_fact(self, subject, predicate, obj):
"""存储三元组"""
self.db.run(
"MERGE (s:Entity {name: $subject}) "
"MERGE (o:Entity {name: $object}) "
"MERGE (s)-[r:RELATION {type: $predicate}]->(o)",
subject=subject, predicate=predicate, object=obj
)
async def query_relations(self, entity):
"""查询实体关系"""
return self.db.run(
"MATCH (e:Entity {name: $entity})-[r]->(related) "
"RETURN e, r, related",
entity=entity
)
优点: 关系推理能力强、结构化 缺点: 构建成本高、灵活性低
方案四:混合方案(推荐)
class HybridMemory:
def __init__(self):
self.vector_db = VectorDB() # 语义检索
self.relational_db = PostgresDB() # 结构化查询
self.graph_db = Neo4jDB() # 关系推理
self.cache = Redis() # 热数据缓存
async def store(self, interaction):
# 1. 完整交互存入关系数据库
await self.relational_db.store(interaction)
# 2. 摘要存入向量数据库
summary = await self.summarize(interaction)
await self.vector_db.store(summary, metadata={
"user_id": interaction.user_id,
"timestamp": interaction.timestamp
})
# 3. 提取的知识存入图谱
facts = await self.extract_facts(interaction)
for fact in facts:
await self.graph_db.store_fact(*fact)
记忆类型与存储策略
用户偏好记忆
存储: "用户喜欢简洁的回答" → 存入用户配置
检索: 每次生成前读取用户偏好
更新: 显式更新(用户说"我想要更详细")
持久性: 永久
交互历史记忆
存储: 每次对话的摘要
检索: 基于当前话题语义检索相关历史
更新: 追加
持久性: 30天完整,之后仅保留摘要
知识记忆
存储: 从交互中提取的事实和规则
检索: 基于实体和关系查询
更新: 增量更新,可修正
持久性: 永久(除非被更正)
技能记忆
存储: 学会的工具调用模式
检索: 遇到类似任务时调用
更新: 新的成功案例
持久性: 永久
遗忘机制
基于时间的遗忘
def time_based_decay(memory_item):
age_days = (datetime.now() - memory_item.timestamp).days
decay_factor = math.exp(-age_days / 30) # 30天半衰期
memory_item.weight *= decay_factor
if memory_item.weight < 0.01:
delete(memory_item) # 权重过低则删除
基于使用的遗忘
def usage_based_cleanup(memories):
for m in memories:
if m.last_accessed < datetime.now() - timedelta(days=90):
if m.access_count < 3: # 很少被检索
archive_or_delete(m)
基于质量的遗忘
def quality_based_filtering(memories):
for m in memories:
if m.feedback_score < 0: # 被标记为错误
delete(m)
elif m.feedback_score < 0.3: # 低质量
degrade(m) # 降级为摘要
合并压缩
async def merge_similar_memories(self):
"""合并相似记忆条目"""
all_memories = await self.get_all()
# 聚类
clusters = cluster(all_memories, threshold=0.85)
for cluster in clusters:
if len(cluster) > 1:
# 生成合并摘要
merged = await self.llm.summarize(cluster)
# 删除原条目,存入合并后的摘要
for m in cluster:
await self.delete(m)
await self.store(merged)
检索策略
多路召回
async def retrieve_memories(self, query, user_id):
# 1. 向量检索(语义相关)
semantic_results = await self.vector_db.search(
embed(query),
filter={"user_id": user_id},
top_k=10
)
# 2. 图谱检索(实体相关)
entities = extract_entities(query)
graph_results = await self.graph_db.query_relations(entities)
# 3. 时间检索(最近交互)
recent_results = await self.relational_db.query_recent(
user_id, limit=5
)
# 4. 融合排序
all_results = semantic_results + graph_results + recent_results
return self.rerank(all_results, query)
上下文构建
async def build_context(self, query, user_id):
memories = await self.retrieve_memories(query, user_id)
context = "## 相关记忆\n"
# 用户偏好
context += f"用户偏好: {memories.preferences}\n"
# 相关历史
for m in memories.history[:3]:
context += f"之前讨论过: {m.summary}\n"
# 相关知识
for fact in memories.facts[:5]:
context += f"已知: {fact}\n"
return context
隐私与安全
数据最小化
只存储必要的信息:
- 不存储完整的原始对话
- 只存摘要和关键信息
- 敏感信息脱敏后存储
访问控制
class MemoryAccessControl:
def check_access(self, user_id, memory):
# 只能访问自己的记忆
if memory.user_id != user_id:
return False
# 敏感记忆需额外验证
if memory.sensitivity == "high":
return self.verify_identity(user_id)
return True
记忆删除权
用户有权要求删除所有记忆:
async def delete_all_user_data(self, user_id):
await self.vector_db.delete_by_user(user_id)
await self.relational_db.delete_by_user(user_id)
await self.graph_db.delete_by_user(user_id)
await self.cache.delete_by_user(user_id)
# 符合GDPR"被遗忘权"
总结
Agent记忆持久化是"记住过去以改善未来"的技术。混合存储方案——向量数据库做语义检索、关系数据库做结构化存储、知识图谱做关系推理——是当前最全面的方案。但记忆管理的核心不是"存什么",而是"忘什么"——好的遗忘机制让记忆保持高效和有用。记忆系统是Agent"人格连续性"的基础,没有持久化记忆的Agent,每次对话都是从零开始。