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

监视已部署提示流应用程序的质量和令牌使用情况

重要

本文中标记了“(预览版)”的项目目前为公共预览版。 此预览版未提供服务级别协议,不建议将其用于生产工作负载。 某些功能可能不受支持或者受限。 有关详细信息,请参阅 Microsoft Azure 预览版补充使用条款

监视已部署到生产环境的应用程序是生成式 AI 应用程序生命周期的重要组成部分。 数据和使用者行为的更改可能会随时间推移影响应用程序。 这些更改可能导致对业务结果产生负面影响的过时系统,并使组织面临合规性、经济和声誉风险。

注释

若要改进对已部署应用程序(而不是提示流)执行持续监视的方法,请考虑使用 Azure AI 联机评估

通过使用 Azure AI 对生成式 AI 应用的监控,您可以监控生产环境中的应用程序,以获取令牌使用情况、生成质量和操作指标。

使用用于监视提示流部署的集成,可以:

  • 从已部署的提示流应用程序收集生产推理数据。
  • 应用负责任 AI 评估指标(例如有据性、连贯性、流畅性和相关性),这些指标可与提示流评估指标互操作。
  • 监视提示流中每个模型部署的提示、完成和令牌总使用情况。
  • 监视操作指标,例如请求计数、延迟和错误率。
  • 使用预配置的警报和默认设置来定期运行监视。
  • 在 Azure AI Foundry 门户中使用数据可视化效果并配置高级行为。

先决条件

在按照本文中的步骤作之前,请确保满足以下先决条件:

注释

必须对此功能使用 基于中心的项目 。 不支持 Foundry 项目 。 请参阅 如何知道我拥有哪种类型的项目?创建基于中心的项目

  • 一个可供部署的提示流。 如果没有提示流,请参阅开发提示流
  • Azure 基于角色的访问控制用于授予对 Azure AI Foundry 门户中操作的访问权限。 若要执行本文中的步骤,必须在资源组上为用户帐户分配 Azure AI 开发人员角色。 有关权限的详细信息,请参阅 Azure AI Foundry 门户中的基于角色的访问控制

监视指标的要求

生成式预训练转换器 (GPT) 语言模型会生成监视指标,这些指标配置有特定的评估指令(提示模板)。 这些模型充当序列到序列任务的评估模型。 与标准生成式 AI 评估指标相比,使用此技术生成监视指标显示出强有力的实证结果和与人类判断的高相关性。 有关指令流评估的详细信息,请参阅 提交批处理测试并评估流程生成式 AI 的评估和监控指标

以下 GPT 模型生成监视指标。 这些 GPT 模型支持监视,配置为 Azure OpenAI 资源:

  • GPT-3.5 Turbo
  • GPT-4
  • GPT-4-32k

支持的监视指标

支持用于监控的指标如下。

指标 DESCRIPTION
有据性 衡量模型生成的答案与源数据中信息(用户定义的上下文)的一致性。
相关性 衡量模型生成的响应与给定问题的相关程度和直接相关程度。
一致性 衡量模型生成的响应在逻辑上的一致性和关联性。
流畅度 衡量生成式 AI 预测答案的语法熟练程度。

列名称映射

创建流时,需要确保列名称已映射。 以下输入数据列名称用于测量生成安全性和质量。

输入列名称 定义 必需/可选
问题 给定的原始提示(也称为“输入”或“问题”)。 必选
答案 返回的 API 调用的最终完成(也称为“输出”或“应答”)。 必选
上下文 发送到 API 调用的任何上下文数据以及原始提示。 例如,如果希望仅从某些认证的信息源或网站获取搜索结果,则可以在评估步骤中定义此上下文。 可选

指标所需的参数

根据此表,数据资产中配置的参数决定了可以生成的指标。

指标 问题 答案 上下文
一致性 必选 必选 -
流畅度 必选 必选 -
有据性 必选 必选 必选
相关性 必选 必选 必选

有关每个指标的特定数据映射要求的详细信息,请参阅查询和响应指标要求

为提示流设置监视

若要为提示流应用程序设置监视,首先必须使用推理数据收集来部署提示流应用程序。 然后,可以为已部署的应用程序配置监视。

使用推理数据收集来部署提示流应用程序

在本节中,你将学习如何在启用推理数据收集的情况下部署提示流。 有关如何部署提示流的详细信息,请参阅 部署流进行实时推理

小窍门

