Retrieval Augmented Generation (RAG) and Beyond: A Comprehensive Survey on How to Make your LLMs use External Data More Wisely



作者认为对于数据增强的 LLM 来说,并没有一刀切的方案,表现不佳通常源于未能正确识别任务的核心重点,或任务本身需要多种能力的组合,而这些能力必须被解构以便更好地解决问题。




外部数据中直接存在的显性事实,不需要额外的推理。这是最简单的查询形式,模型的任务主要是定位并提取相关信息。例如,“2024 年夏季奥运会将在何处举办?”目标是外部数据中包含的一个事实。

1.1 主要挑战
在这个层面上的查询,主要需要正确检索数据,以便 LLM 能够提供准确的回答。由于其高效性、灵活性以及相对较低的成本,RAG 成为处理此类查询时最常采用的技术解决方案。然而,即使采用了 RAG,在构建一个强大且高质量的系统时,依然面临着显著的挑战。这些挑战包括:
数据处理困难: 外部数据通常是高度非结构化的,并包含多模态组件,如表格、图片、视频等。此外,分段或“切块”这些数据的过程会在保持原始上下文和意义方面带来挑战。
数据检索困难: 从庞大且非结构化的数据集中检索相关数据段可能需要大量的计算资源,并且容易出错。开发高效且准确的检索机制是一个难点。
评估困难: 评估 RAG 系统的性能,尤其是在组件级别,是一项复杂的任务。这需要开发强健的指标,能够准确评估数据检索和响应生成的质量。
1.2 技巧
1.2.1 数据处理增强
文档解析通常涉及从文本、表格和图形中提取信息,确保相关片段能够被准确识别和检索。
多模态文档解析: 处理源文档中的多模态内容(如图表、表格甚至视频,如会议记录)是最常被提到的问题之一。通常有两种方法来解决这一问题。第一种方法是将多模态内容转换为文本形式。

例如,表格到文本的方法可以将表格转换为文本,其他技术则将视觉内容转换为基于文本或属性的描述,然后由大型语言模型处理。


第二种方法是利用多模态嵌入技术,使用从多模态数据中检索到的嵌入作为输入的软提示。


分块优化: 对于较长的文本,将文档分割成文本块是常见且必要的操作。较大的文本块可以保留更多语义上的连贯性,但它们往往也会包含更多的噪音。常用的分块策略包括固定大小分块、递归分块、滑动窗口分块、基于段落的分块、语义分块等。

一些方法旨在确定查询所需的细节层次,并基于此选择适合检索的文本块粒度。


另外,有些方法选择将文本处理并精细化为较小的段落,以保持较高的信息完整度。


1.2.2 数据检索增强
索引: 包括稀疏检索、稠密检索和混合检索

查询与文档对齐: 将查询与外部数据中的文档片段对齐,以识别能够帮助回答查询的最佳文档片段。

传统对齐: 将文档片段和查询映射到相同的编码空间。 文档域对齐: 先生成合成答案,再用这些答案检索相关数据,解决查询和检索数据不在同一分布空间的问题。HyDE 是该领域的一个显著工作。 
查询域对齐: 为每个文本的原子单元生成一组合成问题,将文本片段映射到查询空间,然后检索最接近原始查询的合成问题及其对应的文本片段。 
这种方法确保选择最相关且上下文适当的片段来回答查询。

重新排序与修正: 在检索到前 k 个文本块后,RAG 系统需要对这些片段进行过滤和重新排序。大多数 RAG 系统使用检索器提供的相关性评分作为排序依据,而一些研究使用特定的度量标准,如困惑度或困惑度增益作为排序标准。


其他研究则使用LLM评估检索文本块的可信度和实用性,训练可插拔的奖励驱动上下文适配器,以优化检索器的输出。

此外,一些研究专注于预训练一个专门用于事实验证的小型语言模型,用于过滤掉不正确的检索文本块,从而提高检索文本的质量。

1.2.3 响应生成优化
生成响应时,需要确定检索到的信息是否足够,或者是否需要额外的外部数据。此外,处理检索知识与模型内部先验知识之间的冲突也至关重要。监督微调是提升RAG系统生成性能的有效方法。



