增强RAG:选择最佳的嵌入和重排模型

news2024/12/24 8:47:44

对于如何选择最佳的嵌入模型和重排模型,给出了详细的步骤和代码。

在构建检索增强生成(RAG)管道时,关键组件之一是检索器。我们有多种嵌入模型可供选择,包括 OpenAI、CohereAI 和开源的sentence transformers。此外,还有来自 CohereAI 和sentence transformers的几种重排器可供选择。

但是,在所有这些选项中,我们如何确定最佳组合以获得顶级的检索性能?我们如何知道哪个嵌入模型最适合我们的数据?或者哪个重排器最能提升我们的结果?

在这篇博客文章中,我们将使用 LlamaIndex 的 检索评估 模块迅速确定嵌入模型和重排器模型的最佳组合。让我们开始吧!

让我们首先了解 检索评估 中可用的指标。

理解检索评估中的指标

为了衡量我们检索系统的效率,我们主要依赖于两个广泛接受的指标:命中率平均倒数排名(MRR)。让我们深入这些指标,了解它们的重要性以及它们的工作原理。

命中率:

命中率计算在查询中正确答案出现在检索到的前k个文档中的比例。简单来说,它关乎我们的系统在前几个猜测中正确答案出现的频率。

平均倒数排名(MRR):

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

现在我们已经确定了范围并熟悉了这些指标,是时候深入实验了。为了获得实践经验,您也可以通过我们的Google Colab Notebook进行操作。

*设置环境*

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

*设置Keys*

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

*下载数据*

我们在此实验中使用Llama2论文,我们下载这篇论文。

documents = SimpleDirectoryReader(input_files=["llama2.pdf"]).load_data()

node_parser = SimpleNodeParser.from_defaults(chunk_size=512)
nodes = node_parser.get_nodes_from_documents(documents)

*加载数据*

让我们加载数据。我们将使用第36页之前的内容进行实验,这排除了目录、参考文献和附录。

然后,这些数据被解析并转换为节点,这些节点代表我们想要检索的数据块。我们使用了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)

*生成问题-上下文对*

为了评估目的,我们创建了一个问答对数据集。这个数据集可以被看作是我们数据中的一组问题及其相应的上下文。为了在评估嵌入(OpenAI/CohereAI)和重排器(CohereAI)时消除偏见,我们使用Anthropic LLM生成问答对。

让我们初始化一个提示模板来生成问答对。

# 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
)

过滤掉类似这样的句子的函数— Here are 2 questions based on provided context

# function to clean the dataset
def 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)

*自定义检索器*

为了确定最优的检索器,我们采用了嵌入模型和重排器的组合。最初,我们建立了一个基础的 VectorIndexRetriever。检索节点后,我们引入了重排器来进一步优化结果。值得注意的是,在这个特定的实验中,我们将 similarity_top_k 设置为10,并选择了重排器的前5个结果。然而,您可以根据您特定实验的需求自由调整此参数。我们在这里展示了使用 OpenAIEmbedding 的代码,请参考 notebook 中其他嵌入模型的代码。

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)

*结果*

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

嵌入模型:

  • 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

值得一提的是,这些结果为这个特定数据集和任务提供了深入的性能洞察。然而,实际结果可能会因数据特性、数据集大小以及其他变量(如chunk_size、similarity_top_k等)而有所不同。

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

复制再试一次分享

图片

*分析:*

*按嵌入模型的性能:*

  • 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:在所有嵌入模型中一致性地增强了性能,通常提供了最佳或接近最佳的结果。

*重排器的必要性:*

  • 数据清楚地表明了重排器在优化搜索结果中的重要性。几乎所有嵌入模型都从重排中受益,显示出提高的命中率和MRR值。
  • 特别是CohereRerank,重排器已经证明了它们将任何嵌入模型转变为具有竞争力的能力。

*总体优势:*

  • 当考虑到命中率和MRR时,penAI + CohereRerankJinaAI-Base + bge-reranker-large/CohereRerank 的组合作为顶级竞争者脱颖而出。
  • 然而,CohereRerank/bge-reranker-large 重排器在不同嵌入模型中带来的持续改进使它们成为提升搜索质量的突出选择,无论使用哪种嵌入模型。

总结来说,为了在命中率和MRR上达到最佳性能,OpenAIJinaAI-Base 嵌入与 CohereRerank/bge-reranker-large 重排器的组合显得尤为突出。

