微信扫码
与创始人交个朋友
我要投稿
本文的核心议题是RAG中Rerank技术及其在提升语言模型(LLM)查询效率与准确性方面的应用。Rerank策略能够在不削弱查询精确度的前提下,实现实质上的查询加速效果,甚至有可能增强查询结果的准确性。该技术通过从给定的上下文中筛选并移除无关节点,同时对剩余的相关节点进行重新排序,从而达到优化查询性能的目的。
检索模块对RAG最终问答正确率和用户体验影响很大,获得“善解人意”的高效检索器成为重要的研究方向。一个好的检索器的评判标准是:
二阶段检索包含召回和精排两个阶段,因其很好地平衡了检索性能和效率,成为RAG流程中的常用选择。
在召回阶段,利用密集向量检索技术,通过Embedding模型(采用dual-encoder的架构)离线处理知识库来提取语义向量,随后匹配用户问题的向量以寻找相关背景信息。这种方法效率高,但可能牺牲部分检索精度,因为它缺乏用户查询与知识库内容间的实时交互。
精排阶段引⼊cross-encoder架构,如Reranker模型,实现用户问题与知识库语料的在线语义交互,从而更精确地判定语义关联,提升检索质量,尽管这会牺牲一些效率。
结合两阶段策略,召回快速筛选相关片段,精排则进一步优化排序并剔除低质内容,平衡了效率与效果,对于大型知识库应用尤为重要。随着数据量增长,二阶段检索能有效应对信息质量参差不齐的挑战,通过Reranker模型在Embedding初筛基础上进行精细优化,确保知识库扩容同时问答质量提升。
为了优化问答体验,召回环节应广泛召回可能相关的片段,而精排环节则专注于提升结果相关性和过滤无关内容。BCEmbedding作为双阶段检索解决方案,Embedding专注离线广泛召回,Reranker负责在线精确排序与过滤。
Embedding模型(双编码器结构)在离线处理时缺乏query与passage间的信息交流,性能受限。而Reranker的交叉编码器设计支持在线交互,灵活性和性能潜力更高,更适合复杂度高的精排任务。
为减轻Embedding负担并优化其性能,合理设计标签分配策略至关重要。这不仅需贴合业务目标,还应考虑实际应用场景与学术研究设定间的差异,确保模型特性与任务需求相匹配,从而有效提升模型效率和效果。
Embedding负责尽可能召回,让Reranker这种上限高的角色来做精排这种困难任务。bce-embedding-base_v1和bce-reranker-base_v1的组合拳可以实现最好的检索效果。
(纯中文、多领域LlamaIndex RAG评测):先Embedding召回top10片段,再由Reranker精排,最后取top5片段算指标。
Reranker模型与Embedding模型的区别在于,前者直接接收问题和文档作为输入,输出它们之间的相似度分数,而非向量表示。这种模型通过交叉熵损失函数优化,产生的相关性分数无范围限制,能够更直观反映真实语义关联强度。特别地,bge-reranker-base_v1模型适用于中英文双语环境的精排任务,其输出的分数不仅能辅助段落排序,还能有效辨识并过滤低质量内容,为基于语言模型的问答系统(如RAG)提供更纯净的上下文信息,显著提升回答质量。
至于EmbeddingModel,它具备中英双语及跨语言检索能力,而RerankerModel更进一步,单一模型就能处理中英日韩四种语言的跨语种语义精排,增强了多语言环境下的性能。这两种模型联合,凭借广泛的应用领域覆盖,包括教育、医疗、法律、金融、科研、客服和通用问答等,为RAG系统的多样化应用场景奠定了坚实基础。
开源二阶段检索模型EmbeddingModel(bce-embedding-base_v1)和RerankerModel(bce-reranker-base_v1),可免费商用。同时提供一个配套的模型使用算法库BCEmbedding:
1.创建一个conda环境并激活
conda create --name bce python=3.10 -y
conda activate bce
2.项目源码安装
git clone git@github.com: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很长的情况。
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-07-18
2024-05-05
2024-06-20
2024-05-19
2024-09-04
2024-07-09
2024-07-09
2024-07-07
2024-07-07
2024-07-08
2024-12-21
2024-12-14
2024-12-01
2024-11-27
2024-11-25
2024-11-06
2024-11-06
2024-11-05