目录
一、RAG是什么?
二、为什么需要RAG?
三、RAG的特点
四、基础RAG架构
数据准备阶段
应用阶段:
五、RAG分类
基础RAG(Naive RAG)
缺点
高级RAG(Advanced RAG)
模块化RAG(Modular RAG)
六、RAG(检索增强生成) vs Fine-Tuning(微调)
八、高效和准确的检索
1)来源
检索源的类型
检索单元的粒度
2)索引优化
1.分块策略
2.元数据附件
3.结构指数
3)查询优化
1.查询扩展
2.查询变换
4)生成优化
1.内容策划
2.用小模型微调 (Fine-tuning)
九、在 Rag 中进行增强处理
迭代检索
递归检索
适应性检索
十、RAG效果评估
独立评估(Independent Evaluation)
端到端评估(End-to-End Evaluation)
十一、框架
LangChain:多功能的LLM应用开发框架
LlamaIndex:专注于数据层的RAG构建工具
参考文章
一、RAG是什么?
检索增强生成(RAG)是指对大型语言模型输出进行优化,使其能够在生成响应之前引用训练数据来源之外的权威知识库。大型语言模型(LLM)用海量数据进行训练,使用数十亿个参数为回答问题、翻译语言和完成句子等任务生成原始输出。在 LLM 本就强大的功能基础上,RAG 将其扩展为能访问特定领域或组织的内部知识库,所有这些都无需重新训练模型。这是一种经济高效地改进 LLM 输出的方法,让它在各种情境下都能保持相关性、准确性和实用性。
RAG通过计算语义相似度从外部知识库检索相关文档片段来增强 LLMs。通过参考外部知识,RAG 有效地减少了生成不正确的内容的问题。它被集成到 LLMs 广泛应用,使 RAG 成为推动聊天机器人发展和提高 LLMs 在现实世界应用中的适用性的关键技术。
二、为什么需要RAG?
将大模型应用于实际业务场景时会发现,通用的基础大模型基本无法满足我们的实际业务需求,主要有以下几方面原因:
- 知识的局限性:模型自身的知识完全源于它的训练数据,而现有的主流大模型的训练集基本都是构建于网络公开的数据,对于一些实时性的、非公开的或离线的数据是无法获取到的,这部分知识也就无从具备。
- 幻觉问题:所有的AI模型的底层原理都是基于数学概率,其模型输出实质上是一系列数值运算,大模型也不例外,所以它有时候会一本正经地胡说八道,尤其是在大模型自身不具备某一方面的知识或不擅长的场景。而这种幻觉问题的区分是比较困难的,因为它要求使用者自身具备相应领域的知识。
- 数据安全性:对于企业来说,数据安全至关重要,没有企业愿意承担数据泄露的风险,将自身的私域数据上传第三方平台进行训练。这也导致完全依赖通用大模型自身能力的应用方案不得不在数据安全和效果方面进行取舍。
三、RAG的特点
1、RAG 是一种相对较新的人工智能技术,可以通过允许大型语言模型 (LLM) 在无需重新训练的情况下利用额外的数据资源来提高生成式 AI 的质量。
2、RAG 模型基于组织自身的数据构建知识存储库,并且存储库可以不断更新,以帮助生成式 AI 提供及时的上下文答案。
3、使用自然语言处理的聊天机器人和其他对话系统可以从 RAG 和生成式人工智能中受益匪浅。
4、实施 RAG 需要矢量数据库等技术,这些技术可以快速编码新数据,并搜索该数据以输入给LLM模型。
四、基础RAG架构
RAG就是通过检索获取相关的知识并将其融入Prompt,让大模型能够参考相应的知识从而给出合理回答。因此,可以将RAG的核心理解为“检索+生成”,前者主要是利用向量数据库的高效存储和检索能力,召回目标知识;后者则是利用大模型和Prompt工程,将召回的知识合理利用,生成目标答案。
在检索阶段,算法搜索并检索与用户输入相关的信息片段,下图step1和step2从向量数据库中查询与query相关的信息片段 。
生成阶段step3,大模型依据增强的提示和预训练的内部表示中提取信息,为用户量身定做生成答案,将答案发送给聊天机器人并附上出处链接。
- 数据准备阶段:数据提取——>文本分割——>向量化(embedding)——>数据入库
- 应用阶段:用户提问——>数据检索(召回)——>注入Prompt——>LLM生成答案
数据准备阶段
数据准备一般是一个离线的过程,主要是将私域数据向量化后构建索引并存入数据库的过程。主要包括:数据提取、文本分割、向量化、数据入库等环节。
- 数据提取
- 数据加载:包括多格式数据加载、不同数据源获取等,根据数据自身情况,将数据处理为同一个范式。
- 数据处理:包括数据过滤、压缩、格式化等。
- 元数据获取:提取数据中关键信息,例如文件名、Title、时间等 。
- 文本分割:
文本分割主要考虑两个因素:1)embedding模型的Tokens限制情况;2)语义完整性对整体的检索效果的影响。一些常见的文本分割方式如下:- 句分割:以”句”的粒度进行切分,保留一个句子的完整语义。常见切分符包括:句号、感叹号、问号、换行符等。
- 固定长度分割:根据embedding模型的token长度限制,将文本分割为固定长度(例如256/512个tokens),这种切分方式会损失很多语义信息,一般通过在头尾增加一定冗余量来缓解。
- 向量化(embedding):
向量化是一个将文本数据转化为向量矩阵的过程,该过程会直接影响到后续检索的效果。目前常见的embedding模型如表中所示,这些embedding模型基本能满足大部分需求,但对于特殊场景(例如涉及一些罕见专有词或字等)或者想进一步优化效果,则可以选择开源Embedding模型微调或直接训练适合自己场景的Embedding模型。
模型名称 | 描述 | 获取地址 |
---|---|---|
ChatGPT-Embedding | ChatGPT-Embedding由OpenAI公司提供,以接口形式调用。 | https://platform.openai.com/docs/guides/embeddings/what-are-embeddings |
ERNIE-Embedding V1 | ERNIE-Embedding V1由百度公司提供,依赖于文心大模型能力,以接口形式调用。 | https://cloud.baidu.com/doc/WENXINWORKSHOP/s/alj562vvu |
M3E | M3E是一款功能强大的开源Embedding模型,包含m3e-small、m3e-base、m3e-large等多个版本,支持微调和本地部署。 | https://huggingface.co/moka-ai/m3e-base |
BGE | BGE由北京智源人工智能研究院发布,同样是一款功能强大的开源Embedding模型,包含了支持中文和英文的多个版本,同样支持微调和本地部署。 | https://huggingface.co/BAAI/bge-base-en-v1.5 |
- 数据入库:
数据向量化后构建索引,并写入数据库的过程可以概述为数据入库过程,适用于RAG场景的数据库包括:FAISS、Chromadb、ES、milvus等。一般可以根据业务场景、硬件、性能需求等多因素综合考虑,选择合适的数据库。
应用阶段:
在应用阶段,我们根据用户的提问,通过高效的检索方法,召回与提问最相关的知识,并融入Prompt;大模型参考当前提问和相关知识,生成相应的答案。关键环节包括:数据检索、注入Prompt等。
- 数据检索
常见的数据检索方法包括:相似性检索、全文检索等,根据检索效果,一般可以选择多种检索方式融合,提升召回率。
-
- 相似性检索:即计算查询向量与所有存储向量的相似性得分,返回得分高的记录。常见的相似性计算方法包括:余弦相似性、欧氏距离、曼哈顿距离等。
- 全文检索:全文检索是一种比较经典的检索方式,在数据存入时,通过关键词构建倒排索引;在检索时,通过关键词进行全文检索,找到对应的记录。
- 注入Prompt
- Prompt作为大模型的直接输入,是影响模型输出准确率的关键因素之一。在RAG场景中,Prompt一般包括任务描述、背景知识(检索得到)、任务指令(一般是用户提问)等,根据任务场景和大模型性能,也可以在Prompt中适当加入其他指令优化大模型的输出。一个简单知识问答场景的Prompt如下所示:
五、RAG分类
基础RAG(Naive RAG)、高级RAG(Advanced RAG)和模块化RAG(Modular RAG)是检索增强生成在大型语言模型中应用的三种不同形式。
基础RAG(Naive RAG)
基础RAG是RAG方法的原始形式,它结合了信息检索和文本生成两个阶段。在这个框架中,当模型接收到一个查询时,它首先执行一个检索步骤,从一个大型的、结构化的知识库中检索出与查询相关的信息片段。然后,这些检索到的信息被送入一个生成器模型,该模型结合原始查询和检索到的信息来生成回答。基础RAG的关键在于它将检索和生成紧密结合,使得生成的回答能够利用检索到的实时外部信息。
缺点
检索挑战。检索阶段常常难以精确地检索信息并返回,导致选择不匹配或不相关的块,并遗漏关键信息。
生成困难。在生成响应时,模型可能会遇到幻觉问题,即它产生的内容没有得到检索上下文的支持。这个阶段也可能受到输出中的不相关性、毒性或偏见的影响,从而降低了响应的质量和可靠性。
增强障碍。 将检索的信息与不同的任务相结合可能具有挑战性,有时会导致支离破碎或不连贯的输出。 该过程还可能会遇到冗余,因为从多个来源检索到类似信息,导致重复响应。 确定各种段落的重要性和相关性并确保文体和语调的一致性会增加复杂性。 面对复杂的问题时,仅根据原始查询执行一次检索可能不足以获取足够的上下文信息。
此外,还有一个担忧是生成模型可能过于依赖增强信息,导致输出的内容只是简单地重复检索到的内容,而没有添加任何洞察力或合成的信息。
高级RAG(Advanced RAG)
高级RAG对基础RAG进行了改进,引入了预检索(pre-retrieval)和后检索(post-retrieval)优化策略。
在预检索阶段,模型会通过对查询进行处理(如扩展或重写)来提高检索的准确性和相关性。查询优化的目标是使用户的原始问题更清晰,并使其更适合检索任务。这包括策略:细化数据粒度、优化索引结构、添加元数据、对齐优化和混合检索。
在后检索阶段,模型可以对检索到的信息进行进一步的处理,如重新排序、信息压缩或合成,以便更有效地融合到生成步骤中。这种高级RAG通过在检索前后增加额外的处理步骤,提高了回答的质量和相关性。将检索到的信息重新排名以将最相关的内容移到提示的边缘是一项关键策略。
模块化RAG(Modular RAG)
模块化RAG是一种更灵活的RAG实现,它允许不同的检索和生成模块根据特定的应用需求进行替换或重新配置。这种方法的关键在于模块化设计,使得研究者和开发者可以针对特定问题选择最合适的检索器和生成器。例如,对于某些特定类型的查询,可以选择特化的检索模块,或者针对特定的生成任务,选择一个适合该场景的生成器。模块化RAG提供了更大的灵活性和适应性,适用于多样化和动态变化的应用场景。
六、RAG(检索增强生成) vs Fine-Tuning(微调)
RAG是指结合了检索(从大型外部数据库中提取信息)和生成(基于检索到的信息生成答案)两个步骤。RAG通过引入外部知识来源,来增强语言模型的回答能力。Fine-Tuning是指在已有的预训练模型基础上,通过在特定数据集上进行额外的训练来优化模型。这个过程没有引入外部知识,而是调整模型以更好地适应特定任务。
八、高效和准确的检索
高效地从数据源检索相关文档至关重要。有几个关键问题需要考虑,比如检索源、检索粒度、检索预处理以及选择相应的嵌入模型。
1)来源
RAG 依赖外部知识来增强 LLM,而检索源的类型和检索单元的粒度都影响最终生成的结果。
检索源的类型
1.非结构化数据,如文本,是最广泛使用的检索源,主要来自语料库。
2.半结构化数据。通常指包含文本和表格信息的数据,如PDF。
3.结构化数据,如知识图谱(KG)
检索单元的粒度
细粒度检索单元会增加检索负担,并不能保证语义完整性和满足所需的知识;粗粒度检索单元提供更相关的信息,但也可能包含冗余的内容,这可能会分散下游任务中检索器和语言模型的注意力。
2)索引优化
在索引阶段,文档将被处理、分段并转换为嵌入式向量以存储在矢量数据库中。 索引质量决定了检索阶段是否能获得正确的上下文。
1.分块策略
最常用的方法是在固定数量的标记(例如,100、256 或 512)上将文档分成块。[88] 较大的块可以捕获更多的上下文信息,但也会产生更多的噪声,需要更长的处理时间和更高的成本。然而,较小的块可能无法完全传达必要的上下文信息,但它们产生的噪声较少。
2.元数据附件
块可以被丰富为元数据信息,如页码、文件名、作者、类别时间戳。随后,检索可以根据这些元数据进行过滤,限制检索范围。
3.结构指数
提升信息检索效果的有效方法之一是为文档建立分层结构。通过构建这种结构,RAG 系统可以加快相关数据的检索和处理。
层次索引结构。文件以父子关系排列,每个节点都链接到块。每个节点存储数据摘要,帮助快速遍历数据,并帮助RAG系统确定要提取哪些块。这种方法还可以缓解块提取问题造成的幻觉。
知识图谱索引。在构建文档层次结构时使用KG有助于保持一致性。它界定了不同概念和实体之间的联系,显著降低了潜在的误解可能性。另一个优势是将信息检索过程转化为LLM可以理解的指令,从而提高知识检索的准确性,并使LLM能够生成上下文连贯的响应,从而提高RAG系统的整体效率。
3)查询优化
1.查询扩展
将单个查询扩展为多个查询可以丰富查询的内容,提供更多的上下文来解决任何缺乏具体细微差别的问题,从而确保生成的答案的相关性最佳。
2.查询变换
核心思想是基于转换后的查询而非用户的原始查询来检索片段。
查询重写。 原始查询并不总是最适合 LLM 检索,特别是在现实世界的情况下。 因此,我们可以提示 LLM 重写查询。
另一种查询转换方法是使用提示工程让 LLM 基于原始查询生成后续检索所需的查询。
用查询重写(Query Rewrite)和向量转换(Embedding Transformation)来对齐用户查询和文档的语义空间,以及使用监督训练(Supervised Training)让检索器的输出与大型语言模型的偏好相对齐,想了解细节的可以阅读原文。
4)生成优化
检索后,不建议直接将所有检索到的信息输入到 LLM 中以回答问题。接下来将从两个角度介绍两种调整方法:调整检索的内容和调整 LLM。
1.内容策划
在 RAG 系统中,我们通常需要进一步处理检索到的内容。1)重排序:重排序从根本上重新排列文档块,以首先突出显示最相关的结果,有效地减少整个文档库,发挥双重作用信息检索,充当增强器和过滤器,为更精确的语言模型处理提供精炼的输入。2)上下文选择/压缩:在 RAG 过程中常见的误解之一是,尽可能检索并连接更多相关文档以形成一个冗长的检索提示是有益的。然而,过多的上下文可能会引入更多的噪音,降低 LLM 对关键信息的理解。
2.用小模型微调 (Fine-tuning)
基于场景和数据特征对 LLM 进行有针对性的微调可以带来更好的效果。这也是使用本地 LLM 的最大优势之一。当 LLM 在特定领域缺乏数据时,可以通过微调为模型提供额外的知识。Huggingface 的微调数据也可以作为初始步骤。
微调的另一个好处是能够调整模型的输入和输出。
九、在 Rag 中进行增强处理
在RAG领域,标准做法通常涉及一个(一次)检索步骤,然后生成,这可能导致效率低下,并且有时对需要多步推理的复杂问题通常是不足够的,因为它提供了有限的信息范围。
迭代检索
迭代检索是一种过程,它根据初始查询和到目前为止生成的文本多次搜索知识库,提供更全面的知识。通过多次检索迭代提供额外的上下文参考,从而增强了后续答案生成的鲁棒性。然而,它可能会受到语义不连续性和无关信息积累的影响。
递归检索
递归检索常用于信息检索和自然语言处理中,以提高搜索结果的深度和相关性。该过程涉及根据先前搜索的结果迭代地细化查询。递归检索旨在通过反馈循环逐渐收敛到最相关的信息,从而增强搜索体验。
适应性检索
自适应检索方法,如 Flare和 Self-RAG ,通过使 LLM 能够主动确定检索的最佳时机和内容来细化 RAG 框架,从而提高信息来源的效率和相关性。
十、RAG效果评估
生成器生成答案后,需要有科学的输出内容评估体系整个RAG流程才算闭环。
文中介绍了两种评估RAG的方法:独立评估(Independent Evaluation)和端到端评估(End-to-End Evaluation)。
独立评估(Independent Evaluation)
独立评估方法会分别评估检索模块(Retrieval Module)和生成模块(Generation Module),其中检索模块评估指标包括指标包括命中率(Hit Rate)、平均排名倒数(Mean Reciprocal Rank, MRR)、归一化折扣累积增益(Normalized Discounted Cumulative Gain, NDCG)、准确率(Precision)等,这些指标用于测量系统在根据查询或任务排名项目方面的有效性。而生成模块评估通常在端到端评估中进行。评估指标主要关注上下文相关性,测量检索到的文档与查询问题的相关性。
端到端评估(End-to-End Evaluation)
端到端评估方法评估RAG模型对给定输入生成的最终响应,包括模型生成答案与输入查询的相关性和对齐程度。从内容生成目标视角来评估可以将评估划分为未标记内容和已标记内容。未标记内容评估指标包括答案忠实度(Answer Fidelity)、答案相关性(Answer Relevance)、无害性(Harmlessness)等,而已标记内容评估指标包括准确率(Accuracy)和精确匹配(Exact Match, EM)。端到端评估可以分为人工评估和使用大型语言模型的自动评估。此外,还可以根据RAG在特定领域的应用,采用特定的评估指标,例如在问答任务中使用EM。
文章中还介绍了两套RAG评估框架,RAGAS (Es et al. 2023) 和 ARES (Saad-Falcon et al. 2023)
两个评估框架的核心焦点是以下三个主要指标:
- 答案忠实度:这个指标强调模型生成的答案必须忠实于给定的上下文,确保答案与上下文信息一致且不偏离或矛盾。这个评估方面对于解决大型模型中的幻觉问题至关重要。
- 答案相关性:这个指标强调生成的答案需要与提出的问题直接相关。
- 上下文相关性(Context Relevance):这个指标要求检索到的上下文信息与查询相关。
十一、框架
LangChain:多功能的LLM应用开发框架
LangChain是一个全面的开发框架,专注于简化LLM应用的开发过程。它提供了一套工具、组件和接口,使得开发者能够轻松地构建复杂的应用程序。LangChain的核心优势在于其“可组合性”,允许开发者通过串联不同的LLMs和其他系统来创建强大的应用。
RAG应用:LangChain通过其chains和agents模块支持RAG应用的开发。这些模块使得开发者可以组织任务顺序、调用特定工具,并持久化内存状态,从而构建出能够记住以前交互的聊天机器人或智能助理。
社区和支持:LangChain拥有一个活跃的社区和开发者群体,这为开发者提供了丰富的资源和支持。
LlamaIndex:专注于数据层的RAG构建工具
LlamaIndex是一个专为构建RAG应用程序而设计的Python库,它专注于数据层,并提供了从基础到高级的检索策略,以帮助开发者在RAG流程中实现精准检索。
RAG应用:LlamaIndex通过其retrievers模块提供了一系列的检索策略,这些策略可以帮助开发者在构建RAG应用时实现高效的信息检索。此外,LlamaIndex支持多种存储后端,使得开发者可以灵活地处理和存储数据。
数据连接器:LlamaIndex的数据连接器(Reader)可以加载不同数据源的数据,并将数据格式化为Document对象,这些对象存储文本和元数据,为RAG应用提供了坚实的数据基础。
参考文章
用通俗易懂的方式讲解:一文讲清大模型 RAG 技术全流程_rag流程-CSDN博客
一文搞懂大模型RAG应用(附实践案例) - 知乎 (zhihu.com)
学习检索增强生成(RAG)技术,看这篇就够了——热门RAG文章摘译(11篇) - 知乎 (zhihu.com)
检索增强生成(RAG)应用的构建:LangChain与LlamaIndex的比较与选择_llamaindex langchain 比较-CSDN博客