z
zhouhui/bge-reranker-base
模型介绍文件和版本分析
下载使用量0

我们已更新新的重排序模型,支持更长的文本长度、更多语言,并实现了更优性能。

FlagEmbedding

模型列表 | 常见问题 | 使用方法 | 评估 | 训练 | 引用 | 许可证

更多详情请参考我们的 Github:FlagEmbedding。

English | 中文

FlagEmbedding 专注于检索增强型大型语言模型(LLMs),目前包含以下项目:

  • 长上下文 LLM:Activation Beacon
  • 语言模型微调:LM-Cocktail
  • 嵌入模型:Visualized-BGE、BGE-M3、LLM Embedder、BGE Embedding
  • 重排序模型:llm rerankers、BGE Reranker
  • 基准测试:C-MTEB

最新动态

  • 2024年3月18日:发布新的重排序模型,基于强大的 M3 和 LLM(GEMMA 与 MiniCPM,实际上规模并不庞大)骨干网络构建,支持多语言处理和更长输入,在 BEIR、C-MTEB/Retrieval、MIRACL、LlamaIndex Evaluation 等榜单上的排序性能获得显著提升。
  • 2024年3月18日:发布Visualized-BGE,为 BGE 赋予视觉能力。Visualized-BGE 可用于为图像-文本混合数据生成嵌入。
  • 2024年1月30日:发布 BGE-M3,BGE 模型系列的新成员!M3 代表 Multi-linguality(多语言,支持100+种语言)、Multi-granularities(多粒度,输入长度可达8192)、Multi-Functionality(多功能,统一了稠密检索、词法检索、多向量/ColBERT 检索)。 它是首个支持所有三种检索方式的嵌入模型,在多语言(MIRACL)和跨语言(MKQA)基准测试中刷新了 SOTA。 技术报告 与 代码。:fire:
  • 2024年1月9日:发布 Activation-Beacon,一种有效、高效、兼容且低成本(训练)的 LLM 上下文长度扩展方法。技术报告 :fire:
  • 2023年12月24日:发布 LLaRA,一个基于 LLaMA-7B 的稠密检索模型,在 MS MARCO 和 BEIR 上取得了最先进的性能。模型和代码将开源,敬请期待。技术报告
  • 2023年11月23日:发布 LM-Cocktail,一种通过融合多个语言模型在微调过程中保持通用能力的方法。技术报告 :fire:
  • 2023年10月12日:发布 LLM-Embedder,一个统一的嵌入模型,以支持 LLM 的多样化检索增强需求。技术报告
  • 2023年9月15日:BGE 的技术报告已发布
  • 2023年9月15日:BGE 的大规模训练数据已发布
  • 2023年9月12日:新模型发布:
    • 新的重排序模型:发布交叉编码器模型 BAAI/bge-reranker-base 和 BAAI/bge-reranker-large,其性能优于嵌入模型。我们建议使用/微调它们对嵌入模型返回的 top-k 文档进行重排序。
    • 更新嵌入模型:发布 bge-*-v1.5 嵌入模型,以缓解相似度分布问题,并在无指令情况下增强其检索能力。
更多
  • 2023年9月7日:更新微调代码:添加挖掘难负样本的脚本,并支持在微调过程中添加指令。
  • 2023年8月9日:BGE 模型已集成到 Langchain,您可以像这样使用它;C-MTEB 排行榜已上线。
  • 2023年8月5日:发布基础规模和小型规模模型,在同尺寸模型中性能最佳 🤗
  • 2023年8月2日:发布 bge-large-*(BAAI General Embedding 的缩写)模型,在 MTEB 和 C-MTEB 基准测试中排名第一! :tada: :tada:
  • 2023年8月1日:我们发布了中文大规模文本嵌入基准(C-MTEB),包含31个测试数据集。

模型列表

bge 是 BAAI general embedding 的缩写。

