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