杜克大学-Azure-端到端大模型笔记-全-

杜克大学 Azure 端到端大模型笔记(全)

1:认识你的课程讲师阿尔弗雷多·德萨 👨‍🏫

在本节课中,我们将认识本课程的讲师阿尔弗雷多·德萨,并了解他的专业背景与课程重点。

大家好,我是阿尔弗雷多·德萨。我很高兴为大家带来这门关于 Azure 上大型语言模型的课程。我的经验和背景主要在自动化编程领域。我是一名资深的 Python 开发者,最近也在大量使用 R 编程语言进行开发。此外,我在云技术领域已有很长时间的工作经验。

多年来,我的工作重点一直是自动化以及构建稳健的基础设施。我认为,我的侧重点在于关注监控,以及在流程(例如流水线)运行过程中捕捉细节。在我们学习本课程的不同类型内容时,大家会清楚地看到如何应用我过去的这些经验。

有趣的是,我们将学习如何将过去行之有效的方法(如自动化、监控、密切关注细节以及构建稳健的基础设施和应用程序)应用到像大型语言模型这样的新技术上。因此,结合我的背景,以及我在微软的经验,希望大家能够对在 Azure 上运行的大型语言模型有一个非常透彻的理解。

本节课中我们一起认识了讲师阿尔弗雷多·德萨,并了解了他将如何结合其在自动化、监控和云基础设施方面的丰富经验,来指导我们学习 Azure 上的大型语言模型。

2:02_01_02:课程介绍

在本节课中,我们将学习Azure OpenAI服务,并了解如何开始与之交互。我们将从获取服务访问权限开始,介绍创建Azure OpenAI服务资源的最简单方法,并尝试在Playground中部署一个模型。我们将了解Playground是什么、如何使用它以及如何与之交互。这是一种非常直接的方式,让你能够部署Azure OpenAI服务中托管的OpenAI模型。


上一节我们介绍了课程的整体目标,本节中我们来看看Azure OpenAI服务的具体入门步骤。

访问Azure OpenAI服务

要开始使用Azure OpenAI服务,首先需要获取访问权限。这通常涉及在Azure门户中申请并创建相应的服务资源。

创建服务资源

创建Azure OpenAI服务资源是部署模型的第一步。这个过程在Azure门户中完成,只需几个简单的配置步骤。

以下是创建资源的关键步骤:

  1. 登录到Azure门户。
  2. 在市场中搜索“Azure OpenAI”。
  3. 点击“创建”按钮,开始配置新的资源实例。
  4. 填写必要的信息,如订阅、资源组、区域和资源名称。
  5. 选择定价层,然后查看并创建资源。

部署模型与使用Playground

资源创建成功后,下一步就是在Playground中部署一个模型。Playground是一个基于Web的交互式环境,允许你测试和调整模型而无需编写代码。

我们将看到Playground的界面,并学习如何通过它来与部署的模型进行交互。你可以输入提示(prompt),模型会生成相应的补全(completion)。

例如,一个简单的交互代码如下:

# 这是一个概念性示例,实际调用需使用Azure OpenAI SDK
response = openai.Completion.create(
    engine="your-deployment-name",
    prompt="Translate the following English text to French: 'Hello, world.'",
    max_tokens=60
)
print(response.choices[0].text.strip())

通过Playground,你可以快速测试不同提示和参数设置对模型输出的影响。


本节课中我们一起学习了Azure OpenAI服务的入门知识。我们了解了如何获取服务访问权限、创建服务资源,以及如何在Playground中部署并交互式地测试模型。这为后续更深入的应用开发奠定了实践基础。

3:获取Azure OpenAI服务访问权限 🔑

在本节课中,我们将学习如何获取Azure OpenAI服务的访问权限。目前,该服务的访问权限受到一定限制,未来可能会有所变化。我们将通过一系列步骤来完成申请。

访问申请概述

首先,我们需要访问Microsoft Learn平台上的Azure OpenAI服务文档页面。这个页面不仅是申请访问的起点,也是了解服务功能、创建资源、使用嵌入和OpenAI模型等所有信息的绝佳场所。

上一节我们介绍了Azure OpenAI服务的概况,本节中我们来看看如何具体申请访问权限。

申请步骤详解

以下是申请Azure OpenAI服务访问权限的具体步骤。

  1. 访问官方文档:导航至Microsoft Learn上的Azure OpenAI服务文档页面。这是获取最新信息和申请链接的可靠来源。
  2. 查找申请链接:在文档页面的“附加资源”部分,可以找到申请访问的链接。点击该链接将跳转到申请页面。
  3. 使用快捷链接:一个更易记忆的快捷方式是访问 aka.ms/oai/access 这个短链接。它同样会引导你至申请页面。
  4. 填写申请表单:在申请页面,请仔细阅读所有说明,并完整填写表单中的所有信息。
  5. 使用企业信息:请注意,申请时不应使用个人邮箱地址。你需要提供企业相关信息,例如公司名称、地址等。
  6. 提交并等待:完成所有信息填写后,提交申请。审核和开通访问权限可能需要一些时间。

重要注意事项

由于服务注册目前存在一定限制,申请过程可能有所调整。为了确保你遵循的是最新、最准确的流程,建议始终通过Microsoft Learn平台,搜索并进入“Azure OpenAI服务”官方文档页面来获取最新指引。

本节课中我们一起学习了如何通过Microsoft Learn平台申请Azure OpenAI服务的访问权限,包括查找申请链接、填写企业信息以及提交申请的完整流程。

4:04_01_04_创建Azure OpenAI服务资源

概述

在本节课中,我们将学习如何通过Python代码与Azure OpenAI服务进行交互。我们将从分析官方提供的代码示例开始,了解其结构,并学习如何修改和运行一个简单的聊天脚本。

代码示例分析

上一节我们介绍了在Azure门户中创建资源。本节中我们来看看如何通过代码与创建好的服务进行对话。

官方提供的Python代码示例需要特定版本的库才能运行。代码开头明确指出,它需要openai库的0.28.1或更低版本。如果你从未使用过Python,建议先尝试使用页面中提供的curl命令示例,该命令在大多数系统终端(如macOS、Linux或Windows的WSL)中都可用。

修改与运行Python脚本

为了更清晰地展示交互过程,我们对示例代码进行了一些调整。以下是修改后的脚本核心部分:

import os
import openai

openai.api_type = "azure"
openai.api_base = os.getenv("AZURE_OPENAI_ENDPOINT")
openai.api_version = "2023-05-15"
openai.api_key = os.getenv("AZURE_OPENAI_KEY")

