数据截至 (上游 commit 549301e79f1d)
CORE 图解析 — 异步去重、实体合并与矛盾失效
本章讲什么: 摄取把事实快速落库后,后台怎么把图「整理干净」——合并同一个人的不同写法、删掉重复事实、让过时事实失效。这是记忆保持一致与演化的关键一步。
1. 为什么要单独一步、还异步
摄取主线(§1)追求快:抽完就落库,不做全局比对。但这会留下脏数据:
- 同一个实体被建了两遍(「John」vs「John Smith」)。
- 同一个事实换种说法又存了一遍(「在 Google 工作」vs「受雇于 Google」)。
- 新事实和旧事实矛盾,但旧的还挂着
invalidAt=null。
全局去重要查整张图、还要调 LLM 判断,昂贵。所以丢到后台队列异步做——写入延迟低,整理慢慢来。入口 processGraphResolution(apps/webapp/app/jobs/ingest/graph-resolution.logic.ts:83-534)。
2. 八步全景
Step 0 按名去重实体(deduplicateEntitiesByName)── 廉价预清理
Step 1 实体解析:向量召回相似实体 → LLM 判是否同一个 → 记录 merge
Step 2 语句解析:结构匹配 + 语义相似 → LLM 判 重复/矛盾
Step 3 应用实体合并(mergeEntities:改引用再删源)
Step 4 删重复语句(先 moveAllProvenance 搬出处,再删)
Step 5 失效矛盾语句(invalidateStatements,写 invalidatedBy)
Step 6 清理孤儿实体(没有任何关系的)
Step 6.5 联系人同步(Person 实体投影到 Contacts)
Step 7 心声 aspect 解析(processAspectResolution)
Step 8 更新队列 + 信用额度对账
下面只细讲最核心的两块:实体解析(Step 1) 和 语句解析(Step 2)。