Prompt Flow 在 Azure 机器学习工作室、Azure AI Studio 和本地开发笔记本电脑上提供,是一种开发工具,旨在简化由 LLM(大型语言模型)提供支持的 AI 应用程序的整个开发周期。Prompt Flow 使提示处于前端和中心,而不是像其他工具那样混淆它们或将它们深埋在抽象层中。这种方法不仅允许开发人员构建编排,还可以像在传统软件开发周期中评估和迭代代码一样评估和迭代他们的提示。

开发后,Prompt Flow 允许开发人员方便地将其应用程序部署到 Azure 机器学习所称的联机终结点。此类端点在 REST API(应用程序编程接口)后面加载 Prompt Flow,并执行它以响应推理请求。在大多数情况下,这是将解决方案部署到生产环境的最简单方法,因为 Microsoft Azure 负责使其高度可用且安全。但是,在某些情况下,您可能希望承担 Prompt Flow 的部署。也许你想要比托管服务本身提供的更精细,也许你已经有基于 Kubernetes 的 CI/CD(持续集成和持续交付)管道,你想将 Prompt Flow 添加到其中,或者出于监管原因,你可能需要在本地执行 Prompt Flow 的某些节点。

幸运的是,Prompt Flow 允许您构建流并将其打包为 docker 容器,您可以将其推送到任意容器注册表,然后拉取以在任何启用容器的平台上运行。假设我们正处于冲刺的尾声,我们已经完成了 Prompt Flow 的下一次迭代,并且我们希望自行托管部署。这篇博文旨在演示实现目标的步骤。

我们的出发点是HR(人力资源)受益的聊天机器人。我们的想法是创建一个基于聊天的助手,该助手将了解为我们员工提供的福利,并能够快速准确地回答问题。为此,我们采用了 Microsoft 的优势手册,将其分块并在 Azure AI 搜索中引入,以允许全文搜索、矢量搜索和混合搜索。我们使用基于检索增强生成 (RAG) 的方法,将用户的问题矢量化,然后使用该向量从 Azure AI 搜索中检索语义上最相关的文档块; 最终,用户的问题和块都被发送到一个大型语言模型,在我们的例子中是 GPT-35-turbo,该模型将生成答案并返回给用户。

如果要在您的环境中部署此解决方案,您将在此存储库 rom212/benefitspromptflow(github.com) 中找到代码。请注意,必须在 Azure AI 搜索索引中为自己的权益手册编制索引。

我喜欢在我的开发计算机上通过 Visual Studio Code 本地使用 Prompt Flow,以及可在此处找到的 Prompt Flow 扩展:VS Code 的 Prompt Flow - Visual Studio Marketplace。 尽管表示流的有向无环图 (DAG) 是 yaml 文件,但 Visual Studio Code 扩展提供了 DAG 的可视化表示形式,使各个步骤和整个流的业务流程清晰明了。

image

在上面,我们可以看到执行从输入开始;这是用户的第一个问题。此问题将矢量化,然后将该向量和初始问题作为文本发送到执行混合搜索并从 Azure AI 搜索中检索最相关的一个或多个块的 Python 节点。然后,我们有一个提示节点,它通过将块填充到初始问题旁边来为 LLM 准备输入。最后,LLM 接收此扩充的提示,并返回答案作为 Prompt Flow 的最终输出。请注意左侧显示的 Prompt Flow 扩展。另请注意,Prompt Flow 是一个快速迭代的工具,如果您在发布日期几个月后阅读这篇介绍,您肯定会获得不同的体验。

我们可以从 Visual Studio Code 体验中本地运行流。这使我们能够建立它应该如何表现的基线。我们可以单击播放按钮或按 Shift+F5 打开对话框并在交互模式下运行 Prompt Flow。

image

image

在上面,我们可以看到用户可以提出问题并从聊天机器人那里得到明确的答案。我们现在在开发中有一个正常运行的后端,可以为 HR 副驾驶类型的应用程序提供支持,并允许员工询问有关其福利的具体问题!不过,我们这篇博文的目标是了解如何将其部署在生产级计算平台上,该平台几乎可以在任何地方甚至本地部署。为此,我们将使用 Microsoft Visual Studio Code 的 Prompt Flow 扩展中的生成功能,查看它如何生成 docker 文件以及生成和推送容器映像所需的项目。

启用可视化编辑器后,您可以在顶部导航栏上看到五个菜单选项。在“调试”和“排序”按钮之间是“构建”按钮,它为我们提供了将流程构建为 docker 的选项。

image

这提示我们为决定称为“build”的工件选择输出目录。

image

最后,我们可以通过单击“创建 Dockerfile”按钮来要求 Prompt Flow 扩展继续进行构建。请注意,在撰写本文时,这不适用于 Visual Studio Code 扩展的 1.6.0 版本,但适用于 1.5.0 版本。

image

浏览生成文件夹会显示工件,尤其是 Dockerfile,它显示了如何生成映像。它将基于 miniconda3 基础映像构建,并实例化 gunicorn 服务器以在端口 8080 上处理推理请求。

image

值得注意的是,我们在开发中使用的 API 密钥并未融入构建中。相反,与 Azure AI 搜索或 Azure Open AI 的各种连接现在希望将其密钥作为环境变量查找。这使我们能够保护机密的安全,并在运行时动态注入它们。

image

为了构建和运行这个基于 Linux 的映像,我们将构建文件夹移动到 Linux 主机。在我们的例子中,为了简单起见,我们将在本地使用 WSL2(适用于 Linux 2 的 Windows 子系统)。WSL2 允许我们轻松地在 Windows 机器上运行 Linux 环境,但以下步骤在另一台启用了 docker 的 Linux 主机上同样有效。导航到我们的 build 文件夹后,我们可以调用 docker build 命令。

image

现在,我们可以标记映像并将其推送到我们选择的容器注册表,例如 Docker Hub。在本例中,我们决定将其推送到 Microsoft Azure 容器注册表服务。

image

现在它像往常一样基于容器的部署。我们可以将映像部署到 Kubernetes 集群或任何运行 docker 的计算机上。由于我们的 Prompt Flow 使用了连接,因此我们必须记住将所需的机密作为环境变量传递,以访问 Azure AI 搜索和 Azure Open AI。

image

我们的应用程序正在运行,API 已准备好将问题作为 Prompt Flow 的输入。在我们的例子中,我们甚至有一个小的 Web 前端,可用于测试目的。

image

我们看到了 Prompt Flow 为开发人员提供的一些便捷功能。我们还看到,尽管 Prompt Flow 可以很容易地将编排的流部署到托管终结点,但对于我们实际应该在哪里部署它,它并没有硬性要求。事实上,构建功能允许您打包应用程序并在几乎任何平台上执行它。