微信扫码
与创始人交个朋友
我要投稿
为什么要用Reranking
公司内部使用自研RAG系统支持业务工作已经有几个月时间,从最开始大家指出系统存在两点问题(这有问题,那也有问题),逐步优化到现在成为生产力工具。主要针对流程节点中优化了Prompt、Chunk分块策略、元数据过滤、检索策略等方面。但依然会被吐槽输出差强人意,最主要是检索的内容不够精准,当然这也跟我们知识库的内容复杂宽泛有关系。
另一个问题是ElasticSearch(ES),是的,我们使用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) :这些重排序模型会分析用户提出的查询与文档之间的交互特征,以便更准确地评估它们之间的相关性。例如网易有道BCEmbedding、Jina Reranker、Cohere reranker
2.LLM:通过使用 LLM 深入理解整个文档和用户提出的查询,可以更全面地捕捉语义信息,并对文档进行排序。现有的涉及 LLM 的重排序方法大致可分为三类:对 LLM 进行 fine-tuning,使其专门针对重排序任务进行训练、使用 Prompt 的方式引导 LLM 进行重排序以及利用 LLM 生成的数据来增强训练集,从而提高重排序模型的性能。
BCEmbedding介绍
BCEmbedding(Bilingual and Crosslingual Embedding, BCEmbedding)网易有道开源的算法模型库,包括检索模型 EmbeddingModel(bce-embedding-base_v1)和重排序模型 RerankerModel(bce-reranker-base_v1)本地部署,可免费商用。
其他特性:
EmbeddingModel 和 RerankerModel 可支持 BCEmbedding,transformers,sentence-transformers 框架推理模型。
提供 LangChain和 LlamaIndex的集成接口,可方便集成到现有基于 LangChain 或 LlamaIndex 的 RAG 产品中。
RerankerModel 提供 rerank 方法,可以支持长 passages(token 数超过 512)的精排。
RerankerModel 提供 rerank 方法,可以提供有意义的 query 和 passage 的语义相关分数(0~1),可用于在精排,进一步过滤低质量 passage,减少无关信息对 LLM 问答的干扰。
非常贴心,几乎可以轻松集成到自己的项目中。
以下是官方提供的集成LangChain样例代码,原有一些包路径已经过时LangChain做了迁移的,我已经做了修改。另一个需要注意的点,代码中需要下载Huggingface的模型,这个需要上外网,而且这个BCEmbedding的模型库需要验证才能下载,比较麻烦。最好的情况是把模型git clone到本地,然后修改embedding_model_name为本地的路径。
#python
# 我们在`BCEmbedding`中提供langchain直接集成的接口。
from BCEmbedding.tools.langchain import BCERerank
from langchain_community.vectorstores import FAISS
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import PyPDFLoader
from langchain_community.embeddings.huggingface import HuggingFaceEmbeddings
from langchain_community.vectorstores.utils import DistanceStrategy
from langchain.retrievers.contextual_compression import ContextualCompressionRetriever
# init embedding model
embedding_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 documents
documents = 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 reranker
retriever = 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的二段式,多了额外的步骤,必然会带来额外的处理时间。基于重排序模型的相对还好一些,LLM的Reranking性能损耗会更大,特别是对比原来向量检索就毫秒级的返回,体验就非常明显。
2.成本提升,不管是本地部署的服务器成本,还是商业化的在线服务调用,都需要额外成本。而且每次可能都是要从检索出来的top_50文档筛选出top_5,计算量远大于原来的单段式。
Reranking 在那些对回答的精确度和相关性要求极高的场合中比较有高价值,比如专业的知识库查询或者客户服务系统等。在这些应用场景中,查询往往关乎重大的商业利益,要求严谨,因此,提高回答的精确度是最重要的考量,其重要性超过了对系统性能要求和成本控制。Reranking 的应用能够带来更准确的答案,从而显著增强用户满意度。
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-03-30
2024-04-26
2024-05-10
2024-04-12
2024-05-28
2024-05-14
2024-04-25
2024-07-18
2024-04-26
2024-05-06
2024-12-22
2024-12-21
2024-12-21
2024-12-21
2024-12-21
2024-12-20
2024-12-20
2024-12-19