分享
图解高级RAG技术
输入“/”快速插入内容
图解高级RAG技术
用户7742
用户7742
2024年6月20日修改
本文为IVAN ILIN撰写的《Advanced RAG Techniques: an Illustrated Overview》一文的中文精校解读
原文地址:
Advanced RAG Techniques: an Illustrated Overview
本文全面研究了高级 RAG 及其算法,并系统化讲述。由于本文的目的是科普当前可用的 RAG 算法和技术,所以不会深入到代码细节。但是文中链接了相关的文档和教程,推荐大家详细阅读。
引言
一句话总结:
RAG(中文为检索增强生成) = 检索技术 + LLM 提示
。
例如,我们向 LLM 提问一个问题(answer),RAG 从各种数据源检索相关的信息,并将检索到的信息和问题(answer)注入到 LLM 提示中,LLM 最后给出答案。
RAG 是2023年基于 LLM 的系统中最受欢迎的架构。许多产品基于 RAG 构建,从基于 web 搜索引擎和 LLM 的问答服务到使用私有数据的chat应用程序。
尽管在2019年,
Faiss
就实现了基于嵌入的向量搜索技术,但是 RAG 推动了
向量搜索
领域的发展。比如
chroma
、
weaviate.io
和
pinecone
这些基于开源搜索索引引擎(主要是 faiss 和
nmslib
)向量数据库初创公司,最近增加了输入文本的额外存储和其他工具。
有两个最著名的基于 LLM 的管道和应用程序的开源库——
LangChain
和
LlamaIndex
,受 ChatGPT 发布的启发,它们在 2022 年 10 月和 11 月创立,并在 2023 年获得大量采用。
本文的目的是参考 LlamaIndex实现,来系统讲解关键的高级 RAG 技术,以方便大家深入研究。
问题在于,大多数教程只会针对个别技术进行详细讲解,而不是整体全面地系统化归纳总结。
另一件事是,LlamaIndex 和 LangChian 都是了不起的开源项目,他们的开发速度非常快,以至于他们的文档已经比2016年的机器学习教科书还要厚。
原始 RAG
本文 RAG 管道从一个文本文档语料库开始,直接跳过如何通过数据加载器从Youtube等数据源获取步骤。
标准的 RAG 流程简介:将文本分块,然后使用一些 Transformer Encoder 模型将这些块嵌入到向量中,将所有向量放入索引中,最后创建一个 LLM 提示,告诉模型根据我们在搜索步骤中找到的上下文回答用户的查询。
在运行时,我们使用同一编码器模型对用户的查询进行向量化,然后搜索该查询向量的索引,找到 top-k 个结果,从我们的数据库中检索相应的文本块,并将它们作为上下文输入到 LLM 提示中。
提示与下边内容类似:
提示工程
是提升 RAG 流程性能的一种简便有效的方法。可以查阅 OpenAI 提供的详尽的
提示工程指南
。
虽然 OpenAI 是 LLM 提供商的领头羊,但还有其他不少选择,例如 Anthropic 的
Claude
,Mistral 的小型但功能强大的模型
Mixtral
,Microsoft 的
Phi-2
,以及如
Llama2
,
OpenLLaMA
,
Falcon
等众多开源模型,都可以供你选择最合适的,作为 RAG 管道大脑。
高级 RAG
现在我们深入讲解高级 RAG 技术。包括所涉及的核心步骤和算法的方案,但是省略了一些逻辑循环和复杂的多步代理行为,以保持方案的可读性。
上图中绿色部分是我们接下来详细探讨的核心 RAG 技术。一张图并不能全部展示所有的高级 RAG 技术,比如我们这里省略了上文扩展技术。
1.
分块 (Chunking) & 向量化 (Vectorisation)
首先我们需要为文档内容创建向量索引,然后在运行时搜索与查询向量余弦距离最近的向量索引,这样就可以找到与查询内容最接近语义的文档。
1.1 分块 (Chunking)
Transformer 模型具有固定的输入序列长度,即使输入上下文窗口很大,一个句子或几个句子的向量也比几页文本的向量更能代表其语义含义,因此对数据进行分块—— 将初始文档拆分为一定大小的块,而不会失去其含义。有许多文本拆分器实现能够完成此任务。
块的大小是一个需要重点考虑的问题。块的大小取决于所使用的嵌入模型以及模型需要使用 token 的容量。如基于 BERT 的句子转换器,最多需要 512 个 token,OpenAI ada-002 能够处理更长的序列,如 8191 个 token,但这里的折衷是 LLM 有足够的上下文来推理,而不是足够具体的文本嵌入,以便有效地执行搜索。
有一项关于块大小选择的研究
。在 LlamaIndex 中,
NodeParser 类
很好支持解决这个问题,其中包含一些高级选项,例如定义自己的文本拆分器、元数据、节点/块关系等。
1.2 向量化 (Vectorisation)
下一步是选择一个
搜索优化的模型来嵌入我们的块
。有很多选项,比如
bge-large
或
E5 嵌入系列
。只需查看
MTEB
排行榜以获取最新更新即可。
有关分块和向量化步骤的 end2end 实现,请查看 LlamaIndex 中完整数据摄取管道的
示例
。