当前位置: 首页 > news >正文

【技术点】RAG

本文非自己原创,只是学习过程中资料的总结合并。具体来自于以下链接

https://cloud.google.com/use-cases/retrieval-augmented-generation

一文读懂:大模型RAG(检索增强生成)含高级方法

RAG基础

定义

RAG(检索增强生成)是一种 AI 框架,将传统信息检索系统(例如搜索和数据库)的优势与生成式大语言模型 (LLM) 的功能相结合。通过将您的数据和世界知识与 LLM 语言技能相结合,接地输出更准确、更及时,并且与您的具体需求相关。

RAG 通过几个主要步骤来帮助增强生成式 AI 输出:

  • 检索和预处理:RAG 利用强大的搜索算法查询外部数据,例如网页、知识库和数据库。检索完毕后,相关信息会进行预处理,包括标记化、词干提取和停用词移除
  • 接地输出:经过预处理的检索到的信息接着会无缝整合到预训练的 LLM 中。此整合增强了 LLM 的上下文,使其能够更全面地理解主题。这种增强的上下文使 LLM 能够生成更精确、更翔实且更具吸引力的回答。

RAG检索增强生成(Retrieval Augmented Generation),已经成为当前最火热的LLM应用方案。理解起来不难,就是通过自有垂域数据库检索相关信息,然后合并成为提示模板,给大模型生成漂亮的回答。

业界不知道大模型的基本没有,大家对大模型的能力也有一定的了解,但是当我们将大模型应用于实际业务场景时会发现,通用的基础大模型基本无法满足我们的实际业务需求,主要有以下几方面原因:

知识的局限性:模型自身的知识完全源于它的训练数据,而现有的主流大模型(ChatGPT、文心一言、通义千问…)的训练集基本都是构建于网络公开的数据,对于一些实时性的、非公开的或离线的数据是无法获取到的,这部分知识也就无从具备。

幻觉问题:所有的AI模型的底层原理都是基于数学概率,其模型输出实质上是一系列数值运算,大模型也不例外,所以它有时候会一本正经地胡说八道,尤其是在大模型自身不具备某一方面的知识或不擅长的场景。而这种幻觉问题的区分是比较困难的,因为它要求使用者自身具备相应领域的知识。

数据安全性:对于企业来说,数据安全至关重要,没有企业愿意承担数据泄露的风险,将自身的私域数据上传第三方平台进行训练。这也导致完全依赖通用大模型自身能力的应用方案不得不在数据安全和效果方面进行取舍。

而RAG是解决上述问题的有效方案。
一句话总结:
RAG(中文为检索增强生成) = 检索技术 + LLM提示 。
例如,我们向LLM提问一个问题(answer),RAG从各种数据源检索相关的信息,并将检索到的信息和问题(answer)注入到LLM提示中,LLM最后给出答案。

RAG是2023年基于LLM的系统中最受欢迎的架构。许多产品基于RAG构建,从基于web搜索引擎和LLM的问答服务到使用私有数据的应用程序。

早在2019年,Faiss就实现了基于嵌入的向量搜索技术,现在RAG推动了向量搜索领域的发展。比如chroma、http://weaviate.io和pinecone这些基于开源搜索索引引擎(主要是faiss和nmslib)向量数据库初创公司,最近增加了输入文本的额外存储和其他工具。


图1:RAG工作流程示意图,展示了从用户提问,经过嵌入、检索、注入提示到LLM生成答案的过程。用户输入问题后,先进行嵌入操作将文本转为向量,接着基于相关性查找最相关的内容,再将其注入提示索引,最后由LLM依据这些信息生成答案。

在这个过程中,有两个主要步骤:语义搜索和生成输出。在语义搜索步骤中,我们希望从我们的知识库中找到与我们要回答的查询最相关的部分内容。然后,在生成步骤中,我们将使用这些内容来生成响应。

有两个最著名的基于LLM的管道和应用程序的开源库——LangChain和LlamaIndex,它们在2022年10月和11月创立,并在2023年受到广泛的采用。

本文的目的是参考LlamaIndex实现,来系统讲解关键的高级RAG技术,以方便大家深入研究。
问题在于,大多数教程只会针对个别技术进行详细讲解,而不是整体全面地系统化归纳总结。
另一件事是,LlamaIndex和LangChian都是了不起的开源项目,他们的开发速度非常快,其各自积累文档已经比2016年的机器学习教科书还要厚。

提示技术:检索增强生成
检索增强生成(RAG)
通用语言模型可以通过微调来完成情感分析和命名实体识别等常见任务。这些任务通常不需要额外的背景知识。

