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

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

重要

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

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

注意

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

使用 Azure AI 监视生成式 AI 应用程序,便可在生产中监视应用程序的令牌使用情况、生成质量和操作指标。

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

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

先决条件

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

  • 具有有效付款方式的 Azure 订阅。 免费或试用 Azure 订阅不支持此应用场景。 如果没有 Azure 订阅,请先创建一个付费的 Azure 帐户

  • 一个 Azure AI Foundry 项目

  • 一个可供部署的提示流。 如果没有提示流,请参阅开发提示流

  • Azure 基于角色的访问控制 (Azure RBAC) 用于授予对 Azure AI Foundry 门户中的操作的访问权限。 若要执行本文中的步骤,必须为用户帐户分配资源组的“Azure AI 开发人员”角色。 有关权限详细信息,请参阅 Azure AI Foundry 门户中基于角色的访问控制

监视指标的要求

监视指标由一些最先进的 GPT 语言模型生成,这些模型配置了特定的评估指令(提示模板)。 这些模型充当序列到序列任务的评估模型。 与标准生成式 AI 评估指标相比,使用此技术生成监视指标显示出强有力的实证结果和与人类判断的高相关性。 有关提示流评估的详细信息,请参阅提交批量测试和评估流生成式 AI 的评估和监视指标

生成监视指标的 GPT 模型如下所示。 这些 GPT 模型支持监控并配置为 Azure OpenAI 资源:

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

支持的监视指标

监视支持以下指标:

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

列名称映射

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

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

指标所需的参数

根据下表,数据资产中配置的参数决定了你可以生成哪些指标:

指标 问题 Answer 上下文
一致性 必须 必须 -
流畅度 必须 必须 -
真实性 必须 必需 必须
相关性 必须 必需 必须

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

为提示流设置监视

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

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

在本部分中,你将了解如何在启用推理数据收集后部署提示流。 有关部署提示流的详细信息,请参阅部署实时推理流

  1. 登录到 Azure AI Foundry

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

  3. 从左侧导航栏中选择“提示流”

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

    注意

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

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

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

  6. 选择“部署”以开始部署流。

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

  7. 在部署窗口中,确保启用了“推理数据收集”,此功能可以无缝地将应用程序的推理数据收集到 Blob 存储。 监视需要此数据收集。

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

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

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

    部署向导中“查看”页面的屏幕截图,其中已完成所有设置。

    注意

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

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

    部署测试页的屏幕截图。

    注意

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

配置监视

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

  1. 在左侧导航栏中,转到“我的资产”>“模型 + 终结点”

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

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

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

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

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

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

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

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

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

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

    注意

    如果部署未启用数据收集,则创建监视器后会将推理数据收集到 Azure Blob 存储,这会使部署离线几分钟。

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

使用监视结果

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

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

    • 请求总数:所选时间范围内发送到部署的请求总数。
    • 令牌总数:该部署在所选时间范围内使用的令牌总数。
    • 提示令牌计数:该部署在所选时间范围内使用的提示令牌数。
    • 完成令牌计数:该部署在所选时间范围内使用的完成令牌数。
  2. 在“令牌使用情况”选项卡中查看指标(默认选中此选项卡)。 在这里,可以查看一段时间内应用程序的令牌使用情况。 还可以查看一段时间内的提示令牌和完成令牌的分布情况。 可以更改“趋势线范围”,以监视整个应用程序中的所有令牌或应用程序中使用的特定部署(例如 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 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 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}",
)

# Set thresholds for 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 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 门户中使用监视结果