🚀 Bloomz-3b 重排序模型
本重排序模型基于 cmarkea/bloomz-3b-dpo-chat 模型构建,旨在衡量问题(查询)与上下文之间的语义对应关系。通过归一化评分,它有助于在开放域问答(ODQA)场景中过滤检索器输出的查询/上下文匹配结果。此外,它能够使用比检索器更高效的建模方法对结果进行重新排序。不过,由于计算成本较高,这种建模类型并不适合直接进行数据库搜索。
该模型支持法语和英语,具有语言无关性。因此,它可以在跨语言环境中有效评分,而不受单语言环境(英语或法语)下的行为影响。
📦 数据集
训练数据集由 mMARCO 数据集组成,包含查询/正样本/难负样本三元组。此外,我们还纳入了 SQuAD 数据集中“训练”分割的数据,形成查询/正样本/难负样本三元组。为了为 SQuAD 生成难负样本数据,我们考虑了与查询主题相同但来自不同查询集的上下文。因此,负样本观察结果与查询属于相同主题,但可能不包含问题的答案。
最后,将三元组展开,得到查询/上下文句子对,若为查询/正样本则标签为 1,若为查询/负样本则标签为 0。在每对元素(查询和上下文)中,随机且均匀地选择法语或英语。
📊 评估
为了评估重排序器的性能,我们将使用 SQuAD 数据集的“验证”分割。我们将从每个段落中选择第一个问题,以及构成应在 Oracle 建模中排名第一的上下文的段落。有趣的是,主题数量有限,每个与查询不匹配的对应主题的上下文都被视为难负样本(主题外的其他上下文为简单负样本)。因此,我们可以构建以下表格,每个主题显示上下文数量和相关查询:
主题名称 |
上下文数量 |
主题名称 |
上下文数量 |
Normans |
39 |
Civil_disobedience |
26 |
Computational_complexity_theory |
48 |
Construction |
22 |
Southern_California |
39 |
Private_school |
26 |
Sky_(United_Kingdom) |
22 |
Harvard_University |
30 |
Victoria_(Australia) |
25 |
Jacksonville,_Florida |
21 |
Huguenot |
44 |
Economic_inequality |
44 |
Steam_engine |
46 |
University_of_Chicago |
37 |
Oxygen |
43 |
Yuan_dynasty |
47 |
1973_oil_crisis |
24 |
Immune_system |
49 |
European_Union_law |
40 |
Intergovernmental_Panel_on_Climate_Change |
24 |
Amazon_rainforest |
21 |
Prime_number |
31 |
Ctenophora |
31 |
Rhine |
44 |
Fresno,_California |
28 |
Scottish_Parliament |
39 |
Packet_switching |
23 |
Islamism |
39 |
Black_Death |
23 |
Imperialism |
39 |
Geology |
25 |
Warsaw |
49 |
Pharmacy |
26 |
French_and_Indian_War |
46 |
Force |
44 |
|
|
评估语料库由 1204 对需要排名的查询/上下文组成。
首先,我们计算了查询和上下文语言相同(法语/法语)情况下的评估分数。
然后,我们在跨语言环境中评估了模型,查询为法语,上下文为英语。
可以观察到,跨语言环境对我们模型的性能影响不大。如果在重排序和过滤搜索的前 K 个结果的场景中使用该模型,可以应用 0.8 的阈值来过滤检索器输出的上下文,从而减少 RAG 类型应用中上下文中存在的噪声问题。
💻 使用示例
基础用法
以下示例基于 Transformers 库的 API 管道。
from transformers import pipeline
reranker = pipeline(
task='text-classification',
model='cmarkea/bloomz-3b-reranking',
top_k=None
)
query: str
contexts: List[str]
similarities = reranker(
[
dict(
text=context,
text_pair=query
)
for context in contexts
]
)
score_label_1 = [
next(item['score'] for item in entry if item['label'] == 'LABEL_1')
for entry in similarities
]
contexts_reranked = sorted(
zip(score_label_1, contexts),
key=lambda x: x[0],
reverse=True
)
score, contexts_cleaned = zip(
*filter(
lambda x: x[0] >= 0.8,
contexts_reranked
)
)
📄 许可证
本项目使用的许可证为 bigscience-bloom-rail-1.0。
📖 引用
@online{DeBloomzReranking,
AUTHOR = {Cyrile Delestre},
ORGANIZATION = {Cr{\'e}dit Mutuel Ark{\'e}a},
URL = {https://huggingface.co/cmarkea/bloomz-3b-reranking},
YEAR = {2024},
KEYWORDS = {NLP ; Transformers ; LLM ; Bloomz},
}