RAG(Retrieval-Augmented Generation)优化

RAG流程

RAG是通过检索来增强生成模型的能力:将用户的查询与检索过程中获取的文档见解直接整合到prompt里,输入给语言模型。基本流程如下:

  1. 加载并解析文档
  2. 切割文档为文本片段
  3. 文本片段向量化(embeddings)
  4. embeddings存入数据库
  5. 用户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

Embedding模型

检索后排序Rerank

问题:有时,最合适的答案不一定排在检索的最前面
优化:先检索召回一部分文本,再通过一个排序模型对 query 和 document 重新打分排序
在这里插入图片描述
Rerank 的 API 服务

混合检索(Hybrid Search)

问题:传统的关键字检索(稀疏表示)与向量检索(稠密表示)各有优劣。比如文档中包含很长的专有名词,关键字检索往往更精准而向量检索容易引入概念混淆。
优化:需要结合不同的检索算法,来达到比单一检索算法更优的效果。这就是混合检索。混合检索的核心是,综合文档在不同检索算法下的排序名次(rank),为其生成最终排序
在这里插入图片描述

RAG-Fusion

RAG-Fusion 就是利用了 RRF 的原理来提升检索的准确性
原始项目(一段非常简短的演示代码)在这里插入图片描述

  • 22
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值