LLM之RAG实战(六)| 高级RAG 02:选择最佳embedding和重排序模型

图片

       在构建检索增强生成(RAG)Pipeline时,一个关键组件是Retriever。我们有多种embedding模型可供选择,包括OpenAI、CohereAI和开源sentence transformers。此外,CohereAI和sentence transformers还提供了几个重排序器。

       但是,有了所有这些选项,我们如何确定最佳组合以获得一流的检索性能?我们如何知道哪种embedding模型最适合我们的数据?或者哪种重新排序对我们的结果提升最大?

      在这篇博客文章中,我们将使用LlamaIndex的Retrieval Evaluation模块来快速确定embedding和重排序模型的最佳组合。让我们一起来了解一下吧!

       让我们首先了解Retrieval Evaluation中可用的评估指标!

一、理解Retrieval Evaluation中的评估指标:

       为了衡量我们的检索系统的有效性,我们选择被广泛接受的两个指标:Hit Rate和 Mean Reciprocal Rank (MRR)。让我们深入研究这些指标,以了解它们的重要性以及它们是如何运作的。

命中率(Hit Rate)

       命中率计算在前k个检索到的文档中找到正确答案的查询的百分比。简单地说,这是关于我们的系统在前几次猜测中正确的频率。

平均倒数排名(MRR)

       对于每个查询,MRR通过查看排名最高的相关文档的排名来评估系统的准确性。具体来说,它是所有查询中这些排名的倒数的平均值。因此,如果第一个相关文档是最高结果,则倒数为1;如果是第二个,则倒数为1/2,依此类推。

       既然我们已经确定了评估指标,现在是时候开始实验了。

二、设置环境

!pip install llama-index sentence-transformers cohere anthropic voyageai protobuf pypdf

三、设置Key

openai_api_key = 'YOUR OPENAI API KEY'cohere_api_key = 'YOUR COHEREAI API KEY'anthropic_api_key = 'YOUR ANTHROPIC API KEY'openai.api_key = openai_api_key

四、下载数据

!wget --user-agent "Mozilla" "https://arxiv.org/pdf/2307.09288.pdf" -O "llama2.pdf"

五、加载数据

      让我们加载数据。我们前36页来进行实验,不包括目录、参考文献和附录。

       然后将这些数据转换为节点进行解析,这些节点表示我们想要检索的数据块。我们设置chunk_size为512。​​​​​​​

documents = SimpleDirectoryReader(input_files=["llama2.pdf"]).load_data()
node_parser = SimpleNodeParser.from_defaults(chunk_size=512)nodes = node_parser.get_nodes_from_documents(documents)

六、生成问题上下文对

        为了评估,我们创建了一个问题上下文对数据集,该数据集包括一系列问题及其相应的上下文。为了消除embedding(OpenAI/CohereAI)和重排序(CohereAI)评估的偏差,我们使用Anthropic LLM生成问题上下文对。

       让我们初始化一个Prompt模板来生成问题上下文对。​​​​​​​

# Prompt to generate questionsqa_generate_prompt_tmpl = """\Context information is below.---------------------{context_str}---------------------Given the context information and not prior knowledge.generate only questions based on the below query.You are a Professor. Your task is to setup \{num_questions_per_chunk} questions for an upcoming \quiz/examination. The questions should be diverse in nature \across the document. The questions should not contain options, not start with Q1/ Q2. \Restrict the questions to the context information provided.\"""

​​​​​​​

llm = Anthropic(api_key=anthropic_api_key)qa_dataset = generate_question_context_pairs(    nodes, llm=llm, num_questions_per_chunk=2)

       过滤句子的函数,例如——以下是基于所提供上下文的两个问题​​​​​​​

# function to clean the datasetdef filter_qa_dataset(qa_dataset):    """    Filters out queries from the qa_dataset that contain certain phrases and the corresponding    entries in the relevant_docs, and creates a new EmbeddingQAFinetuneDataset object with    the filtered data.          :param qa_dataset: An object that has 'queries', 'corpus', and 'relevant_docs' attributes.    :return: An EmbeddingQAFinetuneDataset object with the filtered queries, corpus and relevant_docs.    """# Extract keys from queries and relevant_docs that need to be removed    queries_relevant_docs_keys_to_remove = {        k for k, v in qa_dataset.queries.items()        if 'Here are 2' in v or 'Here are two' in v    }# Filter queries and relevant_docs using dictionary comprehensions    filtered_queries = {        k: v for k, v in qa_dataset.queries.items()        if k not in queries_relevant_docs_keys_to_remove    }    filtered_relevant_docs = {        k: v for k, v in qa_dataset.relevant_docs.items()        if k not in queries_relevant_docs_keys_to_remove    }    # Create a new instance of EmbeddingQAFinetuneDataset with the filtered data    return EmbeddingQAFinetuneDataset(        queries=filtered_queries,        corpus=qa_dataset.corpus,        relevant_docs=filtered_relevant_docs    )# filter out pairs with phrases `Here are 2 questions based on provided context`qa_dataset = filter_qa_dataset(qa_dataset)