def get_completion(user_message):
    messages = [
        {"role": "system", "content": "You are an AI assistant that helps people find information."},
        {"role": "user", "content": user_message}
    ]
    response = openai.ChatCompletion.create(
        engine="gpt-35-turbo",
        messages=messages,
        temperature=0.7,
        max_tokens=800,
        top_p=0.95,
        frequency_penalty=0,
        presence_penalty=0,
        stop=None
    )
    return response.choices[0].message.content

while True:
    user_input = input("User: ")
    if user_input.lower() == 'quit':
        break
    response = get_completion(user_input)
    print("Assistant:", response)

主要修改点包括:

  1. 将API密钥和终端点设置为环境变量,提升安全性。
  2. 将核心逻辑封装在一个函数get_completion中,使结构更清晰。
  3. 使用while循环实现持续对话,直到用户输入“quit”退出。

环境与依赖管理

在运行脚本前,需要正确设置Python环境并安装依赖。

以下是设置步骤:

  1. 创建虚拟环境:使用命令python3 -m venv venv创建一个隔离的Python环境。
  2. 激活虚拟环境
    • macOS/Linux: source venv/bin/activate
    • Windows: venv\Scripts\activate
  3. 安装依赖:创建一个requirements.txt文件,内容为openai==0.28.1,然后运行pip install -r requirements.txt进行安装。

“固定版本”(==0.28.1)意味着精确安装此版本,以避免因库版本更新导致的兼容性问题。

运行演示

完成环境配置后,在终端激活的虚拟环境中运行脚本python chat.py

程序启动后,会提示“User:”。输入问题,例如“I find Python dependency management kind of tricky.”,AI助手会迅速回复,例如“Python dependency management can be challenging...”。

这个循环对话模式允许用户持续提问并获得回答,模拟了真实的聊天交互体验。

总结

本节课中我们一起学习了如何通过Python与Azure OpenAI服务进行交互。我们分析了官方代码示例,创建了一个可持续对话的修改版脚本,并介绍了使用虚拟环境和requirements.txt文件来管理项目依赖的重要步骤。通过本课实践,你已经掌握了连接并使用Azure OpenAI核心服务的基础方法。

5:部署OpenAI模型 🚀

在本节课中,我们将学习如何在Azure AI Studio中部署OpenAI模型。我们将了解配额设置、模型选择、部署配置以及如何验证部署结果。整个过程旨在让初学者能够轻松上手。


配额概览与设置

在开始部署模型之前,我们先来了解一下Azure AI Studio中的配额管理。配额决定了您每分钟可以处理的最大令牌数量,这对于控制资源使用和成本非常重要。

以下是配额设置的关键信息:

  • 配额单位:配额以每分钟令牌数(TPM) 为单位进行管理。
  • 默认限制:系统会提供一个默认配额,例如240,000 TPM
  • 自定义调整:您可以根据需要,通过请求流程来增加配额上限。
  • 动态配额:一个重要的特性是,您可以随时将配额从最高值(如240,000)降低到更低的值(如1,000)。这允许您灵活利用可用容量,并且只有在实际使用时才会产生费用。

了解了配额的基本概念后,我们就可以开始选择并部署具体的模型了。


选择与部署GPT-3.5 Turbo模型

上一节我们介绍了配额管理,本节中我们来看看如何具体部署一个模型。我们将以GPT-3.5 Turbo为例进行演示。

操作步骤如下:

  1. 在Azure AI Studio中,导航至“模型”部分。
  2. 从模型列表中选择“GPT-3.5 Turbo”。
  3. 点击“部署”按钮,开始配置部署。

在部署配置界面,您需要进行以下设置:

  • 模型版本:从可用版本中选择一个,例如 gpt-35-turbo-0125
  • 部署名称:为此次部署起一个易于识别的名字,例如 GPT-35-demo
  • 高级选项:在这里,您可以看到并调整为此部署分配的配额。系统会显示可用配额(如240,000 TPM),您可以根据需求在此范围内进行调整。

配置完成后,点击“创建”。由于这是基于API的部署,过程通常非常迅速。部署成功后,您会收到“已成功创建部署”的确认信息。


验证部署与使用模型

模型部署成功后,我们需要知道在哪里找到它以及如何开始使用。接下来,我们将进入“部署”管理页面进行验证。

请按照以下步骤操作:

  • 在Azure AI Studio中,点击进入“部署”页面。
  • 在部署列表中,找到您刚刚创建的部署(例如 GPT-35-demo)。其状态应显示为“成功”。
  • 点击该部署,可以查看详细信息,包括速率限制、令牌使用情况等。

查看部署详情后,您可以通过以下方式立即开始使用模型:

  • 在Playground中打开:点击“在Playground中打开”,您将进入一个交互式界面,可以直接与部署的模型进行对话和测试。
  • 通过API调用:部署信息中会提供终结点(Endpoint)和密钥(Key),您可以在自己的应用程序代码中使用这些信息来调用模型API。

此外,您也可以从Azure AI Studio的主页,通过“试用Azure OpenAI”入口访问模型目录和Playground。


课程总结

本节课中,我们一起学习了在Azure AI Studio中部署OpenAI模型的完整流程。我们首先了解了配额(TPM)的概念和设置方法,然后逐步完成了选择GPT-3.5 Turbo模型、配置部署参数并成功创建部署的过程。最后,我们学会了如何在部署管理页面验证结果,并通过Playground或API开始使用已部署的模型。掌握这些步骤,您就具备了在Azure平台上部署和使用大型语言模型的基础能力。

6:使用密钥和终结点 🔑

在本节课中,我们将学习如何在Azure OpenAI服务中使用密钥和终结点。我们将了解如何查找和管理这些关键信息,以及如何根据不同的使用场景(例如使用Python库或直接调用API)来正确配置它们。

资源管理中的密钥与终结点

上一节我们介绍了Azure OpenAI服务的基础。本节中,我们来看看如何访问和管理服务的访问凭证。

在Azure门户中查看已创建的OpenAI服务资源时,可以在资源管理部分找到密钥和终结点。

你将在此处获得终结点。同时,你还会获得位置、区域以及两个密钥。密钥管理功能允许你执行例如重新生成密钥或复制密钥等操作。重新生成密钥的功能在此处可用。例如,如果你不小心泄露了密钥,或者像我一样在演示中担心密钥被展示,你可以在此处重新生成它们。

你也可以查看模型部署,不过我们暂时不在此处管理它们。重点是密钥和终结点。

通用终结点与特定终结点

这里有一个需要注意的地方:此处显示的终结点是通用的,并不特定于我实际部署的模型。在我的例子中,我已经部署了模型,但它们没有显示在这里。这会在某些情况下显示。