由于可以在 Azure AI Foundry 门户中 自定义左窗格 ,因此你可能会看到与这些步骤中显示的项不同。 如果未看到要查找的内容,请选择 ... 左窗格底部的更多内容。

  1. 登录到 Azure AI Foundry

  2. 如果你尚未进入项目,请选择它。

    注释

    必须对此功能使用 基于中心的项目 。 不支持 Foundry 项目 。 请参阅 如何知道我拥有哪种类型的项目?创建基于中心的项目

  3. 在左侧窗格中,选择“提示流”

  4. 选择之前创建的提示流。

    本文假定你创建了一个可供部署的提示流。 如果没有提示流,请参阅开发提示流

  5. 确认流成功运行,并为 要评估的指标配置所需的输入和输出。

    提供所需的最小参数(问题/输入和答案/输出)后只会提供两个指标:一致性和流畅性。 必须按照监视指标的要求部分中所述配置您的流程。 此示例使用 question (Question) 和 chat_history (Context) 作为流输入,并且 answer (Answer) 用作流输出。

  6. 选择部署以开始部署您的流。

    显示提示流编辑器的屏幕截图,其中显示了“部署”按钮。

  7. 在部署窗口中,确保启用 推理数据收集 ,以便将应用程序的推理数据无缝收集到 Azure Blob 存储。 为了监控,需要进行此数据收集。

    显示部署向导中基本设置的屏幕截图。

  8. 继续执行部署窗口中的步骤以完成高级设置。

  9. 在“ 审阅 ”页上,查看部署配置,然后选择“ 创建 ”以部署流。

    显示部署向导中已完成所有设置的“审阅”页的屏幕截图。

    默认情况下,将部署的提示流应用程序的所有输入和输出收集到 Blob 存储。 当用户调用部署时,将收集数据供监视器使用。

  10. 选择部署页上的“ 测试 ”选项卡。 然后测试部署以确保其正常工作。

    显示部署测试页的屏幕截图。

    监视要求至少有一个数据点来自部署中的“测试”选项卡以外的源。 建议在“消费”选项卡上使用提供的 REST API,将示例请求发送到您的部署。 有关如何将示例请求发送到部署的详细信息,请参阅创建联机部署

配置监控

本部分介绍如何为已部署的提示流应用程序配置监视。

  1. 在左窗格中,转到 “我的资产>模型 + 终结点”。

  2. 选择创建的提示流部署。

  3. “启用生成质量监视 ”框中,选择“ 启用”。

    显示部署页的屏幕截图,其中突出显示了生成质量监视。

  4. 通过选择所需的指标开始配置监视。

  5. 确认列名称已按照列名称映射中的定义从流中映射。

  6. 选择要用于对提示流应用程序执行监视的“Azure OpenAI 连接”和“部署”值。

  7. 选择“高级选项”可查看更多可配置的选项。

    显示为监视指标映射的列的屏幕截图。

  8. 调整配置的指标的采样率和阈值。 指定在给定指标的平均分数低于阈值时应接收警报的电子邮件地址。

    显示映射监视指标列时的高级选项的屏幕截图。

    如果未为部署启用数据收集,则创建监视器可以将推理数据收集到 Blob 存储中。 此任务会使部署暂停几分钟时间。

  9. 选择“创建”以创建监视器。

使用监视结果