模型语言描述检索用查询指令 [1]
BAAI/bge-m3多语言推理 微调多功能性(稠密检索、稀疏检索、多向量(colbert))、多语言性和多粒度(8192 tokens)
BAAI/llm-embedder英语推理 微调一个统一的嵌入模型,支持大型语言模型多样化的检索增强需求参见 README
BAAI/bge-reranker-large中英双语推理 微调一种交叉编码器模型,准确率更高但效率较低 [2]
BAAI/bge-reranker-base中英双语推理 微调一种交叉编码器模型,准确率更高但效率较低 [2]
BAAI/bge-large-en-v1.5英语推理 微调1.5 版本,具有更合理的相似度分布Represent this sentence for searching relevant passages:
BAAI/bge-base-en-v1.5英语推理 微调1.5 版本,具有更合理的相似度分布Represent this sentence for searching relevant passages:
BAAI/bge-small-en-v1.5英语推理 微调1.5 版本,具有更合理的相似度分布Represent this sentence for searching relevant passages:
BAAI/bge-large-zh-v1.5中文推理 微调1.5 版本,具有更合理的相似度分布为这个句子生成表示以用于检索相关文章:
BAAI/bge-base-zh-v1.5中文推理 微调1.5 版本,具有更合理的相似度分布为这个句子生成表示以用于检索相关文章:
BAAI/bge-small-zh-v1.5中文推理 微调1.5 版本,具有更合理的相似度分布为这个句子生成表示以用于检索相关文章:
BAAI/bge-large-en英语推理 微调:trophy: 在 MTEB 排行榜中排名第一Represent this sentence for searching relevant passages:
BAAI/bge-base-en英语推理 微调基础规模模型,但能力与 bge-large-en 相近Represent this sentence for searching relevant passages:
BAAI/bge-small-en英语推理 微调小型模型,但性能具有竞争力Represent this sentence for searching relevant passages:
BAAI/bge-large-zh中文推理 微调:trophy: 在 C-MTEB 基准测试中排名第一为这个句子生成表示以用于检索相关文章:
BAAI/bge-base-zh中文推理 微调基础规模模型,但能力与 bge-large-zh 相近为这个句子生成表示以用于检索相关文章:
BAAI/bge-small-zh中文推理 微调小型模型,但性能具有竞争力为这个句子生成表示以用于检索相关文章:

[1]: 如果您需要根据查询搜索相关文章,建议在查询中添加上述指令;在其他情况下,则无需添加指令,直接使用原始查询即可。在所有情况下,均无需向文章添加指令。

[2]: 与嵌入模型不同,重排序模型将问题和文档作为输入,直接输出相似度分数,而非嵌入向量。为了平衡准确率和时间成本,交叉编码器被广泛用于对其他简单模型检索出的 top-k 文档进行重排序。 例如,使用 bge 嵌入模型检索出排名前 100 的相关文档,然后使用 bge 重排序模型对这 100 篇文档进行重排序,以获得最终的 top-3 结果。

所有模型均已上传至 Huggingface Hub,您可以通过 https://huggingface.co/BAAI 查看。 如果您无法访问 Huggingface Hub,也可以通过 https://model.baai.ac.cn/models 下载模型。

常见问题

1. 如何微调 bge 嵌入模型?

按照此示例准备数据并微调您的模型。 一些建议:

  • 按照此示例挖掘难负样本,这可以提升检索性能。
  • 如果您使用自己的数据对 bge 进行预训练,预训练后的模型不能直接用于计算相似度,必须先通过对比学习进行微调,然后才能计算相似度。
  • 如果微调后模型的准确率仍然不高,建议使用/微调交叉编码器模型(bge-reranker)对 top-k 结果进行重排序。 微调重排序模型时也需要难负样本。有关重排序模型的微调,请参考此示例。
2. 两个不相似句子之间的相似度得分高于 0.5

建议使用 bge v1.5,该版本缓解了相似度分布问题。

由于我们使用温度参数为 0.01 的对比学习对模型进行微调, 当前 BGE 模型的相似度分布区间约为

0.6,10.6, 10.6,1

。 因此,相似度得分大于 0.5 并不表示两个句子相似。

对于下游任务,如段落检索或语义相似度, 重要的是得分的相对顺序,而非绝对值。 如果您需要根据相似度阈值筛选相似句子, 请根据您数据上的相似度分布选择合适的相似度阈值(例如 0.8、0.85,甚至 0.9)。

