AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


精益求精:探索重排序Reranking增强RAG系统
发布日期:2024-05-11 09:52:10 浏览次数: 3780 来源:Bear实验室


重排序(Reranking)技术是对检索增强生成(Retrieval Augmented Generation,RAG)系统的很好的补充优化。Reranking在后检索(Post-Retrieval)阶段对检索(Retrieval)的文档进行重排序,可以提高 RAG 系统的有效性和准确性,为最终的结果生成提供更精准的信息。还能扩大检索结果的丰富度,例如通过多路召回,并配合精细化筛选最相关结果。          
RAG分阶段可以参考下图:  

       

为什么要用Reranking

公司内部使用自研RAG系统支持业务工作已经有几个月时间,从最开始大家指出系统存在两点问题(这有问题,那也有问题),逐步优化到现在成为生产力工具。主要针对流程节点中优化了PromptChunk分块策略、元数据过滤、检索策略等方面。但依然会被吐槽输出差强人意,最主要是检索的内容不够精准,当然这也跟我们知识库的内容复杂宽泛有关系。          

另一个问题是ElasticSearchES),是的,我们使用ElasticSearch作为向量数据库。ES检索的速度足够满足需求,同时也支持全文搜索,但检索的相关度有些时候不够好,更准确的说应该是相关度不够。ES使用的分层可导航小世界(HNSW)算法来计算近似最近邻距离,这种算法的有点是速度快、效率高,但精度不够。          

这里说的精度不够也是个相对的说法,因为LLM上下文窗口大小的限制,我们只把检索出来top_5的文档给到LLM去生成内容。因此解决问题的思路就是检索出更多的内容,再通过另外一个模型对文档和用户查询做相关度评分,根据评分结果取top_5的数据给到LLM去生成内容。          

示例:相似度检索top_k=5,在重排序选择top_n=2


Reranking的技术原理

重排序是一个通过计算文档与查询的相似性得分,并据此重新排序文档的过程。具体到重排序的工作原理,可以从以下几个方面进行解释:    

1.计算嵌入向量:首先,对每个文档计算其嵌入向量。这一步通常涉及使用深度学习模型,如句子变换器(sentence-transformer),来捕捉文档内容的语义信息。

2.输出相似性得分:然后,使用一个交叉编码器或类似的模型,对给定的查询和文档对输出一个相似性得分。这个得分反映了文档与查询之间的相关性。

3.文档重排序:最后,根据这些相似性得分对检索到的文档进行重新排序。这样,最相关的文档会被置于较高的位置,从而提高检索结果的准确性和相关性。

         
重新排序器考虑查询和文档,以在完整的转换器推理步骤中产生单个相似性得分。请注意,这里的文档A相当于我们的查询。

重排序方法(Reranker)主要分为以下两种类型:

1.重排序模型(Reranking models :这些重排序模型会分析用户提出的查询与文档之间的交互特征,以便更准确地评估它们之间的相关性。例如网易有道BCEmbeddingJina RerankerCohere reranker

2.LLM:通过使用 LLM 深入理解整个文档和用户提出的查询,可以更全面地捕捉语义信息,并对文档进行排序。现有的涉及 LLM 的重排序方法大致可分为三类:对 LLM 进行 fine-tuning,使其专门针对重排序任务进行训练、使用 Prompt 的方式引导 LLM 进行重排序以及利用 LLM 生成的数据来增强训练集,从而提高重排序模型的性能。


BCEmbedding介绍

BCEmbeddingBilingual and Crosslingual EmbeddingBCEmbedding)网易有道开源的算法模型库,包括检索模型 EmbeddingModelbce-embedding-base_v1)和重排序模型 RerankerModelbce-reranker-base_v1)本地部署,可免费商用。         

