一句话:RAG 是通过外部的知识库增强语言大模型的生成能力的技术
RAG 架构演进
Retrieval-augmented generation
- RAG 能够低成本地拓展模型本身的能力
- 支持实时的数据更新,增强了模型回答的时效性
- 答案可溯源可解释性强
- 回答的质量依赖与用于增强检索的语料和 RAG 系统的设计
- RAG 耗时在一个回答中占比较大,可能对耗时敏感业务产生性能瓶颈
从当前 RAG 的问题出发我们推测接下来对 RAG 的优化主要集中在
- 提升 RAG 运行速度,响应延迟优化 → 依赖于 embedding 的优化 & AI 专用协议的发展
- 提升 RAG 检索能力,统计用户数据,验证 RAG 效果 → 依赖于 RAG 系统的设计 (较为前沿)
Navie RAG
离线索引构建
- 整合和处理数据源 : 分片,语义分块等
- 通过 Embedding 模型向量化
- 数据存储在向量数据库中 (Faiss 等)
在线检索
- 将用户 Prompt 通过 Embeddings 向量化
- 通过计算向量相似度找出有用的文章 (TOPK)
- 文章 + 用户问题 = 最终 Prompt
Advanced RAG
在 Navie RAG 的基础上, query 多加一步 pre-Retrieval , Retrieval 后再加一步 post-Retrieval
Pre-Retrieval
Query 增强:分解,转换(模糊 → 清晰) ,增强(拆解子问题)
索引数据增加: 清晰,分块,Embedding 模型针对性优化
Post-Retrieval
对 Retrieval 结果做二次加工(排序 & 压缩)
Modular RAG
到 advanced RAG 为止,其线性流程可以简化为下面这样 👇
这个流程看起来没什么问题,但是他太简单了,灵活性不够,对于一些可能需要深度搜索或者需要创造性回答的问题表现不够好。
Modular RAG 就是为了解决这个问题出现的。上述的每一个步骤都视为一个模块。通过不同的编排方式,形成 RAG FLow,进而提升 RAG 的性能表现。
-
线性编排
-
条件编排
-
分支(并行)编排
-
循环编排
- 循环检索 : 在检索和生成之间交替进行 → 适合开放性问题(多意图混合,模糊查询)
- 递归检索 :不断的将子问题拆分为子问题,最后逐层整合 ( 适合深度复杂的推理问题)
更重要的是,这每一个关键的模块都被封装成接口,调用方可以根据自己的需求自定义,大大拓展了 RAG 能力的边界。
使用哪一种编排方式,如何编排,可以使用 LLM Agent 自动判断 ( Adaptive retrieval ) 。
条件编排
分支编排
循环编排
Agentic RAG
顾名思义,将 LLM Agent 作为 RAG 编排和控制的大脑。
- 是一个 Agent (signel Agent)
- 每一个模块一个 Agent (Multi-Agent)
- 分层的 Agent (Hierarchical Agent)
- 更多
什么是 Embedding
Embedding 是 RAG 的核心组件,要讲 RAG Retrieval-Augmented Generation 检索增强生成,就不得不先讲 Embedding
一句话,Embedding 就是将文本等实体,转换成浮点向量用于相似性计算的技术
Embedding 位于 Transformer 的输入层,直接接收原始文本的 token 序列,通过查表将其转化为连续的向量表示。比如下面这个例子,将文本转化为浮点向量后,相似性越高的内容之间的举例越近,比如这里的汽车和单车,而枕头由于关联性较低,则离得较远。
本质上,Embedding 做的其实是 token 的降维。具体一点是将高维稀疏的 token 转换成低维稠密的向量,降低计算的复杂度。
embedding 层的输出(带有位置编码的词向量)直接作为 Transformer (Encoder/Decoder)的输入,供自注意力机制下一步处理。
除了对文本做 Embedding,还可以
- 图片 Embedding 。卷积神经网络(CNN)做特征提取,得到向量
- 音频 Embedding 。将音频转化为有意义的向量数据
- 实体 Embedding 。这里的实体可以是一个句子,一个文档,甚至是一个知识库。
使用 Embedding 增强 LLM 能力的基本步骤(以 OpenAI 为例)
- 搜集数据:准备知识库
- 数据切块:将数据分为切块
- 数据嵌入:通过 OpenAI API 对切块进行 Embedding
- 向量存储:将 SDK 计算出的数据集使用向量数据库或者其他方法存储