请注意,我们的基准测试旨在为你自己的数据提供一个可复现的脚本。尽管如此,请将这些数字视为估计值,并在解释它们时谨慎行事。

*结论:*

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

  • 嵌入模型OpenAIJinaAI-Base 嵌入模型,特别是与 CohereRerank/bge-reranker-large 重排器搭配使用时,为命中率和MRR设定了黄金标准。
  • 重排器:重排器的影响,尤其是 CohereRerank/bge-reranker-large,怎么强调都不为过。它们在提高许多嵌入模型的MRR方面发挥了关键作用,显示了它们在使搜索结果更好的重要性。
  • 基础是关键:选择适合初始搜索的正确嵌入模型至关重要;即使是最好的重排器,如果基本搜索结果不佳,也难以提供太多帮助。
  • 协同工作:要从检索器中获得最佳效果,重要的是找到嵌入模型和重排器的正确组合。这项研究表明,仔细测试并找到最佳配对的重要性。

这些结论强调了在构建高效的检索系统时,嵌入模型和重排器选择的重要性,以及它们如何协同工作以提供最佳的搜索结果。

读者福利:如果大家对大模型感兴趣,这套大模型学习资料一定对你有用

对于0基础小白入门:

如果你是零基础小白,想快速入门大模型是可以考虑的。

一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以根据这些资料规划好学习计划和方向。

包括:大模型学习线路汇总、学习阶段,大模型实战案例,大模型学习视频,人工智能、机器学习、大模型书籍PDF。带你从零基础系统性的学好大模型!

😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓
在这里插入图片描述

👉AI大模型学习路线汇总👈

大模型学习路线图,整体分为7个大的阶段:(全套教程文末领取哈)

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

👉大模型实战案例👈

光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉大模型视频和PDF合集👈

观看零基础学习书籍和视频,看书籍和视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述
在这里插入图片描述

👉学会后的收获:👈

• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

👉获取方式:

😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓
在这里插入图片描述

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

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

相关文章

排序(插入,希尔,选择,堆,冒泡,快速,归并,计数)

本文中的Swap()函数都是下面这段代码 // 交换 void Swap(int* p1, int* p2) {int tmp *p1;*p1 *p2;*p2 tmp; }文章目录 常见排序:一.插入排序1.直接插入排序:2.希尔排序: 二.选择排序1.选择排序:2.堆排序: 三.交换排…

C语言编译的过程

文章目录 1. 预处理(Preprocessing)2. 编译(Compilation)3. 汇编(Assembly)4. 链接(Linking)总结 c语言通过编译器直接编译成机器语言程序。 C语言程序的编译过程通常分为四个主要步…

STM32G474之TIM1输出PWM信号支持互补输出,死区时间和刹车

STM32G474之TIM1输出PWM信号,互补输出,支持死区时间和刹车。PWM第1通道输出引脚配置:TIM1_CH1映射到PA8,TIM1_CH1N映射到PA7,TIM1_BKIN映射到PA6,用作刹车输入信号。当刹车时,停止PWM波形输出。在使用“比较…

海上8km远距离无线通信模组,无人船MESH组网,飞睿WiFi助力海洋船只通信无障碍

在蔚蓝无垠的海洋世界里,每一次科技的进步都如同海上的灯塔,为我们照亮了前行的道路。今天,我要为大家介绍的,就是一款能够打破传统通信界限的模块——飞睿智能8km远距离无线通信模组。它不仅在陆地通信中展现出强大的实力&#x…

4. 第一个3D案例—创建3D场景

入门Three.js的第一步,就是认识场景Scene、相机Camera、渲染器Renderer三个基本概念,接下来,咱们通过三小节课,大家演示“第一个3D案例”完成实现过程。 学习建议:只要你能把第一个3D案例搞明白,后面学习就…

幼儿园数字化探索:从入园适应到全面启智

金秋九月,全国各地幼儿园迎来开学季。幼儿园门口,一幅幅温情与成长的画面交织在一起。针对小班幼儿普遍存在的分离焦虑问题,幼儿园教师团队展现出了高度的专业性和人文关怀。据上海市普陀区汇丽幼儿园叶老师介绍,为有效缓解这一挑…

【技术分享】顶尖 GIS 技术

谈到 GIS,就不能不提到现代地理智能。是指基于 GIS、遥感和卫星定位技术的地理空间可视化、分析、决策、设计和控制的技术总称。地理智能是 GIS 区别于其他信息技术最重要的价值之一。它由地理可视化、地理决策、地理设计、地理控制四个层次组成。它们形成了一个地理…

