在 Azure 中运行 DAG 流#

作者:  Avatar在 GitHub 上打开

要求 - 为了从本教程中获益,您需要:

学习目标 - 完成本教程后,您应该能够:

  • 从 Python SDK 连接到您的 Azure AI 工作区

  • 创建并开发新的 promptflow 运行

  • 使用评估流评估运行

动机 - 本指南将引导您完成 Prompt Flow 代码优先体验的主要用户旅程。您将学习如何创建和开发您的第一个 Prompt Flow,并对其进行测试和评估。

0. 安装依赖包#

%pip install -r ../../requirements.txt

1. 连接到 Azure 机器学习工作区#

工作区是 Azure 机器学习的顶级资源,提供了一个集中位置来处理您在使用 Azure 机器学习时创建的所有工件。本节我们将连接到将运行作业的工作区。

1.1 导入所需的库#

import json

# Import required libraries
from azure.identity import DefaultAzureCredential, InteractiveBrowserCredential

# azure version promptflow apis
from promptflow.azure import PFClient

1.2 配置凭据#

我们使用 DefaultAzureCredential 来获取对工作区的访问权限。DefaultAzureCredential 应该能够处理大多数 Azure SDK 身份验证场景。

如果它对您不起作用,请参考更多可用的凭据:配置凭据示例azure-identity 参考文档

try:
    credential = DefaultAzureCredential()
    # Check if given credential can get token successfully.
    credential.get_token("https://management.azure.com/.default")
except Exception as ex:
    # Fall back to InteractiveBrowserCredential in case DefaultAzureCredential not work
    credential = InteractiveBrowserCredential()

1.3 获取工作区的句柄#

我们使用配置文件连接到工作区。Azure ML 工作区应配置有计算集群。请查看此笔记本以配置工作区

# Get a handle to workspace
pf = PFClient.from_config(credential=credential)

1.4 创建必要的连接#

连接有助于安全地存储和管理与 LLM 和其他外部工具(例如 Azure 内容安全)交互所需的密钥或其他敏感凭据。

在此笔记本中,我们将使用流 web-classification,它内部使用连接 azure_open_ai_connection,如果之前没有添加,我们需要设置该连接。

遵循此说明准备您的 Azure OpenAI 资源,如果您没有 api_key,请获取一个。

请前往工作区门户,点击 Prompt flow -> Connections -> Create,然后按照说明创建您自己的连接。了解更多关于连接的信息。

2. 创建新运行#

web-classification 是一个演示 LLM 多分类的流。给定一个 URL,它将通过少量示例、简单摘要和分类提示将 URL 分类到某个 Web 类别中。

设置流路径和输入数据#

# load flow
flow = "../../flows/standard/web-classification"
data = "../../flows/standard/web-classification/data.jsonl"

提交运行#

# create run
base_run = pf.run(
    flow=flow,
    data=data,
    column_mapping={
        "url": "${data.url}",
    },
)
print(base_run)
pf.stream(base_run)
details = pf.get_details(base_run)
details.head(10)
pf.visualize(base_run)

3. 评估您的流运行结果#

然后您可以使用评估方法来评估您的流。评估方法也是流,它们使用 Python 或 LLM 等来计算准确性、相关性得分等指标。

在本笔记本中,我们使用 eval-classification-accuracy 流进行评估。这是一个演示如何评估分类系统性能的流。它涉及将每个预测与真实值进行比较,并分配“正确”或“不正确”等级,然后汇总结果以生成诸如准确性之类的指标,这反映了系统在分类数据方面的优劣。

eval_run = pf.run(
    flow="../../flows/evaluation/eval-classification-accuracy",
    data=data,
    run=base_run,
    column_mapping={
        "groundtruth": "${data.answer}",
        "prediction": "${run.outputs.category}",
    },
)
pf.stream(eval_run)
details = pf.get_details(eval_run)
details.head(10)
metrics = pf.get_metrics(eval_run)
print(json.dumps(metrics, indent=4))
pf.visualize([base_run, eval_run])

创建另一个具有不同变体节点的运行#

在此示例中,web-classification 的节点 summarize_text_content 有两个变体:variant_0variant_1。它们之间的区别在于输入参数

variant_0

- inputs:
    - deployment_name: gpt-35-turbo
    - max_tokens: '128'
    - temperature: '0.2'
    - text: ${fetch_text_content_from_url.output}

variant_1

- inputs:
    - deployment_name: gpt-35-turbo
    - max_tokens: '256'
    - temperature: '0.3'
    - text: ${fetch_text_content_from_url.output}

您可以在 flow.dag.yaml 中查看完整的流定义

# use the variant1 of the summarize_text_content node.
variant_run = pf.run(
    flow=flow,
    data=data,
    column_mapping={
        "url": "${data.url}",
    },
    variant="${summarize_text_content.variant_1}",  # here we specify node "summarize_text_content" to use variant 1 version.
)
pf.stream(variant_run)
details = pf.get_details(variant_run)
details.head(10)

针对变体运行进行评估#

eval_flow = "../../flows/evaluation/eval-classification-accuracy"

eval_run_variant = pf.run(
    flow=eval_flow,
    data="../../flows/standard/web-classification/data.jsonl",  # path to the data file
    run=variant_run,  # use run as the variant
    column_mapping={
        # reference data
        "groundtruth": "${data.answer}",
        # reference the run's output
        "prediction": "${run.outputs.category}",
    },
)
pf.stream(eval_run_variant)
details = pf.get_details(eval_run_variant)
details.head(10)
metrics = pf.get_metrics(eval_run_variant)
print(json.dumps(metrics, indent=4))
pf.visualize([eval_run, eval_run_variant])

后续步骤#

了解更多关于如何: