跳到主要内容
把知识图谱换一种建法,GraphRAG 还剩多少准确率

把知识图谱换一种建法,GraphRAG 还剩多少准确率

图南
图南

· 阅读约 8 分钟

你看到两个 GraphRAG 系统报准确率,一个 68,一个 74,第一反应大概是给它们排个座次。先别急。这两个数字大概率不在同一个坐标系里。

原因不复杂:这两年这个方向的论文,绝大多数是把建图和检索绑在一起设计的。自己建一张图,对着这张图调检索器、调 prompt、调跳数,最后跑出来的那个准确率,到底该记在检索方法头上,还是该记在“这套图刚好配这套检索”头上,作者本人也拆不开。不是谁作弊,是压根没在同一个坐标系里。

上周挂上 arXiv 的 ArcRAG 问的就是这件事:把底下那张知识图谱换一种建法,上面那套检索器还能不能用。这篇拆完,你手里会有一个说得清的心智模型——所谓“构建无关的检索”,无关在哪一层,以及它无关不到哪一层。后半句更要紧。

(接着接一句你可能想问的:那做消融不就行了。消融能告诉你重试几次最划算、跳数加到几层收益见顶,告诉不了你换一张图会掉多少。这是两个问题。)

接口是现炒的,不是预先设计好的

ArcRAG 的核心动作一句话:别在代码里写死图的形状,去问的时候现看。

怎么个现看法。从一个问题里抽出实体,在图上定位到种子节点,然后看这个种子节点周围一圈长什么样——能到达哪些节点标签、边上挂的是哪些关系、节点上带哪些属性键。三样东西凑起来,就是这次查询的“局部接口”。

这里最容易被搞混的是“接口”这个词。很多人一听接口就以为是提前定义好的一层抽象,其实反过来了:它是每次提问时从图上现抄下来的一份局部形状说明,这次查询是这个形状,下次可能是另一个。用法跟 API 有点像,但它不是 API,它没有版本,没有契约,没有谁保证它下个月还长这样。

作者拿三个多跳 QA 语料——MuSiQue、HotpotQA、TriviaQA——各构造成两种图。一种是模式引导图,节点有类型,关系是封闭集合,还带来源溯源信息。另一种是开放信息抽取图,节点不分类,关系是一段自由文本。

同一个动作在两张图上取回来的东西,差别是这样:

种子实体 → 一跳邻居
  labels: [人物, 导演]
  rels:   [执导, 出生于]
  attrs:  [出生日期, 国籍]

换到开放信息抽取那一族,同样跑一遍:

  labels: []
  rels:   ["was the director of", "born in the city of"]
  attrs:  []

标签是空的,关系是一整句话。检索器的 prompt 里只要写死了“人物”和“执导”这些字眼,它在第二张图上第一步就卡住——因为那几个词在这张图上根本不存在,模型拿着一个不存在的枚举值去对,只能瞎猜。ArcRAG 的处理是 prompt 里一个标签都不写,只写一句“先去看看这块地方长什么样”,真正干活的那份形状信息运行时才塞进去。

真正新的是输入,不是那个规划器

拿到局部接口之后才是规划:基于这份接口规划一条多跳遍历路径,翻成 Cypher 去执行,结果不对就带着报错重试。

我一开始以为 ArcRAG 的贡献在这个多跳规划器上。看完消融才反过来:规划、执行、重试这套东西在 agent 圈已经是现成套路,谁都做。真正新的是喂给规划器的那份接口是现炒的,不是预先设计好的。这个顺序我最初搞反了,现在纠正过来——能迁移的关键不在规划,在输入。

论文对重试预算和通过预算做了消融,控制每个阶段能试几次、能走几轮。这块是整个系统里最不体面、但最决定分数的一截。多跳查询失败,大头不在“想不出路径”,在“想出来的路径翻成 Cypher 的时候属性名拼错、方向写反”。这类错误靠聪明修不掉,模型再怎么想也不会突然就记住你那张图的边指向哪边,只能多试几次、把报错喂回去。工程味很重,但真实情况就是这样。

类比到这儿就该收了

