首页 > 其他分享 >RAG(Retrieval-Augmented Generation)优化

RAG(Retrieval-Augmented Generation)优化

时间:2024-07-18 18:29:11浏览次数:24  
标签:检索 RAG CohereRerank Generation 命中率 MRR 文档 重排 Retrieval

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 的原理来提升检索的准确性
原始项目(一段非常简短的演示代码)在这里插入图片描述

标签:检索,RAG,CohereRerank,Generation,命中率,MRR,文档,重排,Retrieval
From: https://blog.csdn.net/Listennnn/article/details/140523603

相关文章

  • 【在RAG系统中应用知识图谱】
    【引子】关于大模型及其应用方面的文章层出不穷,聚焦于自己面对的问题,有针对性的阅读会有很多的启发,本文源自Whyhow.ai上的一些文字和示例。对于在大模型应用过程中如何使用知识图谱比较有参考价值,特汇总分享给大家。在基于大模型的RAG应用中,可能会出现不同类型的问题,通过......
  • Doris failed to initialize storage reader. tablet=106408, res=[NOT_IMPLEMENTED_E
    ApacheDoris2.3以下的版本会存在一个bug,导致数据在合并时存在异常,在后续查询该字段数据时会提示[1105][HY000]:errCode=2,detailMessage=(192.168.15.228)[CANCELLED]failedtoinitializestoragereader.tablet=106408,res=[NOT_IMPLEMENTED_ERROR]tobeimplemen......
  • 一文读懂 RAG:它将如何重新定义 AI 的未来?
    RAG可以使LLM能够在实时请求提供事实信息时,访问外部来源的数据,比如经过审核的数据库或互联网上的信息。这样一来,RAG就消除了大家对于LLM仅依赖其训练数据中获得的内部知识库的顾虑,毕竟,这些知识库可能存在缺陷或不完整。如果你尝试使用过一些LLM,那么,极有可能遇到的......
  • Aragog-1
    概述测试目的【VulnHub靶场】——HARRYPOTTER第一部:ARAGOG(1.0.2)_aragog靶场-CSDN博客测试范围序号系统IP1本机192.168.152.1282Aragog靶机192.168.152.141详细测试流程1、发现测试目标2、信息收集3、漏洞利用wpscan--api-token=OGdgn8Ekao1Pt4jgVrO3AsxsWcQ4yC1liIzYC3756Tk......
  • 微调(Fine-Tuning)和检索增强生成(RAG)
    微调(Fine-Tuning)和检索增强生成(RAG)https://www.toutiao.com/article/7386094597421810186/?log_from=21b91ee0752_17211185181952024-06-3009:05·架构笔记  微调(Fine-Tuning)过程的核心,是在新的任务和数据集上对预训练模型的参数进行微小的调整,使其能精准契合目标场景......
  • 自定义localStorage监听事件
    一、问题在项目开发过程中,发现有很多时候进行localStorage.setItem()操作设置本地存储后,页面必须刷新才能够获取到存储数据,而有些时候本地缓存更新后,页面无法通过再次刷新以获取本地缓存,这就导致依赖本地缓存的数据无法进行更新。为了解决这个问题,就必须要用到自定义localStorage......
  • TaD+RAG-缓解大模型“幻觉”的组合新疗法
    TaD:任务感知解码技术(Task-awareDecoding,简称TaD),京东联合清华大学针对大语言模型幻觉问题提出的一项技术,成果收录于IJCAI2024。RAG:检索增强生成技术(Retrieval-augmentedGeneration,简称RAG),是业内解决LLM幻觉问题最有效的系统性方案。1.背景介绍近来,以ChatGPT为代表的生成式大......
  • ragflow本地部署的问题(文本解析不了)
    本文章主要介绍我在部署一个名叫ragflow的开源项目时所遇见的问题以及解决办法。对于这个其实对我的感触很大,因为我花费了一个星期的时间来寻找这个问题的办法,但是却不敬人意,于是我决定换一个思路来解决这个问题。下面就是我对这个问题的详细描述。在本地部署完ragflow后,并且......
  • JavaScript全解析——本地存储✔(localStorage~sessionStorage~cookie)
    ●就是浏览器给我们提供的可以让我们在浏览器上保存一些数据●常用的本地存储(localStorage~sessionStorage~cookie)1-localStorage=>特点:->长期存储,除非手动删除否则会一直保存在浏览器中清除缓存或者卸载浏览器也就没有了->可以跨页面通讯,也就是说在一个页面写下......
  • 探索GraphRAG:构建高效的知识图谱索引与查询引擎
    GraphRAG系统简介GraphRAG是一个基于图的检索增强生成系统,它通过索引文本数据,然后使用这些索引数据来回答有关文档的问题。系统的核心在于其索引管道和查询引擎,它们共同工作,以提供快速且准确的信息检索服务。环境准备在开始之前,请确保你的开发环境中已安装Python3.10至3......