其他特性:

  • EmbeddingModel RerankerModel 可支持 BCEmbedding,transformers,sentence-transformers 框架推理模型。

  • 提供 LangChain LlamaIndex的集成接口,可方便集成到现有基于 LangChain LlamaIndex RAG 产品中。 

  • RerankerModel 提供 rerank 方法,可以支持长 passagestoken 数超过 512)的精排。

  • RerankerModel 提供 rerank 方法,可以提供有意义的 query passage 的语义相关分数(01),可用于在精排,进一步过滤低质量 passage,减少无关信息对 LLM 问答的干扰。


Github仓库:https://github.com/netease-youdao/BCEmbedding

非常贴心,几乎可以轻松集成到自己的项目中。         

以下是官方提供的集成LangChain样例代码,原有一些包路径已经过时LangChain做了迁移的,我已经做了修改。另一个需要注意的点,代码中需要下载Huggingface的模型,这个需要上外网,而且这个BCEmbedding的模型库需要验证才能下载,比较麻烦。最好的情况是把模型git clone到本地,然后修改embedding_model_name为本地的路径。

#python# 我们在`BCEmbedding`中提供langchain直接集成的接口。from BCEmbedding.tools.langchain import BCERerank
from langchain_community.vectorstores import FAISSfrom langchain.text_splitter import RecursiveCharacterTextSplitterfrom langchain_community.document_loaders import PyPDFLoaderfrom langchain_community.embeddings.huggingface import HuggingFaceEmbeddingsfrom langchain_community.vectorstores.utils import DistanceStrategyfrom langchain.retrievers.contextual_compression import ContextualCompressionRetriever
# init embedding modelembedding_model_name = 'maidalun1020/bce-embedding-base_v1' #修改为本地路径embedding_model_kwargs = {'device': 'cuda:0'}embedding_encode_kwargs = {'batch_size': 32, 'normalize_embeddings': True}
embed_model = HuggingFaceEmbeddings( model_name=embedding_model_name, model_kwargs=embedding_model_kwargs, encode_kwargs=embedding_encode_kwargs)
reranker_args = {'model': 'maidalun1020/bce-reranker-base_v1', 'top_n': 5, 'device': 'cuda:1'} #修改为本地路径reranker = BCERerank(**reranker_args)
# init documentsdocuments = PyPDFLoader("BCEmbedding/tools/eval_rag/eval_pdfs/Comp_en_llama2.pdf").load()text_splitter = RecursiveCharacterTextSplitter(chunk_size=1500, chunk_overlap=200)texts = text_splitter.split_documents(documents)
# example 1. retrieval with embedding and rerankerretriever = FAISS.from_documents(texts, embed_model, distance_strategy=DistanceStrategy.MAX_INNER_PRODUCT).as_retriever(search_type="similarity", search_kwargs={"score_threshold": 0.3, "k": 10})
compression_retriever = ContextualCompressionRetriever( base_compressor=reranker, base_retriever=retriever)
response = compression_retriever.get_relevant_documents("What is Llama 2?")print(response)

Reranking的不足之处

凡事都有两面性,作为RAG系统的一项优化技术,在生成内容的精准度方面带来提升,但也会带来其他的问题:

1.性能降低,相比于原来单段式的流程,增加了Reranking的二段式,多了额外的步骤,必然会带来额外的处理时间。基于重排序模型的相对还好一些,LLMReranking性能损耗会更大,特别是对比原来向量检索就毫秒级的返回,体验就非常明显。

2.成本提升,不管是本地部署的服务器成本,还是商业化的在线服务调用,都需要额外成本。而且每次可能都是要从检索出来的top_50文档筛选出top_5,计算量远大于原来的单段式。

Reranking 在那些对回答的精确度和相关性要求极高的场合中比较有高价值,比如专业的知识库查询或者客户服务系统等。在这些应用场景中,查询往往关乎重大的商业利益,要求严谨,因此,提高回答的精确度是最重要的考量,其重要性超过了对系统性能要求和成本控制。Reranking 的应用能够带来更准确的答案,从而显著增强用户满意度。

         

 

   


53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询