评估

sentence_transformers.evaluation 定义了不同的类,可用于在训练期间评估模型。

BinaryClassificationEvaluator

class sentence_transformers.evaluation.BinaryClassificationEvaluator(sentences1: list[str], sentences2: list[str], labels: list[int], name: str = '', batch_size: int = 32, show_progress_bar: bool = False, write_csv: bool = True, truncate_dim: int | None = None, similarity_fn_names: list[Literal['cosine', 'dot', 'euclidean', 'manhattan']] | None = None)[source]

根据嵌入的相似度评估模型,通过计算识别相似和不同句子的准确性。评估指标包括余弦相似度、点积分数、欧几里得距离和曼哈顿距离。返回的分数是指定指标的准确性。

结果将写入 CSV 文件。如果 CSV 文件已存在,则会追加值。

不相似的对标签应为 0,相似的对标签应为 1。

参数:
  • sentences1 (List[str]) – 第一列句子。

  • sentences2 (List[str]) – 第二列句子。

  • labels (List[int]) – labels[i] 是对 (sentences1[i], sentences2[i]) 的标签。必须为 0 或 1。

  • name (str, optional) – 输出名称。默认为空字符串。

  • batch_size (int, optional) – 用于计算嵌入的批次大小。默认为 32。

  • show_progress_bar (bool, optional) – 如果为 True,则显示进度条。默认为 False。

  • write_csv (bool, optional) – 将结果写入 CSV 文件。默认为 True。

  • truncate_dim (Optional[int], optional) – 句子嵌入截断到的维度。None 使用模型当前的截断维度。默认为 None。

  • similarity_fn_names (Optional[List[Literal["cosine", "dot", "euclidean", "manhattan"]]], optional) – 要使用的相似度函数。如果未指定,则默认为模型的 similarity_fn_name 属性。默认为 None。

示例

from sentence_transformers import SentenceTransformer
from sentence_transformers.evaluation import BinaryClassificationEvaluator
from datasets import load_dataset

# Load a model
model = SentenceTransformer('all-mpnet-base-v2')

# Load a dataset with two text columns and a class label column (https://huggingface.co/datasets/sentence-transformers/quora-duplicates)
eval_dataset = load_dataset("sentence-transformers/quora-duplicates", "pair-class", split="train[-1000:]")

# Initialize the evaluator
binary_acc_evaluator = BinaryClassificationEvaluator(
    sentences1=eval_dataset["sentence1"],
    sentences2=eval_dataset["sentence2"],
    labels=eval_dataset["label"],
    name="quora_duplicates_dev",
)
results = binary_acc_evaluator(model)
'''
Binary Accuracy Evaluation of the model on the quora_duplicates_dev dataset:
Accuracy with Cosine-Similarity:             81.60  (Threshold: 0.8352)
F1 with Cosine-Similarity:                   75.27  (Threshold: 0.7715)
Precision with Cosine-Similarity:            65.81
Recall with Cosine-Similarity:               87.89
Average Precision with Cosine-Similarity:    76.03
Matthews Correlation with Cosine-Similarity: 62.48
'''
print(binary_acc_evaluator.primary_metric)
# => "quora_duplicates_dev_cosine_ap"
print(results[binary_acc_evaluator.primary_metric])
# => 0.760277070888393

EmbeddingSimilarityEvaluator

class sentence_transformers.evaluation.EmbeddingSimilarityEvaluator(sentences1: list[str], sentences2: list[str], scores: list[float], batch_size: int = 16, main_similarity: str | SimilarityFunction | None = None, similarity_fn_names: list[Literal['cosine', 'dot', 'euclidean', 'manhattan']] | None = None, name: str = '', show_progress_bar: bool = False, write_csv: bool = True, precision: Literal['float32', 'int8', 'uint8', 'binary', 'ubinary'] | None = None, truncate_dim: int | None = None)[source]

根据嵌入的相似度评估模型,通过计算与黄金标准标签的 Spearman 和 Pearson 秩相关系数。评估指标包括余弦相似度、欧几里得距离和曼哈顿距离。返回的分数是指定指标的 Spearman 相关系数。

