Long-term Memory

Long-term Memory 是 Agent 跨会话持久化的记忆,包含用户画像、偏好、历史摘要和关键事实。它的生命周期比会话长,可能永久保存。

#type / concept #status / evergreen #tech / ai

[!info] related notes

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. 遗忘机制

过期的记忆自动衰减或删除。

常见坑

  1. 不提取长期记忆: 每次对话都从零开始
  2. 提取太泛: 记住了太多不重要的信息
  3. 不做隐私保护: 记住了用户不想被记住的信息
  4. 记忆冲突: 新旧信息矛盾时不知道以哪个为准

参考资料

创建于 2026/6/30 更新于 2026/7/15