# 热门搜索 #
搜索
喂饭!RAG for LLM: A Survey论文导读
8995点击    2023-12-24 12:11

前言


这是 Retrieval-Augmented Generation for Large Language Models: A Survey 这篇论文的改写解读,因为大概率绝大部分人没有耐心去看完原文。也有好心人翻译成了中文 面向大语言模型的检索增强生成技术:调查 [译] ,但是大概率绝大部分人没有耐心看完(而且这个翻译版本是机翻,估计没有人工校验过,有一些文本结构问题)。原文对RAG的方法做了一个调查综述,是常见的水论文的手段,也是后续继续研究的必要过程。如果想了解RAG的全貌,还是非常有用的。


本文是给没有耐心的你准备的,严肃读者还是应该读原文。我们没有按照原文的顺序来进行,按照自己的理解进行了重新组织。默认你应该已经知道RAG,也很清楚RAG的原理,可能自己动手做过一些实验。所以应该知道RAG没有想象中那么容易。相信这也是你会看到这篇文章的原因。


改善模型生成效果的方法


RAG的目的是为了改善大模型的生成效果,但它是改善生成效果的唯一方法。常见方法有:


  1. 提示工程,通过例如few-shot prompt 的手段增强输出
  2. RAG,检索增强,就是本文叙述的方法
  3. 微调,对模型进行微调
  4. 综合手段,综合利用微调、提示工程和RAG


列出这些方法的意思是不要上来就无脑RAG或者微调,需要分析一下应用场景,决定采用哪种方法来决定问题的解决方案。


文中给出的图说明了几种方法的特点,根据对于LLM适应和外部知识的依赖程度进行了区分。


  

图 1: RAG与其他模型优化方法的比较

RAG的本质


RAG的本质是让模型获取正确的Context(上下文),利用ICL (In Context Learning)的能力,输出正确的响应。它综合利用了固化在模型权重中的参数化知识和存在外部存储中的非参数化知识(知识库、数据库等)。


RAG分为两阶段:


  1. 使用编码模型(如 BM25、DPR、ColBERT 等)根据问题找到相关的文档。
  2. 生成阶段:以找到的上下文作为基础,系统生成文本。


RAG技术的发展


RAG并不是ChatGPT火爆之后才出现的,它最早在2020年就被提出。但是当时是一个端到端的方法,结合了一个预训练的检索器和预训练的生成器,主要通过模型微调来提升效果。


大部分与 RAG 相关的研究出现在 2020 年之后,尤其是在 2022 年 12 月 ChatGPT 发布之后,这一事件成为了一个重要的转折点。这之后的RAG更多的是利用LLM的推理能力,通过结合外部知识来获得更好的生成效果。诞生了各种手段和方法。


当然你并不需要了解每一种简写是什么意思(其实是我不知道)。



图 2: 现有 的RAG 研究时间线

RAG的分类


文章根据RAG技术分成三类,代表了不同的技术复杂度,越复杂也代表实现难度越大。但是可能会收到更好的效果,适应更多的场景。这三类类型是:


  • Naive RAG 简单RAG,这就是大部分人都知道RAG,把文本分段,根据用户的Qurey,去查找分段,输入给模型,然后输出。但是这种方法 Too Simple, Some Time Naive。有各种问题,首先生硬的对文本分段就不科学,然后可能查询到的分段有可能和Qurey并不相关,再有输入给LLM的文本分段可能有大量的冗余、重复或者噪声信息,让模型不能输出和期望一致的内容。

  • Advanced RAG 高级RAG,针对简单RAG的不足,"高级"RAG进行了针对性的改善。主要是针对检索进行了改善,包括Preretrieval(检索前),Post-retrieval(检索后) 和Retrieval Process(检索中) 的各种改善方法(废话....)。检索前包括建立多种文档索引、利用滑动窗对文本进行分块;检索中包括多路召回,Embedding模型微调(可以参看我们的前一篇文章 炼不出垂直大模型? 试试垂直Embedding);检索后包括重排(Re-rank)等。

  • Modular RAG 模块化RAG,模块化方法并不局限在“检索”-“阅读”的框架,利用大模型自身的"反思"能力等,构建起RAG的新的范式。简单点说,上面两种方法都是一个单一的流水线模式,检索结束之后交给模型,然后模型输出结果。但是在论文中的Modular RAG方法中,递归的调用了LLM的能力,例如利用模型来反思、评估第一次输出,然后再输出新的结果。或者让模型自己决定什么时候调用检索工具。这其实有点像实现一个RAG Agent。论文表示这种模块化的 RAG 范式正逐渐成为 RAG 领域的趋势。



图 3:三种 RAG 范式的比较