让我们看看这些情况是什么。我将转到Azure AI Studio,查看“模型”部分。这里列出了我已部署的几个模型,以及更多可用的模型。

关于我的部署,我转到“部署”部分,可以看到我已经部署的几个模型。

让我们查看名为 demo-alfredo 的部署。这个部署很好,它使用的是 gpt-35-turbo 模型,这符合我们当前的需求。

从Playground获取代码示例

现在,让我转到Playground。我点击“打开Playground”,可以选择聊天Playground,然后选择刚才的部署并立即打开。

我想向你展示的是,在聊天会话中,点击“查看代码”。

当你想要使用像Python这样的语言时,你将能够使用 openai 库(非Azure专用版)。你会得到需要定义的变量。这个代码示例需要一个特定的版本,这没问题。

但我希望你注意我们在这里的 openai.api_base。在这个例子中是:

https://demoalfredo.openai.azure.com

这就是我们之前看到的通用终结点,它并不具体。那么,OpenAI(或Azure)如何知道我们指的是哪个具体模型呢?

对于像Python这样的使用场景,你需要 api_base 是这个通用终结点,这没问题。但对于其他情况,你将需要特定的终结点。我知道这可能会让人困惑。

关键在于,你在这里看到的 engine 参数,它写着 demo-alfredo。这指的是我们实际部署并命名为 demo-alfredo 的模型。如果我给它起了别的名字,这里就会不同。

令人困惑的是,你既获得了一个终结点,也获得了一个密钥,但你只获得一个密钥。如果你想使用另一个密钥,可以回到OpenAI服务之前的仪表板获取。

但你是否注意到,这里的终结点实际上是特定的?这是因为当你在不使用OpenAI库的情况下直接与API通信时,你可以使用这个特定终结点。

直接API调用与CURL示例

如果我们切换到“Curl”和“命令行”视图,你会看到它实际上使用了完整的、特定的API终结点。

这就是使用HTTPS的实际终结点。对于Python的OpenAI库,它会为你构建这个URL。你可以在这里看到 /openai/deployments/demo-alfredo/... 这样的路径。

以下是需要记住的要点:

  • 密钥:用于身份验证,可以在Azure门户中管理(如重新生成)。
  • 通用终结点:格式如 https://[your-resource-name].openai.azure.com,在使用OpenAI客户端库时使用。
  • 特定终结点:包含部署名称的完整路径,格式如 https://[your-resource-name].openai.azure.com/openai/deployments/[deployment-name]/...,在直接调用REST API(如使用Curl)时使用。
  • 引擎/部署名称:在代码中通过 enginedeployment_name 参数指定,以告诉Azure使用哪个具体的模型部署。

本节课中我们一起学习了如何在Azure OpenAI服务中查找和使用密钥与终结点。我们区分了通用终结点和特定于部署的终结点的不同用途,并了解了如何从Playground获取不同编程语言和工具的代码示例。理解这些概念对于安全、有效地集成Azure OpenAI服务到你的应用程序中至关重要。

7:07_01_07:创建一个简单的 Python 示例 🐍

在本节课中,我们将学习如何使用 Python 与 Azure OpenAI 服务进行交互,创建一个简单的聊天示例。我们将从分析官方示例代码开始,逐步构建一个可运行的脚本,并了解如何管理 Python 依赖环境。


我们已将示例代码在此处打开,现在我们将开始与之交互,并使用 Python 来实现。

关于 Python 有几点需要注意。如果你直接复制这里的代码,它将无法工作。代码示例明确指出,它需要 openai Python 库的版本为 0.28.1 或更低。因此,你首先会在 Python 包管理上遇到挑战。

如果你从未使用过 Python,建议你使用此处提供的 curl 示例。curl 命令在大多数 Unix 系统(如苹果电脑、Linux 电脑)的终端中可用。如果你使用的是 Windows 的 Linux 子系统(WSL),也需要使用类似的方法。

不过,让我们还是来看看如何使用 Python 进行操作。我将快速切换到我的文本编辑器,向你展示如何实现。官方示例代码是自上而下顺序执行的,没有使用函数。让我们看看我整合好的脚本是什么样子。

好的,这是基本相同的代码,但有一些区别。你可以看到,openai.api_key 是从环境变量中获取的。这意味着在运行脚本之前,我需要确保已经导出了这个环境变量,稍后我会展示具体做法。

与自上而下的写法不同,我在这里创建了一个非常小的函数,并做了一些细微的改动。我将添加一个 user_message 参数,当我传递它时,它会被附加到消息列表中。这就是模型与我交互的方式:系统消息设定助手角色(例如“你是一个帮助人们查找信息的AI助手”),用户角色则传递我输入的消息。

然后,我将调用 completion 方法,其参数与我们在 Azure 门户上看到的代码示例以及之前的内容完全相同。接下来,我将创建一个无限循环,持续要求用户输入,并将输入的消息传递给函数进行处理。

最后,我将通过以下代码提取响应:completion.choices[0].message.content。这是因为在 Python 中,返回的数据结构是一个字典,我们通过这种方式层层访问所需的内容。我们无需深入 Python 的细节,只需知道它是这样工作的即可。

现在,我还想向你展示 requirements.txt 文件。关闭其他文件后,你可以看到我已经按照要求安装了指定版本的库:openai==0.28.1。这里的双等号意味着“锁定版本”,即精确选择 0.28.1 这个版本。

我将切换到我的终端。在终端中,我已经激活了一个虚拟环境。如果你从未在 Python 中使用过虚拟环境,你可以使用类似 python3 -m venv venv 的命令来创建一个,然后使用 source venv/bin/activate(在 Linux/Mac 上)来激活它。激活后,你就可以在其中安装依赖了。在本例中,我们将使用 pip install -r requirements.txt 来安装。

本视频不会详细讲解 Python 的所有细节,我们会快速进行。我已经预先安装好了所有依赖。现在,我将运行 python chat.py

程序启动:“欢迎。我今天能为您做些什么?” 例如,我可以输入:“我觉得 Python 依赖管理有点棘手。”

消息被发送出去,然后我们很快就能收到回复:“Python 依赖管理可能具有挑战性,尤其是在处理复杂项目时。一个流行的 Python 工具是我们一直在使用的 Pip。”

回到聊天界面,这就是我们修改后的版本。我们使用了 while True 循环,这允许我们保持对话持续进行,不断添加消息并获取回复。你可以参照此例进行类似操作,或添加你自己的变体。


本节课中,我们一起学习了如何设置 Python 环境、安装特定版本的 OpenAI 库,并编写了一个简单的交互式聊天脚本。我们了解了如何从环境变量读取 API 密钥、构建请求消息以及处理模型的响应。通过这个基础示例,你可以开始探索和构建更复杂的 AI 应用。

