用通俗易懂的方式讲解:选择最佳的 Embedding 和重排序模型,提升大模型 RAG 效果特别明显!

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

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

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

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

文章目录

    • 技术交流&资料
    • 通俗易懂讲解大模型系列
    • 一、理解Retrieval Evaluation中的评估指标
    • 二、设置环境
    • 三、设置Key
    • 四、下载数据
    • 五、加载数据
    • 六、生成问题上下文对
    • 七、自定义检索器
    • 八、评估
    • 九、结果
    • 10、分析
    • 11、结论

技术交流&资料

技术要学会分享、交流,不建议闭门造车。一个人可以走的很快、一堆人可以走的更远。

成立了大模型技术交流群,本文完整代码、相关资料、技术交流&答疑,均可加我们的交流群获取,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友。

方式①、微信搜索公众号:机器学习社区,后台回复:加群
方式②、添加微信号:mlc2060,备注:来自CSDN + 技术交流

通俗易懂讲解大模型系列

  • 做大模型也有1年多了,聊聊这段时间的感悟!

  • 用通俗易懂的方式讲解:大模型算法工程师最全面试题汇总

  • 用通俗易懂的方式讲解:我的大模型岗位面试总结:共24家,9个offer

  • 用通俗易懂的方式讲解:大模型 RAG 在 LangChain 中的应用实战

  • 用通俗易懂的方式讲解:一文讲清大模型 RAG 技术全流程

  • 用通俗易懂的方式讲解:如何提升大模型 Agent 的能力?

  • 用通俗易懂的方式讲解:ChatGPT 开放的多模态的DALL-E 3功能,好玩到停不下来!

  • 用通俗易懂的方式讲解:基于扩散模型(Diffusion),文生图 AnyText 的效果太棒了

  • 用通俗易懂的方式讲解:在 CPU 服务器上部署 ChatGLM3-6B 模型

  • 用通俗易懂的方式讲解:使用 LangChain 和大模型生成海报文案

  • 用通俗易懂的方式讲解:ChatGLM3-6B 部署指南

  • 用通俗易懂的方式讲解:使用 LangChain 封装自定义的 LLM,太棒了

  • 用通俗易懂的方式讲解:基于 Langchain 和 ChatChat 部署本地知识库问答系统

  • 用通俗易懂的方式讲解:在 Ubuntu 22 上安装 CUDA、Nvidia 显卡驱动、PyTorch等大模型基础环境

  • 用通俗易懂的方式讲解:Llama2 部署讲解及试用方式

  • 用通俗易懂的方式讲解:基于 LangChain 和 ChatGLM2 打造自有知识库问答系统

  • 用通俗易懂的方式讲解:一份保姆级的 Stable Diffusion 部署教程,开启你的炼丹之路

  • 用通俗易懂的方式讲解:对 embedding 模型进行微调,我的大模型召回效果提升了太多了

  • 用通俗易懂的方式讲解:LlamaIndex 官方发布高清大图,纵览高级 RAG技术

  • 用通俗易懂的方式讲解:使用 LlamaIndex 和 Eleasticsearch 进行大模型 RAG 检索增强生成