对于更复杂且知识密集型的任务,可以构建一个基于语言模型的系统,该系统能够访问外部知识源来完成任务。这使得生成的内容在事实方面更加一致,提高了生成回复的可靠性,并有助于缓解 “幻觉” 问题。

Meta AI的研究人员提出了一种名为检索增强生成(RAG)的方法来处理这类知识密集型任务。RAG将信息检索组件与文本生成模型相结合。RAG可以进行微调,并且其内部知识能够以高效的方式进行修改,而无需重新训练整个模型。

RAG接收一个输入,并根据某个来源(例如维基百科)检索一组相关/辅助文档。这些文档会与原始输入提示串联起来作为上下文,然后输入到文本生成器中,最终生成输出。这使得RAG能够适应事实随时间变化的情况。由于大语言模型(LLMs)的参数化知识是静态的,所以RAG的这种特性非常有用。RAG使语言模型无需重新训练,通过基于检索的生成方式获取最新信息,从而生成可靠的输出。

刘易斯等人(2021年)提出了一种针对RAG的通用微调方法。一个预训练的序列到序列模型被用作参数化记忆,而维基百科的密集向量索引被用作非参数化记忆(通过一个经过神经预训练的检索器来访问)。

然后,查询检索器使用这个查询向量在文档索引中进行搜索。文档索引是表示文档的向量的结构化集合。以使用维基百科作为来源为例,维基百科中的每一篇文章都被转换为一个向量,这些向量存储在索引中。查询检索器根据查询向量与文档向量之间的相似度找到最相关的文档。它可能会使用诸如余弦相似度之类的算法来衡量这种相似度。例如,如果查询向量与关于巴黎的文章的向量具有较高的余弦相似度,那么这些文章就很可能被检索出来。一旦检索到相关文档,它们就会与原始查询结合作为上下文。然后,这个上下文被输入到生成器中。生成器是一个文本生成模型,例如像GPT - 3或GPT - 4这样的预训练语言模型。生成器利用上下文(检索到的文档和原始查询)来生成答案。例如,如果检索到的文档包含巴黎是法国首都的信息,而查询是关于法国的首都,那么生成器可以利用这个上下文生成类似“法国的首都是巴黎。”这样的回复。

在训练过程中,RAG系统可以进行微调。查询编码器、查询检索器和生成器的参数可以进行调整,以提高系统的性能。例如,如果系统经常给出错误答案,微调过程可以调整模型的权重,使检索和生成更加准确。这可以通过反向传播等技术来实现,即计算生成答案与正确答案之间的误差,并用于更新模型参数。

RAG也面临一些挑战。其中一个关键问题是检索的准确性。如果检索器未能找到最相关的文档,那么生成的答案可能不准确或不完整。这可能是由于文档索引的质量不高,或者查询编码器未能准确地将查询转换为合适的向量表示。另一个挑战是处理长文档和大量文档时的效率问题。当文档数量庞大时,检索过程可能会变得非常耗时,影响系统的响应速度。此外,如何有效地将检索到的文档与查询结合,以生成连贯且准确的答案,也是一个需要解决的问题。

在实际应用中,RAG已被广泛用于多种场景。在问答系统中,它可以帮助用户获得更准确、更有依据的答案。例如,在在线客服领域,RAG可以根据用户的问题,从产品文档、常见问题解答库等知识源中检索相关信息,然后生成回复,提高客户服务的质量和效率。在信息检索和文档生成任务中,RAG也能发挥重要作用。比如在新闻写作中,它可以从各种新闻来源中检索相关素材,辅助生成新闻稿件,确保内容的准确性和丰富性。

为何使用 RAG?

RAG有几个优点。它可以通过整合外部知识提高基于语言模型的系统的准确性。它还有助于减少语言模型中常见的“幻觉”问题。由于生成的答案是基于检索到的信息,所以答案在事实上正确的可能性更高。此外,RAG无需重新训练整个模型就能适应新信息。随着新文档被添加到文档索引中,系统可以获取这些新知识并生成更及时的答案。例如,如果发生了一个新事件并记录在相关来源中,RAG系统可以快速检索到这些信息并在生成回答时加以利用,而不需要像传统的语言模型那样,重新进行大规模的训练。

获取最新信息

大型语言模型 (LLM) 的知识来源于预训练数据,这使得它们容易给出过时甚至不准确的答案。而 RAG 技术通过为 LLM 提供实时更新的信息,有效克服了这一局限性。

事实依据

LLM 是生成富有创意且引人入胜的文本的强大工具,但有时它们在事实准确性方面会力不从心。这是因为 LLM 是使用大量文本数据训练的,其中可能包含不准确的信息或存在偏差的信息。