创建监视器后,它每天运行以计算令牌使用情况和生成质量指标。

  1. 转到部署中的 “监视”选项卡 以查看监视结果。 在这里,你将看到在所选时间范围内监视结果的概述。 使用日期选取器更改要监视的数据的时间范围。 此概述中提供以下指标:

    • 请求总数:所选时间范围内发送到部署的请求总数。
    • 令牌总数:该部署在所选时间范围内使用的令牌总数。
    • 提示令牌计数:该部署在所选时间范围内使用的提示令牌数。
    • 完成令牌计数:该部署在所选时间范围内使用的完成令牌数。
  2. 查看 “令牌使用情况 ”选项卡上的指标。(默认情况下已选中此选项卡。在这里,可以查看应用程序随时间推移的令牌使用情况。 还可以查看一段时间内的提示令牌和完成令牌的分布情况。 可以更改 Trendline 范围 值,以监视整个应用程序中所有令牌的使用情况,或监视应用程序中某个特定部署(例如 GPT-4)的令牌使用情况。

    显示部署监视页上的令牌使用情况的屏幕截图。

  3. 转到“生成质量”选项卡,监视一段时间内应用程序的质量。 时间图表中显示了以下指标:

    • 冲突计数:给定指标(例如,流利度)的冲突计数是所选时间段内冲突的总和。 指标计算(默认为每日一次)时,如果计算结果低于设置的阈值,则会发生违规。
    • 平均分数:给定指标(例如,流利度)的平均分数是所有实例(或请求)的分数之和,除以所选时间范围内实例数(或请求数)。

    “生成质量冲突”卡显示所选时间范围内的冲突率。 冲突率是违规次数除以可能的冲突总数。 可以在设置中调整指标的阈值。 默认情况下,每天计算指标。 还可以在设置中调整此频率。

    显示部署监视页上的生成质量趋势线的屏幕截图。

  4. 在“ 监视”(预览) 选项卡上,还可以查看在所选时间范围内发送到部署的所有采样请求的综合表。

    监视将默认采样率设置为 10%。 例如,如果将 100 个请求发送到您的部署,则 10 个请求会被抽样,并用于计算生成质量度量标准。 可以在设置中调整采样率。

    显示生成质量的“跟踪”按钮的屏幕截图。

  5. 选择表中某行右侧的“跟踪”按钮以查看给定请求的跟踪详细信息。 此视图提供了对应用程序请求的全面跟踪详细信息。

    显示跟踪信息的屏幕截图。

  6. 关闭跟踪视图。

  7. 转到“操作”选项卡,以查看部署的实时操作指标。 我们支持以下操作指标:

    • 请求数量
    • 延迟
    • 错误率

    显示部署操作选项卡的屏幕截图。

部署的“监控”(预览版)选项卡上的结果提供了深入的见解,帮助您主动优化提示流应用程序的性能。

使用 SDK v2 的高级监视配置

监视还支持使用 SDK v2 的高级配置选项。 支持以下方案。

启用令牌使用情况监控

如果您只希望为已部署的提示流应用程序开启令牌使用情况监视,请根据具体情况调整以下脚本:

from azure.ai.ml import MLClient
from azure.ai.ml.entities import (
    MonitorSchedule,
    CronTrigger,
    MonitorDefinition,
    ServerlessSparkCompute,
    MonitoringTarget,
    AlertNotification,
    GenerationTokenStatisticsSignal,
)
from azure.ai.ml.entities._inputs_outputs import Input
from azure.ai.ml.constants import MonitorTargetTasks, MonitorDatasetContext

# Authentication package
from azure.identity import DefaultAzureCredential

credential = DefaultAzureCredential()

# Update your Azure resources details
subscription_id = "INSERT YOUR SUBSCRIPTION ID"
resource_group = "INSERT YOUR RESOURCE GROUP NAME"
project_name = "INSERT YOUR PROJECT NAME" # This is the same as your Azure AI Foundry project name
endpoint_name = "INSERT YOUR ENDPOINT NAME" # This is your deployment name without the suffix (e.g., deployment is "contoso-chatbot-1", endpoint is "contoso-chatbot")
deployment_name = "INSERT YOUR DEPLOYMENT NAME"

# These variables can be renamed but it is not necessary
monitor_name ="gen_ai_monitor_tokens" 
defaulttokenstatisticssignalname ="token-usage-signal" 

# Determine the frequency to run the monitor, and the emails to recieve email alerts
trigger_schedule = CronTrigger(expression="15 10 * * *")
notification_emails_list = ["test@example.com", "def@example.com"]

ml_client = MLClient(
    credential=credential,
    subscription_id=subscription_id,
    resource_group_name=resource_group,
    workspace_name=project_name,
)

spark_compute = ServerlessSparkCompute(instance_type="standard_e4s_v3", runtime_version="3.3")
monitoring_target = MonitoringTarget(
    ml_task=MonitorTargetTasks.QUESTION_ANSWERING,
    endpoint_deployment_id=f"azureml:{endpoint_name}:{deployment_name}",
)

# Create an instance of a token statistic signal
token_statistic_signal = GenerationTokenStatisticsSignal()

monitoring_signals = {
    defaulttokenstatisticssignalname: token_statistic_signal,
}

monitor_settings = MonitorDefinition(
compute=spark_compute,
monitoring_target=monitoring_target,
monitoring_signals = monitoring_signals,
alert_notification=AlertNotification(emails=notification_emails_list),
)

model_monitor = MonitorSchedule(
    name = monitor_name,
    trigger=trigger_schedule,
    create_monitor=monitor_settings
)

ml_client.schedules.begin_create_or_update(model_monitor)

启用生成质量监视

如果只想为已部署的提示流应用程序启用生成质量监视,请根据方案调整以下脚本:

from azure.ai.ml import MLClient
from azure.ai.ml.entities import (
    MonitorSchedule,
    CronTrigger,
    MonitorDefinition,
    ServerlessSparkCompute,
    MonitoringTarget,
    AlertNotification,
    GenerationSafetyQualityMonitoringMetricThreshold,
    GenerationSafetyQualitySignal,
    BaselineDataRange,
    LlmData,
)
from azure.ai.ml.entities._inputs_outputs import Input
from azure.ai.ml.constants import MonitorTargetTasks, MonitorDatasetContext

# Authentication package
from azure.identity import DefaultAzureCredential

credential = DefaultAzureCredential()

# Update your Azure resources details
subscription_id = "INSERT YOUR SUBSCRIPTION ID"
resource_group = "INSERT YOUR RESOURCE GROUP NAME"
project_name = "INSERT YOUR PROJECT NAME" # This is the same as your Azure AI Foundry project name
endpoint_name = "INSERT YOUR ENDPOINT NAME" # This is your deployment name without the suffix (e.g., deployment is "contoso-chatbot-1", endpoint is "contoso-chatbot")
deployment_name = "INSERT YOUR DEPLOYMENT NAME"
aoai_deployment_name ="INSERT YOUR AOAI DEPLOYMENT NAME"
aoai_connection_name = "INSERT YOUR AOAI CONNECTION NAME"

# These variables can be renamed but it is not necessary
app_trace_name = "app_traces"
app_trace_Version = "1"
monitor_name ="gen_ai_monitor_generation_quality" 
defaultgsqsignalname ="gsq-signal"

# Determine the frequency to run the monitor and the emails to receive email alerts
trigger_schedule = CronTrigger(expression="15 10 * * *")
notification_emails_list = ["test@example.com", "def@example.com"]

ml_client = MLClient(
    credential=credential,
    subscription_id=subscription_id,
    resource_group_name=resource_group,
    workspace_name=project_name,
)

spark_compute = ServerlessSparkCompute(instance_type="standard_e4s_v3", runtime_version="3.3")
monitoring_target = MonitoringTarget(
    ml_task=MonitorTargetTasks.QUESTION_ANSWERING,
    endpoint_deployment_id=f"azureml:{endpoint_name}:{deployment_name}",
)

# Set thresholds for the passing rate (0.7 = 70%)
aggregated_groundedness_pass_rate = 0.7
aggregated_relevance_pass_rate = 0.7
aggregated_coherence_pass_rate = 0.7
aggregated_fluency_pass_rate = 0.7

# Create an instance of a gsq signal
generation_quality_thresholds = GenerationSafetyQualityMonitoringMetricThreshold(
    groundedness = {"aggregated_groundedness_pass_rate": aggregated_groundedness_pass_rate},
    relevance={"aggregated_relevance_pass_rate": aggregated_relevance_pass_rate},
    coherence={"aggregated_coherence_pass_rate": aggregated_coherence_pass_rate},
    fluency={"aggregated_fluency_pass_rate": aggregated_fluency_pass_rate},
)
input_data = Input(
    type="uri_folder",
    path=f"{endpoint_name}-{deployment_name}-{app_trace_name}:{app_trace_Version}",
)
data_window = BaselineDataRange(lookback_window_size="P7D", lookback_window_offset="P0D")
production_data = LlmData(
    data_column_names={"prompt_column": "question", "completion_column": "answer", "context_column": "context"},
    input_data=input_data,
    data_window=data_window,
)

gsq_signal = GenerationSafetyQualitySignal(
    connection_id=f"/subscriptions/{subscription_id}/resourceGroups/{resource_group}/providers/Microsoft.MachineLearningServices/workspaces/{project_name}/connections/{aoai_connection_name}",
    metric_thresholds=generation_quality_thresholds,
    production_data=[production_data],
    sampling_rate=1.0,
    properties={
        "aoai_deployment_name": aoai_deployment_name,
        "enable_action_analyzer": "false",
        "azureml.modelmonitor.gsq_thresholds": '[{"metricName":"average_fluency","threshold":{"value":4}},{"metricName":"average_coherence","threshold":{"value":4}}]',
    },
)

monitoring_signals = {
    defaultgsqsignalname: gsq_signal,
}

monitor_settings = MonitorDefinition(
compute=spark_compute,
monitoring_target=monitoring_target,
monitoring_signals = monitoring_signals,
alert_notification=AlertNotification(emails=notification_emails_list),
)

model_monitor = MonitorSchedule(
    name = monitor_name,
    trigger=trigger_schedule,
    create_monitor=monitor_settings
)

ml_client.schedules.begin_create_or_update(model_monitor)

从 SDK 创建监视器后,可以在 Azure AI Foundry 门户中 使用监视结果