3. 何时需要使用查询指令?

对于 bge-*-v1.5 版本,我们提升了其在不使用指令时的检索能力。 不使用指令时,检索性能仅比使用指令时略有下降。 因此,为方便起见,您在所有情况下都可以不使用指令生成嵌入。

对于使用短查询来查找相关长文档的检索任务, 建议为这些短查询添加指令。 判断是否为查询添加指令的最佳方法是选择在您的任务上表现更好的设置。 在所有情况下,文档/段落都不需要添加指令。

使用方法

嵌入模型使用方法

以下是使用 bge 模型的一些示例,分别结合了FlagEmbedding、Sentence-Transformers、Langchain 或 Huggingface Transformers。

使用 FlagEmbedding

pip install -U FlagEmbedding

如果该方法对你不起作用,你可以查看 FlagEmbedding 以获取更多安装 FlagEmbedding 的方法。

from FlagEmbedding import FlagModel
sentences_1 = ["样例数据-1", "样例数据-2"]
sentences_2 = ["样例数据-3", "样例数据-4"]
model = FlagModel('BAAI/bge-large-zh-v1.5', 
                  query_instruction_for_retrieval="为这个句子生成表示以用于检索相关文章:",
                  use_fp16=True) # Setting use_fp16 to True speeds up computation with a slight performance degradation
embeddings_1 = model.encode(sentences_1)
embeddings_2 = model.encode(sentences_2)
similarity = embeddings_1 @ embeddings_2.T
print(similarity)

# for s2p(short query to long passage) retrieval task, suggest to use encode_queries() which will automatically add the instruction to each query
# corpus in retrieval task can still use encode() or encode_corpus(), since they don't need instruction
queries = ['query_1', 'query_2']
passages = ["样例文档-1", "样例文档-2"]
q_embeddings = model.encode_queries(queries)
p_embeddings = model.encode(passages)
scores = q_embeddings @ p_embeddings.T

关于参数 query_instruction_for_retrieval 的取值,请参见 模型列表。

默认情况下,FlagModel 在编码时会使用所有可用的 GPU。请设置 os.environ["CUDA_VISIBLE_DEVICES"] 来选择特定的 GPU。 您也可以设置 os.environ["CUDA_VISIBLE_DEVICES"]="" 来禁用所有 GPU。

使用 Sentence-Transformers

您还可以通过 sentence-transformers 来使用 bge 模型:

pip install -U sentence-transformers
from sentence_transformers import SentenceTransformer
sentences_1 = ["样例数据-1", "样例数据-2"]
sentences_2 = ["样例数据-3", "样例数据-4"]
model = SentenceTransformer('BAAI/bge-large-zh-v1.5')
embeddings_1 = model.encode(sentences_1, normalize_embeddings=True)
embeddings_2 = model.encode(sentences_2, normalize_embeddings=True)
similarity = embeddings_1 @ embeddings_2.T
print(similarity)

在 s2p(短查询到长段落)检索任务中,每个短查询都应以指令开头(指令详见 Model List)。但段落不需要指令。

from sentence_transformers import SentenceTransformer
queries = ['query_1', 'query_2']
passages = ["样例文档-1", "样例文档-2"]
instruction = "为这个句子生成表示以用于检索相关文章:"

model = SentenceTransformer('BAAI/bge-large-zh-v1.5')
q_embeddings = model.encode([instruction+q for q in queries], normalize_embeddings=True)
p_embeddings = model.encode(passages, normalize_embeddings=True)
scores = q_embeddings @ p_embeddings.T

使用 Langchain

你可以像这样在 langchain 中使用 bge:

from langchain.embeddings import HuggingFaceBgeEmbeddings
model_name = "BAAI/bge-large-en-v1.5"
model_kwargs = {'device': 'cuda'}
encode_kwargs = {'normalize_embeddings': True} # set True to compute cosine similarity
model = HuggingFaceBgeEmbeddings(
    model_name=model_name,
    model_kwargs=model_kwargs,
    encode_kwargs=encode_kwargs,
    query_instruction="为这个句子生成表示以用于检索相关文章:"
)
model.query_instruction = "为这个句子生成表示以用于检索相关文章:"

