模块化 RAG
模块化 RAG 集成了 Adanced RAG 的各种模块和技术,以改进整个 RAG 系统。例如,整合用于相似性检索的搜索模块并在检索器中应用微调方法。模块化 RAG 成为构建 RAG 应用程序时的标准范例。以下是六大模块的介绍
模块化RAG包括六个主要模块:索引、预检索、检索、后检索、生成和编排。
4.3.1 索引(Indexing)
索引指的是把文档分割为可管理的块的过程,是组织系统的关键步骤。
索引面临着三个主要难题。
- •内容表述不完整。
- 块的语义信息受分割方式影响,致使在较长的语境中重要信息的丢失或被掩盖。
- •2. 块相似性搜索不准确。
- 随着数据量增多,检索中的噪声增大,导致频繁与错误数据匹配,使得检索系统脆弱且不可靠。
- •3. 参考轨迹不明晰。
- 检索到的块可能来自任何文档,没有引用痕迹,可能出现来自多个不同文档的块,尽管语义相似,但包含的却是完全不同主题的内容。
4.3.1.1 块优化
块的大小以及块之间的重叠,在 RAG 系统的整体有效性中起着关键作用:
- • 较大的块能捕捉更多的上下文,但也会产生更多噪声,需要更长的处理时间和更高的成本。
- • 而较小的块可能无法完整传达必要的上下文,不过噪声较小。
滑动窗口:在滑动窗口中使用重叠块能增强语义转换。这种方法也存在一些局限性,如上下文大小控制不精准、单词或句子可能被截断以及缺乏语义考量等。
增加元数据:块可以用元数据(比如页码、文件名、作者、时间戳、摘要或相关问题)进行丰富。这些元数据允许进行筛选检索,缩小搜索范围。
从小到大:将用于检索的块和用于合成的块区分开。较小的块能提高检索的准确性,较大的块能提供更多的上下文。一种方法是检索较小的总结块,并参考其较大的父块。或者,可以检索单个句子及其周边的文本。
4.3.1.2 结构组织
增强信息检索的一种有效方式是为文档构建层次结构。通过构建块结构,RAG 系统能够加快相关数据的检索和处理。
分层索引:在文档的分层结构中,节点按父子关系排列,并与块相连接。每个节点都存储着数据摘要,有助于快速遍历数据,并协助 RAG 系统确定要提取哪些块。这种方法还能减轻因块提取问题产生的错觉。构建结构化索引的方法主要包括:
- •基于文档中的段落和句子分割的结构。
- •2. 基于 PDF、HTML 和 Latex 中固有结构。
- •3. 基于文本语义识别和分割的语义。
KG 索引:使用知识图(KGs)来构建文档有助于通过厘清概念和实体之间的联系来保持一致性,降低不匹配错误的风险。还能将信息检索转化为语言模型可理解的指令,提高检索的准确性并实现上下文连贯的响应。这提升了 RAG 系统的整体效率。
3.2 预检索(Pre-retrieval)
朴素 RAG 的一大主要挑战在于它直接将用户的原始查询当作检索的基础。制定精确清晰的问题颇具难度,欠妥的查询会致使检索效果欠佳。此模块的主要挑战包含:
- • 1)查询措辞不当。问题本身复杂,语言组织欠佳。
- • 2)语言的复杂性与歧义性。语言模型在应对专业词汇或含义多样的模糊缩写时常常遭遇困境。比如,它们或许无法判别 LLM 指的是大型语言模型还是法律语境中的法学硕士。(这个也是我本人的很多体会)
4.3.2.1 查询扩展
将单个查询拓展为多个查询,丰富了查询内容,为弥补特定细微差异的缺失提供了更多上下文,从而确保生成答案的最佳相关性。
多查询:借助提示工程通过大型语言模型来扩展查询,而且并行执行。这些扩展经过精心设计以保障多样性和覆盖度。不过,这种方式可能会淡化用户的原始意图。为减轻这一情况,可指示模型给予原始查询更大的权重。
子查询:通过分解和规划复杂问题,会生成多个子问题。具体而言,可以采用从少到多的提示来将复杂问题分解为一系列更简单的子问题。依照原始问题的结构,生成的子问题能够并行或顺序执行。另一种方法涉及使用验证链(CoVe)。扩展后的查询由大型语言模型进行验证,以达成减少幻觉的效果。
4.3.2.2 查询转换
依据转换后的查询而非用户的原始查询进行检索和生成。
重写(Rewrite):原始查询在现实场景中的检索常常存在不足。为解决此问题,可以提示大型语言模型进行重写。也可运用专门的较小模型来达成此目的 。**淘宝中查询重写方法的实施显著提升了长尾查询的召回效果,促使 GMV 增长 **。
HyDE:为弥合问题与答案之间的语义差距,它在回应查询时构建假设文档(假设答案),而非直接搜索查询。它侧重于从答案到答案的嵌入相似性,而非寻求针对问题或查询的嵌入相似性。此外,它还包含反向 HyDE,为每个块生成假设查询,并专注于从查询到查询的检索。
回退提示(Step-back Prompting):原始查询被抽象为一个高级概念问题(回退问题)。在 RAG 系统中,回退问题和原始查询均用于检索,且将它们的结果相结合来生成语言模型的答案。
4.3.2.3 查询构建
除文本数据外,诸如表格和图形数据等越来越多的结构化数据正被融入 RAG 系统。为适配各类数据类型,重构用户的查询很有必要。这涉及将查询转化为其他查询语言以访问替代数据源,常见方法有 Text-to-SQL 或 Text-to-Cypher 等。结构化查询语言(如 SQL、Cypher)常与语义信息和元数据结合,用于构建更复杂的查询。
4.3.3 检索(Retrieval)
检索过程在 RAG 系统中举足轻重,提升检索效果需考虑的三个主要方面包括检索效率、质量以及任务、数据和模型的对齐。
4.3.3.1 检索器选择
随着 RAG 技术的广泛应用,嵌入模型的发展势头正盛。除基于统计的传统模型和基于编码器结构的预训练模型外,在大型语言模型上微调的嵌入模型也展现出强大的能力。然而,它们往往参数更多,导致推理和检索效率欠佳。故而,依据不同任务场景选择合适的检索器至关重要。
稀疏检索器(Sparse Retriever):用统计方法将查询和文档转化为稀疏向量。其优势在于处理大型数据集时效率高,只关注非零元素。但在捕捉复杂语义方面,可能不如密集向量有效。常见方法包括 TF-IDF 和 BM25。
密集检索器(Dense Retriever):使用预训练的语言模型(PLMs)为查询和文档提供密集表示。尽管计算和存储成本较高,却能提供更复杂的语义表示。典型模型有 BERT 结构的 PLMs,如 ColBERT,以及多任务微调模型,如 BGE 和 GTE 。
混合检索器(Hybrid Retriever ):是同时使用稀疏和密集检索器。两种嵌入技术相互补充,以提高检索效果。稀疏检索器能提供初始筛选结果。此外,稀疏模型增强了密集模型处理含罕见实体查询的零样本检索能力,从而增强系统的稳健性。
4.3.3.2 检索器微调
在上下文可能与预训练语料库有差异的情况下,尤其是在医疗保健、法律等具有大量专有术语的高度专业化领域。虽然这种调整需要额外付出努力,但能大幅提高检索效率和领域对齐度。
监督微调(Supervised Fine-Tuning,SFT):基于有标记的领域数据微调检索模型通常借助对比学习来实现。这涉及缩短正样本间的距离,同时拉大负样本间的距离。
LM 监督检索器(LM-supervised Retriever,LSR):与直接从数据集中构建微调数据集不同,LSR 借助 LM 生成的结果作为监督信号,在 RAG 流程中对嵌入模型进行微调。
适配器(Adapter):有时,对大型检索器进行微调可能成本很高,尤其是在处理像 gte-Qwen 这类基于 LLMs 的检索器时。在这种情况下,通过融入一个适配器模块并进行微调可以缓解此情况。添加适配器的另一个好处是能够更好地与特定的下游任务相适配 。
4.3.4 检索后
将所有检索到的块直接输入到 LLM 并非最佳选择,对块进行后处理有助于更好地利用上下文信息。主要的挑战包括:
- • 1)中间内容丢失(Lost in the middle)。像人类一样,LLM 往往只记得长文本的开头或结尾,而遗忘中间部分 。
- • 2)噪声/反事实块(Noise/anti-fact chunks)。检索到的有噪声或事实上相互矛盾的文档可能会影响最终的检索生成 。
- • 3)上下文窗口(Context Window)。尽管检索到了大量相关内容,但大型模型中上下文信息长度的限制导致无法涵盖所有这些内容。
4.3.4.1 重新排序
在不改变其内容或长度的情况下对检索到的块进行重新排序,以提升更关键文档块的可见性。
规则基重新排序:依照某些规则计算指标来对块进行重新排序。常见的指标包括:多样性、相关性和 MRR(Maximal Marginal Relevance,最大边际相关性) 。其思路是减少冗余并增加结果的多样性。MRR 基于查询相关性和信息新颖性的组合标准为最终的关键短语列表选取短语。
模型基重新排序:利用语言模型对文档块重新排序,通常依据块与查询之间的相关性。重新排序模型已成为 RAG 系统的重要组成部分,相关模型技术也在不断迭代升级。重新排序的范围还扩展到了多模态数据,比如表格和图像 。
4.3.4.2 压缩
在RAG流程中,人们普遍认为,尽可能多地检索相关文档,并将它们串联起来形成冗长的检索提示,是有益的。但这种认知其实是个误区。过多的上下文信息可能会带来噪声,影响大型语言模型(LLM)捕捉关键信息的能力。为了解决这个问题,通常采用压缩和筛选检索内容的方法。
LLMLingua:利用经过对齐和训练的小语言模型,比如GPT-2 Small或LLaMA-7B,可以从提示中识别并剔除不重要的标记,将其转化为一种对人类来说晦涩难懂,但对LLMs却易于理解的形式。这种方法提供了一种直接而实用的提示压缩方式,无需对LLMs进行额外训练,同时保持了语言的完整性和压缩比的平衡。
4.3.4.3 选择
与压缩文档内容不同,选择是直接移除无关的文档块。
选择性上下文:通过识别并剔除输入上下文中的冗余内容,可以精炼输入,从而提升语言模型的推理效率。在实际操作中,选择性上下文根据基础语言模型计算的自信息来评估词汇单元的信息量。通过保留自信息更高的内容,这种方法提供了一种更简洁、高效的文本表示方式,且不会影响其在多样化应用中的表现。然而,这种方法忽略了压缩内容与目标语言模型以及用于提示压缩的小语言模型之间的相互依赖性。
LLM-Critique:另一种直接而有效的方法,是在生成最终答案前,让LLM评估检索到的内容。这允许LLM通过LLM批评机制,过滤掉相关性不高的文档。例如,在Chatlaw中,LLM被引导自我推荐相关法律条款,以评估其相关性。
4.3.5 生成(Generation)
利用LLM根据用户的查询和检索到的上下文信息生成答案。选择一个符合任务需求的合适模型,考虑微调需求、推理效率和隐私保护等因素。
4.3.5.1 生成器微调
除了直接使用LLM外,根据场景和数据特征进行有针对性的微调,可以带来更好的效果。这也是使用本地部署LLMs的一个显著优势。
指令微调(Instruct-Tuning):当LLMs在特定领域缺少数据时,可以通过微调为其提供额外的知识。通用的微调数据集可以作为第一步。微调的另一个好处是能够调整模型的输入和输出,例如,使LLM适应特定的数据格式,并根据指令以特定风格生成响应。
强化学习(Reinforcement learning):通过强化学习来让大型语言模型(LLM)的输出与人类或检索器的偏好相契合,是一种颇具潜力的方法。例如,对最终生成的答案进行手动标注,然后借助强化学习给予反馈。除了与人类的偏好达成一致,与微调模型和检索器的偏好相符合也是可行的。
双重微调(Dual Fine-tuing):同时对生成器和检索器进行微调,以实现它们偏好的一致。一种典型的方式,如 RA-DIT,利用 KL 散度来对齐检索器和生成器之间的评分函数。
4.3.5.2 验证(Verification)
尽管 RAG 提升了大型语言模型生成答案的可靠性,但在众多场景中,它需要将幻觉出现的概率降至最低。因此,可以通过额外的验证模块来筛除不符合要求标准的响应。常见的验证方法包含基于知识库的和基于模型的。
知识库验证:通过外部知识直接对大型语言模型生成的响应进行验证。通常,先从响应中提取特定的陈述或三元组。而后,从经过验证的知识库(如维基百科或特定的知识图谱)中检索相关证据。最后,将每个陈述与证据逐步比对,以判定该陈述是得到支持、被驳斥还是信息不足。
基于模型的验证:运用小型语言模型来验证大型语言模型生成的响应。给定输入问题、检索到的知识和生成的答案,训练一个小型语言模型来判别生成的答案是否正确反映了检索到的知识。此过程被设定为一道选择题,验证器需要判断答案是否反映了正确答案。如果生成的答案未正确反映检索到的知识,可迭代地重新生成答案,直至验证器确认答案正确。
4.3.6 编排(Orchestration)
编排涉及管理 RAG 过程的控制模块。与传统固定流程的僵化方式不同,RAG 如今在关键节点纳入决策,并依据先前的结果动态选择后续步骤。这种自适应和模块化的能力是模块化 RAG 的显著特征,使其有别于更为简单的朴素和高级 RAG 范式。
4.3.6.1 路由
面对不同的查询,RAG 系统会路由到为不同场景定制的特定管道,这是为应对各种情况而设计的多功能 RAG 架构的基本特性。需要一个决策机制,依据来自模型的输入或补充的元数据,来确定将启用哪些模块。针对不同的提示或组件采用不同的路由。
4.3.6.2 调度
RAG 系统在复杂性和适应性方面不断演进,能够借助复杂的调度模块来管理流程。调度模块在模块化 RAG 中发挥着关键作用,能识别需要外部数据检索的关键节点,评估响应的充分性,并决定是否需要进一步的调查。它通常用于涉及递归、迭代和自适应检索的场景,确保系统能就何时停止生成或启动新的检索循环做出明智决策。
规则判断(Metadata routing):后续步骤由一组既定规则支配。通常,系统通过评分机制评估生成答案的质量。继续或停止该过程的决策取决于这些分数是否超过某些预定阈值,这些阈值通常与单个token的置信水平有关,接受 的条件是其中的所有令牌必须具有大于或等于阈值的相关概率。若不满足此条件,系统会重新生成新答案。
LLM 判断(Semantic routing)。LLM 独立决定后续的行动。有两种主要方式来实现这种能力:
- • 第一种方式利用 LLM 的上下文学习能力,并通过提示工程进行判断。这种方式的一个显著优点是无需对模型进行微调。然而,判断输出的格式取决于 LLM 对所提供指令的遵循情况。
- • 第二种方式涉及 LLM 生成特定token,通过微调来启动有针对性的行动。这种技术源自 Toolformer ,已被集成到像 Self-RAG 这样的框架中。这使得对 LLM 的行动有了更直接的控制机制,增强了系统对对话上下文中特定触发因素的响应能力。不过,它需要生成大量符合要求的指令集来微调 LLM。
知识驱动的调度策略(Knowledge-guide schedulin):突破了基于规则的方法的局限,也不再完全依赖大型语言模型(LLM)来控制流程,而是采用了一种更为灵活的中间策略——知识引导的调度。通过知识图谱的强大功能,引导检索和生成过程。从知识图谱中提取与问题相关的信息,构建一个由逻辑上相互关联的节点组成的推理链,每个节点都承载着解决问题的关键信息。基于这一推理链的节点信息,可以分别进行信息检索和内容生成。整合这种方法,不仅提升了问题解决的效率和精确度,也使得提供的解释更加清晰明了。
4.3.6.3 融合
随着RAG进程的发展,已经超越了单一的线性流程,经常需要扩大检索范围或通过探索多条流水线来增加多样性。在扩展到各个分支之后,融合模块有效地整合了信息,确保了全面且连贯的响应。融合模块的作用不仅仅是合并答案,还要确保最终输出内容丰富,并且能够反映出问题的多维度特性。
LLM融合(LLM fusion):将多分支的信息聚合起来最直接的方法之一是利用LLMs的强大功能来分析和整合不同分支的信息。然而,这种方法在处理超出LLM上下文窗口限制的长答案时也面临挑战。为了解决这个问题,通常的做法是先对每个分支的答案进行总结,提取关键信息,然后再将其输入到LLM中,以确保即使在长度受限的情况下也能保留最重要的内容。
加权集成(Weighted ensemble ):从多个分支生成的不同标记的加权值,以实现对最终输出的全面选择。权重是根据文档与输入查询之间的相似性得分来确定的。权重通过使用softmax函数来计算,确保了权重的归一化,并且总和为一。
互反排名融合(RRF ,Reciprocal Rank Fusion):将多个检索结果的排名合并成一个统一的列表。它采用定制的加权平均方法来提高整体的预测性能和排名精度。优势在于其动态权重分配,这种分配是由分支之间的相互作用所决定的。在模型或来源的异质性特别显著的场景中,RRF尤其有效,它可以显著提高预测的准确性。
RA/SD 衍生者AI训练营。发布者:chris,转载请注明出处:https://www.shxcj.com/archives/7278