wordpress发送邮件的方法?怎么配置功能?

wordpress发送邮件设置教程?WordPress如何配置发信? WordPress作为最受欢迎的内容管理系统之一,被广泛用于创建和管理网站。AokSend将详细介绍WordPress发送邮件的方法,并指导您如何配置这一功能,确保您的邮件发送既高…

跑步用耳机哪款好?这五款运动骨传导耳机健身人士都说好!

在无线耳机市场持续繁荣的今天,入耳式耳机以其卓越的音质体验赢得了众多用户的青睐。然而,随着健康意识的提升,长时间佩戴入耳式耳机所带来的健康隐患日益受到关注。正是在这样的背景下,骨传导耳机凭借其独特的非入耳式设计&#…

iMeta: 南医大余光创组ggtree最新文章-系统发育树存储与可视化的数据结构

Ggtree:用于系统发育树及相关数据存储与可视化的数据结构 https://onlinelibrary.wiley.com/doi/10.1002/imt2.56 SHORT COMMUNICATION ● 2022年9月28日,南方医科大学基础医学院余光创团队在iMeta在线发表了题为“Ggtree: a serialized data object f…

UOS系统下Java执行权限问题

在程序部署中,出现 /bin/java 权限不足 问题,这个问题是由于java文件无运行权限导致,通过 sudo chmod ax bin/java 项目中需要展示系统当前所有运行程序窗口界面截图功能,这个功能在实现时通过 import 截图可获取界面图片&…

【Story】国际标准组织及其相关信息(全)

目录 1. ISO(International Organization for Standardization)2. IEC(International Electrotechnical Commission)3. ITU(International Telecommunication Union)4. ISO/IEC 合作标准5. IEEE&#xff08…

使用ChatGPT7小时完成高分论文写作,AI写作避坑全攻略指南

大家好,感谢关注。我是七哥,一个在高校里不务正业,折腾学术科研AI实操的学术人。关于使用ChatGPT等AI学术科研的相关问题可以和作者七哥(yida985)交流,多多交流,相互成就,共同进步,为大家带来最酷最有效的智能AI学术科研写作攻略。经过数月爆肝,终于完成学术AI使用教…

探索前沿的WebGIS开发技术:新中地教育限时福利课程免费分享

随着新学期的到来,新中地教育特别推出了限时免费领取课程合集活动,领取截止时间9月9日。为广大GIS学习者和爱好者提供一个宝贵的学习机会。此次活动旨在鼓励更多人加入到地理信息系统(GIS)技术的学习中来,掌握前沿的We…

NYNQ u-boot+kernel+rootfs.ext4的构造

其中u-boot位与NoFlash中内核和根文件系统位于emmc中 具体描述: 基于上表,在进行内存地址分配将会事半功倍。

嵌入式在线商城

一、主线功能 1、设计与实现在线商城系统涉及到前端展示、后台管理以及数据库进行查找,功能包含登录页面、商品搜素、商品详细信息查找。 二、页面设计 2.1、商品搜索设计 2.2、商品详细信息展示设计 2.3、TCP并发服务器设计 HTTP是基于Tcp服务器搭建起来的 第一…

【Hadoop|HDFS篇】HDFS的Shell操作

1. 基本语法 hadoop fs 具体命令或者hadoop dfs 具体命令。 两个是完全相同的。 2. 命令大全 hadoop fs&#xff1a; Usage: hadoop fs [generic options][-appendToFile <localsrc> ... <dst>][-cat [-ignoreCrc] <src> ...][-checksum <src> ..…

Robotics: computational motion planning 部分笔记—— week 1 graph-based

grassfire algorithm 四周扩散性&#xff1b;从终点开始按照相邻最小距离格子移动 Dijkstra’s Algorithm 标明从起点开始的所有点的最短距离&#xff08;从上一节点继承&#xff09;&#xff0c;直到终点 A* Algorithm 带有启发性的&#xff0c;给出距离估计&#xff0c…

大数据-117 - Flink DataStream Sink 案例:写出到MySQL、写出到Kafka

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

LLM常见问题(RAG部分)

1. 什么是 Graph RAG&#xff1f; Graph RAG 是由悦数图数据提出的概念&#xff0c;是一种基于知识图谱的检索增强技术&#xff0c;通过构建图模型的知识表达&#xff0c;将实体和关系之间的联系用图的形式进行展示&#xff0c;然后利用大语言模型 LLM进行检索增强。 通过图技…