Skip to content

如何让 AI Agent 具备长期记忆能力?有哪些存储和检索方案? ​

  • 标签:AI、大模型、Agent

🏛 业务架构师 ​

Agent 长期记忆的存储与检索方案,我按"三种数据形态×配套方案"讲:

方案一·向量库方案(情景记忆):把历史会话要点、事件摘要向量化存储(每条带时间、用户、任务类型元数据),新任务时按当前上下文语义检索 Top-K 相关记忆注入。

  • 检索:向量召回+元数据过滤+时间衰减加权(旧记忆降权);
  • 适用:对话型 Agent、跨会话上下文关联;
  • 优劣:通用性强;但检索不保证精确,重要事实不能只靠它。

方案二·结构化档案(语义记忆):用 LLM 定期从交互中抽取结构化字段(用户偏好、关键属性、重要事件)写入 Profile 表(KV 或关系型),查询就是精确取数。

  • 适用:用户画像、客户 360、配置型记忆;
  • 优劣:精确可控可审计;但 schema 要预先设计,长尾信息装不下。

方案三·任务经验库(程序性记忆):把"什么任务用什么策略成功率高"沉淀为案例库(成功轨迹+失败教训),按任务相似度检索参考——Agent 的"错题本+最佳实践库"。

生产建议:三者组合是标配——档案存"确定事实"、向量库存"模糊情景"、经验库存"方法论"。配套机制比选型更重要:写入过滤(敏感信息不入库)、冲突更新(新信息覆盖旧信息)、遗忘机制(过期数据清理)、用户可见可删(合规要求)。记忆系统要像数据资产一样有 Owner、有质量指标(记忆命中率、记忆污染率),否则三个月后就是一座无人敢信的垃圾山。

🏗 系统架构师 ​

长期记忆方案我按**"记什么 → 怎么存 → 怎么取 → 怎么治"**的存储层次设计:

记忆分类:

  • 语义记忆(用户事实与偏好):职业、习惯、约束("部署要走审核")→ 结构化存储;
  • 情节记忆(历史任务事件):做过什么、结论如何 → 向量化;
  • 程序记忆(验证过的做法):成功的工具链、代码模板 → 文件/知识库。

存储选型(三层):

  • 结构化层:Postgres——事实表(主体-属性-值 + 置信度 + 时间戳 + 来源),可更新可审计;
  • 语义层:向量库——情节与文档的 embedding,语义检索;
  • 缓存层:Redis——热用户画像,会话启动秒级加载。

检索方案:任务开始时 query 向量化 → 记忆库召回 Top-K(相关性 + 时间衰减 + 置信度加权排序)→ 结构化事实直查 → 合并注入 System Prompt(预算 500~2000 token)。本质是"个人 RAG"。

治理(生产关键,多数团队栽在这):

  • 写入:会话结束异步抽取(LLM 判断值得记什么),用户显式指令("记住…")优先级最高;
  • 冲突合并:新事实覆盖旧事实带版本记录(用户改口要跟着改);
  • 衰减与遗忘:TTL + 访问频率衰减,用户可查看/编辑/删除(合规刚需);
  • 可观测:记录"本次注入了哪些记忆、命中了哪些"——记忆污染导致的诡异行为必须可归因。

架构本质:长期记忆 = Agent 的"磁盘 + 数据库",窗口是"内存"——好的记忆系统让 Agent 越用越懂你,坏的记忆系统让它越用越离谱。

💻 全栈开发专家 ​

长期记忆的存储与检索,我给一套可直接落地的方案矩阵:

存储方案选型:

  1. 结构化 KV/关系库(语义记忆):稳定的用户事实与偏好(姓名、组织、偏好设置)——精确读写、可编辑可删除,合规友好;
  2. 向量库(情景记忆):对话事件、任务结论的 Embedding——模糊语义召回「用户之前提过类似什么」;
  3. 图库(关系记忆):实体关系网络(用户-项目-同事),复杂个性化才需要;
  4. 成品方案优先试:Mem0(抽取-冲突合并-遗忘全托管)、Zep/Graphiti(时序知识图谱记忆)、LangGraph Store(与编排原生集成)。

读写管线:

python
# 写:会话结束后异步(不阻塞回复)
facts = llm_extract("从对话提取长期有效的事实", session_text)
for f in facts:
    old = store.search(namespace=("user", uid), query=f.text, limit=1)
    if similar(old): store.update(old, f)      # 冲突合并:新覆盖旧,保版本
    else: store.put(("user", uid), str(uuid4()), f)

# 读:每轮任务前,按当前消息检索注入(限 3~5 条)
mem = store.search(("user", uid), query=current_task, limit=3)
context.add(f"[已知用户信息] {mem}")

必须处理的四件事:遗忘(时间衰减+容量上限淘汰低频)、冲突(新事实优先但留版本历史)、隔离(严格 user_id 命名空间,串户是事故)、可删除(用户行使「被遗忘权」,全链路含向量索引都要删得掉)。验证:记忆命中率(注入的记忆被回答使用了)和记忆污染率(错误记忆导致答错)两个指标都要盯。