一 InsightMemory - 从 RAG 到 Memory:AI 应用缺的不是搜索,而是持续认知

10 阅读7分钟

为什么只靠向量检索做不好长期记忆

摘要

过去很多 LLM 应用把 memory 做成了“历史文本切块 + 向量检索 + prompt 拼接”。这套方案可以解决语义搜索,但解决不了长期记忆。

长期记忆真正难的不是“能不能找回相似文本”,而是系统能不能持续判断信息属于谁、能不能把当前事实和历史事实分开、能不能维护更新和冲突关系、能不能在回答时给出证据链。

InsightMemory 的核心判断是:AI 应用的下一层基础设施,不会只是更大的 context window,也不会只是更强的 embedding,而是一套能理解、组织、演进和追溯的 memory layer。

正文

很多 LLM 应用在做 memory 时,第一反应是把历史对话、文档、日志切成 chunk,然后放进向量数据库。查询时再用 embedding 找相似内容,最后把召回片段塞回 prompt。

这套方法很适合语义搜索,但它和“长期记忆”之间还有明显距离。

长期记忆不只是把过去的文本找回来。真正难的是:系统能不能判断一条信息属于谁,能不能知道新事实是在更新旧事实还是补充旧事实,能不能把当前状态和历史状态分开,能不能在回答时说明证据来自哪里。

如果这些问题没有被建模,memory 很容易变成一个越来越大的文本池。

短期看,这样的系统会让人觉得“记住了很多”。长期看,它只是把越来越多的旧事实、过期状态、冲突版本和错误归属一起塞回 prompt。Agent 不是更聪明了,而是被更多噪音包围了。

向量记忆的典型问题

纯向量记忆通常有几个明显短板。

第一,同名主体容易混淆。比如 Atlas 可能是一个发布项目,也可能是一份知识文档。向量检索只看文本相似度时,很容易把两个主体的事实召回到同一个答案里。

第二,当前事实和历史事实容易混在一起。一个规则以前允许 24 小时内补录,后来改成必须先审批。如果系统只保存文本片段,那么查询“现在要求什么”时,历史规则也可能被当成当前答案。

第三,更新关系不可见。新信息到底是覆盖旧信息、补充旧信息、冲突旧信息,还是只是并存事实?如果没有显式关系,系统只能把所有内容都追加进去。

第四,why/how 问题很难回答。用户问“为什么不能切换模板”,答案可能需要同时召回 blocker 和外部 checklist。这不是简单相似度能稳定解决的问题。

第五,证据链不稳定。很多系统能给出一个“像是对的”答案,但很难追溯到原始 observation、历史变化和支持关系。

这五个问题加起来,说明 vector memory 不是“不够好”,而是模型层次不够。它解决的是 retrieval,不是 memory model。真正的长期记忆系统需要把 identity、state、history、relation 和 evidence 都纳入设计。

更大的 context 不能替代 memory

很多人会觉得,既然模型上下文越来越大,长期记忆是不是可以直接靠大窗口解决。

我认为恰恰相反:context 越大,memory 越重要。

大 context 解决的是“能塞进去多少材料”,memory 解决的是“哪些材料应该被组织成长期经验”。没有 memory 层,大 context 只会让系统更容易把无关、过时、冲突的信息一起塞进去。

长期运行的 Agent 不缺材料,它缺的是一套能持续整理材料的认知结构。

长期记忆需要什么

我做 InsightMemory 时,把长期记忆拆成几个稳定对象:

  • entity:这条记忆属于谁。
  • memory:系统关于这个主体沉淀出的稳定事实、状态、规则或结论。
  • observation:原始输入证据,只追加,不把它当成可变真相。
  • edge:memory 之间的关系,比如 update、support、conflict、derivation。

这意味着写入时不只是“存文本”,而是让 LLM 参与理解:

  • 输入里有哪些稳定主体;
  • 每条候选记忆应该挂到哪个主体;
  • 新旧记忆之间是什么关系;
  • 哪些原始 observation 支撑了这条 memory。

召回时也不只是“找相似片段”,而是先解析目标 entity,再从该主体的 memory 和关联 edge 中组织答案。

一个真实评测里的简单例子

写入两条记忆:

Atlas 是发布项目,当前主阻塞是数据库迁移失败。
Atlas 是知识文档,当前缺少回滚说明。

评测查询:

Atlas 发布项目 当前主阻塞是什么?

评测要求答案必须包含 数据库迁移失败,并且不能混入 回滚说明。也就是说,系统必须把 Atlas 发布项目Atlas 知识文档 拆成两个 entity,而不是因为它们都叫 Atlas 就混在一起。

这个 case 在多个评测报告里跑通过,例如 default_matrix_high_concurrency_v1_genericsame_name_live_v4。它验证的不是“能不能搜到 Atlas”,而是“能不能在同名主体中保持正确归属”。

InsightMemory 的思路

InsightMemory 的定位不是替代所有 RAG,而是补上长期记忆层。

它把 LLM 用在理解和组织记忆上,把数据库用于持久化 identity、memory、evidence、relation 和 history。这样做的目标是让系统具备几个能力:

  • 同名 entity 隔离;
  • 当前态和历史态并存;
  • 新信息可以更新、补充、冲突或支持已有 memory;
  • 召回时可以沿 memory edge 找到相关上下文;
  • 答案可以返回 citation 和 observation 证据链。

这也是为什么我认为长期记忆不应该被简化成“向量库加 prompt”。向量检索是重要组件,但它不是完整的 memory model。

更直接地说,InsightMemory 想做的是 AI 应用的持续认知层。它不是把过去的文本临时找回来,而是把长期交互中出现的主体、事实、状态、规则、证据和关系沉淀成可维护的记忆网络。

这层能力一旦稳定,Agent 才有机会从“每次都很聪明”升级为“越用越理解你的世界”。

适合哪些开发者关注

如果你的应用只是一次性文档问答,普通 RAG 可能已经够用。

但如果你在做下面这些系统,长期记忆会很快变成核心问题:

  • 需要持续记住用户偏好和任务状态的个人 Agent;
  • 需要长期跟踪项目、规则、事故和决策的企业 Copilot;
  • 需要区分同名公司、文档、项目和策略的知识系统;
  • 需要回答 current、historical、why 和 how 的研究助手;
  • 需要给出 citation、支持审计和调试的严肃 AI 应用。

这些场景的共同点是:它们不只是“查资料”,而是在运行过程中不断形成经验。

小结

RAG 解决的是“从材料里找信息”。长期记忆要解决的是“系统如何持续理解、组织、维护和召回自己的经验”。

如果你的 Agent 只需要临时查资料,向量检索可能已经够用。如果你希望它长期记住用户、项目、规则、变化历史和证据链,那么你需要一个更结构化的 memory 层。

InsightMemory 正是在这个方向上的一次开源尝试。

它的野心不是再做一个 memory demo,而是把 LLM 应用里的长期记忆做成一层可独立部署、可评估、可追溯、可扩展的基础设施。

GitHub: https://github.com/MarvekW/InsightMemory

如果你正在做 Agent、Copilot、RAG 或知识系统,欢迎试用、提 issue、贡献评测 case。项目仍在快速迭代中,也欢迎提供 LLM API-KEY、调用额度或真实接入反馈,帮助继续完善评测和长期记忆实验。