🚀 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},
}