Long-term Memory
Long-term Memory 是 Agent 跨会话持久化的记忆,包含用户画像、偏好、历史摘要和关键事实。它的生命周期比会话长,可能永久保存。
#type / concept
#status / evergreen
#tech / ai
[!info] related notes
- 所属 MOC: AI Agent Application MOC
- 相关: Memory Manager, User Profile Injection
Long-term Memory
一句话定义
Long-term Memory 是 Agent 跨会话持久化的记忆。用户第二次来对话时,Agent 应该记得他上次说了什么、他的偏好是什么、他的背景是什么。
核心原理
长期记忆的类型
| 类型 | 例子 | 更新频率 |
|---|---|---|
| 用户画像 | 年龄、性别、职业 | 低 |
| 偏好 | 喜欢简洁回答、常用语言 | 中 |
| 历史摘要 | ”用户上周咨询过膝关节问题” | 中 |
| 关键事实 | ”用户对花生过敏” | 低 |
| 行为模式 | ”用户通常周末提问” | 低 |
Python 实现
class LongTermMemory:
def __init__(self, db):
self.db = db
async def get_user_profile(self, user_id: str) -> dict:
"""获取用户画像"""
return await self.db.query(
"SELECT * FROM user_profiles WHERE user_id = ?", user_id
)
async def update_user_profile(self, user_id: str, updates: dict):
"""更新用户画像(合并更新)"""
profile = await self.get_user_profile(user_id) or {}
profile.update(updates)
await self.db.upsert("user_profiles", user_id, profile)
async def get_facts(self, user_id: str) -> list[str]:
"""获取关键事实"""
return await self.db.query(
"SELECT fact FROM user_facts WHERE user_id = ?", user_id
)
async def add_fact(self, user_id: str, fact: str):
"""添加关键事实"""
await self.db.insert("user_facts", {"user_id": user_id, "fact": fact})
async def get_session_summaries(self, user_id: str, limit: int = 5) -> list[str]:
"""获取历史会话摘要"""
return await self.db.query(
"SELECT summary FROM sessions WHERE user_id = ? ORDER BY updated_at DESC LIMIT ?",
user_id, limit
)
从对话中提取长期记忆
class MemoryExtractor:
def __init__(self, llm):
self.llm = llm
async def extract_from_conversation(self, messages: list[Message]) -> dict:
"""从对话中提取用户信息"""
prompt = f"""
分析以下对话,提取用户的关键信息。
对话:
{format_messages(messages)}
请提取:
1. 用户偏好
2. 关键事实
3. 需要记住的信息
输出 JSON 格式。
"""
result = await self.llm.chat(prompt)
return json.loads(result)
常见设计模式
1. 自动提取
每轮对话后用 LLM 自动提取需要记住的信息。
2. 用户可控
用户可以查看和修改 Agent 记住的信息。
3. 遗忘机制
过期的记忆自动衰减或删除。
常见坑
- 不提取长期记忆: 每次对话都从零开始
- 提取太泛: 记住了太多不重要的信息
- 不做隐私保护: 记住了用户不想被记住的信息
- 记忆冲突: 新旧信息矛盾时不知道以哪个为准