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

教程:使用 Azure 应用服务和 Azure OpenAI 构建聊天机器人(Flask)

在本教程中,你将通过将 Azure OpenAI 与 Python Web 应用程序集成并将其部署到 Azure 应用服务来构建智能 AI 应用程序。 你将创建一个 Flask 应用,用于向 Azure OpenAI 中的模型发送聊天完成请求。

显示 Azure 应用服务中运行的聊天机器人的屏幕截图。

本教程中,您将学习如何:

  • 创建 Azure OpenAI 资源并部署语言模型。
  • 生成连接到 Azure OpenAI 的 Flask 应用程序。
  • 将应用程序部署到 Azure 应用服务。
  • 在开发环境和 Azure 中实现无密码安全身份验证。

Prerequisites

1.创建 Azure OpenAI 资源

在本部分中,你将使用 GitHub Codespaces 通过 Azure CLI 创建 Azure OpenAI 资源。

  1. 转到 GitHub Codespaces 并使用 GitHub 帐户登录。

  2. 通过 GitHub 查找 空白 模板,然后选择“ 使用此模板 创建新的空白 Codespace”。

  3. 在 Codespace 终端中,安装 Azure CLI:

    curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
    
  4. 请登录到 Azure 帐户:

    az login
    

    按照终端中的说明进行身份验证。

  5. 为资源组名称、Azure OpenAI 服务名称和位置设置环境变量:

    export RESOURCE_GROUP="<group-name>"
    export OPENAI_SERVICE_NAME="<azure-openai-name>"
    export APPSERVICE_NAME="<app-name>"
    export LOCATION="eastus2"
    

    Important

    该区域至关重要,因为它与所选模型的区域可用性相关联。 模型可用性和 部署类型可用性 因区域而异。 本教程使用的 gpt-4o-mini,在标准部署类型下的 eastus2 中可用。 如果部署到其他区域,则此模型可能不可用,或者可能需要不同的层。 在更改区域之前,请参阅 “模型摘要”表和区域可用性 ,以验证首选区域中的模型支持。

  6. 使用自定义域创建资源组和 Azure OpenAI 资源,然后添加 gpt-4o-mini 模型:

    # Resource group
    az group create --name $RESOURCE_GROUP --location $LOCATION
    # Azure OpenAI resource
    az cognitiveservices account create \
      --name $OPENAI_SERVICE_NAME \
      --resource-group $RESOURCE_GROUP \
      --location $LOCATION \
      --custom-domain $OPENAI_SERVICE_NAME \
      --kind OpenAI \
      --sku s0
    # gpt-4o-mini model
    az cognitiveservices account deployment create \
      --name $OPENAI_SERVICE_NAME \
      --resource-group $RESOURCE_GROUP \
      --deployment-name gpt-4o-mini \
      --model-name gpt-4o-mini \
      --model-version 2024-07-18 \
      --model-format OpenAI \
      --sku-name Standard \
      --sku-capacity 1
    # Cognitive Services OpenAI User role that lets the signed in Azure user to read models from Azure OpenAI
    az role assignment create \
      --assignee $(az ad signed-in-user show --query id -o tsv) \
      --role "Cognitive Services OpenAI User" \
      --scope /subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.CognitiveServices/accounts/$OPENAI_SERVICE_NAME
    

有了 Azure OpenAI 资源后,你将创建一个 Web 应用程序以与之交互。