参数:
  • sentences1 (List[str]) – 对中第一个句子列表。

  • sentences2 (List[str]) – 对中第二个句子列表。

  • scores (List[float]) – sentences1[i] 和 sentences2[i] 之间的相似度分数。

  • batch_size (int, optional) – 处理句子的批次大小。默认为 16。

  • main_similarity (Optional[Union[str, SimilarityFunction]], optional) – 要使用的主要相似度函数。可以是字符串(例如“cosine”、“dot”)或 SimilarityFunction 对象。默认为 None。

  • similarity_fn_names (List[str], optional) – 要使用的相似度函数名称列表。如果为 None,则使用模型的 similarity_fn_name 属性。默认为 None。

  • name (str, optional) – 评估器的名称。默认为空字符串。

  • show_progress_bar (bool, optional) – 评估期间是否显示进度条。默认为 False。

  • write_csv (bool, optional) – 是否将评估结果写入 CSV 文件。默认为 True。

  • precision (Optional[Literal["float32", "int8", "uint8", "binary", "ubinary"]], optional) – 嵌入要使用的精度。可以是“float32”、“int8”、“uint8”、“binary”或“ubinary”。默认为 None。

  • truncate_dim (Optional[int], optional) – 句子嵌入截断到的维度。None 使用模型当前的截断维度。默认为 None。

示例

from datasets import load_dataset
from sentence_transformers import SentenceTransformer
from sentence_transformers.evaluation import EmbeddingSimilarityEvaluator, SimilarityFunction

# Load a model
model = SentenceTransformer('all-mpnet-base-v2')

# Load the STSB dataset (https://huggingface.co/datasets/sentence-transformers/stsb)
eval_dataset = load_dataset("sentence-transformers/stsb", split="validation")

# Initialize the evaluator
dev_evaluator = EmbeddingSimilarityEvaluator(
    sentences1=eval_dataset["sentence1"],
    sentences2=eval_dataset["sentence2"],
    scores=eval_dataset["score"],
    name="sts_dev",
)
results = dev_evaluator(model)
'''
EmbeddingSimilarityEvaluator: Evaluating the model on the sts-dev dataset:
Cosine-Similarity:  Pearson: 0.8806 Spearman: 0.8810
'''
print(dev_evaluator.primary_metric)
# => "sts_dev_pearson_cosine"
print(results[dev_evaluator.primary_metric])
# => 0.881019449484294

InformationRetrievalEvaluator

class sentence_transformers.evaluation.InformationRetrievalEvaluator(queries: dict[str, str], corpus: dict[str, str], relevant_docs: dict[str, set[str]], corpus_chunk_size: int = 50000, mrr_at_k: list[int] = [10], ndcg_at_k: list[int] = [10], accuracy_at_k: list[int] = [1, 3, 5, 10], precision_recall_at_k: list[int] = [1, 3, 5, 10], map_at_k: list[int] = [100], show_progress_bar: bool = False, batch_size: int = 32, name: str = '', write_csv: bool = True, truncate_dim: int | None = None, score_functions: dict[str, Callable[[Tensor, Tensor], Tensor]] | None = None, main_score_function: str | SimilarityFunction | None = None, query_prompt: str | None = None, query_prompt_name: str | None = None, corpus_prompt: str | None = None, corpus_prompt_name: str | None = None, write_predictions: bool = False)[source]

该类评估信息检索(IR)设置。

给定一组查询和一个大型语料库。它将为每个查询检索前 k 个最相似的文档。它测量平均倒数排名(MRR)、Recall@k 和归一化折现累积增益(NDCG)。

参数:
  • queries (Dict[str, str]) – 将查询 ID 映射到查询的字典。

  • corpus (Dict[str, str]) – 将文档 ID 映射到文档的字典。

  • relevant_docs (Dict[str, Set[str]]) – 将查询 ID 映射到一组相关文档 ID 的字典。

  • corpus_chunk_size (int) – 语料库每个块的大小。默认为 50000。

  • mrr_at_k (List[int]) – 一个整数列表,表示用于 MRR 计算的 k 值。默认为 [10]。

  • ndcg_at_k (List[int]) – 一个整数列表,表示用于 NDCG 计算的 k 值。默认为 [10]。

  • accuracy_at_k (List[int]) – 一个整数列表,表示用于准确性计算的 k 值。默认为 [1, 3, 5, 10]。

  • precision_recall_at_k (List[int]) – 一个整数列表,表示用于精确度和召回率计算的 k 值。默认为 [1, 3, 5, 10]。

  • map_at_k (List[int]) – 一个整数列表,表示用于 MAP 计算的 k 值。默认为 [100]。

  • show_progress_bar (bool) – 评估期间是否显示进度条。默认为 False。

  • batch_size (int) – 评估的批次大小。默认为 32。

  • name (str) – 评估的名称。默认为空字符串。

  • write_csv (bool) – 是否将评估结果写入 CSV 文件。默认为 True。

  • truncate_dim (int, optional) – 嵌入截断到的维度。默认为 None。

  • score_functions (Dict[str, Callable[[Tensor, Tensor], Tensor]]) – 将评分函数名称映射到评分函数的字典。默认为 model 中的 similarity 函数。

  • main_score_function (Union[str, SimilarityFunction], optional) – 用于评估的主要评分函数。默认为 None。

  • query_prompt (str, optional) – 编码语料库时要使用的提示。默认为 None。

  • query_prompt_name (str, optional) – 编码语料库时要使用的提示名称。默认为 None。

  • corpus_prompt (str, optional) – 编码语料库时要使用的提示。默认为 None。

  • corpus_prompt_name (str, optional) – 编码语料库时要使用的提示名称。默认为 None。

  • write_predictions (bool) – 是否将预测结果写入 JSONL 文件。默认为 False。这对于下游评估很有用,因为它可以作为接受预计算预测的 ReciprocalRankFusionEvaluator 的输入。

