Skip to content
LangSmith 文档版本 跟随上游 源快照 8651ab19 更新于 2026-10-18

如何定义摘要评估器

某些指标只能在整个实验级别定义,而不能在实验的单个 run 上定义。例如,你可能想计算评估目标在数据集中所有示例上的总体通过率或 f1 分数。这些被称为摘要评估器。

基础示例

这里,我们将计算 f1 分数,它是精确率和召回率的组合。

这类指标只能基于实验中的所有示例计算,因此我们的评估器接收一个 outputs 列表和一个 reference_outputs 列表。

python
def f1_score_summary_evaluator(outputs: list[dict], reference_outputs: list[dict]) -> dict:
    true_positives = 0
    false_positives = 0
    false_negatives = 0

    for output_dict, reference_output_dict in zip(outputs, reference_outputs):
        output = output_dict["class"]
        reference_output = reference_output_dict["class"]

        if output == "Toxic" and reference_output == "Toxic":
            true_positives += 1
        elif output == "Toxic" and reference_output == "Not toxic":
            false_positives += 1
        elif output == "Not toxic" and reference_output == "Toxic":
            false_negatives += 1

    if true_positives == 0:
        return {"key": "f1_score", "score": 0.0}

    precision = true_positives / (true_positives + false_positives)
    recall = true_positives / (true_positives + false_negatives)
    f1_score = 2 * (precision * recall) / (precision + recall)

    return {"key": "f1_score", "score": f1_score}
typescript
function f1ScoreSummaryEvaluator({ outputs, referenceOutputs }: {
    outputs: Record<string, any>[],
    referenceOutputs: Record<string, any>[]
}) {
    let truePositives = 0;
    let falsePositives = 0;
    let falseNegatives = 0;

    for (let i = 0; i < outputs.length; i++) {
        const output = outputs[i]["class"];
        const referenceOutput = referenceOutputs[i]["class"];

        if (output === "Toxic" && referenceOutput === "Toxic") {
            truePositives += 1;
        } else if (output === "Toxic" && referenceOutput === "Not toxic") {
            falsePositives += 1;
        } else if (output === "Not toxic" && referenceOutput === "Toxic") {
            falseNegatives += 1;
        }
    }

    if (truePositives === 0) {
        return { key: "f1_score", score: 0.0 };
    }

    const precision = truePositives / (truePositives + falsePositives);
    const recall = truePositives / (truePositives + falseNegatives);
    const f1Score = 2 * (precision * recall) / (precision + recall);

    return { key: "f1_score", score: f1Score };
}

然后,你可以按如下方式将此评估器传递给 evaluate 方法:

python
from langsmith import Client

ls_client = Client()
dataset = ls_client.clone_public_dataset(
    "https://smith.langchain.com/public/3d6831e6-1680-4c88-94df-618c8e01fc55/d"
)

def bad_classifier(inputs: dict) -> dict:
    return {"class": "Not toxic"}

def correct(outputs: dict, reference_outputs: dict) -> bool:
    """Row-level correctness evaluator."""
    return outputs["class"] == reference_outputs["label"]

results = ls_client.evaluate(
    bad_classified,
    data=dataset,
    evaluators=[correct],
    summary_evaluators=[pass_50],
)
typescript
import { Client } from "langsmith";
import { evaluate } from "langsmith/evaluation";
import type { EvaluationResult } from "langsmith/evaluation";

const client = new Client();
const datasetName = "Toxic queries";
const dataset = await client.clonePublicDataset(
    "https://smith.langchain.com/public/3d6831e6-1680-4c88-94df-618c8e01fc55/d",
    { datasetName: datasetName }
);

function correct({ outputs, referenceOutputs }: {
    outputs: Record<string, any>,
    referenceOutputs?: Record<string, any>
}): EvaluationResult {
    const score = outputs["class"] === referenceOutputs?.["label"];
    return { key: "correct", score };
}

function badClassifier(inputs: Record<string, any>): { class: string } {
    return { class: "Not toxic" };
}

await evaluate(badClassifier, {
    data: datasetName,
    evaluators: [correct],
    summaryEvaluators: [summaryEval],
    experimentPrefix: "Toxic Queries",
});

在 LangSmith UI 中,你将看到摘要评估器的分数与相应键一起显示。

summary_eval.png

摘要评估器参数

摘要评估器函数必须使用特定的参数名称。它们可以接受以下参数的任意子集:

  • inputs: list[dict]:与数据集中单个示例对应的输入列表。
  • outputs: list[dict]:每个实验针对给定输入生成的 dict 输出列表。
  • reference_outputs/referenceOutputs: list[dict]:与该示例关联的参考输出列表(如果可用)。
  • runs: list[Run]:两个实验针对给定示例生成的完整 Run 对象列表。如果你需要访问每个 run 的中间步骤或元数据,请使用此项。
  • examples: list[Example]:所有数据集 Example 对象,包括示例输入、输出(如果可用)和元数据(如果可用)。

摘要评估器输出

摘要评估器应返回以下类型之一:

Python 与 JS/TS

  • dict:形式为 {"score": ..., "name": ...} 的 dict 允许你传递数值或布尔分数以及指标名称。

目前仅支持 Python

  • int | float | bool:这会被解释为连续指标,可以求平均值、排序等。函数名将用作指标名称。

BytesRouter 是社区翻译站点,所有译文仅供参考,一切以官方英文原文为准。