2.创建并设置 Flask 应用

  1. 在 codespace 终端中,创建虚拟环境并安装所需的 PIP 包。

    python3 -m venv .venv
    source .venv/bin/activate
    pip install flask openai azure.identity dotenv
    pip freeze > requirements.txt
    
  2. 在工作区根目录中,创建 app.py 并将以下代码复制到其中,以便通过 Azure OpenAI 进行简单的聊天完成调用。

    import os
    from flask import Flask, render_template, request
    from azure.identity import DefaultAzureCredential, get_bearer_token_provider
    from openai import AzureOpenAI
    
    app = Flask(__name__)
    
    # Initialize the Azure OpenAI client with Microsoft Entra authentication
    token_provider = get_bearer_token_provider(
        DefaultAzureCredential(), "https://cognitiveservices.azure.com/.default"
    )
    client = AzureOpenAI(
        api_version="2024-10-21",
        azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT"),
        azure_ad_token_provider=token_provider,
    )
    
    @app.route('/', methods=['GET', 'POST'])
    def index():
        response = None
        if request.method == 'POST': # Handle form submission
            user_message = request.form.get('message')
            if user_message:
                try:
                    # Call the Azure OpenAI API with the user's message
                    completion = client.chat.completions.create(
                        model="gpt-4o-mini",
                        messages=[{"role": "user", "content": user_message}]
                    )
                    ai_message = completion.choices[0].message.content
                    response = ai_message
                except Exception as e:
                    response = f"Error: {e}"
        return render_template('index.html', response=response)
    
    if __name__ == '__main__':
        app.run()
    
  3. 在其中创建 模板 目录和 index.html 文件。 将以下代码复制到其中以获取简单的聊天界面:

    <!doctype html>
    <html>
    <head>
        <title>Azure OpenAI Chat</title>
        <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
    </head>
    <body>
        <main class="container py-4">
            <h1 class="mb-4 text-primary">Azure OpenAI Chat</h1>
            <form method="post" action="/" class="mb-3">
                <div class="input-group">
                    <input type="text" name="message" class="form-control" placeholder="Type your message..." required>
                    <button type="submit" class="btn btn-primary">Send</button>
                </div>
            </form>
            <div class="card p-3">
                {% if response %}
                    <div class="alert alert-info mt-3">{{ response }}</div>
                {% endif %}
            </div>
        </main>
    </body>
    </html>
    
  4. 在终端中,获取 OpenAI 端点:

    az cognitiveservices account show \
      --name $OPENAI_SERVICE_NAME \
      --resource-group $RESOURCE_GROUP \
      --query properties.endpoint \
      --output tsv
    
  5. 通过从 CLI 输出中添加 AZURE_OPENAI_ENDPOINT 的值来运行应用:

    AZURE_OPENAI_ENDPOINT=<output-from-previous-cli-command> flask run
    
  6. 选择“ 在浏览器中打开 ”以在新浏览器选项卡中启动应用。提交问题并查看是否收到回复消息。

3.部署到 Azure 应用服务并配置 OpenAI 连接

应用在本地工作后,让我们将其部署到 Azure 应用服务,并使用托管标识设置到 Azure OpenAI 的服务连接。

  1. 首先,使用 Azure CLI 命令 az webapp up将应用部署到 Azure 应用服务。 此命令将创建新的 Web 应用并将代码部署到其中:

    az webapp up \
      --resource-group $RESOURCE_GROUP \
      --location $LOCATION \
      --name $APPSERVICE_NAME \
      --plan $APPSERVICE_NAME \
      --sku B1 \
      --os-type Linux \
      --track-status false
    

    该命令可能需要几分钟时间才能完成。 它将在 OpenAI 资源所在的同一资源组中创建新的 Web 应用。

  2. 部署应用后,使用托管标识在 Web 应用与 Azure OpenAI 资源之间创建服务连接:

    az webapp connection create cognitiveservices \
      --resource-group $RESOURCE_GROUP \
      --name $APPSERVICE_NAME \
      --target-resource-group $RESOURCE_GROUP \
      --account $OPENAI_SERVICE_NAME \
      --connection azure-openai \
      --system-identity
    

    此命令通过以下方式在 Web 应用与 Azure OpenAI 资源之间创建连接:

    • 为 Web 应用生成系统分配的托管标识。
    • 将认知服务 OpenAI 参与者角色添加到 Azure OpenAI 资源的托管标识。
    • AZURE_OPENAI_ENDPOINT 应用设置添加到 Web 应用。
  3. 在浏览器中打开已部署的 Web 应用。 在终端输出中查找已部署的 Web 应用的 URL。 打开 Web 浏览器并导航到它。

    az webapp browse
    
  4. 在文本框中键入消息,然后选择“ 发送”,并为应用提供几秒钟时间以使用 Azure OpenAI 的消息进行答复。

    显示 Azure 应用服务中运行的聊天机器人的屏幕截图。

应用现已部署并连接到具有托管标识的 Azure OpenAI。

常见问题


如果想要连接到 OpenAI 而不是 Azure OpenAI,该怎么办?

若要改为连接到 OpenAI,请使用以下代码:

from openai import OpenAI

client = OpenAI(
    api_key="<openai-api-key>"
)

有关详细信息,请参阅 如何使用 Python 在 OpenAI 和 Azure OpenAI 终结点之间切换

在应用服务中使用连接机密时,应使用 Key Vault 引用 ,而不是直接在代码库中存储机密。 这可确保敏感信息保持安全,并集中管理。


是否可以改为使用 API 密钥连接到 Azure OpenAI?

是的,可以使用 API 密钥而不是托管标识连接到 Azure OpenAI。 Azure OpenAI SDK 和语义内核支持此方法。

在应用服务中使用连接机密时,应使用 Key Vault 引用 ,而不是直接在代码库中存储机密。 这可确保敏感信息保持安全,并集中管理。


DefaultAzureCredential 如何在本教程中工作?

通过 DefaultAzureCredential 自动选择最佳可用身份验证方法来简化身份验证:

  • 在本地开发期间:运行 az login后,它将使用本地 Azure CLI 凭据。
  • 部署到 Azure 应用服务时:它使用应用的托管标识进行安全、无密码身份验证。

此方法允许代码在本地和云环境中安全无缝地运行,而无需修改。

后续步骤