示例

import random
from sentence_transformers import SentenceTransformer
from sentence_transformers.evaluation import InformationRetrievalEvaluator
from datasets import load_dataset

# Load a model
model = SentenceTransformer('all-MiniLM-L6-v2')

# Load the Touche-2020 IR dataset (https://huggingface.co/datasets/BeIR/webis-touche2020, https://huggingface.co/datasets/BeIR/webis-touche2020-qrels)
corpus = load_dataset("BeIR/webis-touche2020", "corpus", split="corpus")
queries = load_dataset("BeIR/webis-touche2020", "queries", split="queries")
relevant_docs_data = load_dataset("BeIR/webis-touche2020-qrels", split="test")

# For this dataset, we want to concatenate the title and texts for the corpus
corpus = corpus.map(lambda x: {'text': x['title'] + " " + x['text']}, remove_columns=['title'])

# Shrink the corpus size heavily to only the relevant documents + 30,000 random documents
required_corpus_ids = set(map(str, relevant_docs_data["corpus-id"]))
required_corpus_ids |= set(random.sample(corpus["_id"], k=30_000))
corpus = corpus.filter(lambda x: x["_id"] in required_corpus_ids)

# Convert the datasets to dictionaries
corpus = dict(zip(corpus["_id"], corpus["text"]))  # Our corpus (cid => document)
queries = dict(zip(queries["_id"], queries["text"]))  # Our queries (qid => question)
relevant_docs = {}  # Query ID to relevant documents (qid => set([relevant_cids])
for qid, corpus_ids in zip(relevant_docs_data["query-id"], relevant_docs_data["corpus-id"]):
    qid = str(qid)
    corpus_ids = str(corpus_ids)
    if qid not in relevant_docs:
        relevant_docs[qid] = set()
    relevant_docs[qid].add(corpus_ids)

# Given queries, a corpus and a mapping with relevant documents, the InformationRetrievalEvaluator computes different IR metrics.
ir_evaluator = InformationRetrievalEvaluator(
    queries=queries,
    corpus=corpus,
    relevant_docs=relevant_docs,
    name="BeIR-touche2020-subset-test",
)
results = ir_evaluator(model)
'''
Information Retrieval Evaluation of the model on the BeIR-touche2020-test dataset:
Queries: 49
Corpus: 31923

Score-Function: cosine
Accuracy@1: 77.55%
Accuracy@3: 93.88%
Accuracy@5: 97.96%
Accuracy@10: 100.00%
Precision@1: 77.55%
Precision@3: 72.11%
Precision@5: 71.43%
Precision@10: 62.65%
Recall@1: 1.72%
Recall@3: 4.78%
Recall@5: 7.90%
Recall@10: 13.86%
MRR@10: 0.8580
NDCG@10: 0.6606
MAP@100: 0.2934
'''
print(ir_evaluator.primary_metric)
# => "BeIR-touche2020-test_cosine_map@100"
print(results[ir_evaluator.primary_metric])
# => 0.29335196224364596

NanoBEIREvaluator

class sentence_transformers.evaluation.NanoBEIREvaluator(dataset_names: list[~typing.Literal['climatefever', 'dbpedia', 'fever', 'fiqa2018', 'hotpotqa', 'msmarco', 'nfcorpus', 'nq', 'quoraretrieval', 'scidocs', 'arguana', 'scifact', 'touche2020']] | None = None, mrr_at_k: list[int] = [10], ndcg_at_k: list[int] = [10], accuracy_at_k: list[int] = [1, 3, 5, 10], precision_recall_at_k: list[int] = [1, 3, 5, 10], map_at_k: list[int] = [100], show_progress_bar: bool = False, batch_size: int = 32, write_csv: bool = True, truncate_dim: int | None = None, score_functions: dict[str, ~typing.Callable[[~torch.Tensor, ~torch.Tensor], ~torch.Tensor]] | None = None, main_score_function: str | ~sentence_transformers.similarity_functions.SimilarityFunction | None = None, aggregate_fn: ~typing.Callable[[list[float]], float] = <function mean>, aggregate_key: str = 'mean', query_prompts: str | dict[str, str] | None = None, corpus_prompts: str | dict[str, str] | None = None, write_predictions: bool = False)[source]