将“事实”作为输入提示的一部分提供给 LLM 可以减轻“生成式 AI 幻觉”。这种方法的关键是确保向 LLM 提供最相关的事实,并确保 LLM 输出完全基于这些事实,同时还要回答用户的问题并遵循系统指令和安全限制。

使用 Gemini 的长上下文窗口 (LCW) 是向 LLM 提供源材料的绝佳方式。如果您需要提供的详细信息超出了 LCW 的限制,或者您需要提高性能,可以使用 RAG 方法来减少 token 的数量,从而节省时间和费用。

使用向量数据库和相关性重新排名算法进行搜索

RAG 通常通过搜索检索事实,而现代搜索引擎现在利用矢量数据库来高效检索相关文档。矢量数据库将文档作为嵌入存储在高维空间中,允许基于语义相似度快速、准确地进行检索。多模态嵌入可用于处理图片、音频和视频等内容,这些媒体嵌入可与文本嵌入或多语言嵌入一起检索。

Vertex AI Search 等高级搜索引擎同时使用语义搜索和关键字搜索(称为混合搜索),并使用重新排名工具对搜索结果进行评分,以确保返回的首页结果具有最高相关性。此外,如果查询内容清晰、简洁且无拼写错误,搜索效果会更好;因此,在查找之前,先进的搜索引擎会转换查询并更正拼写错误。

相关性、准确性和质量

RAG 中的检索机制至关重要。您需要在精选的知识库之上使用最佳的语义搜索,以确保检索到的信息与输入的查询或上下文相关。如果您检索的信息不相关,生成的内容可能接地,但与主题无关或不正确。

RAG 通过微调或提示工程来优化 LLM,使其完全基于检索到的知识来生成文本,从而有助于最大限度地减少所生成文本中的矛盾和不一致之处。这大大提高了生成文本的质量,并改善了用户体验。

Vertex Eval Service 现在可以根据“连贯性”“流畅性”“接地性”“安全性”“指令遵从”“问题回答质量”等指标对 LLM 生成的文本和检索的段落进行评分。这些指标可帮助您衡量从 LLM 中获得的接地文本(对于某些指标,是与您提供的标准答案进行比较)。实施这些评估可为您提供基准测量结果,您可以通过配置搜索引擎、精选来源数据、改进来源布局解析或分块策略,或者在搜索之前优化用户的问题,从而优化 RAG 质量。这种 RAG Ops 指标驱动型方法将帮助您通过不断优化实现高质量的 RAG 和接地输出。

RAG、智能体和聊天机器人

RAG 和接地可集成到任何需要访问新鲜、私有或专业数据的大型语言模型 (LLM) 应用或智能体中。通过访问外部信息,由 RAG 提供支持的聊天机器人和对话代理可以利用外部知识提供更加全面、翔实和上下文内容感知的回答,从而改善整体用户体验。

您使用生成式 AI 构建的内容取决于您的数据和应用场景。RAG 和接地可高效、可伸缩地将您的数据引入 LLM。

 RAG实现过程

目前我们已经知道RAG融合是一种用于(可能)提升RAG应用检索阶段的技术。

下面这张图片展示了大概的工作流程。基本上,主要思路就是利用LLM来生成多个查询,期望能够通过这些查询让问题的各个方面在上下文中显现出来。之后你可以使用生成的查询进行向量搜索(如本系列之前的部分所述),并且基于其在结果集中的显示方式来对内容进行重新排序


图2:RAG融合工作流程,用户查询输入后,先由LLM生成相似查询,再分别进行向量搜索,将搜索结果通过倒数排名融合算法重新排序,最后生成输出。
可以用下面提示词生成额外问题:

You are a helpful assistant that generates multiple search queries based on a single input query.

Generate multiple search queries related to: {USER_INPUT}
OUTPUT (4 queries):
```
You are a helpful assistant that generates multiple search queries based on a single input query.

Generate multiple search queries related to: {USER_INPUT}
OUTPUT (4 queries):
```
Playground
Chat
Your presets Save 0 View code Share
Model
gpt-35-turbo
Temperature
1
ASSISTANT
1. Benefits of serverless computing
Maximum length
256
2. Examples of serverless computing platorms
3. Serveriess computing vs traditional servers
Stop sequences
4. How does serverless computing work?
Enter sequence and press Tab
Add message
Top P
1.0
Frequency penalty
Presence penalty
知乎
ChatGPT and OpenAI are not used to train our models, Learn more
Ⓡ
SYSTEM
You are a helpful assistant that generates multiple search queries based on a singe input query.
USER
Generate multiple search queries related to: what is serveriess computing?
OUTPUT (4 queries):

 如上所述,LLM能够生成覆盖原问题多个方面的查询。这样可以帮助我们在数据库中找到包含各个相关方面的信息,从而潜在地提高从RAG应用得到的结果。

 RAG架构