8:审查使用情况和配额 📊

在本节课中,我们将学习如何在Azure OpenAI服务中审查资源的使用情况和配额。上一节我们介绍了如何部署和调用模型,本节中我们来看看如何监控和管理这些资源的使用量。

概述

在Azure门户中,我们可以查看已部署模型的使用情况,包括令牌消耗量和配额限制。这有助于我们了解资源消耗,并据此进行成本管理和规划。

查看配额与使用情况

现在我们已经与Azure OpenAI服务进行了一些交互,部署了一个模型并调用了该模型。接下来,我将查看配额信息。配额选项位于“管理”部分,点击即可加载。

加载完成后,页面将显示我的部署具体使用情况。

加载完毕。这里显示的是GPT-3.5 Turbo模型每分钟的令牌使用量(以千为单位)。请记住,这是我实际部署的模型。

解读使用数据

目前,我的使用量是122,总配额是240。这意味着在刚才简短的交互中,我已经使用了51%的配额。这就是查看配额的方式。

以下是页面显示的其他关键信息:

  • 我可以看到多个不同的条目,因为我确实可以部署很多模型。
  • 使用情况按部署进行区分。
  • 我有多个使用限制,例如这里有一个120的限制。
  • 这些限制会累加到该模型的总使用量中。

对于同一个模型(本例中是GPT-3.5 Turbo),可以创建多个部署。目前,我为该模型创建了两个部署。

计费模式与灵活性

请记住,计费是基于使用量,而非计算资源本身。这一点非常巧妙,因为它允许你专注于API的消耗,而不必过多担心底层计算资源。

这提供了很大的灵活性,并且能让你密切关注使用情况并设置一些限制。

总结

本节课中我们一起学习了如何在Azure OpenAI服务中审查使用情况和配额。我们了解了如何查看令牌消耗、解读配额限制,以及Azure基于使用量计费的模式所带来的管理灵活性。掌握这些信息对于有效管理和优化云上AI资源成本至关重要。

9:09_01_01:架构概述 🏗️

在本节课中,我们将要学习检索增强生成(RAG)的基本架构和工作流程。我们将通过一个清晰的步骤分解,了解用户查询如何通过框架、向量数据库和大语言模型的处理,最终返回一个包含额外上下文的答案。


架构概述

首先,我们从用户的一个查询开始。通常,这个查询会直接发送给应用框架,然后由框架传递给大语言模型处理。但在检索增强生成的架构中,流程会有所不同。

上一节我们介绍了RAG的基本概念,本节中我们来看看它的具体工作路径。

查询处理流程

以下是检索增强生成(RAG)的核心处理步骤:

  1. 用户发起查询:流程始于用户提出一个问题,例如“昨天的天气怎么样?”。
  2. 查询发送至框架:用户的查询首先被发送到应用框架。这个框架可以是LangChain、Semantic Kernel,或者任何实现了相关API的自定义应用程序。
  3. 框架查询向量数据库:框架收到查询后,不会直接将其发送给大语言模型。相反,它会先将查询发送到向量数据库进行搜索。
  4. 数据库返回相关上下文:向量数据库执行相似性搜索,找到与用户查询最相关的信息片段(例如,存储的昨日天气记录)。这些信息是大语言模型在训练时未曾见过的。
  5. 组合查询与上下文:框架将原始用户查询和从向量数据库获取的额外上下文信息组合在一起。
  6. 发送增强提示至LLM:这个组合后的、包含“答案”的增强提示被发送给大语言模型。可以把这个过程想象成学生在考试时拿到了参考资料。
  7. LLM整理并返回答案:大语言模型的核心任务不再是凭空生成答案,而是根据已有的上下文信息,以一种通顺、自然的方式组织语言,形成最终回复。
  8. 答案返回给用户:框架将大语言模型生成的答案返回给用户。

架构优势

这种“前后往返”的流程设计巧妙。它能够为模型提供相关的事实和背景信息,从而提升回答的准确性和可靠性。

训练一个大型机器学习模型成本高昂,但向向量数据库中添加文档的成本却相对很低,操作也更为简单。我们稍后会探讨如何向数据库中添加文档,但以上便是实现检索增强生成时,数据流转路径的快速概览。当我们决定部署时,也会基于此架构进行实施。


本节课中我们一起学习了检索增强生成(RAG)的基本架构。我们了解到,RAG通过引入向量数据库作为外部知识源,让大语言模型在回答时能够参考更具体、更实时的信息,从而克服了模型本身知识可能过时或不足的限制。核心流程可以概括为:用户查询 -> 框架 -> 向量数据库检索 -> 组合上下文 -> 大语言模型生成 -> 返回答案

10:Azure AI搜索概述 🧠

在本节课中,我们将学习Azure AI搜索服务的基础知识。我们将了解其核心概念、如何创建资源,以及它如何作为增强大型语言模型应用的关键组件。


Azure AI搜索,之前被称为Azure认知搜索,是Azure平台提供的一项强大服务。它能够帮助我们在应用中嵌入文档时,增强应用的能力。

上一节我们介绍了课程背景,本节中我们来看看Azure AI搜索的具体操作。首先,让我们快速浏览一下其界面和功能。

我将点击此处。这里有一个我之前创建的实例。我不仅会展示其中的一些功能,还会逐步演示如何创建一个新的资源。

首先,我将创建一个新资源。和往常一样,我会使用“demo”作为资源组名称。我总是尝试使用“demo”作为前缀,因为这是一个便于后续清理资源组的好方法。

以下是创建资源时需要填写的几个关键步骤:

  • 服务名称:需要输入一个全局唯一的名称。例如,我们可以输入“fredo-search”。
  • 区域:选择部署区域,例如“US2”。
  • 定价层:这里非常重要。我们可以选择免费层。免费层提供50MB的存储空间,允许进行基本的操作,且无需任何成本。这对于学习和实验非常有用。
  • 副本与分区:在免费层中,我们只能配置1个副本和1个分区,即1个搜索单元。这对于我们当前的学习目标已经足够。

配置完成后,点击“查看 + 创建”。系统会进行验证,然后开始实际创建资源。

创建成功后,我们可以转到该资源。在这里,事情开始变得有趣。你会看到“导入数据”的选项,这非常实用。还有一个选项是“导入和矢量化数据”,这是我们在使用大型语言模型处理数据时的一个主要步骤。矢量化正是我们想要实现的目标。

你可以通过此处的用户界面进行操作。点击后,需要创建一个Blob存储账户(如果还没有的话)。然后,你需要选择存储账户中的容器以及存放数据的文件夹。由于目前没有现成的存储账户,我们暂时不深入这一步。

