改进现实世界的RAG系统:关键挑战与实用解决方案
引言
检索增强生成系统是在自然语言处理领域中的创新模型,因为它们将检索和生成模型的组件整合在一起。在这方面,RAG系统在大语言模型(LLMs)执行的任务的规模和种类增加时证明了其多功能性,LLMs可以提供更有效的解决方案来进行用例的微调。因此,当RAG系统在生成过程中重新迭代外部索引的信息时,它能够生成更准确的上下文和相关的新信息响应。然而,现实世界中的RAG系统的应用提供了一些困难,这可能会影响其性能,尽管潜力是显而易见的。本文重点关注这些关键挑战,并讨论可以采取的措施以改善RAG系统的性能。这是基于Dipanjan (DJ)在数据黑客峰会2024上发表的* 改进现实世界的RAG系统:关键挑战与实用解决方案* 的一次精彩演讲。
目录
理解RAG系统
RAG系统结合了检索机制和大型语言模型,以利用外部数据生成响应。
RAG系统的核心组件包括:
- 检索:此组件涉及使用一个或多个查询来搜索数据库中的文档或信息片段,或任何其他系统外的知识来源。检索是获取适当数量的相关信息的过程,以帮助制定更准确和上下文相关的响应。
- LLM响应生成:一旦获取相关文档,它们将被输入到大型语言模型 (LLM)中。LLM然后利用这些信息生成一个不仅连贯而且受检索数据影响的响应。这种外部信息的整合使得LLM能够提供基于实时数据的答案,而不是仅依赖于预先存在的知识。
- 融合机制:在一些先进的RAG系统中,可能会使用融合机制在生成响应之前结合多个检索到的文档。该机制确保LLM可以访问更全面的上下文,使其能够生成更准确和细致的答案。
- 反馈循环:现代RAG系统通常包括一个反馈循环,在此过程中,评估生成响应的质量并用于随着时间的推移改善系统。这个迭代过程可能涉及微调检索器、调整LLM或完善检索和生成策略。
RAG系统的好处
RAG系统提供了多个优点,相较于传统的方法如对语言模型进行微调。微调涉及根据特定数据集调整模型参数,这可能资源密集,并限制模型适应新信息的能力而无需额外重新训练。相比之下,RAG系统提供:
- 动态适应:RAG系统允许模型动态访问和整合来自外部来源的最新信息,避免了频繁重新训练的需要。这意味着即使在新信息出现时,模型也能保持相关性和准确性。
- 广泛的知识访问:通过从多种来源检索信息,RAG系统可以处理更广泛的主题和问题,而不需要对模型本身进行广泛的修改。
- 效率: 利用外部检索机制可能比微调更高效,因为这减少了大规模模型更新和重新训练的需求,而是专注于将当前和相关信息整合到响应生成过程中。
典型的 RAG 系统工作流程
一个典型的 RAG 系统通过以下工作流程进行操作:
- 查询生成: 该过程始于根据用户的输入或上下文生成查询。此查询旨在引出相关信息,以帮助撰写响应。
- 检索: 生成的查询随后用于搜索外部数据库或知识源。检索组件识别并获取与查询最相关的文档或数据。
- 上下文生成: 检索到的文档被处理以创建一个连贯的上下文。该上下文提供必要的背景和细节,以告知语言模型的响应。
- LLM 响应: 最后,语言模型使用从检索的文档生成的上下文来产生响应。期望该响应是信息充分、相关且准确的,利用获取的最新信息。
现实世界 RAG 系统中的主要挑战
让我们现在来看看现实世界系统中的主要挑战。这受到 Barnett 等人著名论文 “工程检索增强生成系统时的七个失败点” 的启发,如下图所示。我们将在接下来的部分中更详细地探讨这些问题,并提供实际解决方案来应对这些挑战。
缺失内容
RAG 系统中的一个重要挑战是处理缺失内容。当检索的文档不包含足够或相关的信息以充分应对用户的查询时,就会出现这个问题。当检索的文档中缺少相关信息时,可能会导致几个问题,如对准确性和相关性的影响。
关键内容的缺失可能会严重影响语言模型响应的准确性和相关性。在没有必要信息的情况下,模型可能生成不完整、不正确或缺乏深度的答案。这不仅影响响应质量,还降低了 RAG 系统的整体可靠性。
处理缺失内容的解决方案
这些是我们可以用来应对缺失内容挑战的方法。
- 定期更新和维护知识库,确保其包含准确和全面的信息。这可以通过为检索组件提供更丰富的文档集来减少缺失内容的可能性。
- 制定具体且明确的提示,并附加清晰约束,可以指导语言模型生成更精确和相关的响应。这有助于缩小焦点并提高响应的准确性。
- 实施具有行动能力的 RAG 系统,允许系统主动搜索并整合外部信息源。这种方法通过扩展信息源范围和提高检索数据的相关性来解决缺失内容的问题。
您可以 查看此笔记本,以获取更多详细信息和实用示例!
错过的顶级文档
当应该是顶部排名的文档未能出现在检索结果中时,系统在提供准确响应方面就会遇到困难。这个问题被称为“错过的顶级文档”,当重要的上下文文档在检索过程中未被优先考虑时,就会发生这种情况。因此,模型可能无法获取有效回答问题所需的关键信息。
尽管存在相关文件,但糟糕的检索策略可能会阻止这些文件的检索。因此,由于缺乏关键上下文,模型可能生成不完整或不准确的响应。解决此问题需要改善检索策略,以确保识别并包含最相关的文件在上下文中。
不在上下文中
“不在上下文中”的问题出现在初始检索时包含答案的文件,但没有进入最终用于生成响应的上下文中。这个问题通常是由于检索、重新排名或整合策略无效造成的。尽管存在相关文件,但这些过程中的缺陷可能会阻止文件被包含在最终上下文中。
因此,模型可能缺乏生成准确答复所需的信息。改善检索算法、重新排名方法和整合技术至关重要,以确保所有相关文件都能正确整合到上下文中,从而提高生成响应的质量。
未提取
“未提取”的问题发生在LLM无法从提供的上下文中提取正确答案时,尽管答案是存在的。这个问题在上下文包含过多不必要的信息、噪声或矛盾细节时出现。过多不相关或冲突的信息可能会使模型不堪重负,难以准确找出答案。
为了解决这个问题,改善上下文管理至关重要,通过减少噪声并确保提供的信息相关和一致。这将帮助LLM专注于从上下文中提取精确的答案。
不正确的特异性
当输出响应过于模糊且缺少细节或特异性时,通常是由于模糊或通用的查询未能检索到正确的上下文。此外,分块问题或糟糕的检索策略可能会加重此问题。模糊的查询可能没有给检索系统提供足够的方向,以获取最相关的文件,而不当的分块可能会稀释上下文,使LLM难以生成详细的响应。为了解决这个问题,改进查询使其更具体,并改善分块和检索方法,以确保提供的上下文既相关又全面。
针对错过的高排名、不在上下文中、未提取和不正确特异性的解决方案
- 使用更好的分块策略
- 超参数调整 – 分块和检索
- 使用更好的嵌入模型
- 使用高级检索策略
- 使用上下文压缩策略
- 使用更好的重新排名模型
您可以 查看此笔记本 获取更多详细信息和实用示例!
尝试各种分块策略
您可以在下表中探索和尝试各种分块策略:
超参数调整 – 分块和检索
超参数调整在优化RAG系统以获得更好性能方面发挥着关键作用。超参数调整可以显著影响的两个关键领域是分块和检索。
分块
在RAG系统的上下文中,分块指的是将大型文档划分为较小、更易管控的部分。这使得检索器可以专注于文档中更相关的部分,提高检索上下文的质量。但是,确定最佳分块大小是一项微妙的平衡——过小的分块可能会遗漏重要上下文,而过大的分块可能会稀释相关性。超参数调整帮助找到最大化检索准确性的合适分块大小,而不会使LLM不堪重负。
检索
检索组件涉及多个超参数,这些参数可以影响检索过程的有效性。例如,您可以微调检索文档的数量、相关性评分的阈值以及用于提高提供给LLM的上下文质量的嵌入模型。检索中的超参数调整确保系统始终提取出最相关的文档,从而增强RAG系统的整体性能。
更好的嵌入模型
嵌入模型有助于将您的文本转换为在检索和搜索过程中使用的向量。不要忽视嵌入模型,因为使用错误的模型可能会严重影响您的RAG系统的性能。
更新的嵌入模型将会在更多数据上进行训练,通常效果更好。不要仅仅依赖基准测试,应该在你的数据上进行使用和实验。如果数据隐私很重要,请不要使用商业模型。目前有多种嵌入模型可用,请查看大规模文本嵌入基准(MTEB)排行榜,以了解潜在的好的和当前的嵌入模型。
更好的重排模型
重排器是经过微调的跨编码器变换模型。这些模型接收一对文档(查询,文档)并返回相关性得分。
经过更多对的微调并最近发布的模型通常会更好,因此请关注最新的重排模型并进行实验。
高级检索策略
为了应对传统RAG系统的局限性和痛点,研究人员和开发者越来越多地实施先进的检索策略。这些策略旨在提高检索文档的准确性和相关性,从而改善整体系统性能。

