本文的核心议题是RAG中Rerank技术及其在提升语言模型(LLM)查询效率与准确性方面的应用。Rerank策略能够在不削弱查询精确度的前提下,实现实质上的查询加速效果,甚至有可能增强查询结果的准确性。该技术通过从给定的上下文中筛选并移除无关节点,同时对剩余的相关节点进行重新排序,从而达到优化查询性能的目的。
![RAG实践|Rerank如何提升LLM查询效率与准确性 RAG实践|Rerank如何提升LLM查询效率与准确性](https://ctfiot.oss-cn-beijing.aliyuncs.com/uploads/2024/06/0-1719407841.gif)
![RAG实践|Rerank如何提升LLM查询效率与准确性 RAG实践|Rerank如何提升LLM查询效率与准确性](https://ctfiot.oss-cn-beijing.aliyuncs.com/uploads/2024/06/10-1719407842.png)
背景
二阶段检索器(Two-stage Retriever)
检索模块对RAG最终问答正确率和用户体验影响很大,获得“善解人意”的高效检索器成为重要的研究方向。一个好的检索器的评判标准是:
-
1、尽可能召回用户问题所需的相关文本片段; -
2、越相关的、对回答问题越有帮助的片段,应该在越靠前的位置; -
3、过滤低质量文本片段;
"离线Embedding" 搭配 "在线Reranker"
二阶段检索包含召回和精排两个阶段,因其很好地平衡了检索性能和效率,成为RAG流程中的常用选择。
在召回阶段,利用密集向量检索技术,通过Embedding模型(采用dual-encoder的架构)离线处理知识库来提取语义向量,随后匹配用户问题的向量以寻找相关背景信息。这种方法效率高,但可能牺牲部分检索精度,因为它缺乏用户查询与知识库内容间的实时交互。
精排阶段引⼊cross-encoder架构,如Reranker模型,实现用户问题与知识库语料的在线语义交互,从而更精确地判定语义关联,提升检索质量,尽管这会牺牲一些效率。
![RAG实践|Rerank如何提升LLM查询效率与准确性 RAG实践|Rerank如何提升LLM查询效率与准确性](https://ctfiot.oss-cn-beijing.aliyuncs.com/uploads/2024/06/1-1719407843.png)
结合两阶段策略,召回快速筛选相关片段,精排则进一步优化排序并剔除低质内容,平衡了效率与效果,对于大型知识库应用尤为重要。随着数据量增长,二阶段检索能有效应对信息质量参差不齐的挑战,通过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实践|Rerank如何提升LLM查询效率与准确性](https://ctfiot.oss-cn-beijing.aliyuncs.com/uploads/2024/06/8-1719407844.png)
结论
-
上述评测是多领域的、中英双语和跨语种的场景。如果你对中文、英文单语种评测感兴趣,请查看【中文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查询效率与准确性 RAG实践|Rerank如何提升LLM查询效率与准确性](https://ctfiot.oss-cn-beijing.aliyuncs.com/uploads/2024/06/10-1719407845.png)
-
评测是在["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查询效率与准确性 RAG实践|Rerank如何提升LLM查询效率与准确性](https://ctfiot.oss-cn-beijing.aliyuncs.com/uploads/2024/06/6-1719407845.png)
![RAG实践|Rerank如何提升LLM查询效率与准确性 RAG实践|Rerank如何提升LLM查询效率与准确性](https://ctfiot.oss-cn-beijing.aliyuncs.com/uploads/2024/06/8-1719407846.png)
引用
-
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(微调模型)
关于我
欢迎关注,一起进步一起成长~
点关注不迷路
往期推荐
原文始发于微信公众号(老贾探AI):RAG实践|Rerank如何提升LLM查询效率与准确性