打个比方。你雇了个研究员去图书馆查东西。一种做法是给他一张固定格式的索引卡片模板,告诉他这个馆的书都按作者、年份、主题三栏编目。另一种做法是让他进馆之后先看一眼书脊怎么贴的标签,再决定怎么找。

前一种在这个馆里效率极高,换个馆直接废掉。后一种每次多花几分钟看标签,但换馆不至于从零开始。

这个类比撑到“先看标签再找书”都没问题,撑不住的是“看标签”这个动作本身——人看标签是理解含义,ArcRAG 读标签读的是一份结构化字段的集合,它没有理解,它只是把字段名塞进了上下文。类比到这儿就该收了,剩下的得回到机制上说。

买到的是方差,不是均值

论文自己的结论里有一句话,比“构建无关”这个卖点重要得多:换了构建方式之后,绝对准确率还是会变。

也就是说,接口归纳买到的是方差,不是均值。换图不至于掉得那么惨,不等于换图不掉。这两件事在宣传语里经常被合成一件,合成之后就成了“检索器跟图无关了”,那是错的。更准确的说法是:检索器不再要求你先把图的样子告诉它,它自己去看,看得出来多少算多少,看不出来的部分照样会拖分。

再往下还有一层更硬的边界。所谓构建无关,前提是底下那个东西得是能用 Cypher 查的属性图。开放信息抽取那一族之所以能跑,是因为它那些自由文本关系最后还是被塞进了属性图的边上,只是边上写的是句子而不是枚举值。真换成一个纯三元组库,或者换成一个连“有哪些关系类型”都问不出来的东西,接口归纳拿什么归纳。这个前提论文没有放开讨论,我猜也不好讨论。这条留到下次展开。

有一段我不太买账

论文还有一段,把自己的结果跟既有 GraphRAG 系统报告的数字摆在一起比。

这就有点自相矛盾了。前面刚说大家的图各建各的、横向比没有意义,后面又横向比了一遍。作者自己也写了,多数既有系统是把检索和自家图谱构建联合设计的——那些数字本身就是被联合设计污染过的。拿它当参照系,比出来的差距里有多少来自检索器、多少来自两张图根本不是一回事,说不清。

我理解这段为什么存在,论文得有个表格显得自己站在别人肩膀上。但在我看来这是全篇最弱的一环,弱到可以整段删掉,删掉之后结论一点不受影响。

落到地上是什么

如果你在做企业知识库这类东西,这篇的意义可能比对做研究的更实际。

企业里的图不是一次建成的。今年某个抽取 pipeline 抽出来的图,明年换了模型、改了 schema、加了新数据源,图就变了。检索器要是跟建图绑死,每次换图都得把整条链路重调一遍,调完还得重新验一遍。这个成本很多人心里有数,但不愿意承认——因为它不是一次性花出去的钱,是每次变更都悄悄收一遍的税。

接口归纳这个思路,本质上是把“重调”的成本从换图那一刻挪到每次查询:每次多花一点 token 去读局部 schema,换的是不用重建整条链路。划不划算取决于你的图变得有多频繁、查询有多密,这是个算账问题,不是立场问题。图三年不动一次的,这套东西对你没什么用,老老实实对着 schema 写死 prompt 就行。图每个季度都在动的,这笔账可能算得过来。

至于 ArcRAG 这个系统本身能不能打,我不替它背书。它的评测设置里有一处明显的松动,就是上面说的那段横比,其余部分——两个图谱家族、同一份检索器配置、对照 Direct-Cypher 代理——是干净的,干净得有点朴素。

真正值钱的地方不在系统,在它把一个问题摆到了台面上:原来“检索”和“建图”这两层之间,一直垫着一层没人写下来的耦合。掀开之后你会发现,能拆的部分比想象的多,不能拆的部分也比想象的多。

所以回到开头那两个数字。它们能不能放在一起比,取决于它们是不是从同一个坐标系里出来的。至于你手上那个场景落在哪一边,得看你自己的图怎么建、变得有多快——这个我没法替你判断,但坐标系在哪儿,你现在应该自己能找了。