四、生成
在检索之后,直接将所有检索到的信息输入到大语言模型(LLM)中以回答问题并不是一种良好的做法。接下来将从两个方面介绍调整方法:调整检索到的内容和调整大语言模型。
4.1 上下文优化(Context Curation)
上下文优化(Context Curation) 是RAG系统中,通过处理检索内容来提高生成质量的关键步骤。冗余信息会干扰LLM(大型语言模型)的最终生成过程,过长的上下文还会导致“中间丢失”(Lost in the middle)问题【98】,即LLM在处理长文本时往往只关注开头和结尾,而忽略中间部分。因此,RAG系统通常需要进一步处理检索到的内容,确保上下文的相关性和简洁性。
1. 重排(Reranking)
重排(Reranking) 是通过对检索到的文档分块重新排序,以突出最相关的结果。这种方法可以有效减少文档池的大小,并在信息检索中起到增强和过滤的双重作用,从而为语言模型提供更精炼的输入,提高生成结果的准确性【70】。
重排方法可以分为以下两类:
- 基于规则的方法:依赖预定义的度量标准(如多样性、相关性和MRR,即平均倒数排名)进行排序。这类方法简单直观,但可能缺乏灵活性。
- 基于模型的方法:利用预训练模型进行排序,如BERT系列的编码-解码模型(Encoder-Decoder)(例如SpanBERT)或专门的重排模型,如Cohere rerank 或 bge-raranker-large,以及通用的大型语言模型如GPT【12】【99】。这些模型能够捕捉更深层次的语义特征,在处理复杂的文档排序任务时表现更好。
2. 上下文选择与压缩(Context Selection/Compression)
在RAG过程中,一个常见的误解是认为检索越多的相关文档并将它们连接成一个长提示就越好。但实际上,过多的上下文会引入噪音,削弱LLM对关键信息的感知能力。
为了应对这个问题,研究提出了上下文选择与压缩(Context Selection/Compression) 的方法:
- (Long) LLMLingua【100】【101】利用小型语言模型(如GPT-2 Small 或 LLaMA-7B)来检测并移除不重要的词元。虽然生成的文本对人类来说可能难以理解,但这种方法对LLM来说是有效的提示压缩方法,且不需要额外训练LLM,在语言完整性和压缩率之间找到了平衡。
- PRCA【69】通过训练信息提取器来减少冗余上下文信息,而RECOMP 通过对比学习训练信息压缩器,利用一个正样本和五个负样本进行训练,编码器在此过程中通过对比损失进行优化【71】【102】。
减少文档数量也是提高模型答案准确性的关键。Ma et al.【103】提出了“过滤-重排(Filter-Reranker)”范式,其中小型语言模型(SLM)作为过滤器,而LLM则作为重排代理。研究表明,让LLM重新排列由SLM识别出的挑战样本可以显著提升多种信息抽取任务的效果。
另一种简单而有效的方法是让LLM在生成最终答案之前对检索内容进行评估,从而过滤掉与问题不相关的文档。例如,在Chatlaw【104】中,LLM通过自我提示评估参考的法律条款相关性,从而提高答案的准确性。
总结
上下文优化(Context Curation) 是RAG系统中的重要步骤,旨在通过重排、选择和压缩上下文来提高检索结果的质量。重排能够通过规则或模型对文档分块进行排序,以确保最相关的内容优先被处理。上下文选择与压缩方法通过小型语言模型和信息提取器等工具减少冗余信息,从而提升LLM的生成效果。另外,通过减少文档数量和评估上下文相关性,也能够显著提高模型答案的准确性和生成效率。
4.2 LLM微调(LLM Fine-tuning)
LLM微调(LLM Fine-tuning) 是基于场景和数据特征对大型语言模型(LLM)进行有针对性的微调,以提高模型在特定任务中的表现。
1. LLM微调的优势
微调LLM的一个关键优势在于能够针对具体领域进行训练:
- 领域知识的补充:当LLM缺乏某一特定领域的数据时,微调可以向模型提供额外的知识,从而提升其在该领域的表现。例如,Huggingface 平台上的微调数据集可以作为微调的初步步骤【37】。这种方法能够使LLM在处理特定任务时表现得更加精准。
- 输入输出的调整:通过微调,还可以调整LLM的输入和输出形式,使其适应特定数据格式,并按照指令生成特定风格的响应。例如,对于处理结构化数据的检索任务,SANTA框架 实现了一种三部分的训练机制,有效捕捉了数据的结构和语义细微差别【76】。在训练的初始阶段,SANTA使用对比学习来优化查询和文档的嵌入表示。
2. 通过强化学习对齐输出
除了微调,通过强化学习对齐输出(Aligning LLM Outputs through Reinforcement Learning) 也是提升LLM表现的有效方式。这种方法通过人类反馈或者检索器的偏好调整模型输出:
- 人类偏好的对齐:一种方法是手动标注最终生成的答案,并通过强化学习反馈这些标注信息,使模型的输出与人类偏好对齐。通过这种方式,模型能够更好地生成符合用户期望的答案【79】。
- 检索器偏好的对齐:除了与人类偏好对齐,还可以将模型的输出与经过微调的模型和检索器的偏好对齐。通过强化学习,模型能够更好地理解检索器的需求,并提供更符合检索器预期的结果。
3. 模型蒸馏(Model Distillation)
在无法使用强大的专有模型或较大参数的开源模型时,一种简单而有效的替代方法是对更强大的模型进行蒸馏。例如,可以蒸馏类似GPT-4的强大模型,提取其知识用于微调较小的模型。蒸馏能够在保持模型能力的同时显著减少模型的计算资源需求。
4. 检索器和生成器的对齐(Aligning Retriever and Generator)
在LLM的微调过程中,还可以将检索器的微调与生成器的微调相结合,以实现对齐。例如,RA-DIT方法【27】通过使用KL散度对检索器和生成器的打分函数进行对齐,从而确保模型的生成结果和检索过程保持一致。这种方法提高了生成器在处理检索结果时的准确性和连贯性。
结论
LLM微调(LLM Fine-tuning) 是提高LLM在特定领域和任务中的表现的重要方法。通过补充领域知识、调整输入输出格式和对齐输出偏好,微调能够使模型更好地适应多样化的应用场景。此外,模型蒸馏和检索器与生成器的对齐方法进一步优化了模型性能,特别是在资源受限或模型规模有限的情况下。微调不仅可以提升LLM在语言生成中的表现,还能够在信息检索和生成器的配合上提供更一致的结果。
五、RAG中的增强过程
在RAG领域,标准做法通常包括一次性检索步骤,随后进行生成。这可能导致效率低下,对于需要多步推理的复杂问题来说也往往不足,因为它提供的信息范围有限 [105]。许多研究已针对这个问题优化了检索过程,我们在图5中对其进行了总结。
5.1 迭代检索(Iterative Retrieval)
迭代检索(Iterative Retrieval) 是一种通过对知识库进行反复搜索来改进生成答案的过程。
1. 迭代检索的优势
迭代检索的关键优势在于通过多次检索提供丰富的上下文信息,帮助模型更好地生成后续的答案:
- 上下文增强:随着检索迭代的进行,模型能够在每一轮检索中获取更多与初始查询相关的上下文信息,这些信息将成为生成后续答案的重要基础。
- 生成增强:在每次迭代中,生成的文本不仅基于当前检索结果,还考虑了前几次检索生成的文本,从而形成更加连贯和完善的答案。这种方式通过多次反馈,帮助模型迭代出更准确和相关的结果。
2. 潜在挑战
尽管迭代检索有助于提供额外的上下文参考,但它也面临一些潜在的挑战:
- 语义不连贯:在多次检索迭代过程中,如果生成的文本与原始问题的语义脱节,可能会导致生成的答案不连贯,影响最终结果的准确性。
- 无关信息累积:随着迭代次数的增加,可能会引入大量不相关的信息,尤其是当检索的内容没有严格过滤时,这些信息的累积可能干扰生成答案的质量。
3. ITER-RETGEN模型
ITER-RETGEN【14】 采用了一种协同的方法,结合了“检索增强生成(retrieval-enhanced generation)”和“生成增强检索(generation-enhanced retrieval)”的策略,特别适用于需要重复特定信息的任务。
- 检索增强生成:在这个过程中,模型利用任务输入的上下文作为检索基础,反复从知识库中提取与任务相关的内容。这种方式确保模型能够始终检索到与当前问题密切相关的信息。
- 生成增强检索:每次生成的文本反过来又会进一步增强检索效果,通过提供更加细化和明确的查询,使模型能够在下一轮检索中找到更相关的内容。这种双向增强的策略使得每一轮检索都能在先前的基础上优化结果。
总结
迭代检索(Iterative Retrieval) 通过反复检索和生成的交互过程,帮助LLM更好地处理复杂任务。尽管它面临着语义不连贯和无关信息累积的问题,但通过像ITER-RETGEN这样的协同方法,这些挑战可以得到缓解。通过“检索增强生成”和“生成增强检索”的双向增强策略,模型能够在每一轮检索中逐步改进,提供更精准和全面的答案。
5.2 递归检索(Recursive Retrieval)
递归检索(Recursive Retrieval) 是一种用于信息检索和自然语言处理(NLP)的方法,旨在通过反复优化查询来提高搜索结果的深度和相关性。这个过程包括基于先前检索结果的反馈不断细化搜索查询,从而逐渐收敛到最相关的信息。递归检索的目标是通过反馈循环逐步优化搜索体验,特别是在复杂搜索场景或信息高度专业化的情况下。
1. 递归检索的优势
递归检索的关键在于通过迭代过程逐步优化查询,从而实现以下目标:
- 深度信息挖掘:通过反复搜索并基于前一轮结果更新查询,递归检索可以逐渐收敛到最相关的内容。
- 增强搜索相关性:每次检索迭代都会带来更多的上下文信息,帮助优化后续的搜索查询,逐步缩小搜索范围,直至找到最优解。
- 用户需求适应性:这种方法特别适用于用户需求不明确的复杂场景,通过反复的反馈循环,模型能够逐步适应用户的查询意图,改善最终的搜索体验。
2. IRCoT与ToC模型
- IRCoT(Information Retrieval Chain of Thought)【61】:该方法使用思维链(Chain-of-Thought,CoT) 引导检索过程,并通过获得的检索结果不断优化思维链。通过这种方法,模型能够在检索的多个步骤中进行自我调整,从而改进搜索策略。这种技术特别适用于需要分步推理的复杂任务。
- ToC(Tree of Clarifications)【57】:该方法创建了一个澄清树(Clarification Tree),用于系统地优化查询中的模糊部分。这种方法在面对用户需求不完全明确的情况下尤其有用。通过递归式的查询改进,它能够逐步消除歧义,使得查询结果更加贴合用户需求。
这两个模型展示了递归检索在优化查询流程方面的强大能力,使其能够在复杂场景中提供高精度的搜索结果。
3. 递归检索与多跳检索的结合
在某些特定数据场景下,递归检索通常与多跳检索(Multi-hop Retrieval) 技术结合使用,以实现更深入的信息提取。两者的主要区别和结合方式如下:
- 递归检索:递归检索通过结构化索引来分层次地处理和检索数据。比如在处理长文档或PDF时,递归检索可以首先对文档的某些部分进行摘要,然后基于该摘要执行后续的检索。这种分层次的处理方式使得递归检索能够在复杂文档中快速找到相关信息。
- 多跳检索:与递归检索不同,多跳检索旨在深入图结构化数据源,提取相互关联的信息【106】。它通过多步推理,从不同的节点跳转,找到分散在多个位置的相关信息。这种技术在处理图数据和复杂网络结构时尤为有效。
递归检索和多跳检索的结合为处理复杂信息结构提供了更加全面的解决方案。例如,在处理具有复杂层次结构的文档或知识图谱时,递归检索首先过滤和优化信息源,而多跳检索进一步深入探索信息之间的关系。
5.3 自适应检索(Adaptive Retrieval)
自适应检索(Adaptive Retrieval) 是一种优化RAG框架的方法,使得大型语言模型(LLM)能够主动决定何时进行检索以及检索哪些内容,从而提高信息检索的效率和相关性。自适应检索方法,例如 Flare【24】和 Self-RAG【25】,赋予LLM更大的自主权,允许模型根据当前的生成过程自动判断是否需要获取更多信息。
1. 自适应检索的背景与趋势
自适应检索属于LLM主动决策的一部分,这种趋势体现在多个模型代理中,如AutoGPT、Toolformer 和 Graph-Toolformer【107】【108】【109】。这些模型代理的特点是让LLM在操作过程中主动进行判断:
- Graph-Toolformer 是一个典型的例子,它将检索过程分为多个步骤,LLM在每个步骤中主动使用检索器、应用自问(Self-Ask)技术,并通过少样本提示发起搜索查询。通过这种方式,模型可以像智能代理一样决定何时需要进行信息检索,类似于工具的使用方式。
这种主动式的检索行为使得LLM能够像智能体一样进行操作,不再只是被动等待查询输入。
2. WebGPT中的强化学习框架
WebGPT【110】通过引入强化学习框架训练GPT-3模型,赋予其在文本生成过程中自动使用搜索引擎的能力。该模型利用特殊的标记进行操作,如发起搜索引擎查询、浏览结果和引用参考文献。这些机制扩展了GPT-3的能力,使其能够通过外部搜索引擎获取最新的相关信息。
WebGPT的检索过程自动化且具有高度灵活性,尤其是在文本生成过程中,模型能够自主决定何时启动外部搜索引擎以获得补充信息。这种设计大大提升了模型在面对实时信息时的表现。
3. Flare模型的自动化检索机制
Flare【24】的自适应检索通过监测生成过程中模型的置信度来自动决定何时触发检索:
- 置信度监测:Flare通过监测生成的术语的概率,当生成术语的概率低于某个阈值时,会激活检索系统以收集相关信息。通过这种方式,Flare在检索周期的时机上做到了优化,在需要时触发检索,避免无效检索。
这种自动化的检索机制确保了生成过程中的信息完整性,同时也减少了不必要的检索操作,提高了检索效率。
4. Self-RAG的反思标记与检索策略
Self-RAG【25】引入了“反思标记(Reflection Tokens)”,让模型能够对自身的输出进行反思。反思标记有两种类型:“检索”(retrieve)和“批评”(critic),模型可以自主决定何时启动检索,或者根据预定义的阈值自动触发检索过程:
- 检索机制:当模型决定启动检索时,生成器会在多个段落中执行片段级别的束搜索(beam search),以生成最连贯的答案序列。
- 批评标记:批评标记用于更新子段落的得分,模型可以在推理过程中灵活调整这些权重,从而优化生成结果。
Self-RAG的设计省去了额外的分类器或依赖自然语言推理(NLI)模型的需求,从而简化了决策流程。这种机制使得模型能够在生成答案时具备更高的自主判断能力,减少了过度依赖外部信号的复杂性,进一步提高了生成的准确性和相关性。
图5的解读
这张图展示了三种不同类型的检索增强流程:迭代检索(Iterative Retrieval)、递归检索(Recursive Retrieval)和自适应检索(Adaptive Retrieval)。
1. 迭代检索(Iterative Retrieval)
- 核心理念:提供更多的上下文信息。
- 流程:
- 从查询(Query) 开始,先进行一次检索(Retrieve),然后根据检索结果生成内容(Generate)。
- 模型在每轮生成后会进行一个判断(Judge),判断是否需要继续检索,若需要,则继续迭代,重新进行检索和生成。
- 这种迭代会根据设定的最大次数(Max Times)或阈值(Threshold)来限制,达到条件后生成最终响应(Response)。
- 特点:该流程允许模型在生成过程中多次获取外部信息。
2. 递归检索(Recursive Retrieval)
-
核心理念:逐步分解复杂问题。
-
流程:
- 从查询(Query) 开始,模型首先进行检索(Retrieve),然后生成结果(Generate)。
- 随后,模型通过查询转化/分解(Query Transformation/Decomposition),对初始问题进行细化或转化,将其分解为多个子问题。
- 每一轮生成后,进行判断(Judge),如果模型决定还需要进一步分解查询,递归进入下一轮检索和生成,直到达到最大递归深度(Max Depth)或满足阈值条件。
- 最终生成响应(Response)。
-
特点:通过逐步分解问题并检索每个子问题的答案,适合处理复杂的多步推理任务。
3. 自适应检索(Adaptive Retrieval)
- 核心理念:灵活且主动地控制检索和生成过程。
- 流程:
- 从查询(Query) 开始,模型首先进行一次判断(Judge),决定是否需要检索信息。如果判断需要,则执行检索(Retrieve) 并进行生成(Generate)。
- 在生成过程中,模型会通过反思标记(例如,生成特殊标记) 或预设的阈值,主动决定何时再次检索或停止检索。
- 最终生成响应(Response)。
- 特点:通过赋予模型主动控制何时检索信息的能力,实现了高度灵活和智能的检索流程。
未完待续。。。