Paul Ford 那篇《Triple Threat》把 LLM、本体论(Ontologies)和知识图谱(Knowledge Graphs)放进同一个框架里讨论。这个组合乍看像三个独立的技术名词,实际上是一套清晰的配合关系:大模型负责自然语言理解和生成,本体负责定义“某个领域里有哪些概念、概念之间是什么关系”,知识图谱负责存放具体事实、支持精确查询和溯源。如果你正在做知识库问答、垂直领域智能助手、企业级语义检索,或者被大模型幻觉问题折腾得够呛,这个“三重威胁”的思路值得认真看一遍。
先说结论:单独用大模型做问答,长在语言能力上,短在事实稳定性和可解释性上;单独用知识图谱,长在精确性和可维护性上,短在自然语言入口太僵硬。把三者组合起来,不是用知识图谱去限制大模型,而是让大模型在正确的语义边界内做它最擅长的事——把用户的不确定问题翻译成确定的知识检索,再把检索到的确定事实翻译成自然语言回答。这套思路解决的不是“模型能不能跑”,而是“答案能不能信、口径能不能统一、日后能不能维护”。
下面按我实际接触这类方案时的理解顺序,拆开讲。
1. 先搞清楚“三重威胁”到底是哪三样东西
1.1 LLM:语言能力强,但事实记忆不可靠
大模型本质上是一个在超大规模文本上训练出来的概率模型。它学习的是 token 与 token 之间的统计关联,而不是像数据库那样把事实逐条存储。所以你问它“某个产品的退换货政策是什么”,它能给出语法完整、结构清晰的回答,但里面可能有 20% 的内容是它自己“编”的。
这里的“编”不是恶意,而是生成机制决定的。模型在生成每个词时,依据的是上下文和训练时学到的分布,它没有能力在生成过程中回头查证“这句话对应的原始资料在哪”。只要是生成模型,就天然存在幻觉风险,差别只是概率高低。
这不是说大模型没用。语言理解、意图识别、实体抽取、摘要生成,这些能力非常成熟,而且恰恰是传统知识图谱系统最缺的部分。问题在于,你不能把模型的“记忆”当作事实层来用。
1.2 本体论:先约定概念,再谈数据
本体论这个词听起来很学术,落到工程上其实非常简单:它是一份关于某个领域的“概念和关系说明书”。
举个例子。一家公司内部有“客户”“用户”“消费者”三个词,业务部门可能混着用,数据部门也可能混着建表。这时候如果没有本体,大模型接到问题“客户总数是多少”,它不知道该去查哪张表、该去匹配哪个实体。本体要做的就是明确:在这个系统里,统一用“客户”作为标准实体,客户与企业之间是“购买”关系,客户与订单之间是“创建”关系,客户不可直接等同于“访问者”。
本体包含的典型内容有:实体类型、属性、实体之间的关系、约束规则、术语别名。它不存具体数据,只定义规则。打个比方,本体是“地图的图例”,知识图谱才是“地图本身”。
很多团队一开始忽略本体,直接上手搭知识图谱,结果就是实体类型随意、关系命名混乱、同一个东西在图上出现十几个名字。图谱确实建起来了,但查询时谁都不敢保证结果口径一致。
1.3 知识图谱:把本体变成可查询、可验证的事实网络
知识图谱是本体落地后的数据层。它由大量“实体—关系—实体”三元组组成,例如:“华为—总部位于—深圳”“张伟—就职于—产品部”。这些三元组遵守本体定义的类型和约束,所以可以被图数据库精确查询,也可以被追溯来源。
知识图谱相比向量数据库有一个很大的区别:向量数据库存的是文本片段或向量的近似匹配,返回的是“语义上像”的内容;知识图谱返回的是“逻辑上精确”的结构化事实。前者擅长找相似,后者擅长给答案。
所以三者放在一起,分工就很清楚:
| 层级 | 核心产物 | 擅长做的事 | 天然短板 |
|---|---|---|---|
| LLM | 自然语言 | 理解问题、生成回答、抽取信息 | 事实不精确、不可溯源、口径不稳定 |
| 本体 | 概念与关系模型 | 统一术语、定义边界、约束关系 | 不具备语言能力,无法直接面对用户 |
| 知识图谱 | 结构化事实网络 | 精确查询、上下钻取、推理、溯源 | 交互入口僵硬,扩展需要人工维护 |
所谓“三重威胁”,我理解就是这三种能力互相补位,形成闭环。
2. 为什么要把知识图谱和大模型放在一起:核心是“可信”问题
2.1 大模型的幻觉,根源在“生成”而不是“检索”
幻觉不是 bug,而是大模型的默认行为。模型训练时把事实压缩成参数,回答时靠概率联想重建内容,这个过程的准确性依赖训练数据覆盖度和模型容量,但永远无法保证。更麻烦的是,模型的回答通常很流畅,用户很难凭语感判断哪句是真的、哪句是模型脑补的。
尤其在企业场景里,错误答案是有实际成本的。客服答错退换货政策,运营答错数据口径,维修人员按错误手册操作,这些都可能造成直接损失。所以企业知识问答的首要指标不是“回复漂不漂亮”,而是“能不能找到可靠来源”。
2.2 知识图谱能提供可溯源的答案
知识图谱里的每一条三元组,理论上都可以带上来源、时间、置信度、维护人等元信息。当大模型的回答是“根据图谱中的事实 F1 和 F2 生成”时,系统能把答案拆分到具体的图记录上,做到真正的事后验证。
我在实际项目里见过一个很直观的效果:把用户问题接到知识图谱问答系统后,遇到争议时,不再需要翻聊天记录猜模型当时怎么想的,直接查图谱查询日志就能定位是哪条事实支撑了这个答案。这在纯大模型方案里几乎做不到。
2.3 本体解决的是“口径统一”,这个经常被忽视
很多团队关注知识图谱,是因为想减少幻觉,但真正让项目失败的往往不是幻觉,而是口径混乱。
举个例子,一个企业知识库里有“销售额”这个实体,销售部认为它包含税前收入,财务部认为它只包含已开票金额,而知识库里同时存在两种口径的报表数据。如果本体没有规定“销售额”的唯一语义,大模型在生成回答时就会根据自己的理解选一个口径,结果就是两个部门拿着同一个问题,得到两个不同的答案,而且都认为自己是对的。
本体在这里的作用,是让大模型在生成查询之前就知道:当前语境下“销售额”必须映射到哪个属性,哪些关系可以作为推断依据,哪些同义词必须归一化。这比任何 prompt 技巧都稳定。
2.4 一个反直觉的点:知识图谱不是让模型“记更多”,而是让模型“少瞎编”
有人以为把知识图谱接入大模型,是为了扩充模型的知识面。其实不是。
模型知识面不够,可以加长上下文、换更大模型、做向量检索,方法很多。但知识图谱最独特的价值是约束:当用户的问题落入图谱覆盖的领域时,系统把回答范围限定在图谱事实之内;当图谱没有覆盖时,系统直接说“不知道”或引导用户换一种问法,而不是强行生成一个看起来像样的回答。
“知道自己在什么地方不知道”,这一点比模型答对几个问题重要得多。大模型自己做不到这一点,但知识图谱可以给它兜底。
3. 实际落地:三种常见的组合方式
3.1 方式一:LLM 生成结构化查询,知识图谱精确作答
这是“重约束”路线,也是可信度最高的一种。流程大致是:
- 用户输入自然语言问题。
- 大模型做意图识别、实体链接,把问题中的实体映射到知识图谱中的标准节点。
- 大模型根据本体 schema 生成图查询语句,例如 Cypher 或 SPARQL。
- 查询在图数据库上执行,返回结构化结果,而非文本片段。
- 大模型把结构化结果转写成自然语言回答,并附上来源。
这个方案的关键难点在第三步:大模型生成查询语句很容易格式错误,或者引用不存在的实体类型。我的处理经验是不要直接让模型自由发挥,而是先定义好查询模板和参数槽位,让模型只负责“填槽”,而不是“写整条查询”。
比如系统里已经定义好“查询某客户的订单列表”这个模板,模型只需要从问题里抽取客户名称和筛选条件,组装成模板参数。这样即使模型偶尔抽错实体,查询本身也不会崩,因为模板结构是安全的。
注意:查询语句必须加超时和返回行数限制。一次失控的图查询能把数据库拖死,这在生产环境是真实发生过的事。
3.2 方式二:知识图谱增强生成,把子图作为上下文
这是“轻约束”路线,也叫 GraphRAG 一类做法。大模型不直接生成图查询,而是先用向量检索或图遍历找到一个候选子图,把子图的实体和关系序列化成文本,拼进 prompt 上下文,再由大模型生成最终回答。
这种方式实现更简单,对本体规范的要求也更低;缺点是不够精确,可能把不相关的关系注入上下文。适合问题类型较开放、答案不需要精确到单条事实的场景,比如“介绍一下这个产品的配套服务有哪些”。
需要提醒的是,子图大小非常影响回答质量。子图太小,信息不够;子图太大,大模型会被无关实体干扰,反而更容易编造。我一般会先通过实体命中确定起点,再限制关系跳数,控制子图规模,最后把关键三元组按“实体—关系—实体”的格式列进 prompt。
3.3 方式三:用 LLM 协助建设本体和知识图谱
这是很多团队忽略的入口。本体建模和知识图谱构建的人工成本很高,但大模型恰好可以在这里帮上忙:从非结构化文档里抽取实体、关系、属性,做候选三元组,然后交给领域专家审核修正。
这个流程最核心的一个原则是:大模型只做粗提取,人类只做确认和纠错,不要全自动写入图谱。我见过不止一个团队图省事,让模型批量抽取后直接入库,结果关系错乱、实体重复,最后清理成本比当初人工建图还高。
比较稳妥的阶段化流程是:
- 先人工定义最小本体:核心实体、核心关系,控制在几十个类型以内。
- 用大模型从文档批量抽取候选三元组。
- 由领域专家抽样审核,总结错误类型,调整抽取 prompt。
- 审核通过的子集写入暂存区,再经过去重和对齐后正式入库。
3.4 三种方式怎么选
| 维度 | 方式一:查询生成 | 方式二:图增强 | 方式三:图谱构建 |
|---|---|---|---|
| 实现难度 | 较高 | 中等 | 中高 |
| 回答精确度 | 高 | 中 | 不直接产生回答 |
| 对本体要求 | 高,必须有严格 schema | 中,容忍一定噪声 | 本身就是本体的来源 |
| 典型场景 | 企业数据问答、报表查询 | 开放型知识问答 | 知识图谱冷启动 |
| 主要风险 | 查询错误、性能问题 | 上下文噪声、幻觉未根除 | 垃圾进垃圾出 |
我的建议是:如果团队已经有一定数据治理基础,优先走方式一;如果只是想快速验证知识图谱对大模型回答有没有帮助,先走方式二;如果连图谱都还没有,那就从方式三开始,但一定要保留人工审核环节。
4. 哪些场景值得上“LLM + 本体 + 知识图谱”
4.1 值得上的场景
第一类是垂直领域知识问答。医疗、法律、工业维修、企业制度、产品手册,这些领域有明确的实体和关系,也有“答错有代价”的现实压力。知识图谱能把知识从文档中结构化,大模型则把入口从“翻手册”变成“直接问”。
第二类是多轮对话中需要保持实体一致的场景。用户在客服对话里先问“A 套餐”,再问“它的流量包怎么叠加”,这里的“它”需要准确指回 A 套餐。纯大模型在多轮指代上容易漂移,而图谱可以把对话状态锁定在确定的实体 ID 上。
第三类是需要解释依据的内部系统。例如合规审查、风险研判,答案必须能回溯到具体条款或数据记录。这种场景下,回答“没有找到依据”比给出一段模棱两可的话更有价值。
4.2 暂时别上的场景
通用百科式问答不适合。问题太分散,图谱覆盖永远跟不上,维护成本会高到不可持续;还不如直接切成纯向量检索,或者老实让大模型回答。
时效性极强的内容也不适合。股票行情、实时价格、突发新闻,知识图谱很难做到分钟级更新,等数据入图,问题早过时了。
还有一个容易被忽略的硬条件:如果团队内部连一份像样的数据字典都没有,那本体设计会变得非常困难。你连“客户”“订单”的定义都统一不了,就不可能设计出稳定的本体,更别提维护知识图谱。
4.3 成本判断要放在长期看
建一个小规模图谱,几十个实体类型、上百条关系,可能两三周就够。但真正的成本在后面:
- 本体要随业务演进,每次调整都涉及数据迁移;
- 知识图谱要有人持续维护,新文档要抽、旧关系要验;
- 实体对齐要反复做,同一家公司在不同文档里可能叫“华为”“HUAWEI”“华为技术有限公司”;
- 质量问题会随时间累积,错误关系不清理,后面所有查询都会受影响。
所以我不建议一上来就规划“全公司知识图谱”。更稳妥的做法是选一个边界清晰的业务域,比如只做“产品售后知识”,或者只做“销售数据口径”,把最小闭环跑通,再考虑扩展。
5. 从 Demo 到生产:五类问题得提前处理
5.1 图谱质量决定回答天花板
知识图谱是典型“垃圾进,垃圾出”的系统。如果入库的实体有大量重复、关系方向不统一、属性值缺失,那么无论大模型多聪明,最终回答都不会稳定。
我的检查清单通常是:
- 同一个实体是否存在多个 ID;
- 关系方向是否一致,例如“属于”和“包含”是否被混用;
- 重要属性是否有缺失,例如实体名称、更新时间、来源文档;
- 是否存在孤立节点,长期没有关系的节点大概率是抽取错误。
图谱不是越大越好,而是越准越好。宁可用 5000 条准确的三元组,也不用 5 万条充满噪声的三元组。
5.2 查询生成必须加约束,不能靠模型自觉
如果采用方式一,LLM 生成查询语句的阶段是整个链路最容易出问题的地方。常见错误包括:实体名写错、关系名不存在、查询语法错误、WHERE 条件过宽导致全表扫描。
对策可以分成几层:
- prompt 里给足 schema 信息,但只给当前任务可能用到的类型和关系,不要给全量。
- 用查询模板替代自由生成,让模型只能填实体、属性和筛选值。
- 对生成结果做规则校验,检查实体类型白名单、关系白名单、最大返回条数。
- 查询失败时自动回退到“告诉用户没有找到精确结果”,而不是让模型重新自由发挥。
注意:这里不要一上来就追求复杂自然语言查询。先把 Top 20 个最常见问题写成模板,让系统在这 20 个场景里做到高准确率,再逐步增加覆盖。
5.3 本体演进要有版本管理
本体会变。业务会新增“发票”这个实体,也会把“客户等级”从单值属性改成多值关系。这个过程中的风险在于:旧查询还在用旧 schema,新数据已经按新 schema 入库,两边一混,回答就乱了。
建议至少做三件事:本体文件纳入版本管理;每次 schema 变更写迁移脚本,把旧数据转换到新结构;发布新 schema 后,旧查询模板要重新跑一遍回归测试。这个环节看着不性感,但恰恰是生产系统能不能长期运行的分水岭。
5.4 延迟与缓存不能事后才想
图查询比向量检索通常更耗时,尤其是多跳查询或包含模糊匹配时。生产环境不能每次问答都实时跑一次大查询。
我常用的优化顺序是:
- 给实体查询加索引,先按 ID 精确命中,再扩展关系。
- 限制跳数,默认最多 2 到 3 跳。
- 对高频问题做结果缓存,缓存粒度放在“查询语句 + 参数”这一层。
- 把常见问题的答案预生成成摘要文本,减少大模型生成时间。
- 如果图谱数据是静态的,可以用内存图或预加载图数据库来降低延迟。
实测时要注意:单次查询 500 毫秒和 3 秒在 demo 里都能接受,但到了客服并发的生产环境,3 秒的查询会让队列迅速堆积。快慢的标准不是“能跑”,而是“并发 100 时还能不能保持在 2 秒内”。
5.5 评估不能只看答对率
“答对率”这个指标在这类系统里太粗糙。我更建议拆成下面几项:
- 查询成功率:LLM 生成查询模板参数后,图数据库执行成功的比例;
- 实体命中率:用户问题中的关键实体能否正确链接到图谱节点;
- 答案可溯源率:最终回答有多少比例能映射到具体的三元组;
- 口径一致率:同一问题在不同表达方式下是否得到同一结论;
- 兜底率:图谱没有答案时,系统是否明确拒绝而不是硬编。
上线前的对比测试也值得做:同样的 200 条测试问题,分别跑纯大模型方案和“LLM + 知识图谱”方案,让业务方盲评。不要看哪边回答更流畅,只看哪边回答更可查、更一致、更少“看起来对但实际错”的答案。
6. 从 Paul Ford 的讨论里,我读到的几条工程结论
6.1 不要把大模型当成数据库
大模型是理解工具,是生成工具,甚至可以当临时推理器,但它不适合作为事实存储层。凡是需要精确、需要溯源、需要口径统一的真实数据,都应该放到本体和知识图谱那一层去管。这个边界划清楚,系统的每一个模块才能各司其职。
6.2 本体不是学术表演,而是产品需求文档
很多团队对“本体论”有距离感,觉得它是哲学或学术圈的东西。实际上,本体建模的过程就是在做业务梳理:到底有哪些关键实体,它们之间有哪些关键关系,哪些规则必须满足。这些内容本质上就是一份可以指导开发的数据需求文档。
本体做得越清晰,后续大模型的 prompt 可以写得越短,查询模板可以设计得越稳,知识图谱的质量也越可控。反过来,如果连本体都没有,知识图谱大概率会退化成一张没有规律的属性表。
6.3 “三重威胁”的本质是三层分工
语言层由 LLM 负责,解决人与系统之间的自然交互;语义层由本体负责,解决概念如何定义、关系如何约束;事实层由知识图谱负责,解决具体数据存放、查询和溯源。把这层分工理顺,再去选技术组件,思路会清楚很多。
6.4 给团队的最小建议
如果你的团队正准备做这类系统,我的建议是先做一个小闭环:
- 选一个有明确边界的业务域;
- 人工建一份最小本体,实体类型不要超过 30 个;
- 用大模型从 100 份以内文档里抽取候选三元组,人工审核入库;
- 挑 20 个高频问题,用查询模板方式接通图谱;
- 跑一轮盲评,确认回答质量确实比纯大模型方案更可控。
这一轮做完,你就能判断这个方向适不适合继续投入。踩过几次之后我发现,很多项目失败不是因为这项技术不行,而是前置的语义梳理和数据清洗没有做干净。技术组合可以很漂亮,但真正决定上限的,是你能不能把“什么概念、什么关系、什么事实”这三件事先想清楚并写明白。
如果只是学习,按上面的小闭环跑一遍就够了;如果要长期维护,就要把本体版本、图谱质量、查询约束、性能缓存和评估口径都当成一等公民来对待。这套“三重威胁”的最后一样东西,其实不是某个工具,而是团队对知识的一整套治理习惯。