二 InsightMemory - 让 AI 不再“张冠李戴”:从文本块到主体记忆

7 阅读7分钟

从 chunk 到 entity:LLM 应用为什么需要以主体为中心的记忆

摘要

很多 memory 系统一上来就讨论 chunk size、embedding、top-k 和 rerank。但长期记忆的第一性问题不是怎么搜,而是这条记忆属于谁。

如果系统不能稳定回答“这条信息属于哪个主体”,那么后面的检索、总结、更新、演进和推理都会变得不可靠。

InsightMemory 的核心设计之一,就是把 memory 从全局文本池里拿出来,围绕 entity 建模。它让 AI 应用不只是 “找回相似文本”,而是能围绕正确主体沉淀长期记忆。

正文

很多 memory 系统一上来就讨论 embedding、chunk size、top-k 和 rerank。这些当然重要,但它们不是长期记忆的第一性问题。

长期记忆的第一个问题应该是:

这条记忆属于谁?

如果系统回答不了这个问题,那么后面的检索、总结、更新和推理都会变得不稳定。

这也是很多 Agent memory 后期变糊的根本原因:系统不是没有记住,而是不知道记住的东西应该挂在哪里。

为什么主体归属很重要

真实输入往往不是干净的单主体文本。一段会议记录里可能同时出现项目、负责人、服务、规则和风险项;一份报告里可能同时包含公司、行业、产品和外部事件;一次对话里可能同时修改用户偏好和任务状态。

如果这些内容都被切成 chunk 放进同一个文本池,系统后续很难知道:

  • 哪条事实属于用户;
  • 哪条事实属于项目;
  • 哪条事实属于某份文档;
  • 哪条事实是外部约束;
  • 哪条事实只是当前 observation 的上下文。

这会带来一个常见问题:召回出来的内容看起来都相关,但拼出来的答案不一定属于同一个主体。

在真实业务里,这个问题会很致命。项目状态不能和文档缺口混在一起,客户偏好不能和测试用户偏好混在一起,历史规则不能被当成当前规则,外部 checklist 也不能污染主 entity 的事实。

entity 不是 display name

以主体为中心建模时,最容易踩的坑是把 display_name 当成 identity。

比如 Apollo 可以是:

  • 一个后端服务;
  • 一个发布项目;
  • 一份内部规范;
  • 一个客户代号。

这些主体可以有相同名字,但不能共用同一个 identity。否则一个主体的记忆会污染另一个主体。

InsightMemory 的做法是区分:

  • entity_key:系统分配的 opaque id,只负责身份稳定性;
  • display_name:对外展示的人类可读名字,可以变化;
  • identity_profile:用于区分同名主体的语义画像;
  • memory:属于某个 entity 的事实、状态、规则或结论。

这样一来,名字只是线索,不是最终身份。

这件事看起来像实现细节,实际上是长期记忆的地基。没有稳定 identity,memory graph 后面的所有 edge 都可能建立在错误节点上。

写入时发生了什么

在 InsightMemory 里,写入一段自然语言时,系统不会直接把文本切块入库,而是让 LLM 参与做几件事:

  • 抽取输入中可能存在的主体;
  • 为主体生成受约束的 identity profile draft;
  • 抽取候选 memory;
  • 判断候选 memory 应该属于哪个 entity;
  • 对比已有 memory,判断是更新、补充、冲突还是并存;
  • 保存 observation 作为原始证据。

数据库保存的是稳定结构,LLM 负责语义理解。两者边界很清楚。

这也是 InsightMemory 和“把 LLM 输出摘要直接存起来”的区别。LLM 负责理解,但系统不会把自由文本摘要当成唯一真相;数据库保存的是 identity、memory、evidence、relation 和 history。

查询时发生了什么

召回时,系统也不应该只做 query embedding。

一个 entity-centered memory 系统应该先判断用户在问哪个主体,然后从这个主体相关的 memories 出发,再根据需要扩展 edge。

