让RAG更进一步的利器:教你使用两种出色的Rerank排序模型

在高级RAG的应用中,常常会有一些“检索后处理(Post-Retrieval)”的环节。顾名思义,这是在检索出输入问题相关的多个Chunk后,在交给LLM合成答案之前的一个处理环节。在这个环节中,可以做一些诸如相似度过滤、关键词过滤、chunk内容替换等处理。其中,**Rerank(重排序)**是一种常见的,也是在RAG应用优化中很常见的一种技术处理环节。

简单的说,Rerank就是对检索出来的多个chunks(或者nodes)列表进行重新排序,使得其排名与用户输入问题的相关性更匹配,使得更相关、更准确的chunk排名更靠前,从而在 LLM生成时能够被优先考虑以提高输出质量。

那么,有了基于向量索引与语义相似度的检索,为什么还需要Rerank?

  • RAG应用中有多种索引类型,很多索引技术并非基于语义与向量构建,其检索的结果希望借助独立的Rerank实现语义重排

  • 在一些复杂RAG范式中,很多时候会使用多路混合检索来获取更多相关知识;这些来自不同源、不同检索算法的chunks要借助Rerank做重排

  • 即使是完全基于向量构建的索引,由于不同的嵌入模型、相似算法、语言环境、领域知识特点等影响,其语义检索的相关度排序也可能发生较大的偏差;此时借助独立的Rerank模型做纠正也非常有意义

Rerank通常需要借助于独立的算法或模型来实现。本文将实践与推荐两种被广泛使用的优秀Rerank模型:

  • **在线模型 - Cohere Rerank模型
    **

  • 本地模型 - bge-reranker-large模型

Cohere Rerank模型

Cohere Rerank是一个商业闭源的Rerank模型。它根据与指定查询问题的语义相关性对多个文本输入进行排序,专门用于帮助关键词或向量搜索返回的结果做重新排序与提升质量。