当面对无关或错误的检索上下文时,预训练的大型语言模型往往容易受到误导,从而生成错误的响应。许多研究表明,通过精心设计 RAG 系统的训练数据,微调或预训练可以有效缓解这一问题。

此外,为了确保 RAG 系统中检索器和生成器之间的性能更加一致,一些研究在训练阶段对检索器和生成器进行联合训练。





这些查询涉及数据中的隐性事实,这些事实并不直接显现,可能需要一定的常识推理或基本的逻辑推断。必要的信息可能分散在多个段落中,或需要简单的推论。例如,问题“堪培拉所在国家目前的多数党是什么?”可以通过将“堪培拉在澳大利亚”的事实与有关澳大利亚当前多数党的信息结合起来回答。

2.1 主要挑战
自适应检索量: 不同问题可能需要不同数量的检索上下文,具体的检索数量取决于问题本身和数据集。固定数量的检索可能会导致信息噪音或信息不足。 推理与检索之间的协调: 推理可以引导检索的重点,而从检索信息中获得的见解可以迭代地优化推理策略。处理这些复杂性需要智能地集成和选择性利用外部数据,并充分发挥LLMs固有的推理能力。
2.2 技巧
2.2.1 迭代 RAG
基于规划的策略 在检索前生成逐步的检索计划,或在检索过程中动态生成计划,可以优化每一步的检索重点,从而高效地引导迭代的RAG系统。例如,ReAct 通过逐步更新每一步的目标,缩小回答问题所需的知识差距。

IRCoT 和 RAT 利用思维链(Chain of Thought)来指导 RAG 流程,基于先前检索的信息决定当前的检索目标。


GenGround 使 LLM 在两个阶段间交替运行,直到得出最终答案:(1) 生成一个更简单的单步问题并给出直接答案,(2) 将问题-答案对追溯回检索到的文档,验证并纠正预测中的任何不准确性。此迭代过程确保了更可靠和准确的响应。

信息填补策略 ITRG 引入了一个迭代检索生成协作框架,先基于已有知识生成答案,然后在后续轮次中继续检索和生成未知部分的响应。

类似地,FLARE 在每次迭代中重新审视并修改生成答案中低概率的词元。

另一方面,Self-RAG 通过微调一个大型模型,使其自主决定何时继续搜索,何时停止搜索并开始回答问题。

2.2.2 图/树结构问题回答
传统的知识图谱(Knowledge Graph, KG) 是增强 LLMs 效率的早期结构之一,图中的每个节点代表一个实体,节点之间的边表示这些实体之间的关系。

LLMs 卓越的阅读理解能力使其无需将文本细化到最小的实体和关系粒度即可有效掌握文本内容。在这一背景下,研究者开始探索将文本块或数据块作为图或树结构的节点,使用边表示高层次或更精细设计的关系。
Knowledge-Graph-Prompting 讨论了三种常见问题,隐含事实挖掘的需求来源于: 
为解决这些问题,Knowledge-Graph-Prompting 使用实体识别、TF-IDF、KNN 及文档结构层次来构建文档图并提取子图以回答问题。 桥接问题依赖于顺序推理 比较问题依赖于对不同段落的并行推理 结构化问题依赖于从相应文档结构中获取内容 MoGG 将一句或两句作为最小的语义单元,使用这些单元作为节点,并基于节点之间的语义相似性构建边。它还训练了一个预测器,决定回答查询所需的文本块粒度,进而确定所需子图的大小。

RAPTOR 使用聚类算法对最小粒度的文本块进行层次聚类,以捕捉文本块之间的高层次语义关系。它在每个层次上总结新的语义信息,并在节点的层次树中召回最必要的信息。

GraphRAG 也采用了聚类方法。它首先根据语义相似性连接最小的文本块,然后使用社区检测算法对节点进行分组。最后,通过分析每个节点社区内的响应,生成查询的全局答案。

2.2.3 自然语言转换 SQL 查询
在处理结构化数据时,将自然语言查询转换为 SQL(NL2SQL)是一种有效的方法。