有哪些增强RAG效果的方法


文章先对高级RAG和模块化RAG的实现方法分别进行叙述,然后又换视角从Retriever(检索器)和Generator(生成器)的角度分别描述了如何获得好的效果进行了探讨,输出了一些数学公式(提升论文B格)。然后再换一个角度,总结了各种增强方法,还非常Nice的给出一个思维导图,这才是缺乏耐心的你想要看到的。


图 4:RAG 核心组成的分类


如果你正在为RAG效果不佳苦苦挣扎,那么就应该仔细评估RAG中每一个环节,看看哪个环节是最需要改善的。


6.1 检索前处理(Pre-Retrieval Process)


在这一步应该要保证数据的质量和对数据进行索引优化,以便检索器可以精确的检索到相关内容。文中提出了五种方法:


  1. 提高索引数据的粒度 :具体来说包括剔除文章中的不相关内容、特殊字符。消除术语和实体的歧义,例如指代消解,比如上文提到某人,在下文中用他来代替时,他是指谁。消除冗余和重复信息。
  2. 优化索引结构 :包括调整数据块大小、创建多个索引和加入图结构信息。例如创建标准索引可用于特定查询,或使用独立索引基于元数据关键词(如“日期”索引)进行搜索或过滤。使用图谱结合查询也会提升效果。
  3. 添加元数据 :这一策略的核心是将引用的元数据,如日期和用途(用于筛选)等,嵌入到数据块中。添加如章节和引用小节等元数据,对于提升检索效率是有益的。当索引被分割成多个块时,如何高效检索便成为关键。通过元数据进行初步筛选可以提高检索的效率和准确性。
  4. 对齐优化 :意思是怎么准确的理解用户的意图,并保证检索的文档内容与用户意图正确相关。实现方法包括了预先将文档生成假设性问题,并且对问题进行Embedding,来匹配用户的Query。
  5. 混合检索 :这种策略结合了不同类型的检索方法或算法。利用综合使用关键字、语义和向量检索。可以提高召回率。


6.2 提高检索的准确性


在检索器上可以做的优化主要是:


  1. 更好的语义表达:文档分段优化,例如滑动窗,或者根据文档结构建立分段,以及微调Embedding模型。
  2. 匹配(对齐)Query和文档:对Query进行重写、分类,Embedding 变换(就是利用模型来实现Query的更优的Embedding表达)等
  3. 匹配检索器和LLM:由于每个LLM都有自己的"风格",因此检索到的内容也要符合LLM的风格才能获得最好的效果


6.3 获得好的生成


在检索后处理,可以优化的环节有:


  1. Prompt 压缩,去除检索到的内容中冗余信息和噪声。
  2. Rerank重排,对检索到的内容根据相关性进行重新排序,并且根据LLM关注特点,调整输入内容的位置,例如重要信息放在最前和最后的位置。
  3. 对LLM进行微调,RAG也是一个子任务,可以通过微调提高LLM在RAG任务上的表现。


6.4 从增强的方法看


如果换一个角度,从可以Augemented的阶段、数据类型和流程角度来思考如何获得好的结果。


  1. 模型训练推理,可以在大模型的预训练、微调和推理三个阶段使用特定方法增强大模型的RAG效果;
  2. 数据类型,可以综合使用非结构化数据、结构化数据(表格、数据库)以及LLM生成数据(合成数据)来改善效果,例如,针对用户的Query,可以让模型预先生成一个假设的答案,然后利用假设答案到知识库中检索相似内容(HyDE),也可以增强检索的效果
  3. 检索流程,可以采用迭代式检索,自适应检索来提升检索效果,迭代式检索的方法是在初始检索之后,系统会分析结果。这种分析可能涉及评估检索数据的相关性,确定需要额外信息的领域,然后持续迭代检索。自适应检索的方法是让模型决定何时需要检索。


6.5 其他方法


还有一些在文中出现,但是没有在思维导图中出现的方法:


  • StepBack-prompt 方法: 集成到 RAG 流程中的 StepBack-prompt 方法[Zheng et al., 2023] 促使大语言模型 (LLM) 在处理具体案例时能够退一步,转而思考背后的普遍概念或原则。研究发现,这种结合后向提示的方法在处理各种复杂、推理密集的任务时表现卓越,充分展现了其与 RAG 的良好兼容性。这种方法既能用于后向提示的答案生成,也能用于最终的问答环节。


RAG的评估方法


文中提到主要有两种方法来评估 RAG 的有效性:独立评估和端到端评估[Liu, 2023]。独立评估涉及对检索模块和生成模块(即阅读和合成信息)的评估。端到端评估是对 RAG 模型对特定输入生成的最终响应进行评估,涉及模型生成的答案与输入查询的相关性和一致性。并简单介绍了RAGAS 和 ARES两种评估框架。


