大模型也能开卷答题 - RAG

0 阅读4分钟

一句话:RAG 是通过外部的知识库增强语言大模型的生成能力的技术

RAG 架构演进

Retrieval-augmented generation

  • RAG 能够低成本地拓展模型本身的能力
  • 支持实时的数据更新,增强了模型回答的时效性
  • 答案可溯源可解释性强
  • 回答的质量依赖与用于增强检索的语料和 RAG 系统的设计
  • RAG 耗时在一个回答中占比较大,可能对耗时敏感业务产生性能瓶颈

从当前 RAG 的问题出发我们推测接下来对 RAG 的优化主要集中在

  • 提升 RAG 运行速度,响应延迟优化 → 依赖于 embedding 的优化 & AI 专用协议的发展
  • 提升 RAG 检索能力,统计用户数据,验证 RAG 效果 → 依赖于 RAG 系统的设计 (较为前沿)

Navie RAG

离线索引构建

  1. 整合和处理数据源 : 分片,语义分块等
  2. 通过 Embedding 模型向量化
  3. 数据存储在向量数据库中 (Faiss 等)

在线检索

  1. 将用户 Prompt 通过 Embeddings 向量化
  2. 通过计算向量相似度找出有用的文章 (TOPK)
  3. 文章 + 用户问题 = 最终 Prompt

image.png

Advanced RAG

在 Navie RAG 的基础上, query 多加一步 pre-Retrieval , Retrieval 后再加一步 post-Retrieval

Pre-Retrieval

Query 增强:分解,转换(模糊 → 清晰) ,增强(拆解子问题)

索引数据增加: 清晰,分块,Embedding 模型针对性优化

Post-Retrieval

对 Retrieval 结果做二次加工(排序 & 压缩)

image.png

Modular RAG

到 advanced RAG 为止,其线性流程可以简化为下面这样 👇

image.png

这个流程看起来没什么问题,但是他太简单了,灵活性不够,对于一些可能需要深度搜索或者需要创造性回答的问题表现不够好。

Modular RAG 就是为了解决这个问题出现的。上述的每一个步骤都视为一个模块。通过不同的编排方式,形成 RAG FLow,进而提升 RAG 的性能表现。

  • 线性编排

  • 条件编排

  • 分支(并行)编排

  • 循环编排

    • 循环检索 : 在检索和生成之间交替进行 → 适合开放性问题(多意图混合,模糊查询)
    • 递归检索 :不断的将子问题拆分为子问题,最后逐层整合 ( 适合深度复杂的推理问题)

更重要的是,这每一个关键的模块都被封装成接口,调用方可以根据自己的需求自定义,大大拓展了 RAG 能力的边界。

使用哪一种编排方式,如何编排,可以使用 LLM Agent 自动判断 ( Adaptive retrieval ) 。

条件编排

image.png 分支编排

image.png 循环编排

image.png

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 序列,通过查表将其转化为连续的向量表示。比如下面这个例子,将文本转化为浮点向量后,相似性越高的内容之间的举例越近,比如这里的汽车和单车,而枕头由于关联性较低,则离得较远。

image.png 本质上,Embedding 做的其实是 token 的降维。具体一点是将高维稀疏的 token 转换成低维稠密的向量,降低计算的复杂度。

embedding 层的输出(带有位置编码的词向量)直接作为 Transformer (Encoder/Decoder)的输入,供自注意力机制下一步处理。

除了对文本做 Embedding,还可以

  • 图片 Embedding 。卷积神经网络(CNN)做特征提取,得到向量
  • 音频 Embedding 。将音频转化为有意义的向量数据
  • 实体 Embedding 。这里的实体可以是一个句子,一个文档,甚至是一个知识库。

使用 Embedding 增强 LLM 能力的基本步骤(以 OpenAI 为例)

  1. 搜集数据:准备知识库
  2. 数据切块:将数据分为切块
  3. 数据嵌入:通过 OpenAI API 对切块进行 Embedding
  4. 向量存储:将 SDK 计算出的数据集使用向量数据库或者其他方法存储