RAG的架构如图中所示,简单来讲,RAG就是通过检索获取相关的知识并将其融入Prompt,让大模型能够参考相应的知识从而给出合理回答。因此,可以将RAG的核心理解为“检索+生成”,前者主要是利用向量数据库的高效存储和检索能力,召回目标知识;后者则是利用大模型和Prompt工程,将召回的知识合理利用,生成目标答案。


图3:RAG架构图,展示了数据准备阶段(数据提取、文本分割、向量化、数据入库)和应用阶段(用户提问、数据检索、注入Prompt、LLM生成答案)的流程。

完整的RAG应用流程主要包含两个阶段:
数据准备阶段:数据提取——>文本分割——>向量化(embedding)——>数据入库
应用阶段:用户提问——>数据检索(召回)——>注入Prompt——>LLM生成答案

下面我们详细介绍一下各环节的技术细节和注意事项:
 数据准备阶段
数据准备一般是一个离线的过程,主要是将私域数据向量化后构建索引并存入数据库的过程。主要包括:数据提取、文本分割、向量化、数据入库等环节。


图4:数据准备阶段流程,从多种格式的私域数据开始,依次经过数据提取、文本分割、向量化,最终将数据存入向量数据库。

数据提取

数据加载:包括多格式数据加载、不同数据源获取等,根据数据自身情况,将数据处理为同一个范式。
数据处理:包括数据过滤、压缩、格式化等。
元数据获取:提取数据中关键信息,例如文件名、Title、时间等 。

文本分割

文本分割主要考虑两个因素:1)embedding模型的Tokens限制情况;2)语义完整性对整体的检索效果的影响。一些常见的文本分割方式如下:
句分割:以”句”的粒度进行切分,保留一个句子的完整语义。常见切分符包括:句号、感叹号、问号、换行符等。
固定长度分割:根据embedding模型的token长度限制,将文本分割为固定长度(例如256/512个tokens),这种切分方式会损失很多语义信息,一般通过在头尾增加一定冗余量来缓解。

向量化(embedding)

向量化是一个将文本数据转化为向量矩阵的过程,该过程会直接影响到后续检索的效果。目前常见的embedding模型如表中所示,这些embedding模型基本能满足大部分需求,但对于特殊场景(例如涉及一些罕见专有词或字等)或者想进一步优化效果,则可以选择开源Embedding模型微调或直接训练适合自己场景的Embedding模型。
|模型名称|描述|获取地址|

|ChatGPT-Embedding|ChatGPT-Embedding由OpenAI公司提供,以接口形式调用|platform.openai.com/doc|
|ERNIE-Embedding V1|ERNIE-Embedding V1由百度公司提供,依赖于文心大模型能力,以接口形式调用|cloud.baidu.com/doc/WEN|
|M3E|M3E是一款功能强大的开源Embedding模型,包含m3e-small、m3e-base、m3e-large等多个版本,支持微调和本地部署|huggingface.co/moka-ai/|
|BGE|BGE由北京智源人工智能研究院发布,同样是一款功能强大的开源Embedding模型,包含了支持中文和英文的多个版本,同样支持微调和本地部署|huggingface.co/BAAI/bge|

数据入库

数据向量化后构建索引,并写入数据库的过程可以概述为数据入库过程,适用于RAG场景的数据库包括:FAISS、Chromadb、ES、milvus等。一般可以根据业务场景、硬件、性能需求等多因素综合考虑,选择合适的数据库。

 应用阶段

在应用阶段,可以根据用户的提问,通过高效的检索方法,召回与提问最相关的知识,并融入Prompt;大模型参考当前提问和相关知识,生成相应的答案。关键环节包括:数据检索、注入Prompt等。

图5:应用阶段流程,从用户提问出发,经过数据检索、注入Prompt,最终由LLM生成答案。

数据检索

常见的数据检索方法包括:相似性检索、全文检索等,根据检索效果,一般可以选择多种检索方式融合,提升召回率。
相似性检索:即计算查询向量与所有存储向量的相似性得分,返回得分高的记录。常见的相似性计算方法包括:余弦相似性、欧氏距离、曼哈顿距离等。
全文检索:全文检索是一种比较经典的检索方式,在数据存入时,通过关键词构建倒排索引;在检索时,通过关键词进行全文检索,找到对应的记录。