3. 可解释推理


这些查询不仅要求掌握事实内容,还要求具备理解和应用与数据上下文密切相关的领域特定推理的能力。这些推理通常在外部资源中有明确规定,而在一般大型语言模型的预训练阶段中可能未被提及或很少遇到。例如,在药物领域,LLM 必须解读 FDA 指导文件,评估某一药物申请是否符合监管要求。同样,在客户支持场景中,LLM 需要处理预定义工作流程的复杂性,以有效处理用户查询。在医学领域,许多诊断手册提供权威的标准化诊断标准,例如急性胸痛患者的管理指南。通过有效遵循这些外部推理,可以开发用于管理胸痛的专业 LLM 专家系统。 这包括理解指导支持代理与客户交互的程序步骤和决策树,确保回应不仅准确,还符合公司的服务标准和协议。

数据通常以如下形式组织:
纯文本: 可能包括专门的或官方的文档,如手册或指南,以及特定领域的操作手册或操作指南。这些文本阐述了决策过程中所需的推理过程,帮助处理复杂场景的决策。例如,像美国食品药品监督管理局(FDA)为制药工厂提供的指南,或医生使用的药物指导,都提供了专家(如 FDA 官员或医生)如何处理具体案例的见解。
结构化指令:有限状态机类描述,例如,客户支持 agent 根据手册处理用户的产品更换或退款请求的过程。

3.1 主要挑战
提示词优化成本: 优化提示词的过程通常伴随着高昂的时间和计算需求。不同的查询需要特定的背景知识和决策标准,因而需要多样化的示例。虽然手工设计的提示词通常效果显著,但它们劳动密集且耗时。为了为各种查询生成定制的提示词,训练模型也需要大量的计算资源,进一步增加了开销。
有限的可解释性: 提示词对 LLMs 的影响往往不透明。在大多数情况下,LLMs 的内部参数是限制访问的,这使得我们难以准确评估不同提示词对模型的影响。这种透明度的缺乏妨碍了我们持续理解和验证模型对不同提示词的响应是否具备一致的可解释性。
3.2 技巧
3.2.1 提示词微调
对于可解释推理查询,关键问题在于如何有效地将外部数据提供的推理整合到 LLMs 中,并确保这些模型能够准确地遵循并根据这些推理做出反应。

Text2MDT 提供了一个可行的示例,介绍了两种自动从医学指南和教科书中提取医学决策树的方法。这一过程澄清了冗长医学文本中的逻辑链,使其更加易于理解。

MedDM 开发了一种可由 LLMs 执行的临床指导树(CGTs)的格式,并提出了一种基于这些可执行 CGTs 进行推理的方法以及患者与 LLMs 之间的多轮对话框架。

将推理直接作为自然语言指令整合到 LLMs 中并不总能获得最佳性能,手动设计提示词耗时且效率低。为了解决这一问题,提示词微调技术的应用变得尤为重要,以增强 LLMs 遵循特定推理的能力。一种有效的方法是采用强化学习,如 TEMPERA 框架所展示的那样。

该框架设计了在强化学习行动空间中包含有限指令、示例和口语化表达的提示词,LLMs 生成正确回答的概率作为奖励,指导模型在不同数据集上发现最佳提示词配置。

Rlprompt 也采用强化学习方法,训练一个适配器,基于 LLMs 回答的相对准确性反馈帮助较小的语言模型生成最佳提示词。

另一种创新策略是定向刺激提示(Directional Stimulus Prompting),通过下游任务的表现作为奖励机制,训练模型提取和利用定向刺激(即针对具体实例定制的特定线索或关键词)作为提示词,从而确保 LLMs 的行为与预期结果更加一致。

此外,针对离散提示词空间的优化,使用了基于编辑的方法,例如 GrIPS。这种技术使用一个小数据集作为评分集,通过实验对各种提示词修改(包括删除、交换、释义和添加)进行评分,以快速有效地确定最优提示词配置。

近期的进展还表明,利用 LLMs 自身来促进提示词优化逐渐成为趋势。


