- 后端
- 前端
- 人工智能
- RAG
- 知识图谱
- 知识管理
- 搜索引擎
【免费下载链接】utopia
World's first open-source enterprise world model.
本体在 Utopia 中不是装饰性的术语表,而是贯穿抽取、推理、消歧、时间语义各层的"契约"。本篇基于项目决策记录 0012-the-ontology-is-a-contract-not-a-suggestion.md,完整还原"为什么本体必须是一份被执行的契约、而不是一条可被模型随意违背的建议"这一核心设计转变:从实测 57% 的签名违规率与 39 个事实方向反转,到落地写入时方向裁决(judge_direction)、祖先类型地板、可追溯的自动纠正,最终把违规率压到 4%、反转清零。读完你将掌握 Utopia 本体域(domain/range)如何从"提示词里的软约束"升级为"写库时的硬校验",以及每一条决策背后的代价权衡与源码落点。
背景:本体包立功了,但没有一条约束被执行
在 0008-ontology-packs-as-cold-start.md 中,Utopia 将 schema.org、W3C Org、PROV-O、FOAF、IOF Core 五个本体包内嵌进二进制(gzip 后约 316 KB),作为新知识库的冷启动词汇表。效果立竿见影:
- 6 篇维基百科文章、schema.org + W3C Org、零种子(zero seeds)的实验中,共产生 1655 条关系、973 个类;
- 全部 215 条带谓词的事实、全部 41 个不同关系均来自本体包;
- 空谓词占比从十种子时代的 55.5%(其中
related_to占大头)降到 25.6%。
但灾难藏在另一侧:schema.org 明确声明employee (organization → person),而抽取结果里出现了Elon Musk --employee--> Microsoft这种方向完全写反的事实。在 130 条可检查的事实中,有 102 条被反向存储——当初选择 schema.org 的理由(1488 个属性都声明了 domain 和 range)恰恰全部落空。空谓词是诚实的沉默,而反向边是"自信的错误":它会直接进入 0002-reasoning-engine.md 描述的推理引擎,被当作正确的输入放大传播。
根因:一个根源,两个症状
决策 #128 移除种子后,seed_classes为空,类型检索开始偏向"在文本中字面出现"的叶子类:
- 在一段关于 Sutskever 的文本中,
researcher在 976 个类里排第 4,person排第 359,organization排第 795; - 实体因此被定型为
researcher(schema.org 中Audience的子类); - 而
sig_of只认识被展开进提示词的类,employee的签名退化为(* → *),方向信息彻底丢失。
也就是说:类型选错(叶子类优先)导致签名失效(* → *),签名失效导致方向无人约束,方向无人约束导致反转事实进库。这条因果链是理解本文全部六项决策的钥匙。
决策一:类型参与仍是引导,参数顺序改为强制执行
第一条决策划出了一条清晰的边界线:"哪些类型可以参与"与"参数按什么顺序写"是两件不同的事。
- 初版提示词把两者混为一谈,写成"提示而非规则——当文本另有说法时,按文本写",结果模型把这条宽容应用到了参数顺序上;
- 但参数顺序不是关于世界的断言,而是键(key)的编码约定:
works_at (person → organization)中的左右位置只是这条关系的编码方式,文本永远不会"说另一个方向",文本只说明"存在一个关系"; - 对类型,0001-ontology-import-and-governance.md 的结论依然成立:硬性门槛会系统性地丢数据——
part_of的教训已经证明,一条错误的声明如果作为硬门槛,会把大量合法事实挡在门外。
一句话总结:类型错误可以等治理流程纠正,方向错误则会污染整张图。
决策二:祖先地板(Ancestor Floor)——让高层类永远在场
修复类型检索偏向的直接手段是祖先地板:每个被检索到的类的全部祖先都加入候选列表。于是person、organization这类高层类总是可用:
- 被误定型为
researcher的人实体被纠正为person; - 类型侧的违规被成片消除,实体类型变得可信;
- 这取代了早已死去的"种子基类常驻"方案(决策 #128),是 0001 中"P3a 死胡同"一节里"seed base classes always present"的正式继承者。
在 [0001] 的对应分析中可以看到,这条修复的价值远超表面:类型可信是后续一切自动纠正的前提——"实体类型不可靠时自动交换方向会被否决"(见死胡同一节),而祖先地板恰好让这个前提成立。
决策三:写入时纠正方向——judge_direction的诞生
这是整篇决策的核心工程动作:当主语违反 domain、宾语满足 domain 时,按签名交换主宾。它复用了produces/produced_by这一对早已存在的移动(#109),但触发条件从"提示词措辞"变成了"签名裁决"。
两个关键实现细节:
- 类型读取自存储中的实体,而不是抽取器的
entity_type_of。后者只覆盖当前 chunk 内声明的实体,而宾语通常早已存在(跨 chunk 引用),读存储才能拿到真实类型——仅此一项差异就把反转从 10 降到 0。 - 判据刻意收窄:只在"正向违反而反向成立"时对调,两个方向都不成立就留空谓词(见决策五)。
源码落点:ontology::judge_direction
该函数位于 crates/utopia-store/src/ontology.rs,是"三条写谓词的路共用的那一道判断"(#190 / #196):
pub enum Fit { Unchecked, // 两端都没声明 → 不裁 Keep, // 主语符合 → 保留 Swap, // 主语不符、宾语符合 → 按签名对调主宾 Neither, // 两边都不符合 → 关系不适用于这对实体,谓词留空 }判定逻辑(简化自源码):
- 正向:主语在 domain 且宾语在 range 中均无违反 →
Keep; - 反向:把主宾对调后两端均无违反 →
Swap; - 否则 →
Neither。
注意一个重要的对称性修复(#222):早期版本只看 domain,导致Project Aurora head_of Li Ting这种"主语(Project 是 Agent)过了 domain、宾语违反 range 却无人检查"的事实原样进图。现在 domain 与 range两端各看各的,专项测试 a_direction_is_judged_by_range_too.rs 用最小本体复现了这一形态,并验证了四条规则:正向符合 Keep、反向成立 Swap、宾语未定型 Keep("不知道"不是"不符合")、两端都符合 Keep。
决策四:永不静默——每次交换都留下direction_corrected痕迹
0001 曾反对"由可能错误的声明驱动的自动动作"。本决策的回答是:自动动作可以是正确的,只要它留下痕迹。
- 每一次交换都会产生一条
direction_corrected的提取丢弃记录(extraction_drops表); - 29 次交换中有 1 次是错的(
spatial,schema.org 对其 domain 的声明本来就模糊)——这是"信任一条可能不适用于当前这对实体的声明"的固有代价,但因为是可见、可审计的,这个代价可控。
源码落点:提取丢弃的可审计通道
0001 中的 P1"无静默丢弃"为这条决策提供了表结构基础:extraction_drops (kb_id, document_id, reason, detail, count, example, updated_at),direction_corrected正是其中的原因码之一。Library 界面会显示"N facts did not land",任何一次自动纠正都能被人工追溯。
决策五:不适用的关系保持沉默——空谓词不是数据丢失
当交换也非法时,保留谓词就等于"以本体的名义断言本体不同意的东西":
OpenAI --affectedBy--> …:affectedBy在 schema.org 中是医疗测试属性;competitor属于SportsEvent,用在公司之间完全错位。
此时谓词被丢弃,但主语、宾语、时间、证据全部保留;模型的原始措辞进入fact_evidence.proposed_predicate,并通过fact_surface_predicate()展示(参见 0010-no-relation-is-no-relation.md 的空谓词行为)。实测中 179 条被推回空谓词的事实全部保留了原措辞——"这个关系不适用"和"数据没抓到"是两种完全不同的状态,前者永远不该造成信息损失。
决策六:两处附带修复
- 前导轻动词不是区分:
has_funding与funding合并。过度合并不必担心——一旦键冲突,匹配自然失效(碰撞使匹配作废),风险自愈。 - 子句不是实体名:原先 100 字符的守卫只设在"已声明实体"路径上,未声明的主语和宾语直接进入
resolve()。问题在于 57 字符的法院名和 65 字符的子句无法靠长度区分,新判据改为单词数 + 有限动词。效果:最长实体名从 111 字符降到 57,未定型实体从 76 降到 60。
死胡同:哪些路被证明走不通
这些反面结论与正面决策同样重要:
- 更多提示词措辞:三轮迭代把违规率从 57% 压到 35%,但全是类型错误;真反转纹丝不动(22.7% → 17.1% → 17.6%,在噪声范围内)。模型看得到签名却不执行——"X is an employee of Y"的英文语序太有诱导性,提示词不可能与自然语言语法对抗。这是"强制 vs 引导"之争的决定性证据。
- 地板落地前的自动交换:因实体类型不可靠(Musk 曾被定型为
researcher)被否决;地板落地后前提消失,自动交换才得以放行——决策二与决策三是严格的前后依赖关系。 - 为再具体化(reification)引入更丰富的建模语言:
amount(13)、target(8)、participant(5) 失败的原因是 schema.org 通过中间节点(Action / LoanOrCredit / Offer)建模,而 Utopia 写的是扁平二元关系。真正的阻塞不是表达能力——entities+facts已经是属性图——而是提示词规则:规范名必须来自文本、每个主宾都必须是实体,而"2024 年 A 轮融资"在文本里没有名字,模型会被迫编造一个。当查询真的需要限定词本身时("2024 年 A 轮由 General Catalyst 领投的公司")再回来解决,无名节点还需要自己的命名与去重方案。 - 把孤儿归咎于守卫(无事实的实体 14.0% → 17.5%):守卫拦截的是个位数;真正的原因是模型声明了从不使用的实体(法院、SEC、特斯拉总部)——值得单独测量。
决策记录还点出一个结论:包的成本不是提示词长度,而是选择难度——很多名字语义宽泛(affected_by、competitor、uses_device、Researcher),按名字或向量相似度挑选必然踩中,这项工作应由 0008 继续承担。
修订演进:守卫从一条路扩展到所有路
2026-09-02 的关键修订揭示了写入时守卫的根本局限:它挡不住后续编辑。合并会把主语换成一个其它类型的实体,事实"变成"违规(6 个残留中的 4 个即由此产生)。修复分两层(#190 / #196):
ontology::judge_direction由抽取与采纳(adoption)共享——采纳是第二条写谓词的路,曾把违规率推回 12.3%;"两个方向都不适配"的采纳不再挂谓词,计入facts_left_off;- 账本层兜底:迁移脚本 0019_a_signature_holds_on_every_path.sql 为
axiom_violations表新增signature违规类型(与self_loop、asymmetry、cycle、functional并列)。合并对搬动过的事实立即复查;R0 一致性检查会全量复查——之后 domain 声明被修改也无法隐藏旧违规。
这些违规进入 0012_axiom_violations.sql 定义的裁决队列,出路与其他违规一致:撤事实(判数据错)、放宽公理(判定义错)、或认可并存。正如 docs/design/governance.md 所总结的,这印证了治理设计的核心哲学——任何一条路写反了,人都能在 Review 里看见。
修订还明确了一条纪律:未分类实体不是违规——"unknown"不等于"does not fit"。
未解问题与开放边界
- 两个残留违规(
Stability AI Ltd、Colossus 2 data center)既未合并也未重定型,成因未知; - 包导入仍会展开 domain 为再具体化壳类(
Action、Offer、LoanOrCredit)的关系——展示给模型只会产生违规,过滤工作尚未完成。
这两个问题共同指向下一步:本体包的"选择难度"治理与再具体化建模,是契约执法体系之外最后两块未封口的短板。
结论:契约的五条执行纪律
回看整个 0012,Utopia 把"本体是契约"落实为五条可操作的执行纪律,它们彼此咬合、缺一不可:
| 纪律 | 内容 | 源码/文档落点 |
|---|---|---|
| 类型参与是引导 | 类型错误交给治理流程,不做硬门槛 | 0001 准则 2 |
| 参数顺序是强制 | 写入时按签名裁决方向 | ontology.rsjudge_direction |
| 祖先地板保底 | 高层类永远在场,类型可信是自动纠正的前提 | 决策二、0001 P3 |
| 永不静默 | 自动纠正必有direction_corrected痕迹 | extraction_drops原因码、决策四 |
| 不适配即沉默 | 交换非法则留空谓词,措辞进proposed_predicate | 0010、决策五 |
实测结论值得记住:从 57% 违规率到 4%、39 个真反转归零,靠的不是更长的提示词,而是一套"写入时裁决 + 账本兜底 + 痕迹可审计"的工程机制。对于任何把 LLM 抽取与领域本体结合的系统,这都是一份可以直接借鉴的、经过量化验证的设计范本。
- 后端
- 前端
- 人工智能
- RAG
- 知识图谱
- 知识管理
- 搜索引擎
【免费下载链接】utopia
World's first open-source enterprise world model.
相关推荐
SeaTunnel Transform 插件体系深度解析:从行模型契约到多引擎复用
SeaTunnel Transform 插件体系深度解析:从行模型契约到多引擎复用 Transform(转换)是 SeaTunnel 数据集成链路中连接 Sou
数据集成ETL大数据批处理流处理变更数据捕获解锁全球多语言显示:Noto字体项目全面解析与实施指南
解锁全球多语言显示:Noto字体项目全面解析与实施指南 Noto字体作为Google推出的开源字体解决方案,为全球800多种语言提供统一的字体支持,彻底解决了多
搜索引擎可观测性日志分析链路追踪后端全文检索Serial Studio 源码级质量治理:Spec 0075 全量源码审查修复契约深度解读
Serial Studio 源码级质量治理:Spec 0075 全量源码审查修复契约深度解读 2026 年 9 月,开源遥测仪表盘项目 Serial Studi
桌面应用数据可视化物联网
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考