该类评估 SentenceTransformer 模型在信息检索数据集 NanoBEIR 集合上的性能。

该集合是一组基于 BEIR 集合的数据集,但规模显著更小,因此可以在进行全面评估之前,用于快速评估模型的检索性能。这些数据集可在 Hugging Face 的 NanoBEIR 集合中获取。此评估器将为每个数据集并平均返回与 InformationRetrievalEvaluator 相同的指标(即 MRR、nDCG、Recall@k)。

参数:
  • dataset_names (List[str]) – 要评估的数据集名称。默认为所有数据集。

  • mrr_at_k (List[int]) – 一个整数列表,表示用于 MRR 计算的 k 值。默认为 [10]。

  • ndcg_at_k (List[int]) – 一个整数列表,表示用于 NDCG 计算的 k 值。默认为 [10]。

  • accuracy_at_k (List[int]) – 一个整数列表,表示用于准确性计算的 k 值。默认为 [1, 3, 5, 10]。

  • precision_recall_at_k (List[int]) – 一个整数列表,表示用于精确度和召回率计算的 k 值。默认为 [1, 3, 5, 10]。

  • map_at_k (List[int]) – 一个整数列表,表示用于 MAP 计算的 k 值。默认为 [100]。

  • show_progress_bar (bool) – 评估期间是否显示进度条。默认为 False。

  • batch_size (int) – 评估的批次大小。默认为 32。

  • write_csv (bool) – 是否将评估结果写入 CSV 文件。默认为 True。

  • truncate_dim (int, optional) – 嵌入截断到的维度。默认为 None。

  • score_functions (Dict[str, Callable[[Tensor, Tensor], Tensor]]) – 将评分函数名称映射到评分函数的字典。默认为 {SimilarityFunction.COSINE.value: cos_sim, SimilarityFunction.DOT_PRODUCT.value: dot_score}。

  • main_score_function (Union[str, SimilarityFunction], optional) – 用于评估的主要评分函数。默认为 None。

  • aggregate_fn (Callable[[list[float]], float]) – 聚合分数的函数。默认为 np.mean。

  • aggregate_key (str) – 用于聚合分数的键。默认为“mean”。

  • query_prompts (str | dict[str, str], optional) – 要添加到查询的提示。如果是一个字符串,会将相同的提示添加到所有查询。如果是一个字典,则期望 dataset_names 中的所有数据集都是键。

  • corpus_prompts (str | dict[str, str], optional) – 要添加到语料库的提示。如果是一个字符串,会将相同的提示添加到所有语料库。如果是一个字典,则期望 dataset_names 中的所有数据集都是键。

  • write_predictions (bool) – 是否将预测结果写入 JSONL 文件。默认为 False。这对于下游评估很有用,因为它可以作为接受预计算预测的 ReciprocalRankFusionEvaluator 的输入。

示例

from sentence_transformers import SentenceTransformer
from sentence_transformers.evaluation import NanoBEIREvaluator

model = SentenceTransformer('intfloat/multilingual-e5-large-instruct')

datasets = ["QuoraRetrieval", "MSMARCO"]
query_prompts = {
    "QuoraRetrieval": "Instruct: Given a question, retrieve questions that are semantically equivalent to the given question\nQuery: ",
    "MSMARCO": "Instruct: Given a web search query, retrieve relevant passages that answer the query\nQuery: "
}

evaluator = NanoBEIREvaluator(
    dataset_names=datasets,
    query_prompts=query_prompts,
)