Reflexion 框架 引入了一种基于语言反馈的新型提示词优化方法,利用语言模型分析并将对 LLM 输出的反思存储在情景记忆缓冲区中。此记忆组件有助于改进未来互动中的决策过程,并利用累积的历史见解进行评估。

3.2.2 CoT
处理复杂推理需要 LLMs 进行延展的推理链条,这一过程不同于处理事实查询中的离散事实信息。
思维链(Chain-of-Thoughts, CoT) 
思维树(Tree-of-Thoughts, ToT)

思维图(Graph-of-Thoughts, GoT)

思维链、思维树、思维图等方法在这种情境中表现出较高的有效性。对于那些经过充分研究且具有广泛适用性的课题,手动设计 CoT 提示词是一种可行的解决方案。

例如,Ji 等人(2023)提出了一种自我反思的方法,将知识获取与答案生成相结合。通过利用外部工具和设计提示词,他们构建了三种自我反思循环:事实知识获取循环、知识一致性回答循环和问题蕴含回答循环,从而将外部推理纳入模型的处理流程中。

进一步,Wu 等人(2024)对临床记录中的错误类型进行了手动分析,并设计了三种不同的 CoT 提示词来指导 GPT-4 模型关注干预、诊断和管理错误。此类针对性的提示词使得模型能够在临床记录中自动检测错误、识别错误范围并进行纠正。

虽然手动设计的 CoT 提示词效果显著,但需要大量的人工和时间成本。为减少这些成本,Automate-CoT 提出了一种从标记较少的数据集中自动生成增强推理链的技术。该方法采用方差减少的策略梯度策略评估每个 CoT 链的重要性,帮助选择最有效的提示词组合。

另一种使用思维链提示词的方法涉及围绕 LLMs 构建代理工作流系统。这通常需要开发一个更加全面的系统来应对各种现实场景。根据 Wang 等人的研究,此类系统通常可以分为概况、记忆、规划和行动模块。可解释的推理可以以不同形式集成到多个模块中,使代理能够根据环境或人类反馈进行适应和迭代。

近期的进展,如 LLM Reasoners 和 SocREval,集中于自动评估推理链的质量。这些方法还帮助构建了数据增强的LLM应用。

基于可解释推理的应用涵盖了多个领域。例如,CoML 将 AutoML 知识作为提示词集成到 LLM 中,动态检索历史实验记录中的有用信息,并结合这些元素使 LLM 能够为新任务开发机器学习解决方案。

MetaGPT 开发了一个用于软件开发的多代理系统,在该系统中,项目中的不同利益相关者被表示为各自的代理。这个设置允许多个代理根据现实工作流程协同合作,有效完成软件开发任务。

类似地,复杂的代理系统已被设计用于客户服务和医疗问题解答等领域。


在这些领域中,代理系统被定制用于处理特定类型的查询,涉及理解复杂的用户请求或提供准确的医疗信息。这些系统不仅提高了互动质量,还提升了响应的效率和准确性,展示了 LLMs 在经过精心设计的代理工作流中集成后的广泛适用性和潜力。


4. 隐性推理


这一类查询涉及更具挑战性的领域,这些推理并未明确记录,而是必须从外部数据中观察到的模式和结果中推断出来。这里的隐性推理不仅指隐含的推理链和逻辑关系,还包括识别和提取每个特定查询所需的外部推理的内在挑战性任务。例如,在 IT 运维场景中,云运维团队可能已经处理了许多过去的事件,每个事件都有自己独特的情况和解决方案。LLM 必须能够从这些隐性知识库中挖掘出成功的策略和决策过程。同样,在软件开发中,先前调试过的错误历史可以提供大量隐性见解。虽然每个调试决策的逐步推理过程可能未被系统性地记录,但 LLM 必须能够提取出指导这些决策的基本原则。 通过综合这些隐性推理,LLM 不仅能够生成准确的回应,还能反映出由经验丰富的专业人员长期打磨的隐性专业知识和问题解决方法。

