今天是2024年11月17日,星期日,北京,天气晴。
最近琢磨了一个挺有意思的现象:大家试了那么多方案,却始终找不到一个完美的解法。总结起来就是,监督微调虽然好用,但计算成本高、容易过拟合;上下文学习(ICL)依赖手工模板,效率低还处理不了长文本;检索增强生成(RAG)得看检索文档的质量和相关性,成本同样不低;知识图谱(KG)那套则涉及大量人工构建和维护,扩展性实在有限。
说白了,RAG这个“补丁”是越打越多,而且还针对不同任务花式地打。所以,今天专门回顾一下最近一周值得关注的几个工作进展。
一条线是推理规则怎么融入RAG。知识图谱本身可以作为规则约束加进去,关键是怎么挖掘规则、匹配规则。另一条是KGQA范式下的GraphRAG代表工作,以及EGO-GraphRAG这个组合设计,算是昨天话题的延续。还有一条就是RAG怎么跟传统的知识补全模型打配合。
整条技术路线都有不少可感之处,大家不妨当个索引看看,慢慢形成自己的知识体系,总归会有帮助的。
一、KGQA范式下的GraphRAG代表工作及EGO-GraphRAG组合设计
先看一个关于GraphRAG的最新进展——《EGO-GraphRAG: Modularizing Graph-based Retrieval-Augmented Generation for Design Space Exploration》(论文地址:https://arxiv.org/pdf/2411.05844)。这篇工作对KGQA范式下的GraphRAG做了一个系统梳理,把各模块的内容做了组合实验,其中有不少关键的技术点值得拿来研究。
出发点很清晰:现有的RAG方法主要依赖文档检索,容易引入噪声和冗余信息。而图结构能提取特定的推理路径,从而提供更精确、更相关的信息。这里的关键是——怎么找到最佳路径。

具体来看,可以分解为三个相互连接的模块:子图提取、路径过滤和路径细化。
这里整理了已有的一些最新成果,供大家参考:

1)KB-BINDER:《Few-shot In-context Learning for Knowledge Base Question Answering》(https://arxiv.org/abs/2305.01750)。为了在一个统一的、无需训练的框架下处理不同KBQA数据集上的问题,KB-BINDER实现了KBQA任务上的少样本上下文学习。具体来说,它先利用像Codex这样的语言模型,通过模仿几个示例为特定问题生成逻辑形式作为草稿;然后根据知识库,利用BM25分数匹配,把生成的草稿绑定到可执行的草案上。

2)StructGPT:《StructGPT: A General Framework for Large Language Model to Reason over Structured Data》(https://arxiv.org/pdf/2305.09645)。目标很明确——以统一的方式提升大模型对结构化数据的推理能力。它构建专门的接口,从结构化数据中收集相关证据(也就是阅读),然后让LLM专注于基于这些信息进行推理(也就是推理)。

3)ToG:《Think-on-Graph 2.0: Deep and Faithful Large Language Model Reasoning with Knowledge-guided Retrieval Augmented Generation》。核心是利用知识图谱通过实体链接文档,促进深入且由知识引导的上下文检索。同时,用文档作为实体上下文,实现精确高效的图检索。简单来说,ToG在图检索和上下文检索之间来回切换,寻找与问题相关的深层线索,帮助LLM生成答案。

4)RoG:《Reasoning on Graphs: Faithful and Interpretable Large Language Model Reasoning》。它的思路是“规划—检索—推理”框架。RoG先根据KGs生成关系路径作为忠实的计划,然后利用这些计划从KGs中检索有效的推理路径,最后由LLM完成忠实的推理。

