RAG流程
RAG是通过检索来增强生成模型的能力:将用户的查询与检索过程中获取的文档见解直接整合到prompt里,输入给语言模型。基本流程如下:
- 加载并解析文档
- 切割文档为文本片段
- 文本片段向量化(embeddings)
- embeddings存入数据库
- 用户Query -> 检索数据库 -> 带有检索结果信息的Prompt -> LLM -> 回复
RAG需要注意的点
- 文档的读取和处理 (PDF PPT EXCEL等各种格式的文档)
- 如何把文档合理的分割成不同的 chunks 段落
- 如何合理的 embedding 向量化 ,使用什么样的向量数据库
- 对问题做一个扩充或重新改写(用户问题比较简段或与上下文无关)
- 检索的效率、命中率(用传统的搜索引擎技术)极大的影响后续 LLM 判断 粗排
- Ranking 精排
- prompt=问题+检索 Ranking 的整合 好的 prompt 能激发大模型更多的潜能
- 使用通用大模型还是开源大模型进行微调
- response 加入检查机制 是直接返回用户还是返回到某个阶段进行二次处理(违背了一些规范和要求)
- 可以使用 LlamaIndex 的 检索评估 模块迅速确定嵌入模型和重排器模型的最佳组合
检索评估中的指标
- 命中率:计算在查询中正确答案出现在检索到的前k个文档中的比例。简单来说,它关乎我们的系统在前几个猜测中正确答案出现的频率。
- 平均倒数排名(MRR):对于每个查询,MRR通过查看最相关文档的最高排名来评估系统的准确性。具体来说,它是所有查询中这些排名倒数的平均值。因此,如果第一个相关文档是顶部结果,倒数排名就是1;如果是第二个,倒数排名就是1/2,以此类推。
嵌入模型的性能
- OpenAI:展示了一流的性能,尤其是与CohereRerank 结合使用时(命中率0.926966,MRR 0.86573)和bge-reranker-large 结合使用时(命中率0.910112,MRR 0.855805),表明与重排工具的兼容性很强。
- bge-large:在使用重排器时体验到显著的性能提升,最佳结果来自 CohereRerank(命中率0.876404,MRR 0.822753)。
- llm-embedder:从重排中获益匪浅,尤其是与 CohereRerank 结合使用时(命中率0.882022,MRR 0.830243),这提供了显著的性能提升。
- Cohere:Cohere的最新v3.0嵌入性能优于v2.0,并且与原生CohereRerank集成后,显著提高了其指标,拥有0.88764的命中率和0.836049的MRR。
- Voyage:具有强大的初始性能,通过 CohereRerank 进一步增强(命中率0.91573,MRR 0.851217),表明对重排有很高的响应性。
- JinaAI:性能非常强,在使用 bge-reranker-large(命中率0.938202,MRR 0.868539)和 CohereRerank(命中率0.932584,MRR 0.873689)时看到了显著的增益,表明重排显著提升了其性能。
- Google-PaLM:该模型展示了强大的性能,在使用CohereRerank时有可衡量的增益(命中率0.910112,MRR 0.855712)。这表明重排为其整体结果提供了明确的提升。
重排器的影响 - 无重排器:这为每种嵌入模型提供了基线性能。
- bge-reranker-base:普遍提高了所有嵌入模型的命中率和MRR。
- bge-reranker-large:这个重排器经常为嵌入模型提供最高或接近最高的MRR。对于几种嵌入,它的性能与CohereRerank相媲美或超越了它。
- CohereRerank:在所有嵌入模型中一致性地增强了性能,通常提供了最佳或接近最佳的结果。
这些结果为这个特定数据集和任务提供了深入的性能洞察。然而,实际结果可能会因数据特性、数据集大小以及其他变量如chunk_size、similarity_top_k而有所不同。数据清楚地表明了重排器在优化搜索结果中的重要性。几乎所有嵌入模型都从重排中受益,显示出提高的命中率和MRR值。特别是CohereRerank
当考虑到命中率和MRR时,penAI + CohereRerank 和 JinaAI-Base + bge-reranker-large/CohereRerank 的组合作为顶级竞争者脱颖而出
RAG流程优化
文档解析
一些面向 RAG 的文档解析辅助工具
- PyMuPDF: PDF 文件处理基础库,带有基于规则的表格与图像抽取(不准)
- RAGFlow: 一款基于深度文档理解构建的开源 RAG 引擎,支持多种文档格式
- Unstructured.io: 一个开源+SaaS形式的文档解析库,支持多种文档格式
- LlamaParse:付费 API 服务,由 LlamaIndex 官方提供,解析不保证100%准确,实测偶有文字丢失或错位发生
- Mathpix:付费 API 服务,效果较好,可解析段落结构、表格、公式等,贵!
文本分割的粒度
问题:粒度太大可能导致检索不精准,粒度太小可能导致信息不全面
优化:按一定粒度,部分重叠式的切割文本,使上下文更完整
from nltk.tokenize import sent_tokenize
import json
def split_text(paragraphs, chunk_size=300, overlap_size=100):
'''按指定 chunk_size 和 overlap_size 交叠割文本'''
sentences = [s.strip() for p in paragraphs for s in sent_tokenize(p)]
chunks = []
i = 0
while i < len(sentences):
chunk = sentences[i]
overlap = ''
prev_len = 0
prev = i - 1
# 向前计算重叠部分
while prev >= 0 and len(sentences[prev])+len(overlap) <= overlap_size:
overlap = sentences[prev] + ' ' + overlap
prev -= 1
chunk = overlap+chunk
next = i + 1
# 向后计算当前chunk
while next < len(sentences) and len(sentences[next])+len(chunk) <= chunk_size:
chunk = chunk + ' ' + sentences[next]
next += 1
chunks.append(chunk)
i = next
return chunks
检索后排序Rerank
问题:有时,最合适的答案不一定排在检索的最前面
优化:先检索召回一部分文本,再通过一个排序模型对 query 和 document 重新打分排序
Rerank 的 API 服务
混合检索(Hybrid Search)
问题:传统的关键字检索(稀疏表示)与向量检索(稠密表示)各有优劣。比如文档中包含很长的专有名词,关键字检索往往更精准而向量检索容易引入概念混淆。
优化:需要结合不同的检索算法,来达到比单一检索算法更优的效果。这就是混合检索。混合检索的核心是,综合文档在不同检索算法下的排序名次(rank),为其生成最终排序。
RAG-Fusion
RAG-Fusion 就是利用了 RRF 的原理来提升检索的准确性
原始项目(一段非常简短的演示代码)