但我会展示其他实现这些操作的方法。我这里有一个之前创建好的搜索服务实例,我想向你展示其他内容。我已经创建了一个索引。索引意味着我已经上传了数据,并用我的矢量化数据完成了索引构建。

你可以使用“搜索浏览器”来测试查询。你可以查看字段,或者执行查询。我之前处理了一些关于葡萄酒的数据,让我们看看查询结果。可以看到返回了许多结果,虽然它们目前不相关,但这没关系。我们将在后续课程中学习如何具体实现。

本质上,这就是快速开始使用Azure AI服务,特别是AI搜索的方法。你可以创建自己的实例和资源。这样一来,当你准备好开始与大型语言模型以及RAG模式(检索增强生成)进行交互时,就能够将你的应用程序连接起来。


本节课中,我们一起学习了Azure AI搜索的概述。我们了解了其作用、如何创建免费层资源,以及索引和矢量化数据的基本概念。这些是构建能够利用大型语言模型和RAG模式的智能应用的基础。

11:使用GitHub进行自动化与部署 🚀

在本节课中,我们将学习如何使用GitHub Actions来自动化部署端到端的应用程序。这是一种强大且直接的方法,能够将你的应用部署到Azure等云平台。

概述

GitHub Actions提供了一种自动化工作流的方式,特别适合持续集成和持续部署(CI/CD)。通过编写一个YAML配置文件,你可以定义一系列步骤,例如构建Docker镜像、推送到容器注册表,以及部署到云服务。本节将快速概述其基本结构和核心概念。

GitHub Actions工作流结构

上一节我们介绍了自动化部署的概念,本节中我们来看看如何具体配置一个GitHub Actions工作流。其核心是在代码仓库中创建一个特定目录和YAML文件。

你需要执行以下操作:

  1. 在项目根目录下创建一个名为 .github 的目录。
  2. .github 目录内,创建一个名为 workflows 的子目录。
  3. workflows 目录中,放置一个YAML格式的配置文件。

该YAML文件定义了整个自动化流程。GitHub提供了入门模板,帮助你快速开始。

YAML配置文件详解

以下是YAML配置文件的一个通用结构示例。我们将逐部分解析其含义。

name: Deploy to Azure Container Apps # 工作流的名称

on:
  workflow_dispatch: # 允许手动触发此工作流

env:
  # 这里可以定义环境变量,例如注册表名称
  # REGISTRY_NAME: 'myregistry.azurecr.io'

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Build Docker image
        run: |
          docker build -t ${{ env.REGISTRY_NAME }}/myapp:${{ github.sha }} .

      - name: Log in to Azure Container Registry
        uses: azure/docker-login@v1
        with:
          login-server: ${{ env.REGISTRY_NAME }}
          username: ${{ secrets.REGISTRY_USERNAME }}
          password: ${{ secrets.REGISTRY_PASSWORD }}

      - name: Push Docker image
        run: |
          docker push ${{ env.REGISTRY_NAME }}/myapp:${{ github.sha }}

      - name: Deploy to Azure Container Apps
        uses: azure/container-apps-deploy-action@v1
        with:
          appSourcePath: ${{ github.workspace }}
          acrName: ${{ env.REGISTRY_NAME }}
          containerAppName: 'my-container-app'
          resourceGroup: 'my-resource-group'

关键部分说明:

  • name: 工作流的名称。
  • on: 定义触发工作流的事件。workflow_dispatch 表示可通过GitHub界面手动触发。
  • jobs: 定义一个或多个任务。每个任务在指定的运行器(如 ubuntu-latest)上执行。
  • steps: 任务内的具体步骤序列。

核心步骤解析

工作流通常包含几个核心阶段:检出代码、构建镜像、登录注册表、推送镜像和部署应用。

以下是构建和部署流程中的关键步骤:

  1. 检出代码:使用 actions/checkout 操作将你的仓库代码拉取到工作流运行环境中。
  2. 构建Docker镜像:执行 docker build 命令,根据项目中的 Dockerfile 构建容器镜像。镜像标签通常包含Git提交哈希(${{ github.sha }})以确保唯一性。
  3. 登录容器注册表:使用Azure或Docker的登录操作,通过存储在GitHub Secrets中的凭证认证,以便推送镜像。
  4. 推送镜像:执行 docker push 命令,将构建好的镜像上传到指定的容器注册表(如Azure Container Registry)。
  5. 部署到云服务:使用特定的部署操作(如 azure/container-apps-deploy-action),指示云平台(如Azure Container Apps)拉取新镜像并更新应用。

GitHub Secrets的使用

GitHub Secrets是GitHub Actions的一项关键安全功能,它允许你在仓库中安全地存储敏感信息,如API密钥、密码或连接字符串。

在YAML配置中,你可以通过 ${{ secrets.SECRET_NAME }} 的格式引用这些秘密。例如,在登录Azure容器注册表的步骤中,我们使用了 ${{ secrets.REGISTRY_PASSWORD }}。这样的设计避免了将敏感信息硬编码在配置文件中,既安全又便于团队协作和复用。

总结

本节课中我们一起学习了如何使用GitHub Actions实现自动化部署。我们了解了工作流的基本结构,剖析了YAML配置文件的各个部分,并明确了从代码检出到应用部署的核心步骤。此外,我们还认识了GitHub Secrets在安全管理凭证方面的重要作用。通过这套流程,你可以高效、自动地将应用程序部署到Azure等云平台,实现端到端的LLM应用交付。在后续课程中,我们将看到这个工作流的具体运行实例。

12:设置Azure组件 🛠️

在本节课中,我们将学习如何为将应用程序部署到云端而设置必要的Azure服务。我们将重点创建Azure容器应用,并确保其配置与我们的自动化部署流程(例如GitHub Actions)相匹配。


创建容器应用

上一节我们介绍了项目结构和自动化部署的概念。本节中,我们来看看如何在Azure门户中具体创建容器应用。

首先,我们需要访问Azure门户并导航到“容器应用”服务。在创建新应用之前,有一个关键细节需要注意:我们的自动化脚本(如GitHub Actions工作流)中已经预定义了资源组和容器应用的名称。我们必须确保在Azure门户中创建时使用完全相同的名称,否则自动化部署将无法正确识别资源。

