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

开发流

提示流是一种开发工具,旨在简化由大型语言模型 (LLM) 提供支持的 AI 应用程序的整个开发周期。 随着基于 LLM 的 AI 应用程序的势头在全球范围内不断发展,提示流提供了一个全面的解决方案,可简化 AI 应用程序的原型制作、试验、迭代和部署过程。

通过提示流可以:

  • 使用 LLM、提示和 Python 工具通过可视化图形协调可执行流。
  • 轻松测试、调试和迭代流。
  • 创建提示变体并比较它们的性能。

本文介绍如何在 Azure 机器学习工作室中创建和开发第一个提示流。

创建和开发提示流

在工作室中,选择左侧导航栏中的“提示流”选项卡。 选择“创建”以创建第一个提示流。 若要创建流,可以克隆库中提供的示例,也可以从头开始创建。 如果本地或文件共享中已有流文件,则还可以导入文件来创建流。

从头开始或从库中创建提示流的屏幕截图。

创作流

左侧是平展视图,这是主要工作区域,可在其中创作流,例如在流中添加工具、编辑提示、设置流输入数据、运行流、查看输出等。

提示流主工作区的屏幕截图。

右上角是流文件视图。 每个流都可由一个文件夹表示,该文件夹包含“flow.dag.yaml”文件、源代码文件和系统文件夹。 你可以添加新文件、编辑现有文件以及删除文件。 还可以将文件导出到本地,或者从本地导入文件。

除了在平展视图中直接编辑节点外,还可以打开“原始文件模式”开关并选择文件名,以便在打开的文件选项卡中编辑文件。

右下角的图形视图仅用于显示可视化效果。 它显示你正在开发的流结构。 可以执行放大、缩小、自动布局等操作。

注意

无法直接编辑图形视图,但可以选择节点以找到平展视图中的相应节点卡,然后执行内联编辑。

计算会话

在开始创作之前,应首先启动计算会话。 计算会话充当运行提示流所需的计算资源,其中包括包含所有必要的依赖项包的 Docker 映像。 这是流执行的必备项。

在工作室中启动计算会话的屏幕截图。

流输入和输出

流输入是作为一个整体传递到流中的数据。 可以通过指定名称和类型来定义输入架构。 设置每个输入的输入值以测试流。 稍后可以使用 ${input.[input name]} 语法在流节点中引用流输入。

流输出是流作为一个整体生成的数据,用于汇总流的执行结果。 可以在流运行或批处理运行完成后查看和导出输出表。 可以通过使用语法 ${[node name].output}${[node name].output.[field name]} 引用流的单节点输出来定义流输出值。

 流输入和输出的屏幕截图。

使用不同的工具开发流

在一个流中,可以使用不同类型的工具,例如 LLM、Python、Serp API、Content Safety 等。

通过选择一个工具,可以向流添加一个新节点。 应指定节点名称,并为该节点设置必要的配置。

例如,对于 LLM 节点,需要选择连接、部署、设置提示等。连接有助于安全地存储和管理与 Azure OpenAI 交互所需的密钥或其他敏感凭据。 如果还没有连接,则应首先创建连接,并确保 Azure OpenAI 资源具有聊天或完成部署。 LLM 和 Prompt 工具支持使用 Jinja 作为模板语言来动态生成提示。 例如,可以将输入名称括在 {{}} 中,而不是采用固定文本,以便可以即时替换。

若要使用 Python 工具,需要设置 Python 脚本、设置输入值等。应按如下所示定义包含输入和输出的 Python 函数。

 为 Python 节点编写 Python 脚本的屏幕截图。

编写完提示或 Python 脚本后,可以选择“验证和分析输入”,以便系统根据提示模板和 Python 函数输入自动分析节点输入。 可以通过以下方式设置节点输入值:

  • 直接在输入框中设置值
  • 使用 ${input.[input name]} 语法引用流输入
  • 使用 ${[node name].output}${[node name].output.[field name]} 语法引用节点输出

通过引用节点输出,可以将节点链接在一起。 例如,可以在 Python 节点输入中引用 LLM 节点输出,以便 Python 节点可以使用 LLM 节点输出;在图形视图中可以看到这两个节点链接在一起。

启用流的条件控制

提示流不仅提供一种简化的方法来执行流,而且还为开发人员带来了一个强大的功能:条件控制,该功能可让用户为流中任何节点的执行设置条件。

在本质上,条件控制提供用于将流中每个节点与“激活配置”相关联的功能。此配置实质上是一个“when”语句,用于确定何时应执行某个节点。 当你的流较为复杂时(其中某些任务的执行取决于先前任务的结果),你就能认识到此功能的强大之处。 使用条件控制可将特定节点配置为仅在满足指定条件时才执行。

具体而言,可以通过在节点卡中选择“激活配置”按钮来设置节点的激活配置。 可以添加“when”语句并设置条件。 可以通过引用流输入或节点输出来设置条件。 例如,可以将条件 ${input.[input name]} 设置为特定值,或将 ${[node name].output} 设置为特定值。

如果不满足条件,则将跳过该节点。 节点状态显示为“已绕过”。

设置激活配置以启用条件控制的屏幕截图。

测试流

可以通过两种方式测试流:

  • 运行单个节点
    • 若要运行单个节点,请对平展视图中的节点选择“运行”图标。 运行完成后,可以在节点输出部分快速检查结果
  • 运行整个流
    • 若要运行整个流,请选择右上角的“运行”按钮

查看测试结果和跟踪(预览版)

