模型简介
模型特点
模型能力
使用案例
库名称:transformers
许可证:apache-2.0
支持语言:
- 英语
- 中文
- 西班牙语
- 德语
- 阿拉伯语
- 俄语
- 日语
- 韩语
- 印地语
- 斯洛伐克语
- 越南语
- 土耳其语
- 芬兰语
- 印尼语
- 波斯语
- 挪威语
- 泰语
- 瑞典语
- 葡萄牙语
- 丹麦语
- 孟加拉语
- 泰卢固语
- 罗马尼亚语
- 意大利语
- 法语
- 荷兰语
- 斯瓦希里语
- 波兰语
- 匈牙利语
- 捷克语
- 希腊语
- 乌克兰语
- 马拉地语
- 泰米尔语
- 他加禄语
- 保加利亚语
- 立陶宛语
- 乌尔都语
- 希伯来语
- 古吉拉特语
- 卡纳达语
- 阿姆哈拉语
- 哈萨克语
- 克罗地亚语
- 乌兹别克语
- 爪哇语
- 加泰罗尼亚语
- 阿塞拜疆语
- 马来语
- 塞尔维亚语
- 斯洛文尼亚语
- 约鲁巴语
- 拉脱维亚语
- 冰岛语
- 豪萨语
- 格鲁吉亚语
- 爱沙尼亚语
- 波斯尼亚语
- 亚美尼亚语
- 马拉雅拉姆语
- 旁遮普语
- 马耳他语
- 高棉语
- 阿尔巴尼亚语
- 奥里亚语
- 阿萨姆语
- 缅甸语
- 蒙古语
- 南非荷兰语
- 白俄罗斯语
- 爱尔兰语
- 马其顿语
- 威尔士语
- 加利西亚语
- 宿务语
- 拉丁语
- 意第绪语
- 卢森堡语
- 塔吉克语
- 苏格兰盖尔语
- 尼泊尔语
- 普什图语
- 巴斯克语
- 吉尔吉斯语
- 库尔德语
- 僧伽罗语
- 海地克里奥尔语
- 世界语
- 老挝语
- 弗里斯兰语
- 信德语
- 马尔加什语
- 索马里语
- 中库尔德语
- 巽他语
- 新挪威语
数据集:
- lightblue/reranker_continuous_filt_max7_train
基础模型:
- Qwen/Qwen2.5-0.5B-Instruct
流水线标签:文本生成
标签:
- 重排序器
示例:
- 文本:"<<
>>\nLB-Reranker训练了多少种语言?\n\n<< >>\nLB-Reranker已训练超过95种语言。"
示例标题:正面示例(7/7) - 文本:"<<
>>\nLB-Reranker训练了多少种语言?\n\n<< >>\nAA-Reranker适用于广泛的应用场景。"
示例标题:负面示例(2/7)
LB重排序器 v1.0
LB重排序器经过训练,用于判断给定查询与文本片段的相关性,因此可在各种基于检索的任务中作为排序器或重排序器使用。
该模型基于Qwen/Qwen2.5-0.5B-Instruct模型检查点微调,并在阿里云的8 x L20实例(ecs.gn8is-8x.32xlarge)上训练约5.5小时。
该模型的训练数据可在lightblue/reranker_continuous_filt_max7_train找到,生成数据及运行模型训练的代码可在我们的Github仓库获取。
该模型训练数据涵盖超过95种语言,适用于广泛的应用场景。
与同类重排序器相比,该模型具有三大优势:
- 在评估基准上表现略优。
- 训练语言数量超过以往任何模型。
- 作为简单的因果语言模型,训练输出为"1"至"7"之间的字符串。
最后一点意味着该模型可直接与许多广泛可用的推理包(如vLLM和LMDeploy)原生兼容,从而让我们的重排序器能随时受益于这些包的推理改进。
更新:我们还发现该模型在代码片段重排序上也表现优异(P@1达96%)!详情请见我们的Colab。
使用方法
模型训练时输入格式如下:
<<<Query>>>
{您的查询}
<<<Context>>>
{您的文本}
输出为1-7之间的数字字符串。
为生成可用于重排序查询-文本对的连续分数(减少同分值情况),我们计算分数的期望值。
我们提供了vLLM、LMDeploy和OpenAI(免费托管于Huggingface)的实现脚本:
- vLLM
通过
pip install vllm
安装vLLM。显示vLLM代码
from vllm import LLM, SamplingParams import numpy as np def make_reranker_input(t, q): return f"<<<Query>>>\n{q}\n\n<<<Context>>>\n{t}" def make_reranker_inference_conversation(context, question): system_message = "给定查询和文本片段,根据相关性输出1-7的分数。1表示最不相关,7表示最相关。" return [ {"role": "system", "content": system_message}, {"role": "user", "content": make_reranker_input(context, question)}, ] def get_prob(logprob_dict, tok_id): return np.exp(logprob_dict[tok_id].logprob) if tok_id in logprob_dict.keys() else 0 llm = LLM("lightblue/lb-reranker-v1.0") sampling_params = SamplingParams(temperature=0.0, logprobs=14, max_tokens=1) tok = llm.llm_engine.tokenizer.tokenizer idx_tokens = [tok.encode(str(i))[0] for i in range(1, 8)] query_texts = [ ("苹果的学名是什么?", "苹果是由苹果树(Malus spp.,其中包含家苹果或果园苹果;Malus domestica)生产的圆形可食用果实。"), ("'苹果'的中文怎么说?", "苹果是由苹果树(Malus spp.,其中包含家苹果或果园苹果;Malus domestica)生产的圆形可食用果实。"), ("999的平方根是多少?", "苹果是由苹果树(Malus spp.,其中包含家苹果或果园苹果;Malus domestica)生产的圆形可食用果实。"), ] chats = [make_reranker_inference_conversation(c, q) for q, c in query_texts] responses = llm.chat(chats, sampling_params) probs = np.array([[get_prob(r.outputs[0].logprobs[0], y) for y in idx_tokens] for r in responses]) N = probs.shape[1] M = probs.shape[0] idxs = np.tile(np.arange(1, N + 1), M).reshape(M, N) expected_vals = (probs * idxs).sum(axis=1) print(expected_vals) # [6.66570732 1.86686378 1.01102923]
- LMDeploy
通过
pip install lmdeploy
安装LMDeploy。显示LMDeploy代码
# 如果在Jupyter notebook或Colab中运行,取消注释以下内容 # import nest_asyncio # nest_asyncio.apply() from lmdeploy import GenerationConfig, ChatTemplateConfig, pipeline import numpy as np def make_reranker_input(t, q): return f"<<<Query>>>\n{q}\n\n<<<Context>>>\n{t}" def make_reranker_inference_conversation(context, question): system_message = "给定查询和文本片段,根据相关性输出1-7的分数。1表示最不相关,7表示最相关。" return [ {"role": "system", "content": system_message}, {"role": "user", "content": make_reranker_input(context, question)}, ] def get_prob(logprob_dict, tok_id): return np.exp(logprob_dict[tok_id]) if tok_id in logprob_dict.keys() else 0 pipe = pipeline( "lightblue/lb-reranker-v1.0", chat_template_config=ChatTemplateConfig( model_name='qwen2d5', capability='chat' ) ) tok = pipe.tokenizer.model idx_tokens = [tok.encode(str(i))[0] for i in range(1, 8)] query_texts = [ ("苹果的学名是什么?", "苹果是由苹果树(Malus spp.,其中包含家苹果或果园苹果;Malus domestica)生产的圆形可食用果实。"), ("'苹果'的中文怎么说?", "苹果是由苹果树(Malus spp.,其中包含家苹果或果园苹果;Malus domestica)生产的圆形可食用果实。"), ("999的平方根是多少?", "苹果是由苹果树(Malus spp.,其中包含家苹果或果园苹果;Malus domestica)生产的圆形可食用果实。"), ] chats = [make_reranker_inference_conversation(c, q) for q, c in query_texts] responses = pipe( chats, gen_config=GenerationConfig(temperature=1.0, logprobs=14, max_new_tokens=1, do_sample=True) ) probs = np.array([[get_prob(r.logprobs[0], y) for y in idx_tokens] for r in responses]) N = probs.shape[1] M = probs.shape[0] idxs = np.tile(np.arange(1, N + 1), M).reshape(M, N) expected_vals = (probs * idxs).sum(axis=1) print(expected_vals) # [6.66415229 1.84342025 1.01133205]
- OpenAI(托管于Huggingface)
通过
pip install openai
安装openai。显示OpenAI + Huggingface推理代码
from openai import OpenAI import numpy as np from multiprocessing import Pool from tqdm.auto import tqdm client = OpenAI( base_url="https://api-inference.huggingface.co/v1/", api_key="hf_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # 替换为https://huggingface.co/settings/tokens中的访问令牌 ) def make_reranker_input(t, q): return f"<<<Query>>>\n{q}\n\n<<<Context>>>\n{t}" def make_reranker_inference_conversation(context, question): system_message = "给定查询和文本片段,根据相关性输出1-7的分数。1表示最不相关,7表示最相关。" return [ {"role": "system", "content": system_message}, {"role": "user", "content": make_reranker_input(context, question)}, ] def get_reranker_score(context_question_tuple): question, context = context_question_tuple messages = make_reranker_inference_conversation(context, question) completion = client.chat.completions.create( model="lightblue/lb-reranker-0.5B-v1.0", messages=messages, max_tokens=1, temperature=0.0, logprobs=True, top_logprobs=5, # OpenAI API允许的最大值,top_n_tokens必须>=0且<=5。如有变更,请调整至>7。 ) logprobs = completion.choices[0].logprobs.content[0].top_logprobs calculated_score = sum([int(x.token) * np.exp(x.logprob) for x in logprobs]) return calculated_score query_texts = [ ("苹果的学名是什么?", "苹果是由苹果树(Malus spp.,其中包含家苹果或果园苹果;Malus domestica)生产的圆形可食用果实。"), ("'苹果'的中文怎么说?", "苹果是由苹果树(Malus spp.,其中包含家苹果或果园苹果;Malus domestica)生产的圆形可食用果实。"), ("999的平方根是多少?", "苹果是由苹果树(Malus spp.,其中包含家苹果或果园苹果;Malus domestica)生产的圆形可食用果实。"), ] with Pool(processes=16) as p: # 支持并行处理 expected_vals = list(tqdm(p.imap(get_reranker_score, query_texts), total=len(query_texts))) print(expected_vals) # [6.64866580, 1.85144404, 1.010719508]
评估
我们在BEIR基准的9个数据集上进行了评估(据我们所知,这些数据集均未被任何评估模型训练过):
- Arguana
- Dbpedia-entity
- Fiqa
- NFcorpus
- Scidocs
- Scifact
- Trec-covid-v2
- Vihealthqa
- Webis-touche2020
为节省评估时间,我们仅评估所有查询的子集(前250条)。
我们发现,在不影响推理速度的前提下,该模型在评估中的表现与许多先进的重排序器模型相当或更优。
评估代码和结果可在我们的Github获取。
如图所示,除@1位置外,该重排序器在所有位置上的信息检索评估指标均优于我们包含的两个基准。
我们还显示,该模型平均速度快于BGE重排序器v2。
许可证
本模型基于Apache 2.0许可证共享。
开发团队

本模型由Peter Devine(ptrdvn)为Lightblue训练。