域内数据: 隐藏推理查询可能使用来自同一领域的数据,如历史问答记录或人工生成的数据。这些域内数据本身就包含了解决当前查询所需的推理技能或方法论。例如,在 Python 编程难题的背景下,历史问题的解决方案往往包含经典算法和问题解决策略,这些策略可以帮助解决当前的问题。 初步知识: 另一种隐藏推理形式是广泛分散的知识库,这些知识库在不同场景中应用各异。这种初步知识可能构成一个完整的公理系统,例如作为法律判决基础的本地法律法规。此外,它还可能包括在某些领域(如数学证明)中简化推理过程的已验证中间结论。在处理真实世界问题时,这些先验知识可能还来源于人类经验的复杂积累和经验总结。

4.1 主要挑战
逻辑检索: 对于涉及隐藏推理的问题,外部数据的有用性不仅取决于实体级别或语义相似性,更重要的是逻辑一致性或主题对齐。标准的检索方法通常难以捕捉查询的真正目标,或者识别与问题呈现逻辑相似的文本段落。这意味着需要开发更复杂的检索算法,这些算法能够解析并识别问题背后的逻辑结构,而不是仅依赖于表面的文本相似性。 数据不足: 外部数据可能并未明确包含与当前查询直接相关的指导或答案。相关信息往往嵌入在分散的知识中,或者通过示例进行间接呈现。这种间接的信息呈现要求 LLM 具备强大的数据解释和综合能力,能够从分散或间接相关的数据源中推导出连贯的答案。
4.2 技巧
4.2.1 离线学习

要解决这些类型的查询,常见的方法是从数据集离线识别并提取规则和指南,然后检索相关项目。对于生成推理理由,一些工作如STaR 和 LXS 使用大型语言模型(LLM)来生成理由。前者采用迭代的少样例示例方法,从小数据集生成到大数据集;后者引入了两角色解释提取过程,其中学习者模型生成解释,评论者模型对其进行评估验证。

GL 通过上下文学习识别错误并将其概括为未来任务的指导方针。LEAP 通过生成错误、低级原则和高级原则形成推理原则,并将这些原则融入提示中以进行最终推理。

RICP 利用训练数据中的错误生成高级推理和具体见解,然后使用层次聚类对错误模式进行分组,生成任务级和问题级的原则,并将其结合起来以提供问题级见解。


一些集成方法,如 MedPrompt ,包括用GPT-4生成的链式思维作为训练示例,并通过自验证将其与 KNN 检索的上下文学习方法结合使用。

Agent Hospital 通过反思生成理由,并在生成的数据上同时利用记录检索和经验检索。
尽管这些概念有许多不同的名称——如指南、原则、经验和思维模板——但核心思想是提取常见的有用推理理由以增强推理查询。这些理由可能来自自我生成的链式思维(如 MedPrompt, Buffer-of-Thought)、训练集中的错误(如 GL, RICP, Agent Hospital)或有意生成的错误(如 LEAP)。此外,一些原则适用于所有任务(如 Agent Hospital, RICP),而另一些则为特定问题动态检索(如 MedPrompt, Buffer-of-Thought)。许多工作表明,从案例中学习以积累作为推理依据的经验对各种推理任务都有益。
4.2.2 In Context Learning (ICL)

使用示例进行上下文学习是一种常见方法,用于揭示隐藏的推理依据。预训练的大型语言模型表现出显著的上下文学习能力,这种能力可以通过基于相似性检索示例来增强,从而利用模型的少样本学习能力。然而,在提示中包含不相关的信息很容易分散大型语言模型的注意力,导致错误的响应。

Wu 等人开发的 OpenICL 构建了一个 ICL 框架,探索了不同传统方法在示例检索和推理技术对 ICL 有效性上的影响。
此外,根据大型语言模型对上下文示例反馈来训练较小模型,以选择最佳示例和演示,这可以更有针对性地改善特定任务的上下文构建。

此外,Zhang 等人 提出了 Auto-CoT 方法,将示例聚类为各种具有代表性的类型。通过多样化采样问题并生成推理链,该方法构建了更好支持学习过程的示例。
然而,通过少样本学习使大型语言模型掌握其训练领域之外的推理能力仍然是一个重大挑战。Wang 等人通过采样多种推理路径并对这些路径进行边缘化处理,从而选择最一致的答案,提升了大型语言模型选择正确推理链的概率。