以下是创建容器应用的步骤:

  1. 在Azure门户中,选择“创建资源”并搜索“容器应用”。
  2. 点击“创建”开始配置。
  3. 在“基本信息”选项卡中,选择所需的订阅。
  4. 在“资源组”字段,必须输入与自动化脚本中完全一致的名称。例如,如果脚本中定义为 demo-container,则此处也应创建或选择同名资源组。
  5. 为“容器应用名称”设置一个名称,同样必须与自动化脚本中定义的 container-app-name 保持一致。
  6. 选择偏好的区域(例如“美国东部”)。
  7. 完成其他必要配置后,点击“查看 + 创建”进行验证。
  8. 验证通过后,点击“创建”以部署容器应用。

部署过程需要一些时间。一旦完成,该容器应用资源就可以被我们的自动化部署流程所使用。


理解自动化与容器注册表

现在我们已经创建了基础的Azure容器应用,接下来需要理解自动化部署流程如何与之协同工作。

我们的自动化脚本(以GitHub Actions为例)通常会构建一个Docker容器镜像,并将其推送到一个容器注册表。在本例的架构中,我们选择使用GitHub容器注册表来存储构建的镜像。其地址通常类似于 ghcr.io/<用户名>/<镜像名>

以下是此流程的核心环节:

  • 构建镜像:自动化脚本在代码仓库中根据 Dockerfile 构建应用程序的容器镜像。
  • 推送镜像:构建好的镜像被标记并推送到指定的容器注册表(此处为GHCR)。
  • 部署到Azure:自动化脚本接着指示Azure容器应用服务,从该注册表中拉取最新版本的镜像并部署运行。

这意味着,虽然你也可以选择使用Azure容器注册表,但本教程采用了GitHub提供的集成方案,因为它与代码仓库的结合更为紧密和直接。


监控部署进度

创建资源并触发自动化流程后,我们可以监控部署状态。

你可以回到GitHub仓库的“Actions”选项卡,查看对应工作流的运行情况。当工作流开始执行,你会看到诸如“构建镜像”、“推送镜像”、“部署到Azure”等步骤依次进行。

同时,在Azure门户的容器应用“概述”页面,你最终将看到应用状态变为“正在运行”。至此,你的应用程序就已成功部署到云端,并可以准备连接Azure OpenAI服务等其他资源。


总结

本节课中我们一起学习了设置Azure组件的关键步骤。我们首先在Azure门户中创建了容器应用,并强调了资源组和应用名称必须与自动化脚本严格匹配。接着,我们解释了自动化部署流程如何利用GitHub容器注册表来管理镜像,并最终将应用部署到Azure。完成这些设置后,我们的基础云环境就已就绪,为后续集成更高级的服务(如Azure OpenAI)打下了基础。

13:在Azure OpenAI中使用RAG 🧠

在本节课中,我们将学习如何在Azure OpenAI服务中实现检索增强生成(RAG)。我们将把之前准备好的文档加载到向量存储中,通过相似性搜索获取相关上下文,并最终利用大型语言模型生成精准的回答。整个过程将展示如何将Azure AI搜索与Azure OpenAI服务无缝集成。


上一节我们使用CSB加载器准备好了所有文档。现在,让我们实际运行并测试它。我们将演示几个关键操作。

首先,我们将使用带相关性分数的相似性搜索功能。我们将向Azure AI搜索(即这里的向量存储)提问:“What is the best governance ofonwin in App Valley above 94 points?”。运行此查询后,我们会得到一个结果。在本例中,返回的是“declaration App Valley governanceness whensure”。这个结果看起来符合预期。

接下来,我们需要设置Azure OpenAI服务。我们将使用必要的密钥和配置来启动服务。以下是涉及的几个组件:

  • OpenAI API基础地址:从环境变量加载。
  • API密钥:同样从环境变量获取。
  • API版本:这是关键,因为如果你需要使用更新版本的API,此处必须正确指定。

在消息配置部分,需要特别注意。我们设置了系统消息,内容为“assistant is a chatbot that helps you find the best wine for your taste.”。这为系统设定了上下文,用户不会直接看到此消息。

用户的问题(即查询)将放在这里:“What is the best governance so when you want in A Valley above and 94 points”。而助手的回复将包含额外内容,这些内容正是来自我们之前从Azure AI搜索获取的结果。我们需要将这些搜索结果捕获并整合到消息的“content”字段中。

当所有这些消息组件准备就绪后,我们就能清楚地看到各个部分是如何协同工作的:我们有系统和助手的角色设定、用户的查询,以及来自Azure AI搜索的补充内容。

完成以上步骤后,我们将调用OpenAI的聊天补全接口。我们指定部署名称,并传入之前构建好的消息列表。最后,打印出模型的响应内容。

让我们看看结果。这次调用耗时1.2秒,与后台API交互是值得的。响应内容显示:“Here is a highly rated Caness windum from Napa Valley with a score above 94 points”。这完全是大型语言模型的功劳。它具体提到了“The wine 1849 declaration Caness whenium from 2014”,但指出其评分91分并不理想。你可以看到,模型最终以清晰的方式组织了回答。

我们可以尝试一个略有不同的查询来验证灵活性。将问题改为:“pin wine in Oregon noir wine in Oregon above 94 point”。为确保流程正确,我们需要在将查询和上下文发送给OpenAI端点之前,先运行一次搜索来获取新的相关文档。确认搜索返回正确结果后,再次运行整个流程。

这一次,借助新的上下文,大型语言模型成功给出了回答:“A highly rated pinot noir wine from Oregon that is scored above 94 points is this one right here.”。

至此,我们已验证了所有组件协同工作正常。我们成功地将Azure OpenAI服务与Azure AI搜索(原名Azure Cognitive Search)粘合在一起,整个系统完全按照预期运行。


本节课中,我们一起学习了在Azure OpenAI中实施RAG的完整流程。我们从文档加载和向量搜索开始,接着配置了Azure OpenAI服务并构建了包含系统指令、用户查询和检索上下文的提示消息,最后调用模型生成了基于上下文的精准回答。这个过程展示了如何利用外部知识库增强大语言模型的能力,使其能提供更准确、更相关的信息。

14:应用程序概述 🚀

在本节课中,我们将学习如何将之前构建的所有组件整合到一个完整的应用程序中。我们将创建一个基于 FastAPI 的 API 服务,它能够接收用户查询,利用 Azure AI 搜索获取相关信息,并通过 Azure OpenAI 的大型语言模型生成最终答案。我们将首先在本地运行并验证这个应用,为后续将其容器化并部署到 Azure 做好准备。

上一节我们介绍了如何利用 Jupyter Notebook 进行原型开发,本节中我们来看看如何将这些功能封装成一个可部署的 Web 服务。

应用程序架构

我们将以非常直接的方式将所有组件整合在一起。与之前在 Jupyter Notebook 中的操作类似,但这次我们将把它作为一个 API 来提供服务。这个 API 最终将运行在 Azure 的容器中,但在此之前我们可以在本地进行验证。

