开发提示流

提示流是一种开发工具,可以缩短采用大型语言模型 (LLM) 的 AI 应用程序的开发周期。 在本文中,你将了解如何在 Azure 机器学习工作室中创建和开发提示流和聊天流。

随着基于 LLM 的 AI 应用程序的不断发展,提示流提供了一个全面的解决方案,可简化 AI 应用程序的原型制作、试验、迭代和部署过程。 通过使用提示流,可以:

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

创建和开发提示流

若要创建提示流,请在 Azure 机器学习工作室左侧导航中选择“提示流”,然后在“提示流”页面上选择“创建”

在“新建流”画面上,可以通过以下方式创建流:

  • 使用模板创建标准、聊天或评估流。
  • 从“探索库”中克隆可用示例。
  • 使用本地文件或通过文件共享导入现有流。

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

若要创建流,请在所需的流卡片上选择“创建”或“克隆”。 在下一个屏幕窗格中,可以根据需要更改新流名称,然后选择“创建”或“克隆”。 系统将在创作用户界面中打开新流。

计算会话

开始创作之前,请选择流创作页面顶部的“启动计算会话”,以此启动计算会话。 流执行需要使用计算会话。 计算会话管理运行应用程序所需的计算资源,例如包含所有必要的依赖项包的 Docker 映像。

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

创作页面

计算会话可能需要几分钟才能启动。 在计算会话启动时,检查流创作页的各个部分。

  • 页面左侧的流或平展视图是创作流的主要工作区域。 在平展视图中,可以编辑节点、工具、提示和输入;运行节点或整个流;并定义和查看输出。

  • 右上角的“文件”显示流的文件夹和文件结构。 每个流都有一个文件夹,其中包含 flow.dag.yaml 文件、源代码文件和系统文件夹。 可以添加、编辑、删除、上传或下载用于测试、部署或协作的文件。

  • 右下角的“图形”视图直观地显示了流程结构。 可以缩放或使用自动布局。 不能直接编辑此视图,但可以选择一个节点,以在平展视图中查找和编辑。

流输入和输出

在“输入”和“输出”部分,可以查看、添加或删除以及编辑输入和输出。

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

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

流工具

在流中,可以使用不同类型的工具,例如 LLM、Python、Prompt、Serp API 和内容安全。 选择工具会将该工具的新节点添加到流的末尾。 必须指定节点名称并设置必要的配置。 可以使用节点控件更改节点在流中的位置。

节点输入和输出

LLM 和 Prompt 工具使用 Jinja 作为模板语言来动态生成提示。 例如,可以将输入名称括在 {{}} 中,而不是采用固定文本,以便可以即时替换。

可以通过以下方式设置节点输入和输出

  • 直接设置输入值
  • 使用 ${input.<input name>} 语法引用流输入。
  • 使用 ${<node name>.output}${<node name>.output.<field name>} 语法引用节点输出。

编写完提示或 Python 脚本后,可以选择“验证和分析输入”,以便系统根据提示模板和 Python 函数输入自动分析节点输入

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

LLM 节点

对于 Azure OpenAI LLM 节点,需要选择连接、Api 和 deployment_name,并设置提示。 可以使用连接安全地存储和管理与 Azure OpenAI 交互所需的密钥或其他敏感凭据。

Python 节点

若要使用 Python 工具,需要设置 Python 脚本、输入值和其他配置。 新的 Python 节点提供以下用于定义输入和输出的样本 Python 函数。

from promptflow import tool

# The inputs section will change based on the arguments of the tool function, after you save the code
# Adding type to arguments and return value will help the system show the types properly
# Please update the function name/signature per need
@tool
def my_python_tool(input1: str) -> str:
    return 'hello ' + input1

条件控件

提示流支持条件控制,使你可以为流中任何节点的执行设置条件。

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

通过在节点卡片中选择“激活配置”按钮来设置节点的激活配置。 添加“When”语句并设置条件。 可以通过引用流输入或节点输出来设置条件。 例如,可以将条件 ${input.<input name>}${<node name>.output} 设置为特定值。 如果未满足条件,则会跳过该节点,并且节点状态显示为“已绕过”

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

测试流

可以通过运行单个节点或运行整个流来测试流。

  • 若要运行单个节点,请选择节点卡片上的“运行”图标。 节点运行完成后,可以在节点“输出”部分中快速查看结果。
  • 若要运行整个流,请选择页面顶部的“运行”

流输出

选择“运行”以执行流后,可以在页面顶部的横幅中看到运行状态。 选择顶部横幅或顶部菜单栏中的“查看输出”,查看详细的输入、输出、流执行和业务流程信息。

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

流运行完成后,可以选择“查看输出”,以在“输出”屏幕上查看所有历史输出。

流测试结果的屏幕截图。

选择“输出”屏幕上的“跟踪”选项卡可以查看提供有关流持续时间和相关令牌成本的信息的图表。 选择“节点名称”下的“流”,在右侧窗格中查看详细的流概览信息。

展开流并选择任意步骤以查看该步骤的详细信息。 可以在跨度树中查看每个节点执行的持续时间。 有关详细信息,请参阅跟踪跨度规范

 跟踪详细信息的屏幕截图。

开发聊天流

聊天流是专为对话应用程序开发设计的一种特定类型的提示流。 聊天流基于标准流功能构建而成,为聊天输入/输出和历史聊天记录提供经过增强的支持。 借助聊天流,可以轻松创建处理聊天输入和输出的聊天机器人。

若要创建聊天流,请在“新建流”屏幕上,选择“聊天流”卡片上的“创建”,或在“探索库”中选择“聊天”,然后克隆其中一个可用流。

在聊天流创作页中,聊天流标有“聊天”标签,此标签用于将其与标准流和评估流区分开来。 若要测试聊天流,请选择页面顶部的“聊天”以打开聊天框进行对话。

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

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

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

  • 聊天输入:聊天输入是指用户向聊天机器人发送的消息或提交的查询。 有效处理聊天输入对于成功对话至关重要,因为它涉及理解用户意图、提取相关信息以及触发适当的回复。

  • 历史聊天记录:历史聊天记录是用户与聊天机器人之间所有交互记录,包括用户输入和 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. 在屏幕底部的聊天框中输入测试问题,将其发送给聊天机器人。
  3. 查看聊天机器人的回复,确保其符合上下文且准确。
  4. 选择创作页面顶部的“查看输出”以快速查看和调试聊天输入、输出和历史记录。
  5. 在“输出”屏幕上,选择“跟踪”选项卡,然后选择“流”以在右侧窗格中查看详细的流概览信息。 展开流并选择任意步骤以查看该步骤的详细信息。

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