附加说明:此文为译文,原文链接:原文
自早期研究引入检索增强生成(Retrieval-Augmented Generation,RAG)以来,它已成为处理大型语言模型(LLMs)的主流方法。从本质上讲,RAG 从各种来源收集知识,并使用语言模型生成答案。然而,对于基本的 RAG(也称为朴素 RAG),在处理复杂查询时可能难以获得准确结果,并且在处理大型数据集时会面临响应时间慢和成本高的问题。
为了解决这些挑战,研究人员开发了多种高级 RAG 技术。本文概述了这些高级方法,以帮助你在朴素 RAG 不足时获得更好的结果。
理解检索增强生成(RAG)
每个 RAG 应用程序都可以分为两个阶段:检索和生成。首先,RAG 使用搜索和索引技术从外部来源(如知识图谱或向量存储)检索相关文档或知识片段。然后,将检索到的数据输入到语言模型中,该模型通过将检索到的信息与其预训练知识相结合,生成上下文丰富且准确的响应。
随着需求变得更加复杂,RAG 系统也在不断发展。现在可以将 RAG 系统分为以下几类:
- 朴素 RAG:这是 RAG 的最基本形式,系统直接将检索到的数据用作生成模型的输入,而不应用高级技术来优化信息。在生成步骤中也不进行任何增强。
- 模块化 RAG:这种架构将检索和生成组件分离为不同的模块化部分。它允许灵活地替换不同的检索或生成模型,而不会干扰整个代码。
- 高级 RAG:在高级 RAG 中,会使用重新排序、自动合并和高级过滤等复杂技术来改进检索步骤或生成步骤。目标是确保在最短时间内检索到最相关的信息。
高级 RAG 技术提高了信息检索和后续内容生成的效率、准确性和相关性。通过应用这些方法,你可以处理复杂查询、处理不同的数据源,并创建更具上下文感知的人工智能系统。
接下来让我们详细探讨其中一些技术。
高级 RAG 技术
在本节中,我们将高级 RAG 技术分为四个领域:检索前和数据索引技术、检索技术、检索后技术和生成技术。
检索前和数据索引技术
检索前技术侧重于在搜索和检索知识图谱或向量存储中的数据之前提高数据质量。在需要对数据进行清理、格式化和组织信息的情况下可以使用它们。
干净、格式良好的数据可提高检索数据的质量,进而影响大型语言模型生成的最终响应。另一方面,嘈杂的数据会显著降低检索过程的质量,导致大型语言模型生成不相关或不准确的响应。
以下是一些可以预处理数据的方法:
#1 - 使用大型语言模型提高信息密度:在处理原始数据时,经常会遇到无关信息或不相关内容,这些可能会给检索过程带来噪声。例如,考虑一个大型的客户支持交互数据集,其中会包含有用见解的冗长记录以及离题或不相关的内容。在数据摄取步骤之前,你需要提高信息密度,以实现更高质量的检索。
一种实现此目的的方法是利用大型语言模型。大型语言模型可以从原始数据中提取有用信息、总结过于冗长的文本或分离关键事实,从而提高信息密度。然后,你可以使用 Cypher 查询或嵌入将这些更密集、更干净的数据转换为知识图谱,以实现更有效的检索。
#2 - 使用大型语言模型去除数据索引中的重复信息:数据集中的数据重复会影响检索准确性和响应质量,但你可以使用有针对性的技术来解决这个问题。
一种方法是使用聚类算法(如 K - means),它将具有相同语义的数据块分组在一起。然后,可以使用大型语言模型将这些簇合并为单个块,从而有效消除重复信息。
考虑一个公司文档存储库的示例,其中包含多个与客户相关的政策文档。相同的信息可能以下列方式存在:
文档 1:“员工必须确保所有客户数据安全存储。未经同意不得共享客户数据。”
文档 2:“所有客户数据必须加密。共享前需要获得同意。”
文档 3:“确保客户数据安全存储。未获得相关利益相关者同意,不得共享客户数据。”
去重后的文本将是:
合并文本:“客户数据必须安全加密和存储,未经明确同意禁止共享客户数据。”
研究人员已经采用了类似的技术来为大型语言模型生成高质量的预训练数据。
#3 - 使用假设问题索引提高检索对称性:假设问题索引使用语言模型为数据库中存储的每个数据块生成一个或多个问题。这些问题稍后可用于指导检索步骤。
在检索过程中,用户查询与模型生成的所有问题进行语义匹配。然后检索与用户查询相似的问题,并将指向最相似问题的数据块传递给大型语言模型以生成响应。
这种方法的关键是让大型语言模型预先生成问题并将其与文档块一起存储。
检索技术
这些技术涉及优化从基础数据存储中检索相关信息的过程。这包括实施索引策略以有效地组织和存储数据、利用排名算法根据相关性对结果进行优先级排序,以及应用过滤机制来优化搜索输出。
#1 - 使用大型语言模型优化搜索查询:此技术将用户的查询重构为大型语言模型更易理解且检索器可用的格式。在这里,首先通过微调的语言模型处理用户查询以对其进行优化和结构化。这个过程去除任何不相关的上下文并添加必要的元数据,确保查询适合基础数据存储。
GraphRAG 应用程序已经利用了这种技术,这有助于提高它们的有效性。在这些系统中,大型语言模型将用户查询转换为知识图谱 Cypher 查询,然后用于查询知识图谱并检索相关信息。
#2 - 应用分层索引检索:你也可以使用分层索引来提高 RAG 应用程序的精度。在这种方法中,数据被组织成一个分层结构,信息根据相关性和关系进行分类和子分类。
检索过程从更广泛的数据块或父节点开始,然后在与选定父节点链接的较小数据块或子节点内进行更有针对性的搜索。分层索引不仅提高了检索效率,还最大限度地减少了最终输出中不相关数据的包含。
#3 - 使用假设文档嵌入(HyDE)解决查询 - 文档不对称问题:HyDE 技术与前面描述的假设问题索引方法相反。你可以使用这种技术从数据库中进行更准确的数据检索。
在这种技术中,语言模型根据查询生成一个假设答案。然后使用生成的答案在数据库中进行搜索,以获取存储中最佳匹配的数据。
#4 - 实现查询路由或 RAG 决策器模式:查询路由涉及将不同类型的查询引导到系统内最合适的检索或生成模块。这种方法确保每个查询都由最合适的算法或数据源处理,从而优化准确性和效率。
例如,查询路由器可以决定是从知识图谱还是向量存储中检索信息。它还可以确定是否需要检索,或者相关数据是否已经存在于大型语言模型的上下文中。路由器还可能遍历包括摘要和文档块向量的索引层次结构,以用于多文档存储。
这个选择过程由一个大型语言模型引导,该模型格式化结果以正确路由查询。在更复杂的场景中,路由可能会扩展到子链或其他代理,如在多文档代理模型中所见。
#5 - 自查询检索:自查询检索是一种技术,其中语言模型(LLM)根据初始用户查询生成后续查询,以检索更精确的信息。例如,这种方法允许从用户的查询中提取元数据,从而能够在过滤后的数据上进行搜索以获得更准确的结果。
要实现此技术,首先要为向量存储或知识图谱中的文档定义元数据字段。接下来,初始化一个自查询检索器,将你的大型语言模型与存储连接起来。对于每个用户查询,系统针对向量存储或知识图谱执行结构化搜索,促进语义(或基于图的)和基于元数据的检索。这个过程提高了检索步骤中获得的结果的准确性和相关性。最后,可以用检索到的数据提示大型语言模型,以生成有根据且上下文合适的响应。
#6 - 混合搜索:混合搜索将传统的基于关键词的搜索与语义搜索技术相结合。在这种技术中,创建关键词索引和向量嵌入索引。进行搜索时,它同时执行关键词搜索和语义搜索以检索结果。最终结果使用重新排名模型进行排名,该模型根据与用户查询的相关性对其进行评分。
这种方法提高了相关性、扩大了覆盖范围,并为各种查询类型提供了灵活性。混合搜索在具有严格词汇表的领域特别有用。例如,在医疗保健领域,医生经常使用缩写,如 “COPD” 表示慢性阻塞性肺疾病,“HTN” 表示高血压。在这种情况下,语义搜索可能会错过带有缩写的结果,而关键词搜索可以帮助捕获这些结果。
#7 - 图搜索:图搜索利用知识图谱来增强信息检索。通过将数据表示为图,其中节点表示实体,边表示关系,你可以发现关键词搜索或语义搜索方法可能错过的复杂连接。当输入查询时,图搜索算法遍历这些关系,使你不仅可以检索直接匹配的信息,还可以检索基于数据互连性的上下文相关信息。
这种方法对于涉及复杂数据集且理解关系是获取见解的关键的应用程序特别有用。要使用图搜索,首先必须使用大型语言模型将数据转换为知识图谱,然后使用 Cypher 查询根据用户查询检索数据。
检索后技术
这些技术涉及通过专注于优化和改进搜索输出来增强从大型数据集中的检索过程。下面概述的技术通过重新排名结果、验证检索到的上下文或改进查询来帮助改进大型语言模型提示。
#1 - 使用重新排名对搜索结果进行优先级排序:重新排名是检索增强生成(RAG)中最常用的技术之一,在从数据库中检索数据后应用。在这种方法中,使用重新排名模型对检索到的数据进行重新排名,该模型根据与查询的相关性对文档进行排序。
重新排名模型,如 Cohere 的 Rerank3,是专门的人工智能模型,用于评估和优先考虑这些检索到的文档与用户查询的相关性。这些模型在较小的候选文档集上运行,专注于根据查询和文档的上下文微调排名。通常在包含相关和不相关文档示例的数据集上进行训练,重新排名器可以有效地将高质量结果与不太相关的结果区分开来。
通过将重新排名集成到你的 RAG 工作流程中,你可以提高所呈现信息的准确性和相关性,最终导致更好的响应。
#2 - 使用上下文提示压缩优化搜索结果:当你想要在保留准确检索所需的基本信息的同时减小提示的大小,可以使用这种方法。通过压缩提示,你可以简化系统对最相关上下文的关注。你还可以通过减少计算需求或在大型语言模型 API 调用期间使用的令牌数量来节省成本。
上下文提示压缩在处理大型数据集或需要在不牺牲响应准确性的情况下保持效率时特别有用。
#3 - 使用纠正性 RAG 对检索到的文档进行评分和过滤:为了优化你的搜索结果,可以采用纠正性检索增强生成(Corrective Retrieval-Augmented Generation,Corrective RAG 或 CRAG)。这种技术涉及根据与查询的相关性和准确性对检索到的文档进行评分和过滤。
CRAG 引入了一个轻量级的检索评估器,用于评估检索到的文档的整体质量,提供一个置信度,触发不同的知识检索动作,如 “正确”、“不正确” 或 “模糊”。CRAG 还可以通过结合网络搜索来解决静态语料库的局限性,以确定检索到的结果是否相关。
然后将正确的数据块发送到语言模型进行重新表述,并向用户呈现响应。CRAG 有助于消除从数据库中检索到的不相关数据。
#4 - 查询扩展:查询扩展是一种强大的技术,可用于提高搜索结果的相关性。通过扩展原始查询以包括相关术语、同义词或替代短语,你增加了检索更全面信息的机会。
在初始查询可能过于狭窄或具体的情况下,这尤其有帮助。查询扩展允许你的系统在检索步骤中扩大搜索范围,确保你的搜索捕获所有相关信息。
这种方法提高了检索过程的准确性和覆盖范围,导致更有信息性和有用的响应。
生成技术
生成技术涉及优化大型语言模型的响应。这包括训练模型以理解上下文、采用微调方法为特定任务定制响应,以及应用反馈机制来提高输出质量。
#1 - 使用思维链提示消除噪声:你可以通过使用思维链(Chain-of-Thought,CoT)提示来提高人工智能响应的准确性。这种技术涉及引导你的系统通过一系列逻辑步骤或 “思维”,帮助它专注于相关信息,同时过滤掉噪声。通过遵循思维链,你的模型可以更好地理解查询背后的上下文和意图,从而导致更精确和相关的结果。
思维链提示通常涉及为你的模型提供如何处理特定类型查询的示例,其中你展示了得出满意答案所需的思维过程和中间步骤。这种方法帮助模型对信息形成更细致的理解。
思维链提示在处理复杂查询时特别有效,在这种情况下,大型语言模型需要推理才能生成最终响应。像 DSPy 这样的框架特别擅长思维链提示。
#2 - 使用 Self - RAG 使你的系统具有自我反思能力:Self - RAG 是一种高级技术,使你的系统能够通过迭代其输出来改进自己的检索和生成过程。在 Self - RAG 中,模型不仅仅依赖于初始检索,而是通过生成后续查询和响应积极地重新评估和调整其方法。这个迭代过程允许模型纠正自己的错误、填补空白并提高最终输出的质量。
你可以将 Self - RAG 视为模型自我纠正和改进答案的能力。通过生成初始响应、评估其准确性和相关性,然后相应地调整检索过程,模型可以生成更细致和准确的答案。这种方法在单轮检索可能不足以提供最佳答案的场景中特别有用。通过 Self - RAG,你使你的系统更具适应性和精确性。
#3 - 微调大型语言模型:微调你的模型是确保它适应特定领域的词汇和细微差别、专注于数据中真正重要内容的有力方法。这个过程涉及获取一个预训练的语言模型,并在一个更小的、特定领域的数据集上进一步训练它,使模型能够优先考虑相关信息并过滤掉噪声。通过让模型接触你期望的查询和响应类型的示例,它学习到特定于你的用例的细微差别和上下文。
你可以使用参数高效微调(Parameter-Efficient Fine-Tuning,PeFT)、低秩适应(Low-Rank Adaptation,LoRA)和量化 LoRA(Quantized LoRA,qLoRA)等技术来微调你的模型。这些方法使你能够有效地适应大型模型,而无需从头开始重新训练整个模型。此外,像 LlamaFactory 或 Axolotl 这样的无代码工具使微调过程更易于使用,即使你没有深厚的技术专长。
当你微调你的模型时,你实际上是在优化它对你特定数据的理解,这在特定领域知识至关重要且可能未被原始训练数据完全覆盖的专业领域中特别有用。这种微调提高了模型的精度,确保它生成与查询上下文高度相关的响应。
#4 - 使用自然语言推理使大型语言模型对不相关上下文具有鲁棒性:为了增强你的 RAG 系统对不相关上下文的鲁棒性,重要的是要确保检索到的信息在相关时提高性能,在不相关时不损害性能。最近的研究强调,嘈杂的检索,特别是在多跳推理中,可能会导致级联错误。
一种有效的策略是使用自然语言推理(Natural Language Inference,NLI)模型过滤掉不相关的段落。NLI 模型评估检索到的上下文是否支持问答对,帮助你的系统忽略无用信息。
此外,使用相关和不相关上下文的混合训练 RAG 模型可以对其进行微调,以更好地从噪声中辨别有用信息。例如,你可以使用 DSPy,因为它具有自动优化器,可根据你提供的数据集帮助微调大型语言模型的响应。
实施高级 RAG
实施高级检索增强生成(RAG)技术可以显著提高人工智能应用程序的性能和准确性。为了使这个过程更容易,你可以利用像 LangChain、LlamaIndex 和 DSPy 这样的工具和库,它们提供了强大的模块来帮助你将这些高级 RAG 策略集成到你的工作流程中。
本文讨论的方法侧重于三个关键领域:
- 数据预处理:在摄取阶段确保数据质量。
- 检索阶段:通过使用上下文相关数据改进检索过程。
- 生成阶段:通过确保准确检索和微调你的大型语言模型来优化生成步骤。
为了实现这些目标,你的数据必须干净、结构良好,并存储在能够进行精确搜索的系统中。传统的向量嵌入和语义搜索可能并不总是足以完成这项任务。
这就是知识图谱和 GraphRAG 作为构建 RAG 应用程序的未来范式发挥作用的地方。使用 GraphRAG:
- 你可以将数据转换为结构化的知识图谱,创建一个高质量、信息密集的系统。
- 你可以将查询构造为图查询,这允许更高效的检索和推理。
- 你的大型语言模型可以对底层图进行推理,以提供更准确和上下文丰富的响应。
GraphRAG 系统本质上是信息密集型和分层的,并使用结构化查询,使你更容易纳入许多所讨论的高级策略。此外,可视化底层数据并进行调整的能力可以进一步提高准确性和整体系统性能。
FalkorDB 如何助力高级 RAG 优化?
FalkorDB 是一种专门的低延迟存储,旨在优化数据的存储、检索和处理。它非常适合实施高级 RAG(检索增强生成)技术,因为它支持 Cypher 查询和语义搜索。
以下是你应该探索使用 FalkorDB 来实施高级 RAG 技术的原因:
- 知识图谱支持:FalkorDB 在将数据组织成知识图谱方面表现出色,这种方法与高级 RAG 方法(如分层索引、图搜索和混合搜索)相契合。你可以阅读我们关于知识图谱与向量数据库的文章,以了解为什么 FalkorDB 为构建检索步骤提供了一种强大的新方法。
- 与大型语言模型无缝集成:FalkorDB 旨在与大型语言模型无缝集成,并且可以轻松用于构建高级 RAG 技术,如自查询检索和查询扩展。这种集成使你能够有效地利用结构化和非结构化数据,促进更复杂的查询处理和响应生成。无论你是使用知识图谱、语义搜索还是两者兼而有之,FalkorDB 都能确保你的大型语言模型能够快速、准确地利用最相关的数据。
- 支持 GraphRAG:使用 FalkorDB,你可以通过将数据转换为结构化知识图谱轻松实现 GraphRAG 技术。这种能力使你能够创建一个高质量、信息密集的系统,提高检索的准确性和效率。FalkorDB 强大的查询功能,包括对 Cypher 查询的支持,使你更容易导航复杂的数据关系并检索与你的查询上下文相关的信息。
- 低延迟和可扩展性:FalkorDB 经过优化,可处理大规模数据集,使其成为需要多步检索的高级 RAG 应用程序的绝佳选择。其低延迟响应和高效扩展的能力确保即使你的数据在规模和复杂性上不断增长,你的系统仍能保持响应能力。这对于涉及多跳推理或大型、多样化数据集的技术尤为重要,在这些情况下,快速检索和处理至关重要。
FalkorDB 是一个强大的工具,可以帮助你纳入高级 RAG 技术。你可以探索以下模块以了解更多关于其功能的信息:
- FalkorDB 知识图谱
- GraphRAG - SDK
- FalkorDB 浏览器
- 代码图
- FalkorDB LangChain 集成
- FalkorDB LlamaIndex 集成
结论
高级 RAG 技术对于克服朴素 RAG 的挑战至关重要,例如在处理复杂查询和大型数据集时结果不准确、响应时间慢和成本高。通过采用这些高级方法,你可以显著提高人工智能驱动应用程序的性能、准确性和相关性。
在本文中,我们探讨了各种高级 RAG 技术,包括数据预处理、优化的检索方法和复杂的生成策略。这些方法中的每一种都是确保你的 RAG 系统高效且能够提供上下文准确响应的关键。无论是在检索前提高数据质量、微调查询,还是实施像 GraphRAG 这样的创新方法,这些策略共同帮助你构建更强大、更有效的人工智能系统。
像 FalkorDB 这样的工具和平台提供了无缝实施这些技术所需的基础设施。凭借 FalkorDB 对知识图谱的支持、与大型语言模型的集成以及可扩展性,你拥有了优化 RAG 工作流程的强大解决方案。
要开始使用 FalkorDB 实施高级 RAG 技术,你可以使用单行 Docker 命令启动它或注册 FalkorDB Cloud。然后,你可以使用 Python 客户端或任何其他可用客户端开始构建。