results = evaluator(model)
'''
NanoBEIR Evaluation of the model on ['QuoraRetrieval', 'MSMARCO'] dataset:
Evaluating NanoQuoraRetrieval
Information Retrieval Evaluation of the model on the NanoQuoraRetrieval dataset:
Queries: 50
Corpus: 5046

Score-Function: cosine
Accuracy@1: 92.00%
Accuracy@3: 98.00%
Accuracy@5: 100.00%
Accuracy@10: 100.00%
Precision@1: 92.00%
Precision@3: 40.67%
Precision@5: 26.00%
Precision@10: 14.00%
Recall@1: 81.73%
Recall@3: 94.20%
Recall@5: 97.93%
Recall@10: 100.00%
MRR@10: 0.9540
NDCG@10: 0.9597
MAP@100: 0.9395

Evaluating NanoMSMARCO
Information Retrieval Evaluation of the model on the NanoMSMARCO dataset:
Queries: 50
Corpus: 5043

Score-Function: cosine
Accuracy@1: 40.00%
Accuracy@3: 74.00%
Accuracy@5: 78.00%
Accuracy@10: 88.00%
Precision@1: 40.00%
Precision@3: 24.67%
Precision@5: 15.60%
Precision@10: 8.80%
Recall@1: 40.00%
Recall@3: 74.00%
Recall@5: 78.00%
Recall@10: 88.00%
MRR@10: 0.5849
NDCG@10: 0.6572
MAP@100: 0.5892
Average Queries: 50.0
Average Corpus: 5044.5

Aggregated for Score Function: cosine
Accuracy@1: 66.00%
Accuracy@3: 86.00%
Accuracy@5: 89.00%
Accuracy@10: 94.00%
Precision@1: 66.00%
Recall@1: 60.87%
Precision@3: 32.67%
Recall@3: 84.10%
Precision@5: 20.80%
Recall@5: 87.97%
Precision@10: 11.40%
Recall@10: 94.00%
MRR@10: 0.7694
NDCG@10: 0.8085
'''
print(evaluator.primary_metric)
# => "NanoBEIR_mean_cosine_ndcg@10"
print(results[evaluator.primary_metric])
# => 0.8084508771660436

MSEEvaluator

class sentence_transformers.evaluation.MSEEvaluator(source_sentences: list[str], target_sentences: list[str], teacher_model=None, show_progress_bar: bool = False, batch_size: int = 32, name: str = '', write_csv: bool = True, truncate_dim: int | None = None)[source]

计算计算出的句子嵌入与目标句子嵌入之间的均方误差 (x100)。

MSE 是在 ||teacher.encode(source_sentences) - student.encode(target_sentences)|| 之间计算的。