使用 openmind

from openmind import AutoTokenizer, AutoModel, is_torch_npu_available
from openmind_hub import snapshot_download
import torch
import argparse

def parse_args():
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "--model_name_or_path",
        type=str,
        help="Path to model",
        default="zhouhui/bge-reranker-base",
    )
    args = parser.parse_args()
    return args

def main():
    args = parse_args()
    model_path = args.model_name_or_path

    if is_torch_npu_available():
        device = "npu:0"
    else:
        device = "cpu"
    # Sentences we want sentence embeddings for
    sentences = ["样例数据-1", "样例数据-2"]
    tokenizer = AutoTokenizer.from_pretrained(model_path)
    model = AutoModel.from_pretrained(model_path)
    model.eval()

    # Tokenize sentences
    encoded_input = tokenizer(sentences, padding=True, truncation=True, return_tensors='pt')
    # for s2p(short query to long passage) retrieval task, add an instruction to query (not add instruction for passages)
    # encoded_input = tokenizer([instruction + q for q in queries], padding=True, truncation=True, return_tensors='pt')

    # Compute token embeddings
    with torch.no_grad():
        model_output = model(**encoded_input)
        # Perform pooling. In this case, cls pooling.
        sentence_embeddings = model_output[0][:, 0]
    # normalize embeddings
    sentence_embeddings = torch.nn.functional.normalize(sentence_embeddings, p=2, dim=1)
    print("Sentence embeddings:", sentence_embeddings)
    
if __name__ == "__main__":
    main()

使用 HuggingFace Transformers

借助 transformers 包,您可以这样使用模型:首先,将输入传入 transformer 模型,然后选择第一个 token(即 [CLS])的最后一个隐藏状态作为句子嵌入。

from transformers import AutoTokenizer, AutoModel
import torch
# Sentences we want sentence embeddings for
sentences = ["样例数据-1", "样例数据-2"]

# Load model from HuggingFace Hub
tokenizer = AutoTokenizer.from_pretrained('BAAI/bge-large-zh-v1.5')
model = AutoModel.from_pretrained('BAAI/bge-large-zh-v1.5')
model.eval()

# Tokenize sentences
encoded_input = tokenizer(sentences, padding=True, truncation=True, return_tensors='pt')
# for s2p(short query to long passage) retrieval task, add an instruction to query (not add instruction for passages)
# encoded_input = tokenizer([instruction + q for q in queries], padding=True, truncation=True, return_tensors='pt')

# Compute token embeddings
with torch.no_grad():
    model_output = model(**encoded_input)
    # Perform pooling. In this case, cls pooling.
    sentence_embeddings = model_output[0][:, 0]
# normalize embeddings
sentence_embeddings = torch.nn.functional.normalize(sentence_embeddings, p=2, dim=1)
print("Sentence embeddings:", sentence_embeddings)

重排序模型使用方法

与嵌入模型不同,重排序模型将问题和文档作为输入,直接输出相似度,而非嵌入向量。 您可以通过向重排序模型输入查询和段落来获取相关性分数。 该重排序模型基于交叉熵损失进行优化,因此相关性分数并不局限于特定范围。

使用 FlagEmbedding

pip install -U FlagEmbedding

获取相关性分数(分数越高表示相关性越强):

from FlagEmbedding import FlagReranker
reranker = FlagReranker('BAAI/bge-reranker-large', use_fp16=True) # Setting use_fp16 to True speeds up computation with a slight performance degradation

score = reranker.compute_score(['query', 'passage'])
print(score)

scores = reranker.compute_score([['what is panda?', 'hi'], ['what is panda?', 'The giant panda (Ailuropoda melanoleuca), sometimes called a panda bear or simply panda, is a bear species endemic to China.']])
print(scores)

使用 Huggingface transformers

import torch
from transformers import AutoModelForSequenceClassification, AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained('BAAI/bge-reranker-large')
model = AutoModelForSequenceClassification.from_pretrained('BAAI/bge-reranker-large')
model.eval()