为了使用Cohere Rerank,你首先需要在官方网站(https://cohere.com/)注册后申请测试的API-key(测试使用免费):

Cohere Rerank的使用非常简单,通常在LangChain与LlamaIndex框架中也会集成其SDK的使用。现在我们使用如下测试代码,来对比在Rerank之前和之后的chunk节点的排序区别(代码基于LlamaIndex框架构建,并利用其内置的cohere_rerank检索后处理器组件,这里使用了一段关于百度文心一言的介绍文档构建上下文知识库):


 from llama\_index.postprocessor.cohere\_rerank import CohereRerank

`.....``#使用默认的嵌入模型构造向量索引   docs = SimpleDirectoryReader(input_files=["../../data/yiyan.txt"]).load_data()   nodes = SentenceSplitter(chunk_size=100,chunk_overlap=0).get_nodes_from_documents(docs)   vector_index = VectorStoreIndex(nodes)      #检索器``retriever =vector_index.as_retriever(similarity_top_k=5)``   #不借助cohere rerank,直接检索出结果   nodes = retriever.retrieve("百度文心一言的逻辑推理能力怎么样?")   print('================before rerank================')   print_nodes(nodes)      #借助cohere rerank模型重排结果   cohere_rerank = CohereRerank(model='rerank-multilingual-v3.0',api_key='***', top_n=2)   rerank_nodes = cohere_rerank.postprocess_nodes(nodes,query_str='百度文心一言的逻辑推理能力怎么样?')   print('================after rerank================')   print_nodes(rerank_nodes)`

首先看不经过Rerank重排、直接向量检索的排序结果:

这里只打印了排名前两位的chunk节点内容,用来和后面Rerank之后的排名做对比。现在再看下经过Cohere Rerank模型重新排序后的前两名:

有意思的是,这里的前两名的排名结果刚好和未经过Rerank之前的排名相反!从chunk节点的内容与相应的评分(score)也能看出来,在调用Cohere Rerank之后,节点内容的相关性和其对应的评分更加匹配,排序也更加合理。这种更加合理的排名一方面有利于LLM生成更准确的回复;另一方面也可以帮助降低top_K数量,以节约上下文空间。

如果你不使用LlamaIndex,也可以导入官方cohere模块使用,这可以很方便的插入到你现有的各种应用代码中:

import cohere  
co = cohere.Client(api_key="<YOUR API KEY>")  
query = "你的问题..."  
docs = ["相关文档1...","相关文档2...","相关文档3...",...]  
results = co.rerank(model="rerank-multilingual-v3.0", query=query, documents=docs, top_n=5, return_documents=True)

注意如果需要中文支持,必须使用rerank-multilingual-v3.0模型。

bge-reranker-large模型

bge-reranker-large是国内智源开源的一个被广泛使用的Rerank模型,在众多的模型测试中有着非常优秀的成绩。为了使用这个Rerank模型,我们使用HuggingFace 的TEI来本地化部署这个模型并提供服务。在安装与部署TEI后,在命令行执行如下命令可自动下载该模型并启动TEI服务:

model=BAAI/bge-reranker-large  
text-embeddings-router --model-id $model --port 8080

TEI,是HuggingFace 推出的开源 Text Embedding Inherence工具的简称,该工具主要是以部署 Embedding 模型为主(注意TEI本身不是模型,而是类似Ollama的模型部署工具),同时也支持 Rerank 模型的部署。在Mac上的基本安装过程如下(其他平台请参考官方文档):

由于TEI使用了FastAPI规范暴露API接口,因此可以在浏览器中访问:http://localhost:8080/docs/查看当前TEI暴露的接口文档,甚至可以直接测试Rerank接口:

‍‍‍

现在可以开始设计使用该本地的Rerank服务做重排序。由于LlamaIndex目前并没有直接内置集成使用该模型的组件,因此无法像Cohere Reranker那样快速集成。这里我们创建一个自定义的检索后处理器,来实现基于TEI与bge-reranker-large模型的Rerank方法,完整代码如下:

import requests   from typing import List, Optional   from llama_index.core.bridge.pydantic import Field, PrivateAttr   from llama_index.core.postprocessor.types import BaseNodePostprocessor   from llama_index.core.schema import NodeWithScore, QueryBundle``class BgeRerank(BaseNodePostprocessor):       url: str = Field(description="Rerank server url.")       top_n: int = Field(description="Top N nodes to return.")          def __init__(self,top_n: int,url: str):           super().__init__(url=url, top_n=top_n)         #调用TEI的rerank模型服务,实现rerank方法       def rerank(self, query, texts):           url = f"{self.url}/rerank"           request_body = {"query": query, "texts": texts, "truncate": False}           response = requests.post(url, json=request_body)           if response.status_code != 200:               raise RuntimeError(f"Failed to rerank, detail: {response}")           return response.json()          @classmethod       def class_name(cls) -> str:           return "BgeRerank"         #实现LlamaIndex要求的postprocessor的接口       def _postprocess_nodes(           self,           nodes: List[NodeWithScore],           query_bundle: Optional[QueryBundle] = None,       ) -> List[NodeWithScore]:           if query_bundle is None:               raise ValueError("Missing query bundle in extra info.")           if len(nodes) == 0:               return []             #调用rerank           texts = [node.text for node in nodes]           results = self.rerank(               query=query_bundle.query_str,               texts=texts,           )             #组装返回nodes           new_nodes = []           for result in results[0 : self.top_n]:               new_node_with_score = NodeWithScore(                   node=nodes[int(result["index"])].node,                   score=result["score"],               )               new_nodes.append(new_node_with_score)           return new_nodes

构建好这个自定义的检索后处理器后,就可以像之前使用Cohere Rerank一样使用它,我们只需要把上一节的例子稍作修改即可:

......  
#创建自定义的检索后处理器  
customRerank = BgeRerank(url="http://localhost:8080",top_n=2)  
  
#测试处理节点  
rerank_nodes = customRerank.postprocess_nodes(nodes,query_str='百度文心一言的逻辑推理能力怎么样?')  
......

在上面相同用例的情况下,最后输出重新排序的节点信息如下,可以看到,这里的排序结果和上一节使用的Cohere Rerank模型很类似:

现在你就拥有了一个本地部署的强大的Rerank模型服务!

结束语

上面简单介绍了两种很出色的Rerank模型的使用,其中Cohere Rerank是一种商业在线的模型方案;而另外一种更具实用价值、且开源可部署在本地的是bge-reranker-large模型,由于其对资源要求较低,借助TEI工具你可以在本机或企业内部环境轻松部署,用来对自有RAG应用提供服务。

尽管Rerank在RAG管道中所处的环节似乎没有检索(Retrieval)或者生成(Generation)那么重要和必须,但由于其实现简单、资源要求较低、且不依赖于嵌入模型,但是却能够很好的改善最终生成的质量,用较小的代价让你的RAG应用百尺竿头,更进一步;此外Rerank也是一些高级检索的必要步骤,比如之前介绍的融合检索。因此有兴趣的朋友不妨一试,或许能带来意想不到的惊喜!

可能大家都想学习AI大模型技术,也想通过这项技能真正达到升职加薪,就业或是副业的目的,但是不知道该如何开始学习,因为网上的资料太多太杂乱了,如果不能系统的学习就相当于是白学。为了让大家少走弯路,少碰壁,这里我直接把全套AI技术和大模型入门资料、操作变现玩法都打包整理好,希望能够真正帮助到大家。

👉AI大模型学习路线汇总👈
大模型学习路线图,整体分为7个大的阶段:(全套教程文末领取哈)
在这里插入图片描述

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

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

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

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

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

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

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

👉大模型实战案例👈
光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
在这里插入图片描述

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

在这里插入图片描述

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

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

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

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

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

在这里插入图片描述

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

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

相关文章

6月17日(周一),AH 股行情总结

AI手机及苹果概念股全日走强&#xff0c;领益智造、山东精密等多股涨停&#xff0c;立讯精、歌尔股份涨逾6% 。新车型秦L销售预期提振股价&#xff0c;比亚迪涨超1% &#xff1b;航运、煤炭、地产板块下跌。 文章正文 周一&#xff0c;A股低开高走&#xff0c;上证指数收跌0.…

宝塔安装了redis但是远程无法连接

服务器&#xff1a;阿里云 宝塔版本&#xff1a;8.0.5 redis版本&#xff1a;7.2.4 操作步骤&#xff1a; 1.在阿里云上开放redis端口&#xff1a;6379 2.在宝塔上开发端口 3.修改redis配置文件&#xff1a; 修改一&#xff1a; 注释&#xff1a;bind 127.0.0.1&#xff0c;…

Cisco Packet Tracer实验(五)不同vlan间的通信简单配置

1&#xff0e;单臂路由(图) 环境&#xff1a;一台路由器&#xff0c;一台二层交换机&#xff0c;两台pc机 单臂路由&#xff08;Single Arm Routing&#xff09;是指在网络架构中&#xff0c;只有一个物理接口&#xff08;单臂&#xff09;连接到路由器三层交换机&#xff0c;而…

Oracle--数据字典

1.介绍 数据字典是Oracle存储数据库内部信息的地方&#xff0c;描述了数据库内部的运行和管理情况 Oracle数据字典的名称由前缀和后缀组成&#xff0c;使用下划线_连接&#xff1a; dba_&#xff1a;包含数据库实例的所有对象信息v$_&#xff1a;当前实例的动态视图&#xff0…

成功案例(IF=5.7)| mNGS预测小儿重症肺炎患者抗菌素耐药性

01 研究背景 抗菌素耐药性&#xff08;AMR&#xff09;是对儿童健康的一个主要威胁&#xff0c;由于过度或不适当地使用抗生素&#xff0c;与呼吸道感染相关的抗菌素耐药性发病率的增加已成为一个日益关注的临床问题。因此&#xff0c;准确识别病原体和抗菌素耐药性是靶向抗生…

玩转nRF52840-DK开发套件(2)

介绍如何在Windows操作系统上使用Arm Keil MDK。Arm Keil MDK附带Arm C/C编译器和Vision集成开发环境&#xff08;IDE&#xff09;&#xff0c;以及所有nRF5SDK的版本提供了现成的Keil项目。 1. 安装最新的 nRF5 SDK. 链接&#xff1a;nRF5 SDK - nordicsemi.com 点击Download&…

PadleOcr SVTR训练环境搭建

1.环境搭建 1.1conda创建虚拟环境 confa create -n PaddleOcr --clone base 若出现 使用命令 source activate 然后再conda activate PaddleOcr 虚拟环境搭建完成。 1.2.若出现Config use_gpu cannot be set as true while your paddle is not compiled with cuda ! 需…

Java:113-Spring Data JPA详解

Spring Data JPA详解 Spring Data Jpa 是应用于Dao层的⼀个框架&#xff0c;简化数据库开发的&#xff0c;作用和Mybatis框架⼀样&#xff0c;但是在使用方式和底层机制是有所不同的&#xff0c;最明显的⼀个特点&#xff0c;Spring Data Jpa 开发Dao的时候&#xff0c;很多场景…

从手动到自动再到智能,IT运维的进击之路

过去十年&#xff0c;科技化进程飞速发展&#xff0c;作为保障企业信息安全运行的运维行业&#xff0c;从手动发展到自动&#xff0c;又从自动发展到智能&#xff0c;IT运维也从原来的辅助角色逐渐变成了业务推动。 手动——自动——智能的发展 以银行用户为例&#xff0c;最初…

月球全月地质图和4.5亿像素月面标注地图

嫦娥六号都在月球挖到土特产了&#xff0c;那你知道月球到底长什么样子吗&#xff1f; 现在我们就为你分享一下月球的全月地质图&#xff0c;以及4.5亿像素月面带标注的地图&#xff0c;你可以在文末查看该数据的领取方法。 月球全月地质图 对于月球的探索&#xff0c;美国和…

OAuth 2.0:现代应用程序的授权标准

前言 随着互联网和移动应用的发展&#xff0c;应用程序之间的交互变得越来越普遍。用户希望通过单一的身份认证在多个平台上无缝体验&#xff0c;这就要求不同的应用程序能够安全地共享用户数据。而 OAuth 2.0 正是为了解决这一问题而设计的&#xff0c;它提供了一种标准机制&…

AI绘画界的赛博佛祖,开源最强SD3它来了!(整合包)

全网期待已久的SD3终于和大家见面了。这款以Stable Diffusion为基础&#xff0c;进一步优化和升级的模型&#xff0c;无疑将会深刻地又又又一次改变AI绘画界&#xff01; 这次发布的是Medium版本&#xff0c;在多个方面展现出惊人的能力和效率&#xff0c;堪称开源最强&#x…

[Python学习篇] Python列表

列表&#xff08;List&#xff09;&#xff1a;列表是可变的&#xff0c;这意味着你可以修改列表的内容&#xff0c;例如增加、删除或更改元素。列表使用方括号 [] 表示。列表可以一次性存储多个数据&#xff0c;且可以存不同数据类型。 语法&#xff1a; [数据1, 数据2, 数据3…

数字电路运算器分析

文章目录 1. 半加器 2. 加法器 3. 4位加法器 4. 半减器 5. 减法器 6. 4位减法器 1. 半加器 现在我们来考虑如何用电路来实现1位加法。假如有两个1位二进制数A、B&#xff0c;它们的和为1位二进制数S&#xff0c;那么存在下面几种情况&#xff1a; 如果A0&#xff0c;B…

ensp模拟器USG6000V1配置DCHP功能

接着上一篇配置&#xff0c;继续本篇的内容。开启DHCP功能非常简单&#xff0c;只需几个命令即可。实验拓扑图也非常简单&#xff0c;如下&#xff1a; 开启防火墙DHCP功能&#xff1a; [USG6000V1]dhcp enable 选择DHCP接口并设置接口IP地址&#xff0c;这里给g1/0/0配置2网…

【华为免费实战课】基于ENSP实现企业园区网组网项目实战

带你一起走进网工的世界&#xff01; 2024年G-LAB【华为实战公开课】即将开始啦&#xff01;华为实战千万别错过&#xff01; 公开课为期四天&#xff0c;6月18日-6月21日晚20&#xff1a;00开始 关注 工 仲 好&#xff1a;IT运维大本营&#xff0c;私信glab-mary&#xff0…

概率论拾遗

条件期望的性质 1.看成f(Y)即可 条件期望仅限于形式化公式&#xff0c;用于解决多个随机变量存在时的期望问题求解&#xff0c;即 E(?)E(E(?|Y))#直接应用此公式条件住一个随机变量&#xff0c;进行接下来的计算即可 定义随机变量之间的距离为&#xff0c;即均方距离 随机…

Go基础编程 - 09 - 通道(channel)

通道&#xff08;channel&#xff09; 1. 声明2. channel的操作3. 无缓冲通道4. 有缓冲通道5. 如何优雅的从通道循环取值6. 单向通道7. 异常总结 上一篇&#xff1a;结构体 Go语言的并发模式&#xff1a;不要通过共享内存来通信&#xff0c;而应该通过通信来共享内存。 Go语言…

cesium ClippingPolygon多边形裁切

1.多边形裁切 1.1 基本流程 cesium117版本添加了多边形裁切功能&#xff0c;本文分析源码&#xff0c;看看是如何处理的。多边形裁切的大概流程分为4部分: 通过经纬度坐标传入多个闭合的边界&#xff1b;将多个边界打包成两张纹理&#xff0c;一张是每个多边形的坐标&#xf…

Spring框架永远滴神之SpringAI玩转大模型

文章目录 一、SpringAI简介1.什么是SpringAI2.SpringAI支持的大模型类型&#xff08;1&#xff09;聊天模型&#xff08;2&#xff09;文本到图像模型&#xff08;3&#xff09;转录&#xff08;音频到文本&#xff09;模型&#xff08;4&#xff09;嵌入模型&#xff08;5&…