🚀 doc2query/all-t5-base-v1
这是一个基于T5的doc2query模型(也称为docT5query)。它可以解决文本搜索中的词汇鸿沟问题,还能生成训练数据以学习嵌入模型,为不同规模的项目提供强大支持。
🚀 快速开始
本模型可用于以下两个主要场景:
- 文档扩展:为段落生成20 - 40个查询,并将段落和生成的查询索引到标准的BM25索引(如Elasticsearch、OpenSearch或Lucene)中。生成的查询有助于缩小词汇搜索的词汇鸿沟,因为生成的查询包含同义词。此外,它还会重新加权单词,即使重要单词在段落中很少出现,也会赋予更高的权重。在我们的BEIR论文中,我们证明了BM25 + docT5query是一个强大的搜索引擎。在BEIR仓库中,我们有一个如何将docT5query与Pyserini结合使用的示例。
- 特定领域训练数据生成:可用于生成训练数据以学习嵌入模型。在SBERT.net上,我们有一个如何使用该模型为给定的未标记文本集合生成(查询,文本)对的示例。这些对可用于训练强大的密集嵌入模型。
💻 使用示例
基础用法
from transformers import T5Tokenizer, T5ForConditionalGeneration
model_name = 'doc2query/all-t5-base-v1'
tokenizer = T5Tokenizer.from_pretrained(model_name)
model = T5ForConditionalGeneration.from_pretrained(model_name)
text = "Python is an interpreted, high-level and general-purpose programming language. Python's design philosophy emphasizes code readability with its notable use of significant whitespace. Its language constructs and object-oriented approach aim to help programmers write clear, logical code for small and large-scale projects."
input_ids = tokenizer.encode(text, max_length=384, truncation=True, return_tensors='pt')
outputs = model.generate(
input_ids=input_ids,
max_length=64,
do_sample=True,
top_p=0.95,
num_return_sequences=5)
print("Text:")
print(text)
print("\nGenerated Queries:")
for i in range(len(outputs)):
query = tokenizer.decode(outputs[i], skip_special_tokens=True)
print(f'{i + 1}: {query}')
注意:model.generate()
是非确定性的,每次运行时会产生不同的查询。
🔧 技术细节
训练信息
本模型在google/t5-v1_1-base的基础上进行了570k个训练步骤的微调。关于训练脚本,请参阅此仓库中的train_script.py
。
输入文本被截断为384个词块,输出文本最多生成64个词块。
该模型在大量数据集上进行训练。有关确切的数据集名称和权重,请参阅此仓库中的data_config.json
。大多数数据集可在https://huggingface.co/sentence-transformers上获取。
训练数据集
数据集包括但不限于:
- 来自Reddit的(标题,正文)对
- 来自StackExchange和Yahoo Answers!的(标题,正文)对和(标题,答案)对
- 来自亚马逊评论的(标题,评论)对
- 来自MS MARCO、NQ和GooAQ的(查询,段落)对
- 来自Quora和WikiAnswers的(问题,重复问题)对
- 来自S2ORC的(标题,摘要)对
前缀信息
此模型在没有前缀的情况下进行训练。与doc2query/all-with_prefix-t5-base-v1不同,你无法指定要进行的转换类型(如答案转问题、评论转标题等),这可能会导致输出值的混合。
📄 许可证
本项目采用Apache-2.0许可证。