你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

自定义评估流和指标

评估流是一种特殊类型的流,用于评估运行的输出与特定标准和目标的一致程度。

在提示流中,可以自定义或创建针对任务和目标的评估流和指标,然后用其评估其他流。 本文档将介绍:

  • 了解提示流中的评估
    • 输入
    • 输出和指标日志记录
  • 如何开发评估流
  • 如何在批量运行中使用自定义评估流

了解提示流中的评估

在提示流中,流是处理输入并生成输出的一系列节点。 同样,评估流可以采用所需的输入并生成相应的输出,这些输出通常是分数或指标。 评估流的概念与标准流的概念相似,但在创作体验和使用方式方面存在一些差异。

评估流的一些特殊之处在于:

  • 它们通常接收要测试的运行的输出,在其之后运行。 它使用输出来计算分数和指标。 评估流的输出结果用于衡量所测试的流的性能。
  • 它们可能具有一个聚合节点,该节点会计算测试数据集中要测试的流的总体性能。
  • 可以使用 log_metric() 函数记录指标。

我们将介绍如何在开发评估方法时定义输入和输出。

输入

评估流根据数据集计算流批处理运行的指标或分数。 为此,它们需要接受要测试的运行的输出。 可以像定义标准流的输入一样定义评估流的输入。

评估流在另一次运行后运行,以评估该运行的输出与特定标准和目标的一致程度。 因此,评估接收从该运行生成的输出。

例如,如果所测试的流是一个会根据问题生成答案的 QnA 流,则可以相应地将评估的输入命名为 answer。 如果所测试的流是将文本分类为类别的分类流,则可以将评估的输入命名为 category

可能还需要其他输入,例如 ground truth。 例如,如果要计算分类流的准确性,则需要将数据集中的 category 列作为基本事实提供。 如果要计算 QnA 流的准确性,则需要将数据集中的 answer 列作为基本事实提供。

默认情况下,评估会使用与提供给已测试运行的测试数据集相同的数据集。 但如果相应的标签或目标地基本事实值位于不同的数据集中,则可以轻松切换到该数据集。

可能需要其他输入来计算指标,例如 QnA 或 RAG 方案中的 questioncontext 。 可以像定义标准流的输入一样定义这些输入。

输入说明

若要提醒计算指标需要哪些输入,可以为每个所需输入添加说明。 在批量运行提交中映射源时,会显示说明。

评估输入映射屏幕截图,突出显示答案描述。

若要为每个输入添加说明,请在开发评估方法时在输入部分选择“显示说明”。 你可以选择“隐藏说明”来隐藏说明。

分类准确性评估屏幕截图,突出显示“隐藏说明”。

然后,在批量运行提交中使用此评估方法时,会显示此说明。

输出和指标

评估的输出是衡量所测试流性能的结果。 输出通常包含分数等指标,还可能包含用于推理和建议的文本。

评估输出 - 实例级分数

在提示流中,流一次处理一行数据,并生成输出记录。 同样,在大多数评估事例中,每个输出都有一个分数,使你能够检查流对每个单独的数据的执行方式。

评估流可以计算每个数据的分数,你可以通过在评估流的输出部分设置这些分数,将每个数据示例的分数记录为流输出 。 此创作体验与定义标准流输出相同。

显示名称和值的输出部分的屏幕截图。

使用此评估方法评估另一个流时,可以在“概述 ->输出”选项卡中查看分数。 此过程与检查标准流的批处理运行输出相同。 实例级分数将追加到要测试的流的输出中。

指标日志记录和聚合节点

此外,提供运行的总体分数也很重要。 为了区分评估每个单个输出的单个分数,我们将运行的总体性能的评估值称为“指标”

要根据每个单独分数计算整体评估值,可以在评估流中检查 Python 节点的“聚合”,将其转换为“reduce”节点,从而允许该节点将输入作为列表并进行批量处理。

Python 节点标题屏幕截图,指向未选中的复选框。

通过这种方式,可以计算和处理每个流输出的所有分数,并计算每个分数输出的总体结果。 例如,如果要计算分类流的准确性,可以计算每个分数输出的准确性,然后计算所有分数输出的平均准确度。 然后,你可以使用 promptflow_sdk.log_metrics ()将平均准确性记录为指标。 指标应为数值(浮点数/int)。 不支持字符串类型指标日志记录。

以下代码片段是一个示例,展示通过平均每个数据的准确性分数 (grade) 来计算总体准确性。 使用 promptflow_sdk.log_metrics () 将总体准确性记录为指标。

from typing import List
from promptflow import tool, log_metric

@tool
def calculate_accuracy(grades: List[str]): # Receive a list of grades from a previous node
    # calculate accuracy
    accuracy = round((grades.count("Correct") / len(grades)), 2)
    log_metric("accuracy", accuracy)

    return accuracy

