My Little World

RAG

LLM 固有的局限性 🔗

  1. LLM 的知识不是实时的
  2. LLM 可能不知道你私有的领域/业务知识

RAG 通过给LLM 增加额外/专有知识文档,提高LLM 回答问题的准确性

流程图

搭建过程:

  1. 文档加载,并按一定条件切割成片段
  2. 将切割的文本片段灌入检索引擎
  3. 封装检索接口
  4. 构建调用流程:Query -> 检索 -> Prompt -> LLM -> 回复

关键字检索的局限性

同一个语义,用词不同,可能导致检索不到有效的结果

解决办法===> 向量检索

向量检索

二维空间中的向量可以表示为(x,y) 表示从原点(0,0) 到点 (x,y) 的有向线段。

以此类推,我可以用一组坐标 (x0,x1,…..xN) 表示一个𝑁 维空间中的向量,𝑁 叫向量的维度。

文本向量(Text Embeddings)

  1. 将文本转成一组 𝑁 维浮点数,即文本向量又叫 Embeddings
  2. 向量之间可以计算距离,距离远近对应语义相似度大小

文本向量是怎么得到的 🔗

  1. 构建相关(正立)与不相关(负例)的句子对儿样本
  2. 训练双塔式模型,让正例间的距离小,负例间的距离大

向量间的相似度计算

余弦距离 – 越大越相似

欧氏距离 – 越小越相似

向量数据库,是专门为向量检索设计的中间件

澄清几个关键概念:

  1. 向量数据库的意义是快速的检索;
  2. 向量数据库本身不生成向量,向量是由 Embedding 模型产生的;
  3. 向量数据库与传统的关系型数据库是互补的,不是替代关系,在实际应用中根据实际需求经常同时使用。

划重点:

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

优化方向

文本分割的粒度 🔗

缺陷

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

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

检索后排序 🔗

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

方案:

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

混合检索(Hybrid Search)

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

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

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

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

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

RAG-Fusion

RAG-Fusion 就是利用了 RRF 的原理来提升检索的准确性。

https://github.com/Raudaschl/rag-fusion