图6:注入Prompt流程,用户的知识经过整理形成Prompt,输入到大语言模型中,大语言模型据此生成答案。

Prompt作为大模型的直接输入,是影响模型输出准确率的关键因素之一。在RAG场景中,Prompt一般包括任务描述、背景知识(检索得到)、任务指令(一般是用户提问)等,根据任务场景和大模型性能,也可以在Prompt中适当加入其他指令优化大模型的输出。一个简单知识问答场景的Prompt如下所示:

【任务描述】
假如你是一个专业的客服机器人,请参考【背景知识】,回
【背景知识】
{content} // 数据检索得到的相关文本
【问题】
石头扫地机器人P10的续航时间是多久?

Prompt的设计只有方法、没有语法,比较依赖于个人经验,在实际应用过程中,往往需要根据大模型的实际输出进行针对性的Prompt调优。

 原始RAG

本文RAG管道从一个文本文档语料库开始,直接跳过如何通过数据加载器从Youtube等数据源获取步骤。


图7:原始RAG流程,从数据库出发,经过向量存储索引、查询嵌入模型,最终由LLM生成答案

标准的RAG流程简介:将文本分块,然后使用一些Transformer Encoder模型将这些块嵌入到向量中,将所有向量放入索引中,最后创建一个LLM提示,告诉模型根据我们在搜索步骤中找到的上下文回答用户的查询。

在运行时,通过使用同一编码器模型对用户的查询进行向量化,然后搜索该查询向量的索引,找到top-k个结果,从我们的数据库中检索相应的文本块,并将它们作为上下文输入到LLM提示中。
提示与下边内容类似:

def question_answering(context, query):
    prompt = f"""
                Give the answer to the user query delimited by triple backticks ```{query}```\
                using the information given in context delimited by triple backticks ```{context}```.\
                If there is no relevant information in the provided context, try to answer yourself, 
                but tell user that you did not have any relevant context to base your answer on.
                Be concise and output the answer of size less than 80 tokens.
                """

    response = get_completion(instruction, prompt, model="gpt-3.5-turbo")
    answer = response.choices[0].message["content"]
  return answer

提示工程是提升RAG流程性能的一种简便有效的方法。可以查阅OpenAI提供的详尽的提示工程指南 。

虽然OpenAI是LLM提供商的领头羊,但还有其他不少选择,例如deepseek,qwen,Anthropic的Claude,Mistral的小型但功能强大的模型Mixtral,Microsoft的Phi-2,以及如Llama2,OpenLLaMA ,Falcon等众多开源模型,可以选择最合适的,作为RAG管道大脑。

 高级RAG


现在我们深入讲解高级RAG技术。包括所涉及的核心步骤和算法的方案,但是省略了一些逻辑循环和复杂的多步代理行为,以保持方案的可读性。


图8:高级RAG技术架构图,展示了从查询开始,经过查询转换、查询路由、检索上下文、检索融合、重排、后处理,最终由LLM生成答案的过程。

上图中绿色部分是我们接下来详细探讨的核心RAG技术。一张图并不能全部展示所有的高级RAG技术,比如我们这里省略了上文扩展技术。

1. 分块 (Chunking) & 向量化 (Vectorisation)

首先我们需要为文档内容创建向量索引,然后在运行时搜索与查询向量余弦距离最近的向量索引,这样就可以找到与查询内容最接近语义的文档。
    分块 (Chunking):Transformer模型具有固定的输入序列长度,即使输入上下文窗口很大,一个句子或几个句子的向量也比几页文本的向量更能代表其语义含义,因此对数据进行分块——将初始文档拆分为一定大小的块,而不会失去其含义。有许多文本拆分器实现能够完成此任务。块的大小是一个需要重点考虑的问题。块的大小取决于所使用的嵌入模型以及模型需要使用token的容量。如基于BERT的句子转换器,最多需要512个token,OpenAI ada-002能够处理更长的序列,如8191个token,但这里的折衷是LLM有足够的上下文来推理,而不是足够具体的文本嵌入,以便有效地执行搜索。有一项关于块大小选择的研究 。在LlamaIndex中,NodeParser类很好支持解决这个问题,其中包含一些高级选项,例如定义自己的文本拆分器、元数据、节点/上文介绍了RAG的基本概念、架构、实现过程,以及原始RAG和高级RAG技术,下面将接着上文继续梳理剩余内容:
    向量化 (Vectorisation):下一步是选择一个搜索优化的模型来嵌入块。有很多选项,比如bge-large或E5嵌入系列。只需查看MTEB排行榜以获取最新更新即可。有关分块和向量化步骤的end2end实现,请查看LlamaIndex中完整数据摄取管道的示例。