Agarwal 等人引入了两种可扩展的生成可用示例的方法,即强化 ICL 和无监督 ICL,这些方法旨在替代人工生成的示例,从而扩展可用示例的池。

DIN-SQL 试图将任务分解为更简单的子任务,并将这些子问题的解决方案用作大型语言模型的提示,显著提升了从文本生成 SQL 的性能。

同样,DUP 识别了大型语言模型在使用思维链方法解决复杂数学文字问题时面临的三个主要问题:语义误解、计算错误和步骤缺失,其中语义误解是主要的限制因素。通过鼓励大型语言模型深入理解问题并提取解决问题的关键信息,可以显著提高其解决数学问题的能力,特别是通过解决语义误解。

上下文学习正日益广泛应用于数学、法律、医学和金融等各个领域 ,在数据增强的大型语言模型应用开发中起着至关重要的作用。这种方法不仅扩展了大型语言模型的功能能力,还增强了它们在不同领域的实际应用性。
4.2.3 微调
尽管大型语言模型(LLMs)具备强大的上下文学习能力,但准确识别复杂且冗长的逻辑链中的推理依据或最佳示例仍然是一项重大挑战。此外,提供大量的外部先验知识也会对LLMs的推理能力带来挑战。鉴于这些因素,微调成为了一种有前景的方法。它不仅能够利用LLMs在预训练期间获得的广泛基础知识,还能使模型快速掌握新的领域推理。这种方法为提高LLMs在应对高级和专业任务中的适应性和有效性提供了可行的路径。
指令微调(Instruction tuning)是一种常见方法,用于将新的能力融入LLMs,通常涉及使用配对的(指令,输出)数据进行监督微调。构建指令数据集的主要方法有三种:
从现有数据集中提取 
通过手工编写指令手动创建 
使用 LLMs 生成合成数据

此外,许多研究探讨了如何优化指令数据集中的数据分布以提高微调效果。然而,在构建数据增强型 LLM 应用程序时,微调仍然是相对耗时且计算资源密集的方法。近年来,已经有一些工作致力于降低微调大型模型的成本。比如,适配器微调(Adapter tuning)通过在微调过程中将小型适配器模型与LLM集成,同时冻结LLM的参数,只优化适配器的权重。

前缀微调(Prefix Tuning)和提示微调(Prompt Tuning)则在输入之前添加一组可训练向量,这些向量在训练期间被优化,以提高 LLM 的性能。

低秩适应(Low-Rank Adaptation)通过在每个密集层上施加低秩约束来逼近更新矩阵,减少了适应下游任务所需的可训练参数数量。


LISA 利用一小组涉及推理的段落数据样本微调了多模态LLM LLaVA,显著改善了模型的推理分割能力。

MAmmoTH 精心构建了一个结合了“思维链”(Chain of Thought)和“程序思维”(Program of Thought)推理的数学示例数据集,确保了不同数学领域的广泛覆盖,提升了LLM解决一般数学问题的能力。

ReFT 提出了从多个对应同一问题的标注推理路径中学习的方法。它自动为给定的数学问题采样大量推理轨迹,利用正确答案生成奖励信号。

ChatDoctor 利用一个包含 100,000 条来自广泛使用的在线医疗咨询平台的医生-患者对话数据集,微调了 LLaMA,显著提升了模型理解患者需求并提供有效建议的能力。

FinGPT 开发了一个基于金融数据进行微调的开源 LLM,使用自动化数据管理和轻量化的低秩适应技术。

DISC-LawLLM 为中国司法领域创建了一个监督微调数据集,通过微调LLMs,使其在不同法律场景下有效地为各种用户提供增强的法律推理能力。

总结
作者注:构建一个 RAG 系统虽然架构容易,但是不同的查询类别,不同数据格式的处理以及 CoT 等技术的有效应用,如何组合、评估能够达到一个好的效果是一件比较有挑战的事情。构建业务系统->收集反馈->数据与提示词调整->模型微调+强化学习的迭代循环是一个有效路径。





