返回顶部
热门问答 更多热门问答
技术文章 更多技术文章

RAG实践|Rerank如何提升LLM查询效率与准确性

[复制链接]
链载Ai 显示全部楼层 发表于 5 小时前 |阅读模式 打印 上一主题 下一主题

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

点关注不迷路

背景

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

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

  • 1、尽可能召回用户问题所需的相关文本片段;
  • 2、越相关的、对回答问题越有帮助的片段,应该在越靠前的位置;
  • 3、过滤低质量文本片段;
"离线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片段算指标。

结论

  • 上述评测是多领域的、中英双语和跨语种的场景。如果你对中文、英文单语种评测感兴趣,请查看【中文RAG评测['zh']】和【英文RAG评测["en"]】。
  • 竖排对比,bce-embedding-base_v1的表现和之前一样,具备很好的效果,语种支持和领域覆盖都很不错。最新的openai-embed-3和bge-m3表现出顽强的性能,具备良好的多语种和跨语种能力,具备良好的领域泛化性。Cohere和e5的多语种embedding模型同样表现出不错的效果。而其他单语种embedding模型表现却不尽如人意(JinaAI-v2-Base-zh和bge-large-zh-v1.5稍好一些)。
  • 横排对比,reranker模块可以显著改善检索效果。其中CohereRerank和bge-reranker-large效果相当,bce-reranker-base_v1具备比前二者更好的精排能力。
  • 综上,bce-embedding-base_v1和bce-reranker-base_v1的组合可以实现最好的检索效果(93.46/77.02),比其他开源闭源最好组合(bge-m3-large+bge-reranker-large, 89.94/70.17),hit rate提升3.53%,mrr提升6.85%。
  • 评测是在["en", "zh", "en-zh", "zh-en"]设置下。
  • 在WithoutReranker设置下(竖排对比),bce-embedding-base_v1优于其他Embedding模型,包括开源和闭源。
  • 在固定Embedding模型设置下,对比不同reranker效果(横排对比),bce-reranker-base_v1比其他reranker模型效果都要好,包括开源和闭源。
  • bce-embedding-base_v1和bce-reranker-base_v1组合,表现SOTA。

Reranker模型意义

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

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

官方使用指南

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

  • EmbeddingModel和RerankerModel可支持BCEmbedding、transformers、sentence-transformers框架推理模型;
  • 提供LangChain和LlamaIndex的集成接口,可方便集成到现有基于LangChain或LlamaIndex的RAG产品中。
  • RerankerModel的rerank方法,可以支持长片段(512 ~ 32k tokens)的精排
  • RerankerModel的rerank方法,可以提供有意义的语义相关分数(0~1),可用于精排,进一步过滤低质量片段(推荐rerank分数阈值0.35~0.4),减少无关上下文对LLM问答的干扰,可以有效提高LLM回答质量。

调研实践

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是专业的生成式人工智能教程平台。提供Stable Diffusion、Midjourney AI绘画教程,Suno AI音乐生成指南,以及Runway、Pika等AI视频制作与动画生成实战案例。从提示词编写到参数调整,手把手助您从入门到精通。
  • 官方手机版

  • 微信公众号

  • 商务合作

  • Powered by Discuz! X3.5 | Copyright © 2025-2025. | 链载Ai
  • 桂ICP备2024021734号 | 营业执照 | |广西笔趣文化传媒有限公司|| QQ