2. 搜索索引

    向量存储索引:RAG管道的关键部分是搜索索引,它存储了在上一步中获得的向量化内容。最原始的实现是使用平面索引 —— 查询向量和所有块向量之间的暴力计算距离。为了实现1w+元素规模的高效检索,搜索索引应该采用向量索引,比如faiss、nmslib以及annoy。这些工具基于近似最近邻居算法,如聚类、树结构或HNSW算法。此外,还有一些托管解决方案,如OpenSearch、ElasticSearch以及向量数据库,它们自动处理上面提到的数据摄取流程,例如Pinecone、Weaviate和Chroma。取决于索引选择、数据和搜索需求,还可以存储元数据,并使用元数据过滤器来按照日期或来源等条件进行信息检索。LlamaIndex支持多种向量存储索引,同时也兼容其他简单的索引类型,如列表索引、树索引和关键词表索引。
    分层索引:在大型数据库的情况下,一个有效的方法是创建两个索引——一个由摘要组成,另一个由文档块组成,然后分两步进行搜索,首先通过摘要过滤掉相关文档,然后只在这个相关组内搜索。
    假设性问题和HyDE:另一种方法是让LLM为每个块生成一个问题,并将这些问题嵌入到向量中,在运行时对这个问题向量的索引执行查询搜索(将块向量替换为索引中的问题向量),然后在检索后路由到原始文本块并将它们作为LLM获取答案的上下文发送。这种方法提高了搜索质量,因为与实际块相比,查询和假设问题之间的语义相似性更高。还有一种叫做HyDE的反向逻辑方法——你要求LLM在给定查询的情况下生成一个假设的响应,然后将其向量与查询向量一起使用来提高搜索质量。
    内容增强:这里的内容是将相关的上下文组合起来供LLM推理,以检索较小的块以获得更好的搜索质量。
        语句窗口检索器:在此方案中,文档中的每个句子都是单独嵌入的,这为上下文余弦距离搜索提供了极大的查询准确性。为了在获取最相关的单个句子后更好地推理找到的上下文,将上下文窗口扩展为检索到的句子前后的k个句子,然后将这个扩展的上下文发送到LLM。
        自动合并检索器(或父文档检索器):思路与语句窗口检索器非常相似——搜索更精细的信息片段,然后在在LLM进行推理之前扩展上下文窗口。文档被拆分为较小的子块,这些子块和较大的父块有引用关系。首先在检索过程中获取较小的块,然后如果前k个检索到的块中有超过n个块链接到同一个父节点(较大的块),将这个父节点替换成给LLM的上下文——工作原理类似于自动将一些检索到的块合并到一个更大的父块中,因此得名。请注意,搜索仅在子节点索引中执行。
    融合检索或混合搜索:结合传统的基于关键字的搜索(稀疏检索算法,如tf - idf或搜索行业标准BM25 )和现代语义或向量搜索,并将其结果组合在一个检索结果中。这里唯一的关键是如何组合不同相似度分数的检索结果。这个问题通常通过Reciprocal Rank Fusion算法来解决,该算法能有效地对检索结果进行重新排序,以得到最终的输出结果。在LangChain中,这种方法是通过Ensemble Retriever来实现的,该类将你定义的多个检索器结合起来,比如一个基于faiss的向量索引和一个基于BM25的检索器,并利用RRF算法进行结果的重排。在LlamaIndex中,这一过程也是以类似的方式实现的。混合或融合搜索通常能提供更优秀的检索结果,因为它结合了两种互补的搜索算法——既考虑了查询和存储文档之间的语义相似性,也考虑了关键词匹配。


3. 重排(reranking)和过滤(filtering)

使用上述任何算法获得了检索结果,现在是时候通过过滤、重排或一些转换来完善它们了。在LlamaIndex中,有各种可用的后处理器,根据相似性分数、关键字、元数据过滤掉结果,或使用其他模型(如LLM)、sentence - transformer交叉编码器,Cohere重新排名接口或者基于元数据重排它们。这是将检索到的上下文提供给LLM以获得结果答案之前的最后一步。

4. 查询转换