pairs = [['what is panda?', 'hi'], ['what is panda?', 'The giant panda (Ailuropoda melanoleuca), sometimes called a panda bear or simply panda, is a bear species endemic to China.']]
with torch.no_grad():
    inputs = tokenizer(pairs, padding=True, truncation=True, return_tensors='pt', max_length=512)
    scores = model(**inputs, return_dict=True).logits.view(-1, ).float()
    print(scores)

使用 ONNX 文件的重排序模型

from optimum.onnxruntime import ORTModelForSequenceClassification  # type: ignore

import torch
from transformers import AutoModelForSequenceClassification, AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained('BAAI/bge-reranker-large')
model = AutoModelForSequenceClassification.from_pretrained('BAAI/bge-reranker-base')
model_ort = ORTModelForSequenceClassification.from_pretrained('BAAI/bge-reranker-base', file_name="onnx/model.onnx")

# Sentences we want sentence embeddings for
pairs = [['what is panda?', 'hi'], ['what is panda?', 'The giant panda (Ailuropoda melanoleuca), sometimes called a panda bear or simply panda, is a bear species endemic to China.']]

# Tokenize sentences
encoded_input = tokenizer(pairs, padding=True, truncation=True, return_tensors='pt')

scores_ort = model_ort(**encoded_input, return_dict=True).logits.view(-1, ).float()
# Compute token embeddings
with torch.inference_mode():
    scores = model_ort(**encoded_input, return_dict=True).logits.view(-1, ).float()

# scores and scores_ort are identical

使用 Infinity 部署重排序模型

也可以通过 infinity_emb pip 包部署 onnx/torch 文件。

import asyncio
from infinity_emb import AsyncEmbeddingEngine, EngineArgs

query='what is a panda?'
docs = ['The giant panda (Ailuropoda melanoleuca), sometimes called a panda bear', "Paris is in France."]

engine = AsyncEmbeddingEngine.from_args(
    EngineArgs(model_name_or_path = "BAAI/bge-reranker-base", device="cpu", engine="torch" # or engine="optimum" for onnx
))

async def main(): 
    async with engine:
        ranking, usage = await engine.rerank(query=query, docs=docs)
        print(list(zip(ranking, docs)))
asyncio.run(main())

评估

baai-general-embedding 模型在 MTEB 和 C-MTEB 排行榜上均取得了最先进的性能! 有关更多详细信息和评估工具,请参见我们的 脚本。

  • MTEB:
模型名称维度序列长度平均值(56)检索(15)聚类(11)句子对分类(3)重排序(4)STS(10)摘要(1)分类(12)
BAAI/bge-large-en-v1.5102451264.2354.2946.0887.1260.0383.1131.6175.97
BAAI/bge-base-en-v1.576851263.5553.2545.7786.5558.8682.431.0775.53
BAAI/bge-small-en-v1.538451262.1751.6843.8284.9258.3681.5930.1274.14
bge-large-en102451263.9853.946.9885.859.4881.5632.0676.21
bge-base-en76851263.3653.046.3285.8658.781.8429.2775.27
gte-large102451263.1352.2246.8485.0059.1383.3531.6673.33
gte-base76851262.3951.1446.284.5758.6182.331.1773.01
e5-large-v2102451262.2550.5644.4986.0356.6182.0530.1975.24
bge-small-en38451262.1151.8244.3183.7857.9780.7230.5374.37
instructor-xl76851261.7949.2644.7486.6257.2983.0632.3261.79
e5-base-v276851261.550.2943.8085.7355.9181.0530.2873.84
gte-small38451261.3649.4644.8983.5457.782.0730.4272.31
text-embedding-ada-0021536819260.9949.2545.984.8956.3280.9730.870.93
e5-small-v238451259.9349.0439.9284.6754.3280.3931.1672.94
sentence-t5-xxl76851259.5142.2443.7285.0656.4282.6330.0873.42
all-mpnet-base-v276851457.7843.8143.6983.0459.3680.2827.4965.07
sgpt-bloom-7b1-msmarco4096204857.5948.2238.9381.955.6577.7433.666.19
  • C-MTEB: 我们创建了中文文本嵌入基准 C-MTEB,它包含来自 6 个任务的 31 个数据集。 详细介绍请参考 C_MTEB。