七、自定义检索器

      为了寻找最优检索器,我们采用embedding模型和重排序器的组合。最初,我们建立了一个基本的VectorIndexRetriever。在检索节点后,我们引入一个重排序器来进一步细化结果。值得注意的是,对于这个特定的实验,我们将similarity_top_k设置为10,并用reranker选择了前5名。但是,您可以根据具体实验的需要随意调整此参数。我们在这里展示了OpenAIEmbedding的代码,其他embedding代码请参阅笔记本(https://colab.research.google.com/drive/1TxDVA__uimVPOJiMEQgP5fwHiqgKqm4-?usp=sharing)。​​​​​​​

embed_model = OpenAIEmbedding()service_context = ServiceContext.from_defaults(llm=None, embed_model = embed_model)vector_index = VectorStoreIndex(nodes, service_context=service_context)vector_retriever = VectorIndexRetriever(index=vector_index, similarity_top_k = 10)​​​​​​​
class CustomRetriever(BaseRetriever):    ""     "Custom retriever that performs both Vector search and Knowledge Graph search"""    def __init__(        self,        vector_retriever: VectorIndexRetriever,    ) -> None:        """Init params."""        self._vector_retriever = vector_retriever    def _retrieve(self, query_bundle: QueryBundle) -> List[NodeWithScore]:        """Retrieve nodes given query."""    retrieved_nodes = self._vector_retriever.retrieve(query_bundle)    if reranker != 'None':      retrieved_nodes = reranker.postprocess_nodes(retrieved_nodes, query_bundle)       else:          retrieved_nodes = retrieved_nodes[:5]                return retrieved_nodes    async def _aretrieve(self, query_bundle: QueryBundle) -> List[NodeWithScore]:        """Asynchronously retrieve nodes given query.        Implemented by the user.        """        return self._retrieve(query_bundle)    async def aretrieve(self, str_or_query_bundle: QueryType) -> List[NodeWithScore]:        if isinstance(str_or_query_bundle, str):            str_or_query_bundle = QueryBundle(str_or_query_bundle)        return await self._aretrieve(str_or_query_bundle)custom_retriever = CustomRetriever(vector_retriever)

八、评估

       为了评估我们的检索器,我们计算了平均倒数排名(MRR)和命中率指标:​​​​​​​

retriever_evaluator = RetrieverEvaluator.from_metric_names(    ["mrr", "hit_rate"], retriever=custom_retriever)eval_results = await retriever_evaluator.aevaluate_dataset(qa_dataset)

九、结果

我们对各种嵌入模型和重新排序进行了测试。以下是我们考虑的模型:

  • embedding模型:
  • OpenAI Embedding
  • Voyage Embedding
  • CohereAI Embedding (v2.0/ v3.0)
  • Jina Embeddings (small/ base)
  • BAAI/bge-large-en
  • Google PaLM Embedding

重排序模型:

  • CohereAI
  • bge-reranker-base
  • bge-reranker-large

下表显示了基于命中率和平均倒数排名(MRR)指标的评估结果:

图片

10、分析

embedding性能

  • OpenAI:展示顶级性能,尤其是CohereRerank(0.926966命中率,0.86573 MRR)和bge-reranker-large(0.910112命中率,0.8 55805 MRR),表明与重排序工具有很强的兼容性。
  • bge-large:使用重排序时效果显著改进,CohereRerank的结果最好(0.876404命中率,0.822753 MRR)。
  • llm-embedder:从重排序中受益匪浅,特别是使用CohereRebank(0.882022命中率,0.830243 MRR),性能提升显著。
  • CohereCohere最新的v3.0 embedding模型优于v2.0,并且通过集成原生CohereRebank,显著提高了其指标,有0.88764的命中率和0.836049的MRR。
  • Voyage:具有强大的初始性能,CohereRerank进一步放大了这一性能(0.91573命中率,0.851217 MRR),表明对重排列的响应性很高。
  • JinaAI:表现非常强劲,bge-reranker-large(0.938202命中率,0.868539 MRR)和CohereRerank(0.932584命中率,0.8 73689)涨幅显著,表明重新评级显著提升了其表现。
  • Google-PaLM:该模型表现出强大的性能,在使用CohereRebank时有可测量的增益(0.910112命中率,0.855712 MRR)。这表明,重排序明显提升了其整体性能。

重排序的影响:

  • WithoutReranker:这为每个embedding提供了baseline性能。
  • bge-reranker-base:通常可以提高embedding的命中率和MRR。
  • bge-reranker-large:这个reranker经常为embedding提供最高或接近最高的MRR。对于几种embedding,其性能可以与CohereRebank相媲美或超越。
  • CohereRerank:持续提高所有embedding的性能,通常提供最佳或接近最佳的结果。

重排序的必要性:

  • 上述实验表明了重排序在细化搜索结果方面的重要性。几乎所有embedding都受益于重新排序,其可以提高命中率和MRR。
  • Reranker,尤其是CohereRerank,已经证明了他们可以提高任何embedding能力。

总体优势

  • 当同时考虑命中率和MRR时,OpenAI+CohereRebankJinaAI Base+bge-reranker-large/CohereRebank的组合成为顶级竞争者。
  • 然而,CohereRerank/bge-reranker在各种embedding中都可以一致性改进增强搜索的质量,适用于何种embedding。

       总之,为了在命中率和MRR方面实现峰值性能,OpenAI或JinaAI Base嵌入与CohereRerank/bge重ranker大型重ranker的组合脱颖而出。

11、结论:

       在这篇博客文章中,我们展示了如何使用各种embedding和重排序来评估和增强检索器的性能。以下是我们的最终结论。

  • EmbeddingsOpenAIJinaAI-Base embedding,尤其是与CohereRerank/bge-reranker-large reranker配对时,为命中率和MRR设定了黄金标准。
  • Rerankers:重新排序的影响,特别是CohereRerank/bge-reranker-large 重新排序,怎么强调都不为过。它们在改善许多embedding的MRR方面发挥着关键作用,表明了它们在改善搜索结果方面的重要性。
  • Foundation is Key:为初始搜索选择正确的embedding至关重要;如果基本搜索结果不好,即使是最好的重新排序也无济于事。
  • Working Together:为了让检索器发挥出最大的作用,找到embedding和重新排序的正确组合是很重要的。这项研究表明,仔细测试并找到最佳配对是多么重要。

参考文献:

[1] https://blog.llamaindex.ai/boosting-rag-picking-the-best-embedding-reranker-models-42d079022e83

[2] https://colab.research.google.com/drive/1TxDVA__uimVPOJiMEQgP5fwHiqgKqm4-?usp=sharing

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/257134.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

探索Qt 6.3:了解基本知识点和新特性

学习目标: 理解Qt6.3的基本概念和框架:解释Qt是什么,它的核心思想和设计原则。学会安装和配置Qt6.3开发环境:提供详细的步骤,让读者能够顺利安装和配置Qt6.3的开发环境。掌握Qt6.3的基本编程技巧:介绍Qt6.…

python接口自动化测试--requests使用和基本方法封装

之前学习了使用jmeterant做接口测试,并实现了接口的批量维护管理(大概500多条用例),对“接口”以及“接口测试”有了一个基础了解,最近找了一些用python做接口测试的资料,一方面为了学习下如何使用python进行接口测试(如何做出一个…

MSA【3】:SAMed

文章目录 前言1. Abstract & Introduction1.1. Abstract1.2. Introduction 2. Methods2.1. Overview2.2. LoRA in image encoder2.3. Prompt encoder and mask decoder2.4. Training strategies2.4.1. Loss function2.4.2. Warmup2.4.3. AdamW optimizer 总结 前言 SAMed …

青藤销售云助力企业数智化销售

青藤销售云助力企业数智化销售覆盖: 1.人工自动外呼群呼 2.AI电销销售机器人自动筛选意向客户 3.crm企业微信智能客户管理运行系统 4.电话回拨系统不限拨打频次高频外呼不封号 5.语音通知系统覆盖工单提醒、发货提醒、缴费提醒等场景 6.手机号外显专号专用高接通率线…

【数据分享】2019-2023年我国地级市逐年新房房价数据(免费获取/Excel/Shp格式)

房价是一个城市发展程度的重要体现,一个城市的房价越高通常代表这个城市越发达,对于人口的吸引力越大!因此,房价数据是我们在各项城市研究中都非常常用的数据!之前我们分享了2019—2023年我国地级市逐月的新房房价数据…

EasyExcel模板导出(行和列自动合并)

1.需求背景: ①需要从第三方获取数据,第三方接口有两个参数,开始时间和结束时间 ②获取回来的数据并没有入库,所以不能通过数据库将数据归类统计,excel合并大概的流程是判断上一行或者左右相邻列是否相同,然后进行合并,所以不能是零散的数据且客户要求每一个自治区和每一个航站…

Spring Boot学习随笔- 实现AOP(JoinPoint、ProceedingJoinPoint、自定义注解类实现切面)

学习视频:【编程不良人】2021年SpringBoot最新最全教程 第十一章、AOP 11.1 为什么要使用AOP 问题 现有业务层开发存在问题 额外功能代码存在大量冗余每个方法都需要书写一遍额外功能代码不利于项目维护 Spring中的AOP AOP:Aspect 切面 Oriented 面向…

博特激光:紫外激光打标机在玻璃行业的应用

随着科技的飞速发展,紫外激光打标机在玻璃行业的应用日益广泛。这种高效、高精度的打标设备为玻璃制品的标识和加工带来了革命性的变革,助力企业提升生产效率和产品质量。 ​ ​ 一、玻璃制品标识 紫外激光打标机采用高能量密度的激光束,能够…

【RocketMQ-Install】RocketMQ 的安装及基础命令的使用

【RocketMQ-Install】Windows 环境下 安装本地 RocketMQ 及基础命令的使用 1)下载 RocketMQ 安装包1.1.官网下载(推荐)1.2.Git 下载1.3.安装环境要求说明 2)Windows 安装3)Linux 安装4)控制台安装5&#xf…