一、理解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 questions
qa_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 dataset
def filter_qa_dataset(qa_dataset):"""Filters out queries from the qa_dataset that contain certain phrases and the correspondingentries in the relevant_docs, and creates a new EmbeddingQAFinetuneDataset object withthe 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 removedqueries_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 comprehensionsfiltered_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 datareturn 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的代码。

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_retrieverdef _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_nodesasync 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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenSource - 工具管理器easy-manager-tool

文章目录 功能说明运行配置环境配置启动docker部署 项目安全UI展示 Easy-Manager-Tool 打造软件行业首款集成工具,不管你是程序员,测试,运维等都可以使用该软件来提升自己的工作效率。 Easy-Manager-Tool 的诞生是为了解决软件行业众多参与者…

PGSQL安装PostGIS扩展模块

一、PostGIS简介 1、PostGIS介绍 PostGIS是一个空间数据库,空间数据库像存储和操作数据库中其他任何对象一样去存储和操作空间对象。 空间数据与数据库关联起来的三个要素:数据类型、索引和函数。 空间数据类型:用于指定图形为点&#xff0…

HBase学习五:运维排障

1、负载均衡 1.1 Rgion迁移 在当前的HBase版本中,Region迁移虽然是一个轻量级操作,但实现逻辑依然比较复杂,≈复杂性主要表现在两个方面:其一,Region迁移过程涉及多种状态的改变;其二,迁移过程中涉及Master、ZooKeeper(ZK)以及RegionServer等多个组件的相互协调。 …

11.什么档次的原型模式和我写的一样

在《生化危机》系列电影中,克隆人是个频频出现的话题。保护伞公司为了需求复制出另一个战力相当的战士Alice,不惜克隆成百上千个Alice,然而直到最后,非但没有真正克隆出另一个完美的Alice,就连Alice自己也被证实是保护…

SpringBoot(三层框架Controller,Mapper,Service)中遇到的一些注解整理

本文主要从Controller层,Service层,Mapper层这三层架构中记录用到的各种注解 还有一些MyBatis用到的注解 持续更新到本人的毕设做完为止,太多了太多了根本学不完哈哈哈 1.Controller层 1.1GetMapping/PostMapping/DeleteMapping/PutMapping 用于建立HTTP请求与处理方法之间的…

Go 爬虫之 colly 从入门到不放弃指南

文章目录 概要介绍如何学习官方文档如何安装快速开始如何配置调试分布式代理层面执行层面存储层面存储多收集器配置优化持久化存储启用异步加快任务执行禁止或限制 KeepAlive 连接扩展总结如果想用 GO 实现爬虫能力,该如何做呢?抽时间研究了 Go 的一款爬虫框架 colly。 概要…

Qt文件和目录相关操作

1.相关说明 QCoreApplication类、QFile类、QDir、QTemporaryDir类、QTemporaryFile类、QFileSystemWatcher类的相关函数 2.相关界面 3.相关代码 #include "dialog.h" #include "ui_dialog.h" #include <QFileDialog> #include <QTemporaryDir>…

Ardupilot开源飞控之VTOL之旅:打印件清单

Ardupilot开源飞控之VTOL之旅&#xff1a;打印件清单 1. 源由2. 清单2.1 模拟VTX打印件2.2 摄像头打印件2.3 GPS & RC天线打印件2.4 飞控 & 电调打印件 3. 总结4. 参考资料 1. 源由 VTOL一直仍在角落吃灰&#xff0c;主要还是手头缺点经费&#xff0c;搞台3D打印机基本…

Kotlin 移动端多平台

支持多平台编程是 Kotlin 的主要优势之一。它减少了为不同平台编写和维护相同代码所花费的时间&#xff0c;同时保留了本机编程的灵活性和优势。 1. 基本概念 KMM&#xff1a;Kotlin Multiplatform for mobile&#xff08;移动设备的 Kotlin 多平台&#xff09; KMM 多平台的主…

16k+ start 一个开源的的监控系统部署教程

安装条件 Linux或macOS系统 4GB内存 开放 33014、33174、3183端口 1.安装 1、下载源码 首先使用 git 克隆源码到本地 git clone -b main https://github.com/SigNoz/signoz.git && cd signoz/deploy/ 方式1&#xff1a;运行 install.sh 脚本一键安装 ./install.s…

luffy商城项目(一)

企业项目类型 # 1 面向互联网用户&#xff1a;商城类项目 -微信小程序商城 # 2 面向互联网用户&#xff1a;二手交易类的 -咸鱼 -转转 # 3 公司内部项目&#xff1a;python写的重点 -oa系统 -打卡系统工资核算系统 -第三方公司做的&#xff1a…

leetCode-42.接雨水

&#x1f4d1;前言 本文主要是【算法】——算法模拟的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一句&#xff…

git提权

实验环境——vulnhub-dc2靶场 git提权 前提&#xff1a;用户可以使用sudo中git权限 查看sudo权限 sudo -l可以发现git命令存在sudo提权 基于此进行权限提升 方式&#xff1a; sudo git help config #在末行命令模式输入 !/bin/bash 或 !sh #完成提权 sudo git -p help…

直接发文!1D-2D-MTF-CNN-GRU-AT多通道图像时序融合的分类/故障识别程序!Excel导入,直接运行

​适用平台&#xff1a;Matlab2023版本及以上 本程序同时结合两篇国内顶级EI的方法&#xff1a;提出1D-2D-MTF-CNN-GRU-AT多通道图像时序融合的分类/故障识别程序&#xff01; ①中文EI期刊《电力自动化设备》12月29号网络首发文献&#xff1a;《基于格拉姆角场与并行CNN的并…

【PyTorch】PyTorch之Reduction Ops

文章目录 前言一、ARGMAX二、ARGMIN三、AMAX和AMIN四、ALL和ANY五、MAX和MIN六、MEAN七、MEDIAN八、NORM九、PROD十、STD十一、SUM十二、UNIQUE十三、VAR 前言 介绍pytorch的Reduction Ops。 一、ARGMAX torch.argmax(input, dim, keepdimFalse) → LongTensor Parameters&a…

突破Android开发瓶颈:6年Android开发者的实用建议

作为一名在Android领域摸爬滚打6年的老手&#xff0c;我想给那些在这个行业工作了3~5年的朋友们提供一些职业和技术上的建议。 许多开发者在职业生涯中都会遇到一个瓶颈期&#xff0c;尤其是当你在一个公司待了很长时间&#xff0c;感觉自己的技术和业务能力都无法得到提升时。…

多输入多输出 | Matlab实现基于LightGBM多输入多输出预测

多输入多输出 | Matlab实现基于LightGBM多输入多输出预测 目录 多输入多输出 | Matlab实现基于LightGBM多输入多输出预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现基于LightGBM多输入多输出预测&#xff08;完整源码和数据&#xff09; 1.data为数据集&a…

近期学习文章

DNSlog在渗透测试中的实战技巧 - 网安隐藏源IP&#xff0c;提高溯源难度的几种方案 - 网安FreeBuf网络安全行业门户 【漏洞公告】某平台一个有意思的CSRF // SecTrain安全博客 浅谈Web源码泄漏-安全客 - 安全资讯平台 红队-C2 Server基础构建 - 先知社区FreeBuf网络安全行业…

【电力电子在电力系统中的应用】2 CCM和DCM模式下Cuk电路的升降压工作状态

【仅供参考】 【2023.03西南交大电力电子在电力系统中的应用】 目录 0 仿真要求 1 仿真电路搭建及波形记录 1.1 CCM工作模式 1.1.1 升压模式 1.1.2 降压模式 1.2 DCM工作模式 1.2.1 升压模式 1.2.2 降压模式 1.3 改变开关频率和电容参数 1.3.1 改变开关频率 1.3.2 …

高清网络视频监控系统技术方案

目 录 一、概述 二、建设目标及需求 &#xff08;一&#xff09;建设总目标 &#xff08;二&#xff09;需求分析 三、设计依据与设计原则 &#xff08;一&#xff09;设计依据 &#xff08;二&#xff09;设计原则 四、建设方案设计 &#xff08;一&…