在 Python 节点中调用此函数时,无需在其他地方分配它,并且稍后可以查看指标。 在批量运行中使用此评估方法时,可以在“概述 ->指标”选项卡中查看表示总体性能的指标。

“指标”选项卡的屏幕截图,其中显示日志指标记录的指标。

开始开发评估方法

可通过两种方法开发自己的评估方法:

  • 从头开始创建新的评估流:从头开始开发全新的评估方法。 在提示流选项卡主页的“按类型创建”部分,可以选择“评估流”并查看评估流的模板。

从头开始创建新评估流的屏幕截图。

  • 自定义内置评估流:修改内置评估流。 在流创建向导 - 流库 - 中查找内置评估流,选择“克隆”进行自定义。 然后,可以查看并检查内置评估的逻辑和流,然后修改流。 这样,你就无需从零开始,而是可以使用可用于自定义的示例。

克隆内置评估流的屏幕截图。

计算每个数据的分数

如前文所述,评估是基于在数据集上运行的流计算分数和指标的。 因此,评估流的第一步是计算每个单独输出的分数。

以内置评估流 Classification Accuracy Evaluation 为例,该分数 grade 是在 grade 节点中计算的,衡量的是每个流生成的输出与相应的基本事实相比的准确性。 如果在按类型创建时创建了评估流并从头开始编辑,则会在模板中的 line_process 节点中计算此分数。 还可以将 line_process python 节点替换为 LLM 节点,以使用 LLM 计算分数,或使用多个节点执行计算。

模板中 line process 节点的屏幕截图。

然后,需要将节点的输出指定为评估流的输出,这表示输出就是为每个数据样本计算的分数。 还可以将推理输出为其他信息,并且它与在标准流中定义输出的体验相同。

计算和记录指标

评估的第二步是计算用于评估运行的总体指标。 如前文所述,指标是在设置为 Aggregation 的 Python 节点中计算的。 此节点采用上一个节点中计算的分数,并将每个数据样本的分数组织到列表中,然后一次性计算这些分数。

如果在按类型创建时从头开始创建和编辑分数,在此分数是在 aggregate 节点计算的。 代码片段是聚合节点的模板。


from typing import List
from promptflow import tool

@tool
def aggregate(processed_results: List[str]):
    """
    This tool aggregates the processed result of all lines and log metric.
    :param processed_results: List of the output of line_process node.
    """
    # Add your aggregation logic here
    aggregated_results = {}

    # Log metric
    # from promptflow import log_metric
    # log_metric(key="<my-metric-name>", value=aggregated_results["<my-metric-name>"])

    return aggregated_results

可以使用自己的聚合逻辑,例如计算分数的平均值、总体平均值或标准偏差。

然后,需要使用 promptflow.logmetrics() 函数记录指标。 可以在单个评估流中记录多个指标。 指标应为数值(浮点数/int)。

使用自定义评估流

创建自己的评估流和指标后,可以使用此流来评估标准流的性能。

  1. 首先,从要评估的流创作页面开始。 例如,一个 QnA 流,你尚未了解它在大型数据集上的表现,并且想要进行测试。 单击 Evaluate 按钮并选择 Custom evaluation

    评估按钮的屏幕截图。

  2. 然后,类似于提交批处理运行的步骤,如《提交批处理运行并评估提示流中的流》中所述,请按照前几个步骤准备数据集以运行流。

  3. 然后在 Evaluation settings - Select evaluation 步骤以及内置评估中,自定义评估也可供选择。 这会列出在流列表中创建、克隆或自定义的所有评估流。 同一项目中其他人创建的评估流不会显示在本节中。

    选择自定义评估的屏幕截图。

  4. 接下来,在 Evaluation settings - Configure evaluation 这一步中,需要指定评估方法所需的输入数据的源。 例如,基本事实列可能来自数据集。

    若要运行评估,可以在提交评估时指示“输入映射”部分中这些需要的输入的源。 此过程与“提交批处理运行并在提示流中评估流”中提及的配置相同。

    • 如果数据源来自运行输出,则指示源为 ${run.output.[OutputName]}
    • 如果数据源来自测试数据集,则源指示为 ${data.[ColumnName]}

    评估输入映射的屏幕截图。

    注意

    如果评估不需要数据集中的数据,则无需在输入映射部分引用任何数据集列,这指示数据集选择是可选配置。 数据集选择不会影响评估结果。

  5. 使用此评估方法评估另一个流时,可以在“概述 ->输出”选项卡中查看实例级分数。

    “输出”选项卡的屏幕截图,其中附加并突出显示了评估结果。

后续步骤