查询转换是一系列技术,使用LLM作为推理引擎来修改用户输入以提高检索质量。有很多技术实现可供选择。
    - 对于复杂的查询,大语言模型能够将其拆分为多个子查询。比如,当你问:“在Github上,Langchain和LlamaIndex这两个框架哪个更受欢迎?”,一般不太可能直接在语料库找到它们的比较,所以将这个问题分解为两个更简单、具体的合理的子查询:“Langchain在Github上有多少星?”“Llamaindex在Github上有多少星?”。这些子查询会并行执行,检索到的信息随后被汇总到一个LLM提示词中。这两个功能分别在Langchain中以多查询检索器的形式和在Llamaindex中以子问题查询引擎的形式实现。
    - Step - back prompting使用LLM生成一个更通用的查询,以此检索到更通用或高层次的上下文,用于为原始查询提供答案。同时执行原始查询的检索,并在最终答案生成步骤中将两个上下文发送到LLM。这是LangChain的一个示例实现。
    - 查询重写使用LLM来重新表述初始查询,以改进检索。LangChain和LlamaIndex都有实现,个人感觉LlamaIndex解决方案在这里更强大。

5. 聊天引擎

关于构建一个可以多次用于单个查询的完美RAG系统的下一件工作是聊天逻辑,就像在LLM之前时代的经典聊天机器人中一样考虑到对话上下文。这是支持后续问题、代词指代或与上一个对话上下文相关的任意用户命令所必需的。它是通过查询压缩技术解决的,将聊天上下文与用户查询一起考虑在内。
    - 一个流行且相对简单的ContextChatEngine,首先检索与用户查询相关的上下文,然后将其与内存缓冲区中的聊天记录一起发送到LLM,以便LLM在生成下一个答案时了解上一个上下文。
    - 更复杂的情况是CondensePlusContextMode——在每次交互中,聊天记录和最后一条消息被压缩到一个新的查询中,然后这个查询进入索引,检索到的上下文与原始用户消息一起传递给LLM以生成答案。
    - LlamaIndex中还支持基于OpenAI智能体的聊天引擎,提供更灵活的聊天模式,Langchain还支持OpenAI功能API。

6. 查询路由

查询路由是LLM驱动的决策步骤,决定在给定用户查询的情况下下一步该做什么——选项通常是总结、对某些数据索引执行搜索或尝试许多不同的路由,然后将它们的输出综合到一个答案中。查询路由器还用于选择数据存储位置来处理用户查询。这些数据存储位置可能是多样的,比如传统的向量存储、图形数据库或关系型数据库,或者是不同层级的索引系统。在处理多文档存储时,通常会用到摘要索引和文档块向量索引这两种不同的索引。定义查询路由器包括设置它可以做出的选择。选择特定路由的过程是通过大语言模型调用来实现的,其结果按照预定义的格式返回,以路由查询指定的索引。如果是涉及到关联操作,这些查询还可能被发送到子链或其他智能体。LlamaIndex和LangChain都提供了对查询路由器的支持。

7. 智能体(Agent)

智能体(Langchain和LlamaIndex均支持)几乎从第一个LLM API发布开始就已经存在——这个思路是为一个具备推理能力的LLM提供一套工具和一个要完成的任务。这些工具可能包括一些确定性功能,如任何代码函数或外部API,甚至是其他智能体。OpenAI助手基本上整合了开源LLM周边工具——聊天记录、知识存储、文档上传界面。最重要的是函数调用API, 其提供了将自然语言转换为对外部工具或数据库查询的API调用的功能。
    - 在LlamaIndex中,有一个OpenAIAgent类将这种高级逻辑与ChatEngine和QueryEngine类结合在一起,提供基于知识和上下文感知的聊天,以及在一个对话轮次中调用多个OpenAI函数的能力,这真正实现了智能代理行为。
    - 多文档智能体的方案——这是一个非常复杂的配置,涉及到在每个文档上初始化一个Agent(OpenAIAgent),该智能体能进行文档摘要制作和传统问答机制的操作,还有一个顶层智能体,负责将查询分配到各个文档智能体,并综合形成最终的答案。每个文档智能体都有两个工具:向量存储索引和摘要索引,它根据路由查询决定使用哪一个。对于顶级智能体来说,所有文档智能体都是其工具。该方案展示了一种高级RAG架构,其中每个智能体都做路由许多决策。这种方法的好处是能够比较不同的解决方案或实体在不同的文档及其摘要中描述,以及经典的单个文档摘要和QA机制——这基本上涵盖了最常见的与文档集合聊天的用例。但由于需要在智能体内部的大语言模型之间进行多次往返迭代,其运行速度较慢。对于大型的多文档存储,建议考虑对此方案进行简化,以便实现扩展。

8. 响应合成

这是任何RAG管道的最后一步——根据检索的所有上下文和初始用户查询生成答案。
    - 最简单的方法是将所有获取的上下文(高于某个相关性阈值)与查询一起连接并提供给LLM。
    - 还有其他更复杂的选项,涉及多个LLM调用,以优化检索到的上下文并生成更好的答案,比如通过将检索到的上下文逐块发送到LLM来优化答案;概括检索到的上下文,以适应提示;根据不同的上下文块生成多个答案,然后将它们连接或概括起来。

