🚀 Bloomz-560m-retriever-v2
Bloomz-560m-retriever-v2 是一個基於 Bloomz-560m-dpo-chat 模型的雙向編碼器。它能將文章和查詢投影到同一向量空間,確保查詢與相關文章的接近性。該模型支持法語和英語,無論查詢和文章使用哪種語言,都能實現良好的匹配。此模型非常適合開放領域問答(ODQA)任務,還可與 Bloomz-560m-reranking 或 Bloomz-3b-reranking 重排器配合使用。
🚀 快速開始
本部分將為你介紹 Bloomz-560m-retriever-v2 模型的使用方法,包括使用 Transformers API 和 Pipeline API 進行推理的代碼示例。
✨ 主要特性
- 跨語言支持:支持法語和英語,無論查詢和文章使用哪種語言,都能實現良好的匹配。
- 高效檢索:使用餘弦距離作為度量標準,相比之前的 L2 距離,效率更高。
- 適用於開放領域問答:非常適合開放領域問答(ODQA)任務,可與重排器配合使用。
📚 詳細文檔
模型介紹
我們推出了 Bloomz-560m-retriever-v2 模型,它基於 Bloomz-560m-dpo-chat 模型構建。這個雙向編碼器可以將文章和查詢投影到同一個向量空間中,從而保證查詢與相關文章在向量空間中的接近性。該模型對法語和英語具有語言無關性,也就是說,無論查詢使用的是法語還是英語,它都能與對應的文章在向量空間中保持接近。此模型非常適合用於開放領域問答(ODQA)任務,並且可以與 Bloomz-560m-reranking 或 Bloomz-3b-reranking 重排器結合使用。
訓練過程
訓練使用的數據集是 mMARCO 的一個變體,它支持對比學習並能過濾掉假陰性樣本。過濾閾值設置為 0.8,每個正樣本會與 10 個難負樣本進行對比,這些難負樣本按照得分降序排列(即 10 個最難的負樣本)。模型在語言的均勻分佈上進行訓練(1/4 法語 - 法語、1/4 法語 - 英語、1/4 英語 - 法語、1/4 英語 - 英語)。學習目標採用 InfoNCE 類型,並帶有一個可訓練的溫度參數,這與 CLIP 模型的設置類似。
注意事項
與 Bloomz-560m-retriever 不同,這個模型效率更高,它使用餘弦距離作為度量標準(之前使用的是 L2 距離)。
基準測試
性能評估基於 SQuAD 的評估部分(涵蓋 35 個不同主題的 1204 篇文章中的 5921 個查詢)。這個數據集的一個有趣特點是,一個主題可能關聯多篇文章,這代表了一種具有挑戰性的上下文,即一個查詢可能與多篇相關文章接近。平均每個主題大約有三十篇文章(具體分佈可參考 Bloomz-560m-reranking)。
我們使用查詢目標文章的平均排名(Top-mean)、排名的標準差(Top-std)、Top-1、Top-5 和 Top-10 中正確文章的百分比,以及 1204 篇文章的平均倒數排名(MRR)來比較不同模型的性能。
💻 使用示例
基礎用法
使用 Transformers API
from typing import Union, List
import numpy as np
import torch
from transformers import AutoTokenizer, AutoModel
from scipy.spatial.distance import cdist
tokenizer = AutoTokenizer.from_pretrained('cmarkea/bloomz-560m-retriever-v2')
model = AutoModel.from_pretrained('cmarkea/bloomz-560m-retriever-v2')
def infer(txt: Union[str, List[str]]):
tok = tokenizer(txt, padding=True, return_tensors='pt')
with torch.inference_mode():
embedding = model(**tok)
return embedding.get('last_hidden_state')[:,-1,:].numpy()
list_of_contexts: List[str] = [...]
emb_contexts = infer(list_of_contexts)
list_of_queries: List[str] = [...]
emb_queries = infer(list_of_queries)
dist = cdist(emb_queries, emb_contexts, 'cosine')
top_k = lambda x: [
[list_of_contexts[qq] for qq in ii]
for ii in dist.argsort(axis=-1)[:,:x]
]
top_contexts = top_k(5)
使用 Pipeline API
import numpy as np
from transformers import pipeline
from scipy.spatial.distance import cdist
retriever = pipeline('feature-extraction', 'cmarkea/bloomz-560m-retriever-v2')
infer = lambda x: [np.array(ii[0][-1]).reshape(1,-1) for ii in retriever(x)]
list_of_contexts: List[str] = [...]
emb_contexts = np.concatenate(infer(list_of_contexts), axis=0)
list_of_queries: List[str] = [...]
emb_queries = np.concatenate(infer(list_of_queries), axis=0)
dist = cdist(emb_queries, emb_contexts, 'cosine')
top_k = lambda x: [
[list_of_contexts[qq] for qq in ii]
for ii in dist.argsort(axis=-1)[:,:x]
]
top_contexts = top_k(5)
📄 許可證
本模型使用的許可證為 bigscience-bloom-rail-1.0。
📖 引用
@online{DeBloomzRetv2,
AUTHOR = {Cyrile Delestre},
ORGANIZATION = {Cr{\'e}dit Mutuel Ark{\'e}a},
URL = {https://huggingface.co/cmarkea/bloomz-560m-retriever-v2},
YEAR = {2024},
KEYWORDS = {NLP ; Transformers ; LLM ; Bloomz},
}