如何让 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 越用越懂你,坏的记忆系统让它越用越离谱。
💻 全栈开发专家
长期记忆的存储与检索,我给一套可直接落地的方案矩阵:
存储方案选型:
- 结构化 KV/关系库(语义记忆):稳定的用户事实与偏好(姓名、组织、偏好设置)——精确读写、可编辑可删除,合规友好;
- 向量库(情景记忆):对话事件、任务结论的 Embedding——模糊语义召回「用户之前提过类似什么」;
- 图库(关系记忆):实体关系网络(用户-项目-同事),复杂个性化才需要;
- 成品方案优先试: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 命名空间,串户是事故)、可删除(用户行使「被遗忘权」,全链路含向量索引都要删得掉)。验证:记忆命中率(注入的记忆被回答使用了)和记忆污染率(错误记忆导致答错)两个指标都要盯。