
Utopia实体消解深度解析三级重名检测、向量召回与可撤销合并设计【免费下载链接】utopia首个开源企业世界模型项目地址: https://gitcode.com/deeplethe/utopiaUtopia首个开源企业世界模型用一套「三级实体消解」流水线回答知识图谱里最棘手的问题文档里出现的「张伟」到底是不是库里那个「张伟」它用免费的名字召回做粗筛、向量相似度分层做毫秒级判定、LLM 攒批裁决 人工终审兜底并且每一次合并都可以精确撤销——错误合并的代价被设计性地压到了最低。为什么实体消解是个「怕错不怕慢」的问题把多个文档里的实体对齐到同一节点传统做法是拿表面字符串匹配。这会在两个方向上同时失败同名≠同人一个字符串对应多个实体两个张伟同人多名一个实体对应多个字符串Holmes、Mr. Holmes、Sherlock HolmesUtopia 的设计哲学是**「宁分勿合」**错误合并会把两个实体的事实搅在一起代价远高于多出一个实体——而拆分出来的实体随时可以再并。第一级名字候选召回零成本在进入任何模型之前先做纯字符串的免费召回resolution.rs规范化全角转半角、空白折叠 组和A 组是同一个键泛用后缀词干中文剥掉「项目 / 公司 / 集团 / 部门 / 团队」英文剥掉project / corp / inc / team且首尾两种语序都认——「星尘项目」和「星尘」互相召回每个名字生成 ≤10 个召回键走数据库索引多点查询。召回只负责「把候选人拉进来」判不判定完全交给下一级词表污染不了结论。第二级画像向量相似度三档判定 ⚡这是消解的核心闸门。每个实体维护一个画像向量profile_embedding其各 chunk 向量的滑动平均与新 mention 的 chunk 向量算余弦相似度按两个阈值分成三档相似度判定动作≥ 0.55SIM_ATTACH明显是同一个挂接到既有实体0.35 ~ 0.55 灰区拿不准新建实体 入审核队列 0.35SIM_NEW明显不同新建实体不碰队列阈值本身是经验值bge-m3 类模型但真正体现功力的是两个细节同名并列的「分不开」检测SIM_TIE_MARGIN 0.02两个同名候选的画像分如果相差不到 0.02attach 到分高的那个只是「候选顺序掷出的硬币」——与其掷硬币不如两个都不并、都送人工审核对应测试 a_namesake_tie_goes_to_review_not_a_coin_flip.rs旁证宾语校验如果某候选的实体属性如部门名恰好出现在当前 chunk 里就是强旁证——低于 2 个字符的宾语IT、A 组在任何文档里都可能撞上宁可漏掉旁证不能错并人。第三级LLM 攒批裁决永远不在写入关键路径上灰区产生的「疑似重复」审核项由后台任务攒批送 LLM 裁决每次约 12 对附带双方名字、类型、Top 事实、also known as 以及账本里的先例。关键约束LLM永远不在抽取写入的关键路径上——它慢了、挂了只是裁决晚点写入不受影响裁决「是同一个」才执行合并「不同」则保持分开拿不准的继续留给人工终审共享名字名字已被另一实体占用只进审核对、永不自动合并。向量召回第二通道「只提议不合并」 除了名字精确召回还有一条名称向量通道每个名字事实入库后向量化migrations/0080_a_name_has_a_vector.sql新 mention 的名字向量在同类型家族里找余弦 ≥ 0.60 的最近邻——短称、跨文字脚本的写法启明X7vs启明 X7可以借此找到自己的实体。但这条通道只把命中的成对实体作为「提议」交给裁决者绝不直接挂接。原因是身份基准实测发现攒批步骤曾凭名字相似度把「张伟」并进了「财务部总监张伟」。所以这条提议无论置信度多高都必须先过一轮「带工具的二次核查」连模型都调不动时这对候选直接交给人并标记second_look_unavailable测试 a_similar_name_is_proposed_not_merged.rs。类型漂移同名被抽成了不同类型同一个团队常被抽成 organization / project / concept 三种类型。Utopia 按「互斥强度」分流兜底型concept 等当召回候选照常走画像分层易混具体类型organization / project / product照常建实体宁分勿合但生成审核对硬互斥owl:disjointWith声明的如 Person ⟂ Organization完全分开跳过一切启发式。本体声明说了算内置类型表只是没声明时的退路resolution.rs 类型漂移注释。可撤销合并合并是一张「可重放的快照」 Utopia 里合并本身就是可回滚的一等操作entity_merges表完整记录这次合并搬走了什么以主语身份移动的事实、以宾语身份移动的事实、被作废的事实以及目标实体合并前的画像向量、画像样本数、类型快照revert_merge精确回滚resolution.rs事实原路搬回、作废标记撤销、目标实体画像与类型恢复快照、源实体复活连环合并也处理得干净S 并入 T、T 再并入 C 之后撤回 S→T引擎会沿merged_into链找到事实此刻真正挂在哪不会留下「源实体复活了、事实却留在链尾」的残局合并后时间线按剩下的行自动重算被引擎关掉的区间自然重新打开。更进一步自动合并有门禁如果一次合并会让图上出现功能矛盾、推导链或已被引用的答案即「撤不回去」的那种改动这次自动合并会被扣下来等人处理测试 an_automatic_merge_is_gated_by_what_it_can_undo.rs。合并的合法发起者只有三种人、0.8 置信度的裁决器、过闸门的治理流程。实测福尔摩斯语料暴露的三层暗坑 scripts/bench/corpora/holmes.json《福尔摩斯探案集》前六篇四轮实测记录了一次教科书式的修洞过程合并数从14 → 37 → 47 → 57层暗坑修复一类型漂移分类没有「两类型相等」这一档person × person落进了「永不可能是同一个」补上同类型档二召回只看规范名合并后名字进了别名桥断了——Holmes并掉后Mr. Holmes再也连不上别名参与召回三合并把其它待审对以「被合并取代」关闭但包含召回只在实体创建时跑一次关闭就是永久丢失redirect把待审对改指向合并目标而非关闭其中 redirect 是整个图里「最反直觉、最容易被顺手删掉」的一步。这个基准的价值也正如文档所写每一次修复后暴露的下一层比它产出的第一个数字更有价值docs/pipeline.md 第二节。延伸阅读与关键路径想继续深入推荐这几个入口消解全流水线与三档判定docs/pipeline.md身份设计全貌名字即事实、双时钟、门禁docs/design/identity.md消解核心实现约 3000 行注释密度很高值得一读crates/utopia-store/src/resolution.rs可撤销合并的测试用例a_merge_rewinds_with_the_second_clock.rs、a_merged_target_stays_out_of_the_export.rs身份基准脚本双语语料、重名、缩写、两种到达顺序scripts/bench/identity.mjs一句话总结Utopia 的实体消解把「免费手段用尽、毫秒手段分层、昂贵手段攒批、错了可以撤销」做成了显式契约——这正是企业级知识底座和 demo 级去重脚本的分界线。【免费下载链接】utopia首个开源企业世界模型项目地址: https://gitcode.com/deeplethe/utopia创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考