9. RAG融合

RAG融合有权衡取舍,需要清楚它们,以便为具体情境做出最好的决定。

    优点:提供多样化的上下文;有额外的控制层面;能自动校正;在成本方面,如果每10次查询节省一次后续问题,在成本上可能领先。
    缺点:会增加延迟;自动纠错可能失效;如果对应用程序的整体效益贡献不大,可能花费更多但收益有限。
    适用场景与不适用场景:应用程序的内容主要基于常见概念时更可能获益;内容包含大量内部行话或与知名品牌重复的词语时,可能需要调整提示或避免使用。如果微调提示没用,还可以使用语义搜索找到相关的查询、通过少量示例学习实现上下文理解、微调小型LLM等技巧。

10. 编码器和LLM微调

    编码器微调:对bge-large-en-v1.5编码器进行微调,发现对于检索效果提升影响有限,因为针对搜索优化的最新Transformer编码器已经非常高效。
    排序器微调:如果不完全信任基础编码器,可以使用交叉编码器对检索到的结果进行重排。把查询和每个前k个检索到的文本块一起送入交叉编码器,中间用SEP (分隔符) Token分隔,并对它进行微调,使其对相关的文本块输出1,对不相关的输出0。
    LLM微调:OpenAI开始提供LLM微调API,LlamaIndex有关于在RAG设置中微调GPT-3.5-turbo的教程。RAG管道评估的ragas框架显示,微调后的GPT 3.5-turbo模型比原始模型更好地利用了提供的上下文来生成答案。Meta AI Research的RA-DIT技术同时调整LLM和Retriever,用于微调OpenAI LLM和Llama2开源模型,在知识密集型任务和常识推理任务指标上有提升。

11. 评估

RAG系统性能评估有多个框架,包含多项独立指标,如总体答案相关性、答案基础性、忠实度和检索到的上下文相关性。
    - Ragas使用真实性和答案相关性评价生成答案的质量,用经典的上下文精准度和召回率评估检索性能。
    - LlamaIndex和评估框架Truelens等提出RAG三元组评估模式,分别评估检索内容相关性、答案的基础性和答案对问题的相关性。最关键且可控的指标是检索内容的相关性。
    - 简单有效的检索器评估管道可用于编码器微调部分。更高级的方法还考虑平均倒数排名等搜索引擎评估指标和生成答案的质量指标。
    - LangChain的LangSmith框架可实现自定义评估器,监控RAG管道运行。使用LlamaIndex构建时,可以尝试rag_evaluator llama pack。

总结

本文概述了RAG的核心算法,并举例说明其中的一些方法。RAG融合能提高语义搜索效率,但需要注意权衡。除了答案相关性和忠实度,RAG系统的主要生产挑战是速度。小参数规模的LLM可能有光明的未来。

相关文章:

  • deepseek使用记录21——知识焦虑
  • C++基础系列【18】引用和指针的区别
  • 审批流AntV框架蚂蚁数据可视化X6饼图(注释详尽)
  • npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。
  • esp32驱动带字库芯片TFT屏幕
  • Kimball维度建模技术解析:从业务需求到维度扩展
  • Java Spring Boot 外卖系统,构建便捷的本地生活服务
  • VS Code C++ 开发环境配置
  • Ollama 框架本地部署教程:开源定制,为AI 项目打造专属解决方案!
  • 最新的PyCharm及AI助手的安装和试用
  • H5DS编辑器是如何让企业快速构建动态页面
  • 一文读懂深度学习中的损失函数quantifying loss —— 作用、分类和示例代码
  • 权限管理Vue实现
  • CHAPTER 6 Object References, Mutability, and Recycling
  • 超越AI边界:智慧法务如何破解法律行业的“最后一公里“难题
  • ReconDreamer:通过在线恢复构建驾驶场景重建的世界模型
  • golang进阶知识专项-理解值传递
  • 记录一次Spring事务失效导致的生产问题
  • 第七节:基于Winform框架的串口助手小项目---协议解析《C#编程》
  • DeepSeek开源周:五大创新项目详解
  • 用旧电脑做网站/建立网站用什么软件
  • 网站备案要什么/18款禁用软件黄app免费
  • html网站地图怎么做/建网站seo
  • 网站优化公司方案/网络推广公司
  • 苏州高端网站制作/138ip查询网域名解析
  • 附近哪里有建筑模板卖/2020站群seo系统