我们将使用 FastAPI 这个 Python Web 框架,并像之前一样使用 OpenAI 的嵌入模型和 Azure AI 搜索。

核心代码结构

以下是构建应用程序的主要步骤:

首先,我们定义应用程序并收集所有必要的信息。

# 导入必要的库并初始化应用
import os
from fastapi import FastAPI, HTTPException
from openai import OpenAI
from azure.core.credentials import AzureKeyCredential
from azure.search.documents import SearchClient
# ... 其他导入

我们需要确保能够连接到 OpenAI 以获取嵌入,并连接到之前部署的 Azure OpenAI 嵌入模型。同时,连接 Azure AI 搜索也是必需的,因为这是我们扩展查询能力的方式。

我们将暴露几个路由,主要是根路由和 /ask 路由。

app = FastAPI()

@app.get("/")
async def root():
    return {"message": "Redirecting to /docs"}

@app.post("/ask")
async def ask_question(query: str):
    # 处理查询的逻辑
    pass

根路由将重定向到 API 文档。/ask 端点将允许 POST 请求,它主要完成三件事:

  1. 将查询提交给 Azure AI 搜索。
  2. 将查询和搜索结果一起传递给助手函数。
  3. 将增强后的响应以 JSON 格式返回。

查询来自请求体,它既被发送到搜索服务,也被发送给大型语言模型。最终的响应格式如下:

{
  "response": "来自 LLM 的聊天机器人回答"
}

辅助函数

以下是实现核心功能的两个辅助函数。

搜索函数:此函数与之前 Jupyter Notebook 中的功能完全相同。我们添加了打印语句,以便在运行应用时查看搜索返回的结果,方便验证。

def search_documents(query, search_client):
    print(f"正在搜索查询: {query}")
    # 执行带相关度分数的相似性搜索
    results = search_client.search(search_text=query, top=5)
    # ... 处理结果
    return context_text

助手函数:这是与 OpenAI 服务进行 AI 交互的部分。我们使用了与之前 Jupyter Notebook 中相同的模式:设置一个系统消息来定义助手角色,用户查询是原始问题,而内容(content)则是来自 Azure AI 搜索的上文信息。

def get_assistant_response(query, context, openai_client):
    messages = [
        {"role": "system", "content": "你是一个乐于助人的助手。"},
        {"role": "user", "content": f"问题:{query}\n上下文:{context}"}
    ]
    response = openai_client.chat.completions.create(
        model="gpt-4",
        messages=messages
    )
    return response.choices[0].message.content

最后,我们将所有内容整合到暴露的 /ask 路由中。

运行与部署准备

为了运行此应用,我们需要满足一些依赖要求。

以下是主要的依赖项:

  • uvicorn: 用于运行 FastAPI 应用的 ASGI 服务器。
  • fastapi: 构建 API 的 Web 框架。
  • 其他与 OpenAI 和 Azure 服务交互所需的库(与之前相同)。

由于此应用最终将被容器化,我们需要一个 Dockerfile。

# Dockerfile 示例
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"]

这个 Dockerfile 非常简单:它基于 Python 镜像,安装依赖项,复制代码,并使用 Uvicorn 服务器运行应用。

现在,让我们在本地运行它进行验证。打开终端,确保处于虚拟环境中,并运行以下命令:

uvicorn main:app --reload --host 0.0.0.0 --port 8000

这个命令启动了 Uvicorn 服务器,加载环境变量中的密钥和秘密,并将应用绑定到本地主机的 8000 端口。main:app 指定了主 Python 文件(main.py)和其中的 FastAPI 应用实例(app)。

应用加载后,我们可以在浏览器中访问 http://localhost:8000。这里会显示可用的路由,包括我们定义的 /ask 路由(允许 POST 请求)。

这使我们能够立即与 API 进行交互。例如,我们可以发送一个查询:“What is a good choice for Cabernet Franc in California?”

当我们执行这个查询时,应用程序会在后台执行以下操作:

  1. API 接收查询。
  2. 将查询发送给 Azure AI 搜索。
  3. 将搜索结果和原始查询一起发送给 Azure OpenAI 的 LLM。
  4. 将 LLM 生成的答案返回。

查看响应,我们可能会得到:“一个很好的选择是 2016 年的 Andy Cabernet Franc...”,并附上葡萄酒评分和来源信息。这证明应用正在与 Azure AI 搜索通信。

如果我们回到代码的终端输出,可以看到打印的搜索响应,这正是我们最初加载的 CSV 数据,现在正为大型语言模型提供有用的信息。

总结

本节课中我们一起学习了如何构建一个端到端的 LLM 应用程序。我们从定义 FastAPI 应用开始,集成了 Azure AI 搜索来获取相关上下文,并通过 Azure OpenAI 服务生成智能回复。我们成功在本地运行并测试了整个流程,验证了从数据采集、处理到最终提供问答服务的完整链路。这个应用概述为我们下一步将其容器化并部署到 Azure 云服务奠定了坚实的基础。

15:部署与自动化概述 🚀

在本节课中,我们将学习如何将我们的应用程序从代码部署到云端。我们将了解整个部署流程的架构,以及各个组件(如代码仓库、自动化工具、容器注册表和云服务)是如何协同工作的。

架构概览

理解我们现有系统的架构,将帮助我们掌握所有组件是如何协同工作的。

上一节我们介绍了应用程序的基本构成,本节中我们来看看整个部署流程的宏观视图。

部署流程详解

以下是部署流程的详细步骤,我们将从代码开始,一直到应用程序在云端运行。

1. 代码与应用程序

我们从代码开始。我们的应用程序托管在 GitHub 上,它是一个 HTTP API,用于接收请求并与模型交互。

2. 自动化构建

接下来,我们将使用 GitHub Actions 来实现自动化。GitHub Actions 将与 Docker 交互,设置 Docker 构建系统并执行命令。通过这一步,我们将能够构建我们的容器化应用程序。

3. 构建容器镜像

构建容器化应用程序是至关重要的一步,因为我们的目标是将它部署到 Azure 云上。这个过程将生成一个容器镜像。

4. 推送镜像到注册表

构建完成后,我们将把生成的容器镜像推送到注册表。在本例中,我们使用的是 GitHub 容器注册表。当然,你也可以使用其他注册表。使用 GitHub 容器注册表可以简化流程,因为用户名和密码等配置已经预先设置好了,我们稍后在查看 GitHub Actions 工作流时会详细看到这些细节。

5. 触发云服务部署

当镜像成功推送到注册表后,GitHub Actions 会通知 Azure(具体来说是 Azure 容器服务)去拉取这个新镜像。这是一个触发机制:GitHub Actions 告诉 Azure,新的镜像已准备就绪。

