链载Ai

标题: RAG实践|Rerank如何提升LLM查询效率与准确性 [打印本页]

作者: 链载Ai    时间: 4 小时前
标题: RAG实践|Rerank如何提升LLM查询效率与准确性

本文的核心议题是RAG中Rerank技术及其在提升语言模型(LLM)查询效率与准确性方面的应用。Rerank策略能够在不削弱查询精确度的前提下,实现实质上的查询加速效果,甚至有可能增强查询结果的准确性。该技术通过从给定的上下文中筛选并移除无关节点,同时对剩余的相关节点进行重新排序,从而达到优化查询性能的目的。

点关注不迷路

背景

二阶段检索器(Two-stage Retriever)

检索模块对RAG最终问答正确率和用户体验影响很大,获得“善解人意”的高效检索器成为重要的研究方向。一个好的检索器的评判标准是:

"离线Embedding" 搭配 "在线Reranker"

二阶段检索包含召回精排两个阶段,因其很好地平衡了检索性能和效率,成为RAG流程中的常用选择。

在召回阶段,利用密集向量检索技术,通过Embedding模型(采用dual-encoder的架构)离线处理知识库来提取语义向量,随后匹配用户问题的向量以寻找相关背景信息。这种方法效率高,但可能牺牲部分检索精度,因为它缺乏用户查询与知识库内容间的实时交互。

精排阶段引⼊cross-encoder架构,如Reranker模型,实现用户问题与知识库语料的在线语义交互,从而更精确地判定语义关联,提升检索质量,尽管这会牺牲一些效率。

结合两阶段策略,召回快速筛选相关片段,精排则进一步优化排序并剔除低质内容,平衡了效率与效果,对于大型知识库应用尤为重要。随着数据量增长,二阶段检索能有效应对信息质量参差不齐的挑战,通过Reranker模型在Embedding初筛基础上进行精细优化,确保知识库扩容同时问答质量提升。

为了优化问答体验,召回环节应广泛召回可能相关的片段,而精排环节则专注于提升结果相关性和过滤无关内容。BCEmbedding作为双阶段检索解决方案,Embedding专注离线广泛召回,Reranker负责在线精确排序与过滤。

Embedding模型(双编码器结构)在离线处理时缺乏query与passage间的信息交流,性能受限。而Reranker的交叉编码器设计支持在线交互,灵活性和性能潜力更高,更适合复杂度高的精排任务。

为减轻Embedding负担并优化其性能,合理设计标签分配策略至关重要。这不仅需贴合业务目标,还应考虑实际应用场景与学术研究设定间的差异,确保模型特性与任务需求相匹配,从而有效提升模型效率和效果。

评测相关

BCEmbedding项目设计思路

Embedding负责尽可能召回,让Reranker这种上限高的角色来做精排这种困难任务。bce-embedding-base_v1和bce-reranker-base_v1的组合拳可以实现最好的检索效果。

评测配置

(纯中文、多领域LlamaIndex RAG评测):先Embedding召回top10片段,再由Reranker精排,最后取top5片段算指标。

结论

Reranker模型意义

Reranker模型与Embedding模型的区别在于,前者直接接收问题和文档作为输入,输出它们之间的相似度分数,而非向量表示。这种模型通过交叉熵损失函数优化,产生的相关性分数无范围限制,能够更直观反映真实语义关联强度。特别地,bge-reranker-base_v1模型适用于中英文双语环境的精排任务,其输出的分数不仅能辅助段落排序,还能有效辨识并过滤低质量内容,为基于语言模型的问答系统(如RAG)提供更纯净的上下文信息,显著提升回答质量。

至于EmbeddingModel,它具备中英双语及跨语言检索能力,而RerankerModel更进一步,单一模型就能处理中英日韩四种语言的跨语种语义精排,增强了多语言环境下的性能。这两种模型联合,凭借广泛的应用领域覆盖,包括教育、医疗、法律、金融、科研、客服和通用问答等,为RAG系统的多样化应用场景奠定了坚实基础。

官方使用指南

开源二阶段检索模型EmbeddingModel(bce-embedding-base_v1)和RerankerModel(bce-reranker-base_v1),可免费商用。同时提供一个配套的模型使用算法库BCEmbedding:

调研实践

1.创建一个conda环境并激活
condacreate--namebcepython=3.10-y
condaactivatebce
2.项目源码安装
gitclonegit@github.com:netease-youdao/BCEmbedding.git
cdBCEmbedding
pipinstall-v-e.

3.本次实践以[基于BCEmbedding实现Rerank]为例。
通过 BCEmbedding调用 EmbeddingModel。pooler默认是 cls。
通过 BCEmbedding调用 RerankerModel可以计算句子对的语义相关分数,也可以对候选检索见过进行排序。

代码实现:

fromflaskimportFlask,request,jsonify
importtime
importlogging
fromBCEmbeddingimportRerankerModel
importjson

app=Flask(__name__)

logging.basicConfig(level=logging.INFO,format='%(asctime)s-%(levelname)s-%(message)s')

#Loadthemodeloncewhentheapplicationstarts
start_time=time.time()
model=RerankerModel(model_name_or_path="models/maidalun/bce-reranker-base_v1")
end_time=time.time()
logging.info(f"Modelloadedin{end_time-start_time:.2f}seconds")

@app.route('/rerank',methods=['OST'])
defrerank():
start_time=time.time()

#GetdatafromthePOSTrequest
data=request.get_json()
query=data.get('query','')
slices=data.get('slices',[])

ifnotqueryornotslices:
returnjsonify({"error":"Both'query'and'slices'arerequired."}),400

try:
#Calculatescoresorrerankslices
rerank_results=model.rerank(query,slices)

end_time=time.time()
logging.info(f"Rerankingcompletedin{end_time-start_time:.2f}seconds")

returnjsonify(rerank_results),200
exceptExceptionase:
logging.error(f"Errorduringreranking:{e}")
returnjsonify({"error":"Anerroroccurredduringreranking."}),500

if__name__=='__main__':
app.run(host="0.0.0.0",port=5000,debug=False)
注意:

在RerankerModel.rerank方法中,我们提供一个query和passage的拼接方法(在实际生产服务中使用),可适用于passage很长的情况。






欢迎光临 链载Ai (https://www.lianzai.com/) Powered by Discuz! X3.5