乐理基础-弱起小节、弱起

弱起小节的定义: 1.音乐不是从强拍开始的,是从弱拍或次强拍开始的。 2.弱起小节会省去前面没有音乐的部分,它是不完整的小节,它的拍数是不够的。如图1 弱起小节的作用: 强拍经常要作为 和弦出现 和 变化的地方&#xf…

lvs-nat部署

LVS负载均衡群集部署——NAT模式 实验环境: 负载调度器:内网关 lvs,ens33:172.16.23.10;外网关:ens36:12.0.0.1 Web服务器1:172.16.23.11 Web服务器2:172.16.23.12 NFS…

Home Assistant 如何开启SSH服务

环境: Home Assistant 11.2 SSH & Web Terminal 17.0 问题描述: Home Assistant 如何开启SSH服务 解决方案: 通过添加一个名为Terminal & SSH的插件来在 Home Assistant 中启用 SSH 服务 下面是启用 SSH 服务的大致步骤&#x…

黑盒测试中关键截图如何打点

黑盒测试中关键截图如何打点Android黑盒测试过程中如何进行有效的打点是我们经常遇到的问题,我们一般会在脚本内部进行数据打点,也可以使用其他进程录屏或截图。那我们如何选取合适的方式进行打点记录呢?下图是对常用打点方式的统计&#xff…