对于多语言知识蒸馏 (https://arxiv.org/abs/2004.09813),source_sentences 是英语,而 target_sentences 是德语、中文、西班牙语等不同语言。

参数:
  • source_sentences (List[str]) – 用于教师模型嵌入的源句子。

  • target_sentences (List[str]) – 用于学生模型嵌入的目标句子。

  • teacher_model (SentenceTransformer, optional) – 用于计算源句子嵌入的教师模型。

  • show_progress_bar (bool, optional) – 计算嵌入时是否显示进度条。默认为 False。

  • batch_size (int, optional) – 计算句子嵌入的批次大小。默认为 32。

  • name (str, optional) – 评估器的名称。默认为空字符串。

  • write_csv (bool, optional) – 是否将结果写入 CSV 文件。默认为 True。

  • truncate_dim (int, optional) – 句子嵌入截断到的维度。None 使用模型当前的截断维度。默认为 None。

示例

from sentence_transformers import SentenceTransformer
from sentence_transformers.evaluation import MSEEvaluator
from datasets import load_dataset

# Load a model
student_model = SentenceTransformer('paraphrase-multilingual-mpnet-base-v2')
teacher_model = SentenceTransformer('all-mpnet-base-v2')

# Load any dataset with some texts
dataset = load_dataset("sentence-transformers/stsb", split="validation")
sentences = dataset["sentence1"] + dataset["sentence2"]

# Given queries, a corpus and a mapping with relevant documents, the MSEEvaluator computes different MSE metrics.
mse_evaluator = MSEEvaluator(
    source_sentences=sentences,
    target_sentences=sentences,
    teacher_model=teacher_model,
    name="stsb-dev",
)
results = mse_evaluator(student_model)
'''
MSE evaluation (lower = better) on the stsb-dev dataset:
MSE (*100):  0.805045
'''
print(mse_evaluator.primary_metric)
# => "stsb-dev_negative_mse"
print(results[mse_evaluator.primary_metric])
# => -0.8050452917814255

ParaphraseMiningEvaluator

class sentence_transformers.evaluation.ParaphraseMiningEvaluator(sentences_map: dict[str, str], duplicates_list: list[tuple[str, str]] | None = None, duplicates_dict: dict[str, dict[str, bool]] | None = None, add_transitive_closure: bool = False, query_chunk_size: int = 5000, corpus_chunk_size: int = 100000, max_pairs: int = 500000, top_k: int = 100, show_progress_bar: bool = False, batch_size: int = 16, name: str = '', write_csv: bool = True, truncate_dim: int | None = None)[source]

给定大量句子,此评估器执行复述(重复)挖掘并识别相似度最高的对。它将提取的复述对与一组黄金标签进行比较,并计算 F1 分数。

参数:
  • sentences_map (Dict[str, str]) – 将句子 ID 映射到句子的字典。例如,sentences_map[id] => 句子。

  • duplicates_list (List[Tuple[str, str]], optional) – 一个包含 ID 对 [(id1, id2), (id1, id5)] 的列表,用于识别 sentences_map 中的重复/复述。默认为 None。

  • duplicates_dict (Dict[str, Dict[str, bool]], optional) – 一个默认字典,如果 id1 和 id2 是重复项,则将 [id1][id2] 映射为 True。必须是对称的,即如果 [id1][id2] => True,则 [id2][id1] => True。默认为 None。

  • add_transitive_closure (bool, optional) – 如果为 True,则添加传递闭包,即如果 dup[a][b] 和 dup[b][c],则 dup[a][c]。默认为 False。

  • query_chunk_size (int, optional) – 为了识别复述,将计算所有句子对之间的余弦相似度。由于这可能需要大量内存,我们执行批处理计算。query_chunk_size 数量的句子将与最多 corpus_chunk_size 数量的句子进行比较。在默认设置中,5000 个句子将被分组并与最多 100k 个其他句子进行比较。默认为 5000。

  • corpus_chunk_size (int, optional) – 语料库将分批处理,以减少内存需求。默认为 100000。

  • max_pairs (int, optional) – 我们将只提取最多 max_pairs 个潜在复述候选。默认为 500000。

  • top_k (int, optional) – 对于每个查询,我们提取前 top_k 个最相似的对并将其添加到排序列表中。即,对于一个句子,我们不能找到超过 top_k 个复述。默认为 100。

  • show_progress_bar (bool, optional) – 输出进度条。默认为 False。

  • batch_size (int, optional) – 计算句子嵌入的批次大小。默认为 16。

  • name (str, optional) – 实验名称。默认为空字符串。

  • write_csv (bool, optional) – 是否将结果写入 CSV 文件。默认为 True。

  • truncate_dim (Optional[int], optional) – 句子嵌入截断到的维度。None 使用模型当前的截断维度。默认为 None。

示例

from datasets import load_dataset
from sentence_transformers.SentenceTransformer import SentenceTransformer
from sentence_transformers.evaluation import ParaphraseMiningEvaluator

# Load a model
model = SentenceTransformer('all-mpnet-base-v2')

# Load the Quora Duplicates Mining dataset
questions_dataset = load_dataset("sentence-transformers/quora-duplicates-mining", "questions", split="dev")
duplicates_dataset = load_dataset("sentence-transformers/quora-duplicates-mining", "duplicates", split="dev")

# Create a mapping from qid to question & a list of duplicates (qid1, qid2)
qid_to_questions = dict(zip(questions_dataset["qid"], questions_dataset["question"]))
duplicates = list(zip(duplicates_dataset["qid1"], duplicates_dataset["qid2"]))

# Initialize the paraphrase mining evaluator
paraphrase_mining_evaluator = ParaphraseMiningEvaluator(
    sentences_map=qid_to_questions,
    duplicates_list=duplicates,
    name="quora-duplicates-dev",
)
results = paraphrase_mining_evaluator(model)
'''
Paraphrase Mining Evaluation of the model on the quora-duplicates-dev dataset:
Number of candidate pairs: 250564
Average Precision: 56.51
Optimal threshold: 0.8325
Precision: 52.76
Recall: 59.19
F1: 55.79
'''
print(paraphrase_mining_evaluator.primary_metric)
# => "quora-duplicates-dev_average_precision"
print(results[paraphrase_mining_evaluator.primary_metric])
# => 0.5650940787776353

RerankingEvaluator

class sentence_transformers.evaluation.RerankingEvaluator(samples: list[dict[str, str | list[str]]], at_k: int = 10, name: str = '', write_csv: bool = True, similarity_fct: ~typing.Callable[[~torch.Tensor, ~torch.Tensor], ~torch.Tensor] = <function cos_sim>, batch_size: int = 64, show_progress_bar: bool = False, use_batched_encoding: bool = True, truncate_dim: int | None = None, mrr_at_k: int | None = None)[source]

该类评估 SentenceTransformer 模型在重排任务中的性能。

给定一个查询和文档列表,它计算所有可能文档的评分 [query, doc_i] 并按降序排列。然后,计算 MRR@10NDCG@10 和 MAP 来衡量排名质量。

参数:
  • samples (list) –

    一个字典列表,其中每个字典表示一个样本并包含以下键:

    • ’query’:搜索查询。

    • ’positive’:积极(相关)文档列表。

    • ’negative’:消极(不相关)文档列表。

  • at_k (int, optional) – 评估时只考虑每个查询的前 k 个最相似文档。默认为 10。

  • name (str, optional) – 评估器的名称。默认为空字符串。

  • write_csv (bool, optional) – 是否将结果写入 CSV 文件。默认为 True。

  • similarity_fct (Callable[[torch.Tensor, torch.Tensor], torch.Tensor], optional) – 句子嵌入之间的相似度函数。默认为余弦相似度。默认为 cos_sim。

  • batch_size (int, optional) – 计算句子嵌入的批次大小。默认为 64。

  • show_progress_bar (bool, optional) – 计算嵌入时是否显示进度条。默认为 False。

  • use_batched_encoding (bool, optional) – 是否批量编码查询和文档以提高速度,或者逐个编码以节省内存。默认为 True。

  • truncate_dim (Optional[int], optional) – 句子嵌入截断到的维度。None 使用模型当前的截断维度。默认为 None。

  • mrr_at_k (Optional[int], optional) – 已弃用的参数。请改用 at_k。默认为 None。

示例

from sentence_transformers import SentenceTransformer
from sentence_transformers.evaluation import RerankingEvaluator
from datasets import load_dataset

# Load a model
model = SentenceTransformer("all-MiniLM-L6-v2")

# Load a dataset with queries, positives, and negatives
eval_dataset = load_dataset("microsoft/ms_marco", "v1.1", split="validation")

samples = [
    {
        "query": sample["query"],
        "positive": [text for is_selected, text in zip(sample["passages"]["is_selected"], sample["passages"]["passage_text"]) if is_selected],
        "negative": [text for is_selected, text in zip(sample["passages"]["is_selected"], sample["passages"]["passage_text"]) if not is_selected],
    }
    for sample in eval_dataset
]

# Initialize the evaluator
reranking_evaluator = RerankingEvaluator(
    samples=samples,
    name="ms-marco-dev",
)
results = reranking_evaluator(model)
'''
RerankingEvaluator: Evaluating the model on the ms-marco-dev dataset:
Queries: 9706      Positives: Min 1.0, Mean 1.1, Max 5.0   Negatives: Min 1.0, Mean 7.1, Max 9.0
MAP: 56.07
MRR@10: 56.70
NDCG@10: 67.08
'''
print(reranking_evaluator.primary_metric)
# => ms-marco-dev_ndcg@10
print(results[reranking_evaluator.primary_metric])
# => 0.6708042171399308

SentenceEvaluator

class sentence_transformers.evaluation.SentenceEvaluator[source]

所有评估器的基类。值得注意的是,该类引入了 greater_is_betterprimary_metric 属性。前者是一个布尔值,表示更高的评估分数是否更好,这用于在训练参数中将 load_best_model_at_end 设置为 True 时选择最佳检查点。

后者是一个字符串,指示评估器的主要指标。每当评估器返回一个指标字典时,都必须定义此项,并且主要指标是指向主要指标的键,即用于模型选择和/或日志记录的指标。

扩展此类别并为自定义评估器实现 __call__ 方法。

SequentialEvaluator

class sentence_transformers.evaluation.SequentialEvaluator(evaluators: ~collections.abc.Iterable[~sentence_transformers.evaluation.SentenceEvaluator.SentenceEvaluator], main_score_function=<function SequentialEvaluator.<lambda>>)[source]

此评估器允许传递多个子评估器。评估模型时,数据会按顺序传递给所有子评估器。

所有分数都传递给“main_score_function”,该函数会导出一个最终分数。

参数:
  • evaluators (Iterable[SentenceEvaluator]) – SentenceEvaluator 对象的集合。

  • main_score_function (function, optional) – 一个接受分数列表并返回主要分数的函数。默认为选择列表中的最后一个分数。

示例

evaluator1 = BinaryClassificationEvaluator(...)
evaluator2 = InformationRetrievalEvaluator(...)
evaluator3 = MSEEvaluator(...)
seq_evaluator = SequentialEvaluator([evaluator1, evaluator2, evaluator3])

TranslationEvaluator

class sentence_transformers.evaluation.TranslationEvaluator(source_sentences: list[str], target_sentences: list[str], show_progress_bar: bool = False, batch_size: int = 16, name: str = '', print_wrong_matches: bool = False, write_csv: bool = True, truncate_dim: int | None = None)[source]

给定两组不同语言的句子,例如 (en_1, en_2, en_3...) 和 (fr_1, fr_2, fr_3, ...),并假设 fr_i 是 en_i 的翻译。检查 vec(en_i) 是否与 vec(fr_i) 具有最高的相似度。计算两个方向的准确性。

标签需要指示句子之间的相似度。

参数:
  • source_sentences (List[str]) – 源语言中的句子列表。

  • target_sentences (List[str]) – 目标语言中的句子列表。

  • show_progress_bar (bool) – 计算嵌入时是否显示进度条。默认为 False。

  • batch_size (int) – 计算句子嵌入的批次大小。默认为 16。

  • name (str) – 评估器的名称。默认为空字符串。

  • print_wrong_matches (bool) – 是否打印不正确的匹配项。默认为 False。

  • write_csv (bool) – 是否将评估结果写入 CSV 文件。默认为 True。

  • truncate_dim (int, optional) – 句子嵌入截断到的维度。如果为 None,则使用模型当前的截断维度。默认为 None。

示例

from sentence_transformers import SentenceTransformer
from sentence_transformers.evaluation import TranslationEvaluator
from datasets import load_dataset

# Load a model
model = SentenceTransformer('paraphrase-multilingual-mpnet-base-v2')

# Load a parallel sentences dataset
dataset = load_dataset("sentence-transformers/parallel-sentences-news-commentary", "en-nl", split="train[:1000]")

# Initialize the TranslationEvaluator using the same texts from two languages
translation_evaluator = TranslationEvaluator(
    source_sentences=dataset["english"],
    target_sentences=dataset["non_english"],
    name="news-commentary-en-nl",
)
results = translation_evaluator(model)
'''
Evaluating translation matching Accuracy of the model on the news-commentary-en-nl dataset:
Accuracy src2trg: 90.80
Accuracy trg2src: 90.40
'''
print(translation_evaluator.primary_metric)
# => "news-commentary-en-nl_mean_accuracy"
print(results[translation_evaluator.primary_metric])
# => 0.906

TripletEvaluator

class sentence_transformers.evaluation.TripletEvaluator(anchors: list[str], positives: list[str], negatives: list[str], main_similarity_function: str | SimilarityFunction | None = None, margin: float | dict[str, float] | None = None, name: str = '', batch_size: int = 16, show_progress_bar: bool = False, write_csv: bool = True, truncate_dim: int | None = None, similarity_fn_names: list[Literal['cosine', 'dot', 'euclidean', 'manhattan']] | None = None, main_distance_function: str | SimilarityFunction | None = 'deprecated')[source]

根据三元组:(句子、正例、负例)评估模型。检查 similarity(sentence, positive_example) > similarity(sentence, negative_example) + margin 是否成立。

参数:
  • anchors (List[str]) – 用于检查相似度的句子。(例如查询)

  • positives (List[str]) – 正向句子列表。

  • negatives (List[str]) – 负向句子列表。

  • main_similarity_function (联合类型[字符串, 相似度函数], 可选) – 要使用的相似度函数。如果未指定,则使用余弦相似度、点积、欧几里得相似度和曼哈顿相似度。默认为 None。

  • margin (联合类型[浮点数, 字典[字符串, 浮点数]], 可选) – 针对各种相似度指标的裕量。如果提供一个浮点数,它将作为所有相似度指标的裕量。如果提供一个字典,键应为“cosine”、“dot”、“manhattan”和“euclidean”。值指定负样本与锚点的距离应比正样本更远的最小裕量。默认为 None。

  • name (字符串) – 输出的名称。默认为“”。

  • batch_size (整型) – 用于计算嵌入的批处理大小。默认为 16。

  • show_progress_bar (布尔值) – 如果为 True,则打印进度条。默认为 False。

  • write_csv (布尔值) – 将结果写入 CSV 文件。默认为 True。

  • truncate_dim (int, optional) – 句子嵌入截断到的维度。None 使用模型当前的截断维度。默认为 None。

  • similarity_fn_names (列表[字符串], 可选) – 要评估的相似度函数名称列表。如果未指定,则使用 model.similarity_fn_name 进行评估。默认为 None。

示例

from sentence_transformers import SentenceTransformer
from sentence_transformers.evaluation import TripletEvaluator
from datasets import load_dataset

# Load a model
model = SentenceTransformer('all-mpnet-base-v2')

# Load a dataset with (anchor, positive, negative) triplets
dataset = load_dataset("sentence-transformers/all-nli", "triplet", split="dev")

# Initialize the TripletEvaluator using anchors, positives, and negatives
triplet_evaluator = TripletEvaluator(
    anchors=dataset[:1000]["anchor"],
    positives=dataset[:1000]["positive"],
    negatives=dataset[:1000]["negative"],
    name="all_nli_dev",
)
results = triplet_evaluator(model)
'''
TripletEvaluator: Evaluating the model on the all-nli-dev dataset:
Accuracy Cosine Similarity:        95.60%
'''
print(triplet_evaluator.primary_metric)
# => "all_nli_dev_cosine_accuracy"
print(results[triplet_evaluator.primary_metric])
# => 0.956