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

AI 2个月前 admin
109 0 0

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

点关注RAG实践|Rerank如何提升LLM查询效率与准确性不迷路 
RAG实践|Rerank如何提升LLM查询效率与准确性

背景

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

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

  • 1、尽可能召回用户问题所需的相关文本片段;
  • 2、越相关的、对回答问题越有帮助的片段,应该在越靠前的位置;
  • 3、过滤低质量文本片段;
"离线Embedding" 搭配 "在线Reranker"

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

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

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

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

结合两阶段策略,召回快速筛选相关片段,精排则进一步优化排序并剔除低质内容,平衡了效率与效果,对于大型知识库应用尤为重要。随着数据量增长,二阶段检索能有效应对信息质量参差不齐的挑战,通过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实践|Rerank如何提升LLM查询效率与准确性
多领域,双语和跨语种RAG评测

结论

  • 上述评测是多领域的、中英双语和跨语种的场景。如果你对中文、英文单语种评测感兴趣,请查看【中文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%。
RAG实践|Rerank如何提升LLM查询效率与准确性
不同版本之间的评测
  • 评测是在["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环境并激活
conda create --name bce python=3.10 -y
conda activate bce
2.项目源码安装
git clone [email protected]:netease-youdao/BCEmbedding.git
cd BCEmbedding
pip install -v -e .

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

代码实现:

from flask import Flask, request, jsonify
import time
import logging
from BCEmbedding import RerankerModel
import json

app = Flask(__name__)

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

# Load the model once when the application starts
start_time = time.time()
model = RerankerModel(model_name_or_path="models/maidalun/bce-reranker-base_v1")
end_time = time.time()
logging.info(f"Model loaded in {end_time - start_time:.2f} seconds")

@app.route('/rerank', methods=['POST'])
def rerank():
    start_time = time.time()
    
    # Get data from the POST request
    data = request.get_json()
    query = data.get('query''')
    slices = data.get('slices', [])
    
    if not query or not slices:
        return jsonify({"error""Both 'query' and 'slices' are required."}), 400
    
    try:
        # Calculate scores or rerank slices
        rerank_results = model.rerank(query, slices)
        
        end_time = time.time()
        logging.info(f"Reranking completed in {end_time - start_time:.2f} seconds")
        
        return jsonify(rerank_results), 200
    except Exception as e:
        logging.error(f"Error during reranking: {e}")
        return jsonify({"error""An error occurred during reranking."}), 500

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

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

RAG实践|Rerank如何提升LLM查询效率与准确性
rerank推理测试
RAG实践|Rerank如何提升LLM查询效率与准确性
bce-reranker-base_v1推理平均响应时间0.2秒

引用

  • https://github.com/netease-youdao/BCEmbedding
  • https://huggingface.co/maidalun1020/bce-reranker-base_v1
  • https://www.modelscope.cn/models/maidalun/bce-reranker-base_v1
  • https://huggingface.co/BAAI/bge-reranker-v2-m3(微调模型)

关于我

欢迎关注,一起进步一起成长~

点关注RAG实践|Rerank如何提升LLM查询效率与准确性不迷路 

往期推荐

原文始发于微信公众号(老贾探AI):RAG实践|Rerank如何提升LLM查询效率与准确性

版权声明:admin 发表于 2024年6月26日 下午7:31。
转载请注明:RAG实践|Rerank如何提升LLM查询效率与准确性 | CTF导航

相关文章