LLM 固有的局限性 🔗
- LLM 的知识不是实时的
- LLM 可能不知道你私有的领域/业务知识
RAG 通过给LLM 增加额外/专有知识文档,提高LLM 回答问题的准确性
搭建过程:
- 文档加载,并按一定条件切割成片段
- 将切割的文本片段灌入检索引擎
- 封装检索接口
- 构建调用流程:Query -> 检索 -> Prompt -> LLM -> 回复
关键字检索的局限性
同一个语义,用词不同,可能导致检索不到有效的结果
解决办法===> 向量检索
向量检索
二维空间中的向量可以表示为(x,y) 表示从原点(0,0) 到点 (x,y) 的有向线段。
以此类推,我可以用一组坐标 (x0,x1,…..xN) 表示一个𝑁 维空间中的向量,𝑁 叫向量的维度。
文本向量(Text Embeddings)
- 将文本转成一组 𝑁 维浮点数,即文本向量又叫 Embeddings
- 向量之间可以计算距离,距离远近对应语义相似度大小
文本向量是怎么得到的 🔗
- 构建相关(正立)与不相关(负例)的句子对儿样本
- 训练双塔式模型,让正例间的距离小,负例间的距离大
向量间的相似度计算
余弦距离 – 越大越相似
欧氏距离 – 越小越相似
向量数据库,是专门为向量检索设计的中间件
澄清几个关键概念:
- 向量数据库的意义是快速的检索;
- 向量数据库本身不生成向量,向量是由 Embedding 模型产生的;
- 向量数据库与传统的关系型数据库是互补的,不是替代关系,在实际应用中根据实际需求经常同时使用。
划重点:
- 不是每个 Embedding 模型都对余弦距离和欧氏距离同时有效
- 哪种相似度计算有效要阅读模型的说明(通常都支持余弦距离计算)
优化方向
文本分割的粒度 🔗
缺陷
- 粒度太大可能导致检索不精准,粒度太小可能导致信息不全面
- 问题的答案可能跨越两个片段
改进: 按一定粒度,部分重叠式的切割文本,使上下文更完整
检索后排序 🔗
问题: 有时,最合适的答案不一定排在检索的最前面
方案:
- 检索时过招回一部分文本
- 通过一个排序模型对 query 和 document 重新打分排序
混合检索(Hybrid Search)
在实际生产中,传统的关键字检索(稀疏表示)与向量检索(稠密表示)各有优劣。
举个具体例子,比如文档中包含很长的专有名词,关键字检索往往更精准而向量检索容易引入概念混淆。
有时候我们需要结合不同的检索算法,来达到比单一检索算法更优的效果。这就是混合检索。
混合检索的核心是,综合文档 𝑑 在不同检索算法下的排序名次(rank),为其生成最终排序。
一个最常用的算法叫 Reciprocal Rank Fusion(RRF)
RAG-Fusion
RAG-Fusion 就是利用了 RRF 的原理来提升检索的准确性。