模型嵌入维度平均值检索STS句子对分类分类重排序聚类
BAAI/bge-large-zh-v1.5102464.5370.4656.2581.669.1365.8448.99
BAAI/bge-base-zh-v1.576863.1369.4953.7279.7568.0765.3947.53
BAAI/bge-small-zh-v1.551257.8261.7749.1170.4163.9660.9244.18
BAAI/bge-large-zh102464.2071.5354.9878.9468.3265.1148.39
bge-large-zh-noinstruct102463.5370.555376.7768.5864.9150.01
BAAI/bge-base-zh76862.9669.5354.1277.567.0764.9147.63
multilingual-e5-large102458.7963.6648.4469.8967.3456.0048.23
BAAI/bge-small-zh51258.2763.0749.4570.3563.6461.4845.09
m3e-base76857.1056.9150.4763.9967.5259.3447.68
m3e-large102457.0554.7550.4264.368.259.6648.88
multilingual-e5-base76855.4861.6346.4967.0765.3554.3540.68
multilingual-e5-small38455.3859.9545.2766.4565.8553.8645.26
text-embedding-ada-002(OpenAI)153653.0252.043.3569.5664.3154.2845.68
luotuo102449.3744.442.7866.626149.2544.39
text2vec-base76847.6338.7943.4167.4162.1949.4537.66
text2vec-large102447.3641.9444.9770.8660.6649.1630.02
  • 重排序: 评估脚本参见 C_MTEB。
模型T2RerankingT2RerankingZh2En*T2RerankingEn2Zh*MMarcoRerankingCMedQAv1CMedQAv2平均值
text2vec-base-multilingual64.6662.9462.5114.3748.4648.650.26
multilingual-e5-small65.6260.9456.4129.9167.2666.5457.78
multilingual-e5-large64.5561.6154.2828.667.4267.9257.4
multilingual-e5-base64.2162.1354.6829.566.2366.9857.29
m3e-base66.0362.7456.0717.5177.0576.7659.36
m3e-large66.1362.7256.116.4677.7678.2759.57
bge-base-zh-v1.566.4963.2557.0229.7480.4784.8863.64
bge-large-zh-v1.565.7463.3957.0328.7483.4585.4463.97
BAAI/bge-reranker-base67.2863.9560.4535.4681.2684.165.42
BAAI/bge-reranker-large67.664.0361.4437.1682.1584.1866.09

*:T2RerankingZh2En 和 T2RerankingEn2Zh 是跨语言检索任务

训练

BAAI 嵌入

我们使用 retromae 对模型进行预训练,并利用对比学习在大规模数据对上训练模型。 您可以按照我们的 示例 在您的数据上对嵌入模型进行微调。 我们还提供了一个 预训练示例。 请注意,预训练的目标是重构文本,预训练模型不能直接用于相似度计算,需要进行微调。 关于 bge 的更多训练细节,请参见 baai_general_embedding。

BGE 重排序模型

交叉编码器会对输入的文本对执行全注意力机制, 其准确率高于嵌入模型(即双编码器),但耗时也更多。 因此,它可用于对嵌入模型返回的 top-k 文档进行重排序。 我们在多语言数据对上训练交叉编码器, 其数据格式与嵌入模型相同,因此您可以按照我们的 示例 轻松对其进行微调。 更多详情请参考 ./FlagEmbedding/reranker/README.md

引用

如果您觉得本仓库有用,请考虑点赞 :star: 并引用

@misc{bge_embedding,
      title={C-Pack: Packaged Resources To Advance General Chinese Embedding}, 
      author={Shitao Xiao and Zheng Liu and Peitian Zhang and Niklas Muennighoff},
      year={2023},
      eprint={2309.07597},
      archivePrefix={arXiv},
      primaryClass={cs.CL}
}

许可协议

FlagEmbedding 基于 MIT 许可协议 进行许可。发布的模型可免费用于商业用途。