6. 在 Azure 上部署与运行

Azure 容器服务会从注册表(GHCR.io)拉取容器镜像,并将其部署到 Azure 云上。至此,应用程序就成功发布了。

应用程序的运行与扩展

现在,让我们看看应用程序部署后是如何运行和应对用户请求的。

当用户开始与我们的应用程序交互时(我们称之为第一步),他们会发送提示或查询。

这些请求将被 Azure 云接收。我们的应用程序就运行在 Azure 云中。

Azure 的一个重要能力是扩展我们的应用程序,这被称为水平扩展。随着请求量的增加,Azure 可以部署更多这样的“小单元”(即容器)来处理负载。这种根据需求增长容器数量的能力,就是水平扩展系统,它确保我们能够处理所有涌入容器的请求。

一旦请求到达容器,我们的应用程序就能与 Azure OpenAI 服务进行通信。

请求在容器中被处理,通过 Azure OpenAI 服务获得响应,最后经由 Azure 云将响应返回给用户。

总结

本节课中,我们一起学习了从代码到云端的完整部署流程。我们了解了架构概览,并逐步拆解了如何使用 GitHub Actions 实现自动化构建、如何通过 Docker 创建容器、如何将镜像推送到注册表,以及 Azure 如何拉取镜像并部署运行。我们还看到了 Azure 的水平扩展能力如何确保应用程序能够应对高并发请求。这个流程将代码、自动化工具和云服务紧密连接在一起,构成了一个高效的部署管道。接下来,我们将深入 GitHub Actions,亲眼看看这一切是如何具体运作的。

16:在Azure中使用GitHub Actions 🚀

在本节课中,我们将学习如何配置和使用GitHub Actions,以实现将应用程序自动构建并部署到Azure容器应用(Azure Container Apps)的完整流程。我们将详细解析工作流文件,并说明如何设置必要的认证信息。

概述

上一节我们介绍了Azure容器应用的基本概念。本节中,我们来看看如何利用GitHub Actions实现持续集成与持续部署(CI/CD)。我们将通过一个具体的YAML工作流文件,讲解如何构建Docker镜像、推送到GitHub容器注册表,并最终部署到Azure。

工作流文件解析

以下是GitHub Actions工作流的核心组成部分。该文件定义了从代码变更到云上部署的自动化步骤。

工作流触发机制

工作流的名称可以自定义。workflow_dispatch选项是关键,它允许我们手动触发工作流执行。在本例中,我们没有设置为在代码推送到主分支时自动触发。如果你确信代码变更经过验证,可以后续修改为自动触发。

name: Build and Deploy to Azure Container Apps
on:
  workflow_dispatch:

构建与推送容器镜像

此部分负责构建Docker容器镜像,并认证、推送到GitHub容器注册表(GHCR)。GITHUB_TOKEN等认证信息已由GitHub自动预设,无需额外配置。

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v3

      - name: Log in to GitHub Container Registry
        uses: docker/login-action@v2
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Build and push Docker image
        uses: docker/build-push-action@v4
        with:
          push: true
          tags: ghcr.io/${{ github.repository }}/my-app:latest

部署到Azure容器应用

这是与Azure交互的核心步骤。首先需要登录Azure,然后执行部署命令。

以下是部署步骤的关键操作列表:

  • Azure登录:使用azure/login Action并传入之前设置的AZURE_CREDENTIALS密钥进行认证。
  • 设置容器注册表:告知Azure容器应用从哪个注册表拉取镜像。这里使用GitHub容器注册表,并需提供用户名和密码(个人访问令牌)。
  • 配置环境变量:为容器应用设置运行所需的环境变量,例如OpenAI API类型、终端点、密钥以及Azure AI搜索服务的相关信息。
  • 创建/更新容器应用:指定容器的计算资源(如2个CPU和4GB内存),并最终触发部署。
      - name: Log in to Azure
        uses: azure/login@v1
        with:
          creds: ${{ secrets.AZURE_CREDENTIALS }}

      - name: Deploy to Azure Container App
        uses: azure/CLI@v1
        with:
          azcliversion: latest
          inlineScript: |
            az containerapp registry set \
              --name my-container-app \
              --resource-group my-resource-group \
              --server ghcr.io \
              --username ${{ github.actor }} \
              --password ${{ secrets.PAT }}

            az containerapp update \
              --name my-container-app \
              --resource-group my-resource-group \
              --set-env-vars \
                OPENAI_API_TYPE=azure \
                OPENAI_API_BASE=https://your-resource.openai.azure.com/ \
                OPENAI_API_KEY=${{ secrets.OPENAI_API_KEY }} \
                SEARCH_SERVICE_NAME=your-search-service \
                SEARCH_API_KEY=${{ secrets.SEARCH_API_KEY }} \
                SEARCH_INDEX_NAME=demo-index \
              --cpu 2 \
              --memory 4Gi \
              --image ghcr.io/${{ github.repository }}/my-app:latest

关键配置详解

要使上述工作流正常运行,必须在GitHub仓库中正确设置几个密钥(Secrets)。

1. 创建Azure服务主体(Service Principal)

需要在Azure中创建一个服务主体,用于GitHub Actions对Azure进行身份验证。在Azure Cloud Shell或本地CLI中运行以下命令:

az ad sp create-for-rbac --name "my-github-actions-sp" --role contributor --scopes /subscriptions/<your-subscription-id> --sdk-auth

将输出的JSON对象完整复制。

2. 在GitHub仓库中配置密钥

进入GitHub仓库的 Settings > Secrets and variables > Actions 页面。

以下是需要添加的密钥列表:

  • AZURE_CREDENTIALS:将上一步复制的整个JSON输出粘贴在此处。
  • PAT(个人访问令牌):需要一个具有write:packages权限的GitHub个人访问令牌。可以在 https://github.com/settings/tokens/new 创建。
  • OPENAI_API_KEY:你的Azure OpenAI API密钥。
  • SEARCH_API_KEY:你的Azure AI搜索服务的管理员API密钥。

总结

本节课中我们一起学习了如何配置GitHub Actions工作流,以实现应用在Azure容器应用上的自动化部署。我们分解了YAML文件的各个部分,包括手动触发、镜像构建与推送,以及通过Azure CLI进行部署的核心步骤。最重要的是,我们详细说明了如何创建Azure服务主体和在GitHub中设置必要的认证密钥。掌握这些步骤后,你就能建立起一套高效的CI/CD管道,轻松地将应用部署到Azure云环境。

posted @ 2026-03-26 12:23  布客飞龙III  阅读(21)  评论(0)    收藏  举报