语义相似性阈值设定
这种技术涉及在检索过程中设置语义相似性得分的阈值。只有超过该阈值的文档才被视为相关文档,并将其包含在LLM处理的上下文中。优先考虑最语义相关的文档,从而减少检索上下文中的噪音。
多查询检索
多查询检索不是依赖单个查询来检索文档,而是生成多个查询的变体。每个变体针对信息需求的不同方面,从而增加检索到所有相关文档的可能性。这种策略有助于减少错过关键信息的风险。
混合搜索(关键词 + 语义)
混合搜索方法将基于关键词的检索与语义检索结合在一起。基于关键词的搜索检索包含特定术语的文档,而语义搜索则捕捉与查询上下文相关的文档。这种双重方法最大化了检索到所有相关信息的机会。
重排
在检索到初始文档集后,应用重排技术根据其与查询的相关性对文档进行重新排序。使用更复杂的模型或附加特性来优化顺序,确保最相关的文档优先级更高。
链式检索
链式检索将检索过程分解为多个阶段,每个阶段进一步优化结果。初始检索获取广泛的文档集,然后后续阶段基于额外标准(如相关性或特异性)对这些文档进行优化。这种方法允许更有针对性和准确的文档检索。
上下文压缩技术
上下文压缩是优化RAG系统的一项关键技术。它确保最相关的信息被优先考虑,从而导致准确且简洁的响应。在本节中,我们将探讨两种主要的上下文压缩方法:基于提示的压缩和过滤。我们还将 examine它们对增强现实世界RAG系统性能的影响。
基于提示的压缩
基于提示的压缩涉及使用语言模型识别和总结检索文档中最相关的部分。这种技术旨在提炼出关键信息,并以最有利于生成响应的简洁格式呈现。该方法的好处包括:
- 提高相关性:通过关注最相关的信息,基于提示的压缩提高了生成响应的相关性。
- 局限性:然而,这种方法也可能存在局限性,例如在摘要过程中简化复杂信息的风险或丧失重要细微差别。
过滤
过滤涉及根据相关性得分或其他标准从上下文中删除整个文档。这种技术有助于管理信息量,确保仅考虑最相关的文档。潜在的权衡包括:
- 减少上下文量:过滤可能导致可用上下文数量减少,从而影响模型生成详细响应的能力。
- 增强专注: 另一方面,过滤有助于保持对最相关信息的专注,提高响应的整体质量和相关性。
错误格式
“错误格式”问题发生在大型语言模型未按照指定格式(例如JSON)返回响应时。当模型偏离所需结构,生成格式不正确或无法使用的输出时,就会出现此问题。例如,如果您期望JSON格式,但大型语言模型提供纯文本或其他格式,这会干扰后续处理和集成。这个问题强调了仔细指示和验证的必要性,以确保大型语言模型的输出符合指定的格式要求。
错误格式的解决方案
- 强大的大型语言模型原生支持响应格式,例如OpenAI支持JSON输出。
- 更好的提示和输出解析器
- 结构化输出框架
你可以 查看这个笔记本 以获取更多详细信息及动手示例!
例如,像GPT-4o这样的模型具有原生输出解析支持,比如JSON,你可以按照以下代码快照启用它。
不完整
“不完整”问题出现在生成的响应缺乏关键信息,使其不完整。这个问题通常来源于措辞不当的问题,这些问题没有明确传达所需的信息,或者模型的推理效果不佳,导致所需信息不足。
不完整的响应可能源于多种原因,包括模糊的查询未能明确指定必要的细节,检索机制未能获取全面的信息,或者推理过程遗漏了关键元素。解决此问题涉及优化问题的表述、改善上下文检索策略,以及增强模型的推理能力,以确保响应既完整又具有信息量。
不完整的解决方案
- 使用更好的大型语言模型,如GPT-4o、Claude 3.5或Gemini 1.5
- 使用先进的提示技术,如思维链、自我一致性
- 如有必要,构建具有工具使用的自主系统
- 重写用户查询并改进检索 – HyDE
HyDE是一种有趣的方法,其理念是生成对给定问题的假设性答案,这可能在事实上一点也不完全正确,但将具有相关的文本元素,可以帮助从向量数据库中检索出更相关的文档,而不仅仅是使用问题进行检索,如以下工作流所示。
近期研究论文的其他增强
现在让我们看看一些近期研究论文中的增强,这些增强确实取得了效果。
RAG与长上下文大型语言模型
长上下文大型语言模型通常比检索增强生成(RAG)系统提供更好的性能,因为它们能够处理非常长的文档,并生成详细的响应,而不必担心RAG系统所需的所有数据预处理。然而,它们带来了高计算和成本要求,使它们在某些应用中不太实用。混合方法通过利用两种模型的优势提供了解决方案。在这一策略中,您首先使用RAG系统根据检索到的上下文提供响应。然后,如果需要,您可以使用长上下文大型语言模型来审查和完善RAG生成的答案。这种方法允许您在必要时平衡效率和成本,同时确保高质量和详细的响应,正如论文中提到的,* Retrieval Augmented Generation or Long-Context LLMs? A Comprehensive Study and Hybrid Approach*,Zhuowan Li等人。
RAG与长上下文大型语言模型 – 自主路由RAG
让我们来看一下如何实施上述论文提出的解决方案的实际工作流程。在标准的RAG流程中,过程始于根据用户查询从向量数据库中检索上下文文档。RAG系统然后利用这些文档生成答案,同时遵循提供的信息。如果查询的可回答性不确定,则使用LLM评判提示根据上下文确定查询是可回答还是不可回答。对于无法用检索到的上下文令人满意地回答的查询,系统采用长上下文LLM。此LLM使用完整的上下文文档提供详细响应,确保答案仅基于提供的信息。
自主纠正RAG
自主纠正RAG借鉴了论文*Corrective Retrieval Augmented Generation*的灵感,作者为Shi-Qi Yan等,理念是首先根据用户查询从向量数据库中进行正常检索以获取上下文文档。然后,而不是标准的RAG流程,我们利用LLM-作为-评判者流程评估检索到的文档与用户查询的相关性,如果存在一些不相关文档或没有相关文档,我们进行网页搜索以获取来自网页的实时信息,之后再按下图所示遵循正常的RAG流程。
首先,根据输入查询从向量数据库中检索上下文文档。然后,使用LLM评估这些文档与问题的相关性。如果所有文档都相关,则在没有进一步行动的情况下继续。如果某些文档模糊或不正确,重新措辞查询并在网上搜索以获取更好的上下文。最后,将重新措辞的查询连同更新的上下文发送给LLM以生成响应。以下实用工作流程插图中详细展示了这一过程。
自主自我反思RAG
自主自我反思RAG(SELF-RAG)引入了一种新颖的方法,通过结合检索与自我反思来增强大型语言模型(LLM)。此框架使得LLM能够动态检索相关段落,并使用特殊的反思令牌反思自身的响应,从而提高准确性和适应性。实验表明,在开放领域的问题解答和事实验证等任务中,SELF-RAG超越了传统模型如ChatGPT和Llama2-chat,显著提高了事实准确性和引用精确度。这一概念提出于论文*[Self-RAG: Learning to Retrieve, Generate, and Critique through Self-Reflection](Self-RAG: Learning to Retrieve, Generate, and Critique through Self-Reflection)*,作者为Akari Asai等。
以下插图描绘了这一工作流程的实际实施,我们进行正常的RAG检索,然后使用LLM-作为-评判者评估文档的相关性,如果需要进行网页搜索或查询重写和检索以获取更相关的上下文文档。下一步涉及生成响应,并再次使用LLM-作为-评判者对生成的答案进行反思,以确保它回答了问题,并且没有产生任何幻觉。
结论
改善现实世界的RAG系统需要应对若干关键挑战,包括缺少内容、检索问题和响应生成问题。实施实用解决方案,例如丰富知识基础和采用先进的检索技术,可以显著提高RAG系统的性能。此外,改进上下文压缩方法也有助于提高系统的有效性。随着这些系统的发展以满足各种应用的日益增长的需求,持续改进和适应至关重要。会议的主要要点可以在下图中总结。
未来的研究和开发工作应集中在改善检索系统上,探索上述提到的方法。此外,探索像自主AI这样的新方法可以帮助优化RAG系统,从而获得更高的效率和准确性。