程序流程图的意义(合集)

程序流程图的意义 1、矩形 作用:一般用作要执行的处理(process),在程序流程图中做执行框。 在axure中如果是画页面框架图,那么也可以指代一个页面。有时候我们会把页面和执行命令放在同一个流程中做说明,这个时候将两类不同的矩形…

selenium自动化webdriver下载及安装

1、确认浏览器的版本 在浏览器的地址栏,输入chrome://version/,回车后即可查看到对应版本 2、找到对应的chromedriver版本 2.1 114及之前的版本可以通过点击下载chromedriver,根据版本号(只看大版本)下载对应文件 2.2 116版本通过…

全链路压力测试:解析其主要特点

随着信息技术的飞速发展和云计算的普及,全链路压力测试作为一种关键的质量保障手段,在软件开发和系统部署中扮演着至关重要的角色。全链路压力测试以模拟真实生产环境的压力和负载,对整个业务流程进行全面测试,具有以下主要特点&a…

D35|整数拆分+不同的二叉搜索树

96.不同的二叉搜索树 初始思路: 一开始需要推导递推公式也就是需要找规律: 我认为的规律是 dp[0] 1; dp[1] 1; dp[2] 2; dp[3] dp[2]dp[1]xdp[1]dp[2]5; dp[4] dp[3]dp[2]xdp[1]dp[1]xdp[2]dp[3]; dp[5] dp[4]dp[1]xdp[3]dp[2]xdp[2]dp[3…

详解—C++ [异常]

目录 一、C语言传统的处理错误的方式 二、C异常概念 三、异常的使用 3.1 异常的抛出和捕获 3.2 异常的重新抛出 3.3异常安全 3.4 异常规范 四、自定义异常体系 五、C标准库的异常体系 六、异常的优缺点 6.1、C异常的优点: 6.2、C异常的缺点:…

超实用的Web兼容性测试经验总结,建议Mark

在日常工作中,我们经常碰到网页不兼容的问题。我们之所以要做兼容性测试,目的在于保证待测试项目在不同的操作系统平台上正常运行。 主要包括待测试项目能在同一操作系统平台的不同版本上正常运行;待测试项目能与相关的其他软件或系统的“和…

JBoss 4.x JBossMQ JMS 反序列化漏洞CVE-2017-7504 已亲自复现

JBoss 4.x JBossMQ JMS 反序列化漏洞CVE-2017-7504 已亲自复现 漏洞名称影响版本影响版本 漏洞复现环境搭建漏洞利用修复建议 总结 漏洞名称 影响版本 Red Hat JBoss Application Server 是一款基于JavaEE的开源应用服务器。JBoss AS 4.x及之前版本中,JbossMQ实现…