这篇论文我读了两遍。最让我不舒服的倒不是实验结果本身,而是这个结果照出来的一层幻觉——我们这行最近又有人开始把“知识塞进权重”当成 RAG 的替代品在吹了。省 token、不泄露源数据、查询快,听着全对。但这篇论文自己把话说到了一个很尴尬的位置:知识确实写进去了,可怎么读出来,没人知道。
先说这论文干了什么。它没走 Graph RAG 那条大家挤破头的路,换了一个做法:把知识图谱离线编译成一组按实体划分的 LoRA 适配器库。查询的时候不把子图塞进上下文,直接注入对应的权重。作者管这叫参数化知识层。参数化记忆这个概念不新鲜,在 LLM 圈子里隔三岔五就有人提一次,但这次人家真做了实验,而且做出了一个扎眼的数字:MetaQA 单值关系上,适配器让一个闭卷近乎失明的基础模型从 0.007 的精确匹配涨了 +0.243。0.007 基本等于瞎猜,+0.243 听着也不高,可你得意识到,这是没往上下文里塞任何子图的情况下拿到的。知识确实在权重里落了脚。
到这儿我都还觉得像话。真正让我心里咯噔的是第十条往后。
他们试了一件很自然的事:知识既然已经编译进适配器了,那能不能通过“检索适配器”来找到哪个适配器里存着答案?这逻辑太顺了——你有一堆按实体划分的适配器,每个存着围绕某个实体的子图,查询来了,先在权重空间里找到语义最接近的那个适配器,把权重注进去,token 省了,检索也做了,两头不耽误。两年前我也会觉得这站得住。embedding 做语义检索大家都熟,把每个适配器权重拍平了做个 embedding,或者直接看权重空间的几何距离,总能定位到该用的那个适配器吧?直觉上这件事应该 work——语义相邻的实体,子图知识应该有重叠,适配器之间得存在某种可迁移的邻近性。
结果是两条路都跌到随机水平。嵌入检索不行,权重空间几何检索也不行。论文原话:当查询没有对应子图时,这两类检索都只达到随机水平。原因是语义相邻实体的适配器并不包含答案,知识以局部方式存储,不会迁移。
我担心很多人把这条结果看轻了。它说的不是“检索做得不好”,它说了一句更刺耳的话:参数化存储之后,知识的可寻址性被改变了。你写进权重里的不是一篇文档,不是一个可以靠相似度排序的向量,没有那么一个形状规则、语义邻近就能直接调取的结构。训练 LoRA 适配器的时候,优化器从头到尾只被问了一件事:这个适配器能不能正确执行这个子图里的查询。它没有收到任何信号,让它去保持一种“语义上的邻接性”。适配器 A 存着巴黎周围的子图,适配器 B 存着里昂周围的子图,这俩城市语义确实近,但 A 和 B 在权重空间里的距离,是由两次完全独立的优化轨迹决定的。这个轨迹只对让各自子图里的三元组成立负责,不对让两个适配器之间保持语义邻近负责。所以权重几何和子图语义有相关性,ρ = +0.329,但这点相关性够不够撑起可靠的检索?不够。相关和可寻址是两个概念。
我这不是在挑他训练流程的刺。换一套流程,大概率也会撞上同一堵墙。根子在于:优化过程从来没把“权重空间要保留语义可寻址性”当成约束。它只是一个没被要求的副产品。你用 LoRA 把知识压进低秩矩阵,本质就是一次有损的、非线性的一对一映射,而映射后落在高维空间的哪个位置,跟你训练的初始化、学习率、数据顺序都有关系,唯独跟它对外该有的语义坐标没有必然联系。两个语义相邻的实体,适配器权重可以离得远到随机水平——你用 embedding 去检索,当然瞎。
这件事对现在想做“知识库参数化”的人,是一盆冷水。我看到不少帖子把这做法往“替代 RAG”的方向吹,省 token、不露数据、查询快,这些我不否认。但没几个人好好想过读路径这件事。RAG 之所以能在工程上落地,很大程度是因为它的读路径在文本空间里,是你能看见、能调的东西。子图检索不到,你能看它检索了啥,能换 embedding,能调 top-k。参数化之后,读路径变成了权重空间里的黑盒:你必须找到一种机制去选适配器、组合适配器,而这个机制的搜索空间是权重空间,不是文本空间。你连一个注意力头的多维向量里第几个维度对应什么概念都说不清,更别说让它稳定地运行在一个可检索的几何上。
说白一点,文本检索像是把证件放进一个分好类的档案柜,每个抽屉有标签,你想找什么,看标签拉抽屉,路线明确。参数化存储是把证件上的信息编成一段密码,写进一面墙里。墙确实能承载信息,可你现在要找那段密码,手里唯一的办法是站在这面墙前问“哪个区域和我心里的意思更像”。它没有区域,也没有标签。你写进去的时候根本没规划读取时的索引结构,现在要读了,抓瞎是必然的。
我不是反对把知识往参数里放——原则上可行,这篇论文自己都实证了。我要说的是顺序问题。存储方案和读取方案是一对,不是两件事。你在参数化存储上省下的 token,拿什么去换?如果选适配器的机制最后还得回到“从大的候选集里做检索”,而这检索又快不起来、又不准,那就不是零开销,是把开销转移到了一个你还没搞明白的地方。这跟很多年前讨论 KV cache 时说的一样:你能存,不代表你会取。存入是优化问题;取出来并且取对,是系统设计问题。
技术层面有三个点我是真想圈出来说。
第一,LoRA 的低秩约束在这儿可能帮倒忙。低秩矩阵本身就在压信息,不同适配器之间的差异很可能被这种低秩投影进一步抹平,让权重空间里的几何更没判别力。如果你的目标是让适配器在权重空间里至少保留一点可寻址结构,低秩是不是合适的载体?我不确定。但现有结果至少说明,低秩加独立优化,不会天然长出几何结构来。
第二,每个实体训一个适配器,这个设计本身就把实体之间的图结构拆散了。图里有条边连接两个实体,这条边落进适配器 A 的监督信号里,适配器 B 完全看不到。图的信息传递发生在训练之外,于是“语义相邻”和“权重可寻址”之间的桥,在构造阶段就断了。
第三,组合适配器才是真正的重点。单值关系 +0.243 只是最小可行性证明,真实的图是要跨实体跳转的。选对适配器还不够,你还得知道什么时候要两个适配器一起上,什么时候一个适配器的权重会把另一个适配器里的知识覆盖掉。这是权重叠加的干涉问题。文本拼接没这个麻烦,你拼进上下文里它就在那,谁也不会盖住谁。
所以别急着把 RAG 干掉。RAG 和参数化不是一回事,也不是上下位替代关系。我关心的一直是读路径的命运——一个系统读路径设计不清楚,它在生产上就不会比一个读路径清楚但写路径笨重的方案更可靠。可靠性的价值,不是靠省 token 挣回来的。
回到开头那个“不舒服”。那个不舒服是什么?是我们太习惯在参数里找魔法了。把知识塞进权重,权重读不出来,这不叫失败,这叫把我们自己对权重空间的感知力有多弱,晾了出来。我们总以为梯度跑一遍、损失降下来,参数里就自动发生了“理解”,然后坐着等它顺手给我们可检索的邻近结构。工程上这种心态就是最典型的沙子上盖楼:你搭的是存储,可整个系统的可用性,取决于一个你根本没设计的读取机制。存储费了老大力气,读不出来的那一刻,前面所有的 clever 都是沉没成本。
我的态度很明确:参数化知识存储,可以研究,但别拿出去当工程方案。它在存储原理上成立,在检索读取上还差得远——差的程度,就是随机水平。先把适配器怎么选、怎么组合的问题当成一等公民解决掉,再谈省 token、省成本。设计参数化存储时,读写必须当成一个整体来设计,而不是先造一面到处是密码的墙,回头再琢磨从哪扇窗翻进去。顺序反了,就是把这笔检索复杂性的账,从你熟悉的文本空间,转去了一个你看不见、量不准、概念都不确定的空间。
这笔账不是省了。它是藏起来了。
先把读路径想清楚,再决定往参数里放多少东西。这句话不好听,但比一百个“参数化记忆来了,RAG 要死了”的标题值钱。