对于整个流运行,在执行流后,可以在运行横幅中看到运行状态。 然后,可以选择“查看跟踪”以查看用于检查结果和观察流执行情况的跟踪,在其中查看整个流和每个节点的输入和输出,以及用于调试的更多详细信息。 它在运行期间和运行完成后都可以使用。

 两个位置中的“查看输出”按钮的屏幕截图。

了解跟踪视图

提示流的跟踪类型被指定为“流”。 在跟踪视图中,可以观察流编排工具的清晰顺序。

流根下的每个级别 2 跨度都表示流中的一个节点,以函数调用的形式执行,因此跨度类型标识为“函数”。 可以在跨度树中查看每个节点执行的持续时间。

在跨度树中,LLM 调用很容易识别为 LLM 跨度。 它们提供有关 LLM 调用持续时间和关联的词元成本的信息。

通过单击跨度,可以在右侧查看详细信息。 这包括输入和输出、原始 Json 和异常,所有这些内容都可用于观察和调试。  跟踪详细信息的屏幕截图。

注意

在提示流 SDK 中,系统定义了几种跨度类型,包括 LLM、函数、嵌入、检索和流。 系统会自动创建包含指定属性和事件中的执行信息的跨度。

若要了解有关跨度类型的详细信息,请参阅跟踪跨度

流运行完成后,若要检查结果,可以选择“查看测试结果”按钮来检查列表中的所有历史运行记录。 默认情况下,将显示在过去 7 天内创建的运行记录。 可以选择“筛选器”来更改条件

流测试结果的屏幕截图。

还可以选择运行记录的“名称”,以查看跟踪视图中的详细信息

开发聊天流

聊天流专为对话式应用程序的开发而设计,它以标准流的功能为基础,为聊天输入/输出和聊天历史记录管理提供增强支持。 借助聊天流,可以轻松创建处理聊天输入和输出的聊天机器人。

在聊天流创作页中,聊天流标有“聊天”标签,以将其与标准流和评估流区分开来。 若要测试聊天流,请选择“聊天”按钮以触发聊天框进行对话。

聊天流创作页面的屏幕截图。

聊天输入/输出和聊天历史记录

将聊天流与标准流区分开来的最重要元素是聊天输入、聊天历史记录和聊天输出

  • 聊天输入:聊天输入是指用户向聊天机器人提交的消息或查询。 有效处理聊天输入对于成功对话至关重要,因为它涉及理解用户意图、提取相关信息以及触发适当的回复。
  • 聊天历史记录:聊天历史记录是用户与聊天机器人之间所有交互记录,包括用户输入和 AI 生成的输出。 维护聊天历史记录对于跟踪对话上下文并确保 AI 能够生成上下文相关的回复至关重要。
  • 聊天输出:聊天输出是指 AI 生成的消息,这些消息将发送给用户以回复其输入。 生成符合上下文且具有吸引力的聊天输出对于获得积极的用户体验至关重要。

聊天流可以有多个输入,但“聊天历史记录”和“聊天输入”是聊天流中的必需输入

  • 在聊天流输入部分,可以将流输入标记为聊天输入。 然后,可以通过在聊天框中键入内容来填充聊天输入值。

  • 提示流可帮助用户管理聊天历史记录。 “输入”部分中的 chat_history 将保留下来,用于表示聊天历史记录。 聊天框中的所有交互(包括用户聊天输入、生成的聊天输出以及其他流输入和输出)会自动存储在聊天历史记录中。 用户无法在“输入”部分中手动设置 chat_history 的值。 它结构化为输入和输出列表:

    [
    {
        "inputs": {
        "<flow input 1>": "xxxxxxxxxxxxxxx",
        "<flow input 2>": "xxxxxxxxxxxxxxx",
        "<flow input N>""xxxxxxxxxxxxxxx"
        },
        "outputs": {
        "<flow output 1>": "xxxxxxxxxxxx",
        "<flow output 2>": "xxxxxxxxxxxxx",
        "<flow output M>": "xxxxxxxxxxxxx"
        }
    },
    {
        "inputs": {
        "<flow input 1>": "xxxxxxxxxxxxxxx",
        "<flow input 2>": "xxxxxxxxxxxxxxx",
        "<flow input N>""xxxxxxxxxxxxxxx"
        },
        "outputs": {
        "<flow output 1>": "xxxxxxxxxxxx",
        "<flow output 2>": "xxxxxxxxxxxxx",
        "<flow output M>": "xxxxxxxxxxxxx"
        }
    }
    ]
    

注意

在聊天框中执行测试时,创作页上会提供自动保存或管理聊天历史记录的功能。 对于批处理运行,用户必须在批处理运行数据集中包含聊天历史记录。 如果没有可用于测试的聊天历史记录,只需将 chat_history 设置为批处理运行数据集中的空列表 [] 即可。

使用聊天历史记录创作提示

将聊天历史记录并入提示对于创建具有上下文感知力和吸引力的聊天机器人回复至关重要。 在提示中,可以引用 chat_history 来检索过去的交互。 这样就可以参考以前的输入和输出来创建上下文相关的回复。

使用 Jinja 语言的 for-loop 语法可显示来自 chat_history 的输入和输出列表。

{% for item in chat_history %}
user:
{{item.inputs.question}}
assistant:
{{item.outputs.answer}}
{% endfor %}

使用聊天框进行测试

聊天框通过模拟与聊天机器人的对话来提供一种交互式方法来测试聊天流。 若要使用聊天框测试聊天流,请执行以下步骤:

  1. 选择“聊天”按钮以打开聊天框
  2. 在聊天框中键入测试输入,然后选择 Enter 将其发送给聊天机器人
  3. 查看聊天机器人的回复,确保其符合上下文且准确。
  4. 利用“查看跟踪”快速观察和调试

 “聊天流”聊天框体验的屏幕截图。

后续步骤