例如用户问:

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

系统应该优先解析到 Atlas 发布项目,而不是仅仅召回所有包含 Atlas阻塞 的文本。

这个差别决定了系统是在“搜索相似文本”,还是在“围绕正确主体召回记忆”。

如果说 RAG 的核心动作是 retrieval,那么 entity-centered memory 的核心动作是 ownership resolution。先确定主体,再组织记忆,这个顺序不能反。

一个真实评测过的多主体文档案例

仓库里有一个更接近企业 Copilot 的评测用例:multi_subject_same_prefix_artifacts_split。它模拟的是一段文档里同时出现多个同前缀主体,而且每个主体都有自己的事实。

评测写入:

Field operations digest: Latchmere plan 当前目标是周五前补齐 berth packet;Latchmere review 当前负责人是 Noor Patel;Latchmere bulletin 当前要求 every berth packet include quay tag;Latchmere register 之前允许 quay tag 在 departure 后 8 hours 内补录;Latchmere checklist 当前要求 quay tag 和 seal memo 一起提交。以上五个对象名称相近,但分别是 plan、review、bulletin、register、checklist。

这个输入里有 5 个相近主体:Latchmere planLatchmere reviewLatchmere bulletinLatchmere registerLatchmere checklist

评测查询包括:

Latchmere review 当前负责人是谁?
Latchmere bulletin 当前要求什么?

第一问必须回答 Noor Patel。第二问必须回答 quay tag,并且不能把 Noor Patel 混进去。

这个 case 的 expected state 要求系统形成 5 个 entity、5 条 memory、1 条 observation,并完成 2 次 recall audit。它验证的就是:长文里多个相近主体同时出现时,系统不能把它们错误合并。

这个案例比普通同名测试更接近企业知识库和 Copilot 场景:真实文档往往不会干净地一次只讲一个对象,而是把项目、review、bulletin、register、checklist 混在一起。没有 entity-centered memory,这类输入很容易变成一个污染严重的 chunk。

为什么这适合 Agent

Agent 在长期运行中会不断接收新信息。它遇到的不是一次性文档问答,而是持续变化的任务状态、用户偏好、项目约束、工具结果和历史决策。

如果没有 entity 层,所有记忆都会被揉进一个全局上下文里。系统短期看起来可用,长期会越来越难维护。

以 entity 为中心之后,Agent 可以更稳定地做到:

  • 记住不同用户的长期偏好;
  • 区分同名项目或文档;
  • 维护某个任务的当前状态;
  • 保留某条规则的历史版本;
  • 在回答时带出相关证据。

更重要的是,Agent 可以开始形成“关于某个对象的长期理解”。它不再只是把过往文本塞回 prompt,而是能围绕用户、项目、文档、服务、规则和结论建立持续积累的记忆结构。

和普通 RAG 的关系

InsightMemory 不是否定 RAG。

RAG 很适合从外部知识库里找材料。InsightMemory 要解决的是另一个问题:当 AI 应用持续运行后,系统自己产生的经验、状态、规则和结论如何被沉淀、维护和召回。

一个成熟 AI 应用很可能同时需要两层:

  • RAG:从外部材料中检索知识;
  • Memory:把长期交互和运行过程沉淀成可演进的内部经验。

这两者不是替代关系,而是互补关系。

小结

长期记忆不是一个更大的 prompt,也不是一个更强的向量库。它首先是一套 identity 和 ownership 模型。

当系统能回答“这条记忆属于谁”时,后面的更新、召回、解释和演进才有稳定基础。

这就是 InsightMemory 采用 entity-centered memory 的原因。

它想做的是让 AI 不再只有“上下文”,而是拥有围绕主体组织起来的长期认知结构。

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

如果你也遇到过 Agent 记忆串台、同名主体混淆、长期运行后上下文污染的问题,欢迎试用 InsightMemory,并反馈真实 case。项目仍需要 LLM API-KEY、调用额度和更多评测样本来继续打磨。