未来展望


讨论了 RAG 的三大未来发展方向:垂直优化、横向扩展以及 RAG 生态系统的构建。


在垂直优化中,主要研究方向是 :长上下文的处理问题,鲁棒性研究,RAG 与微调(Fine-tuning)的协同作用,以及如何在大规模知识库场景中提高检索效率和文档召回率,如何保障企业数据安全——例如防止 LLM 被诱导泄露文档的来源、元数据或其他敏感信息。


在水平领域,RAG 的研究也在迅速扩展。从最初的文本问答领域出发,RAG 的应用逐渐拓展到更多模态数据,包括图像、代码、结构化知识、音视频等。在这些领域,已经涌现出许多相关研究成果。


生态系统主要介绍了Langchain、LlamaIndex等常见的技术框架。


总结


可以看到,简单的RAG和复杂的RAG之间相差非常大。也由此产生了各种"奇技淫巧"。但是个人认为,如果以AI应用的视角来看,将来RAG也必然会Agent化,Retriever不过是Agent的工具之一。其次,将来的RAG应用也应该是一个端到端可训练迭代的应用,人为介入的方法越多,这种方法就有可能会被更强的模型能力来取代。


文章来自于微信公众号 “Meshinfo”,作者 “Meshinfo


关键词: RAG , LLM , prompt
AITNT资源拓展
根据文章内容,系统为您匹配了更有价值的资源信息。内容由AI生成,仅供参考
1
智能体

【开源免费】AutoGPT是一个允许用户创建和运行智能体的(AI Agents)项目。用户创建的智能体能够自动执行各种任务,从而让AI有步骤的去解决实际问题。

项目地址:https://github.com/Significant-Gravitas/AutoGPT


【开源免费】MetaGPT是一个“软件开发公司”的智能体项目,只需要输入一句话的老板需求,MetaGPT即可输出用户故事 / 竞品分析 / 需求 / 数据结构 / APIs / 文件等软件开发的相关内容。MetaGPT内置了各种AI角色,包括产品经理 / 架构师 / 项目经理 / 工程师,MetaGPT提供了一个精心调配的软件公司研发全过程的SOP。

项目地址:https://github.com/geekan/MetaGPT/blob/main/docs/README_CN.md

2
知识库

【开源免费】FASTGPT是基于LLM的知识库开源项目,提供开箱即用的数据处理、模型调用等能力。整体功能和“Dify”“RAGFlow”项目类似。很多接入微信,飞书的AI项目都基于该项目二次开发。

项目地址:https://github.com/labring/FastGPT

3
RAG

【开源免费】graphrag是微软推出的RAG项目,与传统的通过 RAG 方法使用向量相似性作为搜索技术不同,GraphRAG是使用知识图谱在推理复杂信息时大幅提高问答性能。

项目地址:https://github.com/microsoft/graphrag

【开源免费】Dify是最早一批实现RAG,Agent,模型管理等一站式AI开发的工具平台,并且项目方一直持续维护。其中在任务编排方面相对领先对手,可以帮助研发实现像字节扣子那样的功能。

项目地址:https://github.com/langgenius/dify


【开源免费】RAGFlow是和Dify类似的开源项目,该项目在大文件解析方面做的更出色,拓展编排方面相对弱一些。

项目地址:https://github.com/infiniflow/ragflow/tree/main


【开源免费】phidata是一个可以实现将数据转化成向量存储,并通过AI实现RAG功能的项目

项目地址:https://github.com/phidatahq/phidata


【开源免费】TaskingAI 是一个提供RAG,Agent,大模型管理等AI项目开发的工具平台,比LangChain更强大的中间件AI平台工具。

项目地址:https://github.com/TaskingAI/TaskingAI

4
微调

【开源免费】XTuner 是一个高效、灵活、全能的轻量化大模型微调工具库。它帮助开发者提供一个简单易用的平台,可以对大语言模型(LLM)和多模态图文模型(VLM)进行预训练和轻量级微调。XTuner 支持多种微调算法,如 QLoRA、LoRA 和全量参数微调。

项目地址:https://github.com/InternLM/xtuner

5
prompt

【开源免费】LangGPT 是一个通过结构化和模板化的方法,编写高质量的AI提示词的开源项目。它可以让任何非专业的用户轻松创建高水平的提示词,进而高质量的帮助用户通过AI解决问题。

项目地址:https://github.com/langgptai/LangGPT/blob/main/README_zh.md

在线使用:https://kimi.moonshot.cn/kimiplus/conpg00t7lagbbsfqkq0