微信扫码
与创始人交个朋友
我要投稿
为了引出什么是 RAG,先看一下 LLM 当前存在的问题:幻觉、过时的知识、不透明无法追踪的推理过程
RAG(Retrieval-Augmented Generation,检索增强生成),是指对大型语言模型输出进行优化,使其能够在生成响应之前引用训练数据来源之外的权威知识库。大型语言模型(LLM)用海量数据进行训练,使用数十亿个参数为回答问题、翻译语言和完成句子等任务生成原始输出。在 LLM 本就强大的功能基础上,RAG 将其扩展为能访问特定领域或组织的内部知识库,所有这些都无需重新训练模型。这是一种经济高效地改进 LLM 输出的方法,让它在各种情境下都能保持相关性、准确性和实用性。
即:RAG 就是可以开卷回复的 LLM。
举个?(网上用烂了,但是简洁明了),给 ChatGPT 抛出了一个关于最近被广泛讨论的新闻的问题。鉴于 ChatGPT 对培训前数据的依赖,它最初缺乏提供最新动态的能力。RAG 通过从外部数据库获取和整合知识来弥合这种信息差距。在这种情况下,它收集与用户查询相关的新闻文章。这些文章,结合最初的问题,形成了一个全面的提示,授权 LLMs 生成一个充分知情的答案。
RAG 主要由三个步骤组成:Indexing、Retrieval、Generation。
Naive RAG 遵循传统过程 Indexing-Retrieval-Generation,也被称为 “Retrieve-Read” 框架。
索引首先清理和提取各种格式的原始数据,如 PDF、 HTML、 Word 和 Markdown,然后将其转换为统一的纯文本格式。为了适应语言模型的上下文限制,文本被分割成更小的、可消化的块(chunk)。然后使用嵌入模型将块编码成向量表示,并存储在向量数据库中。这一步对于在随后的检索阶段实现高效的相似性搜索至关重要。知识库分割成 chunks,并将 chunks 向量化至向量库中。
在收到用户查询(Query)后,RAG 系统采用与索引阶段相同的编码模型将查询转换为向量表示,然后计算索引语料库中查询向量与块向量的相似性得分。该系统优先级和检索最高 k (Top-K)块,显示最大的相似性查询。这些块随后被用作 prompt 中的扩展上下文。Query 向量化,匹配向量空间中相近的 chunks。
提出的查询(Query)和选定的文档(Chunks)被合成为一个连贯的提示,大语言模型负责生成回复。该模型的答复方法可能因具体任务的标准而异,允许它或者利用其固有的参数知识,或者限制其对所提供文件中所包含的信息的答复。在正在进行的对话中,任何现有的对话历史都可以整合到提示中,使模型能够有效地进行多轮对话交互。
检索问题
:检索阶段经常存在准确率和召回率冲突的问题,最终导致召回不一致或不相关的 chunks,以及关键信息的缺失。生成困难
:在产生响应时,模型可能面临幻觉的问题,即它产生的内容不被检索到的上下文所支持。这个阶段也可能受到输出不相关,毒性或偏倚的影响,从而影响响应的质量和可靠性。增强障碍
:将检索到的信息与不同的任务整合在一起,有时会产生不连贯或不连贯的输出。当从多个来源检索相似的信息时,该过程也可能遇到冗余,导致重复响应。面对复杂的问题,基于原始查询的单一检索可能不足以获得足够的上下文信息。过度依赖
:生成模型可能过度依赖增强的信息,导致输出只是回应检索到的内容,而不添加有见地或合成的信息。Advanced RAG 提高检索质量,采用了检索前和检索后策略(pre-retrieval and post-retrieval strategies)。为了解决索引问题,Advanced RAG 通过使用滑动窗口方法、细粒度分段和元数据的合并来改进其索引技术。
预检索过程(Pre-retrieval process)
优化索引结构和原始查询优:
后检索过程(Post-Retrieval Process)
将检索到相关的上下文有效地集成到查询中是至关重要的。
检索后处理的主要方法包括重新排序块(rerank chunks)
和上下文压缩(context compressing)
。检索后的工作集中在选择关键信息、强调关键部分和缩短待处理的上下文。
Modular RAG 引入多个特定功能模块和替换现有模块, 总体上展示了更大的灵活性。其过程并不局限于顺序检索和生成,包了括迭代和自适应检索等方法。
new Modules
模块化 RAG 框架引入了额外的专门组件,以增强检索和处理能力。
new Patterns
通过允许模块替换或重新配置来解决特定的问题,模块 RAG 提供了显著的适应能力。这超出了 Naive 和 Advanced RAG 的固定结构,其特点是拥有属性简单的 “Retrieve” 和“ Read”机制。此外,模块化 RAG 通过整合新的模块或调整现有模块之间的交互流来扩展这种灵活性,增强其在不同任务之间的适用性。
诸如 Rewrite-Retrieve-Read 模型之类的创新利用了 LLM 的能力,通过重写模块和 llm 反馈机制来更新重写模型来改进检索查询。类似地,Generate-Read 这样的方法用 llm 生成的内容取代了传统的检索,而 Recite-Read 强调从模型权重进行检索,增强了模型处理知识密集型任务的能力。混合检索策略整合了关键字,语义和向量搜索,以满足不同的查询。此外,利用子查询和假设文档嵌入 (HyDE) 试图通过在生成的答案和真实文档之间嵌入相似性来提高检索的相关性。
上面象限图表来说明三者外部知识需求、模型适应需求两个维度上的差异:
Prompt 工程利用模型的内在能力,对外部知识和模型适应的必要性最小。RAG 可以类比为信息检索提供一个具有量身定制的教科书的模型,是精确信息检索任务的理想选择。相比之下,FT 相当于学生随着时间的推移内化知识,适用于需要复制特定结构、风格或格式的场景。
RAG 通过提供实时的知识更新和高可解释性的外部知识源的有效利用,在动态环境中表现出色。然而,它带来了更高的延迟和数据检索的道德考虑。另一方面,FT 更为静态,需要对更新后的数据进行再培训,但允许对模型的行为和风格进行深度定制。它需要大量的计算资源来准备和训练数据集,虽然它可以减少幻觉,但它可能面临不熟悉的数据的挑战。
FT 依赖 “再次学习” 形成自身 “内部专业知识” 进行回答,而 RAG 是已有基础知识后进行“开卷考试”。RAG 和 FT 之间的选择取决于应用环境中对数据动态、定制和计算能力的具体需求。RAG 和 FT 并不是相互排斥的,它们可以相互补充,在不同的层次上增强模型的能力。在某些情况下,它们的结合使用可能导致最佳性能。包含 RAG 和 FT 的优化过程可能需要多次迭代才能达到满意的结果。
RAG 依靠外部知识来增强 LLMs,而检索源的类型和检索单元的粒度都会影响最终的生成结果。
除了从原始的外部来源进行检索之外,也可以 LLMs 自身产生的内容进行检索和增强。
检索粒度
粗粒度检索单元理论上可以为问题提供更多的相关信息,但它们也可能包含冗余内容,这可能会分散下游任务中检索器和语言模型的注意力;
细粒度检索单元粒度虽然精准划分,但增加了检索的负担,并且不能保证语义完整性和满足所需的知识。
在推理过程中选择合适的检索粒度是提高密集检索器的检索和下游任务性能的一个简单而有效的策略。
在索引阶段,文档将被处理,分段,并转换成嵌入,存储在矢量数据库中。索引构造的质量决定了在检索阶段是否能够获得正确的上下文。
最常用的方法是将文档按固定数量的 token(例如,100、256、512) 分割成块。更大的块可以捕获更多的上下文,但它们也会产生更多的噪音,需要更长的处理时间和更高的成本。虽然较小的块可能无法完全传达必要的上下文,但它们的噪音确实较小。然而,语块导致句子中的截断,促使递归分割和滑动窗口方法的优化,通过跨多个检索过程合并全局相关信息实现分层检索。尽管如此,这些方法仍然不能在语义完整性和上下文长度之间达到平衡。因此,可以使用 Small2Big 方法,其中句子 (小) 作为检索单元,前面和后面的句子(大)作为 LLMs 的上下文。
chunks 可以丰富元数据信息,如页码,文件名,作者,类别时间戳。检索可以基于这些元数据进行过滤,限制检索范围。在检索过程中为文档时间戳分配不同的权重可以实现时间感知的 RAG,确保知识的新鲜性和避免过时的信息。
除了从原始文档中提取元数据之外,还可以人工构造元数据。例如,添加段落摘要,以及引入假设性问题。这种方法也被称为 Reverse HyDE
。
tip:使用 LLM 生成可以被知识库文档回答的问题,然后在检索过程中计算原问题与假设问题的相似度,以缩小问题与答案之间的语义差距。
结构检索
提高信息检索的一个有效方法是为文档建立一个层次结构。通过构建结构,RAG 系统可以加快相关数据的检索和处理。
Naive RAG 直接依赖用户的原始查询作为检索的基础。制定一个精确而清晰的问题是困难的,有时候,问题本身很复杂,语言也没有很好的组织。同时,语言模型在处理具有多重含义的专门词汇或模糊缩写时经常会遇到困难。例如,他们可能无法辨别 “LLM” 指的是大型语言模型还是法律硕士。
查询扩展
将单个查询扩展为多个查询,丰富了查询的内容,提供了进一步的上下文,以解决任何缺乏特定细微差别的问题,从而确保生成的答案具有最佳的相关性。
查询转换
核心概念是基于转换后的查询检索对应的 chunks,而不是基于用户的原始查询。
查询路由
基于不同的查询,路由到不同的 RAG 管道,适合多功能的 RAG 系统设计,以适应不同的情况。
在 RAG 中,检索是通过计算问题与 chunks 二者 Embedding 之间的相似度 (如余弦距离) 来实现的,而嵌入模型的语义表示能力在其中起着关键作用。这主要包括一个稀疏编码器 (BM25) 和一个密集检索器(BERT 架构预训练语言模型)。
一些突出的嵌入模型,如 AngIE、 Voyage、 BGE 等 ,它们都受益于多任务结构调优。另外,C-MTEB 侧重于中文能力,涵盖 6 个任务和 35 个数据集。对于 “使用哪种嵌入模型” 这个问题,没有一个一刀切的答案然而,一些特定的模型更适合特定的用例。
稀疏和密集的嵌入方法捕获不同的相关性特征,可以通过利用互补的相关性信息相互受益。例如,稀疏检索模型可以用于为培训密集的检索模型提供初始搜索结果。此外,预训练语言模型 (PLMs) 可以用来学习术语权重,以增强稀疏检索。具体地说,稀疏检索模型可以增强密集检索模型的零点检索能力,协助密集检索器处理包含稀疏实体的查询,从而提高鲁棒性。
在上下文明显偏离培训前语料库的情况下,特别是在高度专业化的学科 (如医疗保健、法律实践和其他充满专有术语的部门) ,微调嵌入模型对于减少此类差异至关重要。
除了补充领域知识,微调的另一个目的是校准检索器和生成器,例如,使用 LLM 的结果作为微调的监督信号,称为 LSR (lm 监督检索器)。PROMPTAGATOR 利用 LLM 作为少镜头查询生成器来创建特定于任务的检索器,解决有监督的微调中的挑战,特别是在数据稀缺的领域。
另一种方法 LLM-Embedder 利用 LLMs 在多个下游任务中产生奖励信号。检索器通过两种类型的监督信号进行微调: 数据集的硬标签和来自 LLMs 的软奖励。这种双信号方法促进了更有效的微调过程,使嵌入模型适应不同的下游应用。REPLUG 利用检索器和 LLM 来计算检索文档的概率分布,然后通过计算 KL 发散来执行监督训练。这种直接有效的训练方法通过使用 LM 作为监督信号来提高检索模型的性能,从而消除了对特定交叉注意机制的需求。此外,受 RLHF (人类反馈强化学习) 的启发,利用基于 lm 的反馈通过强化学习来强化检索器。
微调模型可能会带来挑战,比如通过 API 进行功能集成,或者解决由于局部计算资源有限而产生的约束。因此,一些方法选择结合外部适配器来帮助对齐。
检索后,通常不能直接将检索到的所有信息输入 LLM 回答问题,需要对检索到的内容或者模型进行调整。
冗余信息会干扰 LLM 的最终生成,过长的上下文也会导致 LLM 陷入 “中间丢失” 的问题(像人类一样,LLM 倾向于只关注长文本的开头和结尾,而忘记中间部分。)。因此,在 RAG 系统中,我们通常需要进一步处理检索到的内容。
重排从根本上重新排列文档块,首先突出最相关的结果,有效地减少了整个文档池,切断了信息检索的双重目的,既充当增强器又充当过滤器,为更精确的语言模型处理提供精炼的输入。
重新排序可以使用基于规则的方法来执行,这些方法依赖于预定义的度量,如多样性、相关性和 MRR,或者基于模型的方法,如 BERT 系列的 Encoder-Decoder 模型 (如 SpanBERT) ,专门的重新排序模型,如 Cohere 重新排序或 bge-raranker-large,以及一般的大语言模型,如 GPT。
RAG 过程中的一个常见误解是,认为检索尽可能多的相关文档并将它们连接起来形成一个冗长的检索提示符是有益的。然而,过多的上下文会引入更多的噪音,降低 LLM 对关键信息的感知。除了压缩上下文之外,减少文档的数量也有助于提高模型答案的准确性。
基于场景和 LLMs 上的数据特征进行有针对性的微调可以产生更好的结果(这里就是 RAG 结合 FT 的思想)。当 LLM 在特定领域缺乏数据时,可以通过微调向 LLM 提供额外的知识。微调的另一个好处是能够调整模型的输入和输出。例如,它可以使 LLM 适应特定的数据格式,并按照指示以特定的风格生成响应。
在 RAG 领域,标准实践往往涉及一个单一的 (一次) 检索步骤,有时对于需要多步推理的复杂问题通常是不够的,因为单次检索提供的信息范围有限。
除了最常见的一次检索,RAG 还包括三种类型的检索增强过程。
RAG 模型在自然语言处理领域的快速发展和日益广泛的应用已经将 RAG 模型的评估推向了 LLMs 社区研究的前沿。
RAG 的核心任务仍然是问答 (QA) ,包括传统的单跳 / 多跳 QA、多选择、特定领域的 QA 以及适合 RAG 的长格式场景。除了 QA 之外,RAG 还不断地被扩展到多个下游任务,如信息提取 (IE)、对话生成、代码搜索等。
RAG 模型的评估强调三个主要质量评分和四个基本能力,它们共同决定了 RAG 模型的两个主要评价指标: 检索和生成。
质量得分
能力评价
上下文相关性和噪声鲁棒性是评价检索质量的重要指标,而答案忠实度、答案相关性、否定拒绝、信息整合和反事实鲁棒性是评价检索质量的重要指标。
随着 LLMs 研究不断深入,目前 LLMs 可以直接处理 20 万个标记的上下文。这种能力意味着,以前依赖 RAG 的长文档问答现在可以直接将整个文档整合到提示符中。
事实上,RAG 仍然扮演着不可替代的角色。一方面,同时为 LLMs 提供大量的上下文将显著影响其推理速度,而分块检索和按需输入则可显著提高其运行效率。另一方面,基于 rag 的生成可以快速定位 LLMs 的原始引用,帮助用户验证生成的答案。整个检索和推理过程是可以观察到的,而完全依赖于长上下文的生成仍然是一个黑匣子。在超长上下文处理能力背景下,新 RAG 方法是未来的研究趋势之一。有研究结果表明,包括不相关的文件可以出乎意料地将准确性提高 30% 以上,与质量下降的最初假设相矛盾。这些结果强调了开发专门的策略以将检索与语言生成模型结合起来的重要性,突出了对 RAG 的健壮性进行进一步研究和探索的必要性。
将 RAG 与微调相结合正在成为一种领先的策略。确定 RAG 的最佳集成和微调,无论是顺序的,交替的,还是通过端到端的联合训练 - 以及如何利用这两个参数化
RAG 的实用性和与工程需求的一致性促进了它的采用。RAG 生态系统的发展在很大程度上受到其技术层次进步的影响。随着 ChatGPT 的出现,LangChain 和 LLamaIndex 等关键工具迅速受到欢迎,它们提供了广泛的 rag 相关 api,并成为 LLMs 领域的必备工具。新兴的技术堆栈,虽然不像 LangChain 和 LLamaIndex 那样功能丰富,但是通过它的专业化产品脱颖而出。例如,Flowise AI 优先考虑低代码的方法,允许用户通过用户友好的拖放界面部署 AI 应用程序,包括 RAG。其他技术如 HayStack、 Meltano 和 Cohere Coral 也因其在这一领域的独特贡献而受到关注。
除了专注于人工智能的供应商,传统的软件和云服务供应商正在扩展他们的产品,包括以 rag 为中心的服务。Weaviate 的 Verba 11 是为个人助理应用程序设计的,而 Amazon 的 Kendra 12 提供智能企业搜索服务,使用户能够使用内置的连接器浏览各种内容存储库。在 RAG 技术的发展过程中,出现了一个明显的趋势,朝着不同的专业化方向发展,例如:
RAG 已经超越了它最初基于文本的问答范围,包含了各种各样的模态数据。这种扩展催生了创新的多模态模型,将 RAG 概念整合到各个领域: 图像、音视频、Vid2Seq、code。结语随着 LLM 及 RAG 技术的不断发展,Agent 的基础能力愈发强大,如何将底层能力整合,产生一个现象级的产品是当下最直接的诉求。Agent 最终的呈现形态,一直在探索与期待... 随着 Agent 爆发,我们不妨尝试将 RAG 融入到 Agent 设计中,进一步提升其 “智能性” 和“专业性”~
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-11-25
RAG搭建中,如何选择最合适的向量索引?
2024-11-25
RAG的2024—随需而变,从狂热到理性(下)
2024-11-25
RAG的2024—随需而变,从狂热到理性(下)
2024-11-25
糟糕!LLM输出半截Json的答案,还有救吗!
2024-11-24
解读GraphRAG
2024-11-24
RAGChecker:显著超越RAGAS,一个精细化评估和诊断 RAG 系统的创新框架
2024-11-23
FastRAG半结构化RAG实现思路及OpenAI O1-long COT蒸馏路线思考
2024-11-23
检索增强生成(RAG):解密AI如何融合记忆与搜索
2024-07-18
2024-05-05
2024-07-09
2024-05-19
2024-07-09
2024-06-20
2024-07-07
2024-07-07
2024-07-08
2024-07-09
2024-11-25
2024-11-06
2024-11-06
2024-11-05
2024-11-04
2024-10-27
2024-10-25
2024-10-21