检索增强的生成模型(RAG)

466 阅读5分钟

检索增强的生成模型(RAG)

前言

借鉴:

  1. 一文搞懂大模型RAG应用(附实践案例)
  2. 一文带你了解大模型的RAG(检索增强生成) | 概念理论介绍+ 代码实操(含源码)
  3. AGI|一篇小白都能看懂的RAG入门介绍!
  4. mp.weixin.qq.com/s?__biz=Mzk…)
  5. 一文搞懂大模型RAG应用(附实践案例)
  6. RAG性能评估:从方案到实践

RAG的概念

RAG(Retrieval Augmented Generation):从已有的数据库中通过检索信息的方法来增强生成模型的能力。

这个数据库指代的范围是广义的,不仅仅是关系型或非关系型数据库,还可以是外部知识图谱,外部应用或者搜索引擎。

如果说原本与大模型交互的方式是直接对LLM进行QA问答,那加入了RAG技术后我们其实是先在知识库中检索出了与问题相关的内容,然后将这些内容与问题一并提交给LLM,我们需要的是让LLM根据我们给出的内容来对问题做出回答,如下图所示。

类似开卷考试,让LLM先翻书,再回答问题。 img

LLM目前存在的一些问题:

  • llm的知识不是实时更新的
  • llm可能不知道你的私有领域/业务知识(数据安全问题)
  • 大模型幻觉问题
  • GPT tokens限制问题

这些问题都可以用RAG解决。

RAG技术架构

  • Embeddings:把文字转换为更易于相似度计算的编码。这种编码叫向量
  • 向量数据库:把向量存起来,方便查找
  • 向量检索:根据输入向量,找到最相似的向量
  • 场景举例:考试时,看到一道题,到书上找相关内容,再结合题目组成答案。然后,就都忘了 img.png

RAG系统的基本搭建流程

搭建过程:

  1. 数据准备阶段:数据提取——>文本分割——>向量化(embedding)——>数据入库
    • 数据准备一般是一个离线的过程,主要是将私域数据向量化后构建索引并存入数据库的过程。
  2. 应用阶段:用户Query ——> 数据检索(召回) ——> 注入Prompt ——> 传输给LLM生成答案
  3. 一文搞懂大模型RAG应用(附实践案例)

缺点:

关键字检索有局限性,同一个语义,用词不同,可能导致检索不到有效的结果

向量数据库

向量数据库基本概念:

  • 向量数据库的意义是快速的检索;
  • 向量数据库本身不生成向量,向量是由 Embedding 模型产生的;
  • 向量数据库与传统的关系型数据库是互补的,不是替代关系,在实际应用中根据实际需求经常同时使用。
  • 向量数据库的核心在于相似性搜索(Similarity Search):将特征用向量来表示,这样就能够通过计算向量之间的距离来判断它们的相似度,这就是相似性搜索

主流向量数据库功能对比

img1.png

OpenAI 发布的两个 Embedding 模型

2024年1月25日,OpenAI 新发布了两个 Embedding 模型

  • text-embedding-3-large
  • text-embedding-3-small

其最大特点是,支持自定义的缩短向量维度,从而在几乎不影响最终效果的情况下降低向量检索与相似度计算的复杂度。

通俗的说:越大越准、越小越快。 官方公布的评测结果:

img2.png

注:MTEB 是一个大规模多任务的 Embedding 模型公开评测集

划重点:

  1. 不是每个 Embedding 模型都对余弦距离和欧氏距离同时有效
  2. 哪种相似度计算有效要阅读模型的说明(通常都支持余弦距离计算)

文本分割的粒度

缺陷

  1. 粒度太大可能导致检索不精准,粒度太小可能导致信息不全面
  2. 问题的答案可能跨越两个片段

改进: 按一定粒度,部分重叠式的切割文本,使上下文更完整

检索后排序

问题: 有时,最合适的答案不一定排在检索的最前面

方案:

  1. 检索时过招回一部分文本
  2. 通过一个排序模型对 query 和 document 重新打分排序 下载.png

混合检索(Hybrid Search)

实际生产中,传统的关键字检索(稀疏表示)与向量检索(稠密表示)各有优劣。

举个具体例子,比如文档中包含很长的专有名词,关键字检索往往更精准而向量检索容易引入概念混淆。

所以,有时候我们需要结合不同的检索算法,来达到比单一检索算法更优的效果。这就是混合检索

混合检索的核心是,综合文档 dd 在不同检索算法下的排序名次(rank),为其生成最终排序。

一个最常用的算法叫 Reciprocal Rank Fusion(RRF)

rrf(d)=aA1k+ranka(d)rrf(d)=\sum_{a\in A}\frac{1}{k+rank_a(d)}

其中 AA 表示所有使用的检索算法的集合,ranka(d)rank_a(d) 表示使用算法 aa 检索时,文档 dd 的排序,kk 是个常数。

很多向量数据库都支持混合检索,比如 WeaviatePinecone 等。也可以根据上述原理自己实现。

总结

RAG 的流程

  • 离线步骤:
    1. 文档加载
    2. 文档切分
    3. 向量化
    4. 灌入向量数据库
  • 在线步骤:
    1. 获得用户问题
    2. 用户问题向量化
    3. 检索向量数据库
    4. 将检索结果和用户问题填入 Prompt 模版
    5. 用最终获得的 Prompt 调用 LLM
    6. 由 LLM 生成回复

如何判断RAG是否好使

  1. 检查预处理效果:文档加载是否正确,切割的是否合理
  2. 测试检索效果:问题检索回来的文本片段是否包含答案
  3. 测试大模型能力:给定问题和包含答案文本片段的前提下,大模型能不能正确回答问题
  4. RAG性能评估:从方案到实践