5)KELP:《Knowledge Graph-Enhanced Large Language Models via Path Selection》(https://arxiv.org/pdf/2406.13862)。针对知识图谱增强问题,KELP提出了一个三阶段原则性框架:通过潜在语义匹配为输入文本生成知识路径的分数,实现更细粒度的灵活知识提取。同时,通过训练KG中选定路径与输入文本之间的编码,还能把与输入文本有间接语义关系的知识路径也考虑进来。

6)DoG:《Debate on Graph: a Flexible and Reliable Reasoning Framework for Large Language Models》(https://arxiv.org/pdf/2409.03155)。它发现两个问题:过长的推理路径分散了答案生成的注意力,而且误报的关系阻碍了路径精细化。所以,DoG提出了一种迭代交互式KGQA框架,利用LLM的交互学习能力,在图上进行推理和“辩论”。具体来说,DoG采用了子图聚焦机制,让LLM在每个推理步骤后都尝试回答问题,从而减轻长推理路径的影响;同时,利用多角色辩论团队逐步简化复杂问题,减少误报关系带来的干扰。

7)GSR:《Less is More: Making Smaller Language Models Competent Subgraph Retrievers for Multi-hop KGQA》(https://arxiv.org/pdf/2410.06121)。核心想法是把子图检索任务建模成由小型语言模型处理的条件生成任务,并定义子图标识符为一系列关系,每个关系都表示为存储在语言模型中的一个特殊标记。

8)GCR:《Graph-constrained Reasoning: Faithful Reasoning on Knowledge Graphs with Large Language Models》(https://github.com/RManLuo/graph-constrained-reasoning, https://arxiv.org/pdf/2410.13080)。它的策略是:利用一个轻量级的、专用于KG的LLM进行图约束推理,同时用一个强大的通用LLM在多个推理路径上做归纳推理。

这些方案的更多细节,建议大家直接看原文。
再说说EGO-GraphRAG,它的本质就是一个各阶段的排列组合实验,分为三个阶段:
在子图提取阶段,通过缩小搜索空间,从整个图中提取与查询相关的子图。常用的方法包括个性化PageRank(PPR)、随机游走重启(RWR)等。
在路径过滤阶段,从提取的子图中检索推理路径。常用的方法包括完整路径过滤、最短路径过滤、迭代路径过滤等。
在路径细化阶段,进一步筛选推理路径,确保只有最相关的路径进入LLM的推理过程。常用的方法包括BM25、Sentence-Transformers、Rerank模型等。这些路径剪枝的策略,值得关注,能帮咱们补齐知识体系。
总共做了20组实验:
评估指标如下,一看便知,这就像乐高式的GraphRAG,做的就是一个对比组合实验。
值得关注的点有两个:一个是时间消耗,一个是具体指标。
二、关于ranking思想引入到知识图谱补全(KGC)任务
知识图谱补全(从不完整的三元组中推断出缺失的实体)也是一个重点任务,大模型在这方面也卷得厉害。核心难点在于:怎么利用实体上下文信息来增强知识图谱的语义表示?怎么有效结合结构化和非结构化信息来做推理?另外,泛化性怎么保证?
以前大家都喜欢用TransE这类嵌入方式,但现有基于嵌入的方法只依赖知识图谱里的三元组,很容易受到虚假关系模式和长尾实体的影响。
所以后来大家开始想,能不能借助更多信息。比如基于文本的方法,在知识图谱三元组和自然语言之间的语义差距上就很难受。除了三元组,实体上下文(比如标签、描述、别名)在增强知识图谱方面也能发挥重要作用。于是也有工作直接让大模型生成实体的上下文,但坦白说,生成的上下文噪声很大,那怎么办?
一个很自然的思路,就是引入ranking的方法去做过滤。
来看看这个思路的一个实现——《Retrieval, Reasoning, Re-ranking: A Context-Enriched Framework for Knowledge Graph Completion》(https://arxiv.org/abs/2411.08165)。它设计了三个模块:
首先,检索模块从知识图谱中收集支持三元组。
从基础嵌入模型(比如TransE, RotatE, GIE, SimKGC, CoLE, NBF-Net)中收集可能的候选答案。
并检索每个相关实体的上下文。
这里的支持三元组检索,优先检索与查询三元组具有相同实体和关系的支持三元组(注意,是相同关系和实体),数量不足时再放宽条件。上下文检索指的是从Wikidata知识库中提取与查询三元组和支持三元组中的实体相关的文本上下文信息。
这一步拿到的第一组答案,来自传统方案。
然后,推理模块用大模型为每个查询三元组生成潜在答案。具体来说,根据已知实体的描述和支持三元组生成多个可能的答案。
这里有个fewshot,也就是In-context Demonstration,目的是让大模型知道这种任务形式,以及已经检索到的支撑三元组和实体的描述,希望它能推理出对应的尾实体。
然后把问题中实体对应的描述拿来生成多个答案:
整条流程如下:
这一步拿到的第二组来源,来自LLM的推理。
最后,重排序模块结合上述两个模块的候选答案,微调一个大模型来提供最佳答案。
这里的关键是微调。整体效果比之前的TransE要好,加入实体描述信息也有明显的收益。
三、关于推理规则用于RAG的一些思路
来聊聊RuAG(Learned-Rule-Augmented Generation),论文是《RuAG: Learned-rule-augmented Generation for Large Language Models》(https://arxiv.org/abs/2411.03349)。它的核心思路是:把大量离线数据自动提炼成可解释的一阶逻辑规则,然后注入大模型中,用来增强推理能力。说实话,这个思路确实管用。
核心看两点:一是规则的表示,这里用了一阶谓词逻辑。
二是在不同任务上,对应推理规则的表示:
以及得到的结果:
其实,这个工作和《RULERAG: RULE-GUIDED RETRIEVAL-AUGMENTED GENERATION WITH LANGUAGE MODELS FOR QUESTION ANSWERING》(https://arxiv.org/pdf/2410.22353)异曲同工。后者也是引入规则知识做RAG,核心包含三个东西:
规则库R:包含用于指导检索和生成的规则,用自然语言表达,比如“[实体1, r1, 实体2] 导致 [实体1, r2, 实体2]”。
检索器(RG-retriever):根据查询和规则检索相关文档的组件。
生成器(RG-generator):根据检索到的文档和规则生成答案的组件。
语言模型(LLM):用于理解和生成自然语言的预训练模型。
核心思路在于:通过引入符号规则作为上下文学习(ICL)示例,指导检索器检索与查询逻辑相关的文档,并统一指导生成器根据同一套规则生成答案。就像下面这个例子。
难点在于规则的挖掘。RAG可以Recall任何东西,关键是那个东西得存在——这很重要。
总结
本文主要介绍了关于推理规则用于RAG的一些思路,知识图谱本身也可以作为规则约束加进去,关键是怎么挖掘规则、匹配规则;KGQA范式下的GraphRAG代表工作及EGO-GraphRAG组合设计,这是对昨天话题的延续;以及RAG怎么跟之前传统的知识补全模型打配合。大家可以仔细琢磨。
