通过


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

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

在本教程中,通过将 Azure OpenAI 与 Python Web 应用程序集成并将其部署到 Azure 应用服务来构建智能 AI 应用程序。 创建 Flask 应用,该应用将聊天完成请求发送到 Azure OpenAI 中的模型,并使用托管标识连接到服务。

你将学会如何:

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

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

Prerequisites

1.创建 Azure OpenAI 资源

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

  1. 使用 GitHub 帐户登录到 GitHub Codespaces

  2. 选择“空白”磁贴中的“使用此模板”以创建新的空白代码空间。

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

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

    az login
    

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

  5. 通过为资源组和 Azure OpenAI 服务提供名称,并将相应的 Azure 区域设置为你的位置来设置环境变量。

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

    Important

    该位置与所选模型的区域可用性相关联。 Azure 区域和计费层之间的模型和 部署类型 可用性各不相同。 本教程使用gpt-4o-mini,该组件在标准部署类型下的多个区域可用。

    在选择位置之前,请参阅 模型摘要和区域可用性表 ,以验证首选区域中的模型支持。

  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 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 应用服务。 此命令在 OpenAI 资源所在的同一资源组中创建新的 Web 应用,并将代码部署到其中。 命令可能需要几分钟时间才能完成。

    az webapp up \
      --resource-group $RESOURCE_GROUP \
      --location $LOCATION \
      --name $APPSERVICE_NAME \
      --plan $APPSERVICE_NAME \
      --sku B1 \
      --os-type Linux \
      --track-status false
    
  2. 部署应用后,使用托管标识在 Web 应用与 Azure OpenAI 资源之间创建服务连接。 以下命令在 Web 应用与 Azure OpenAI 资源之间创建连接:

    • 为 Web 应用生成系统分配的托管标识。
    • 认知服务 OpenAI 参与者 角色添加到 Azure OpenAI 资源的托管标识。
    • AZURE_OPENAI_ENDPOINT 应用设置添加到 Web 应用。
    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
    
  3. 在命令的终端输出 az webapp up 中找到已部署应用的 URL,并在 Web 浏览器中导航到该应用。

    az webapp browse
    
  4. 在 Web 应用中,在文本框中输入一条消息,然后选择“ 发送”。 为应用提供几秒钟时间以回复来自 Azure OpenAI 的消息。

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

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

常见问题


如何连接到 OpenAI 而不是 Azure OpenAI?

若要连接到 OpenAI 而不是 Azure OpenAI,请使用以下代码:

from openai import OpenAI

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

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

Important

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


是否可以使用 API 密钥而不是托管标识连接到 Azure OpenAI?

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

Important

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


DefaultAzureCredential 的工作原理是什么?

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

  • 在本地开发期间,您运行 az login 后,DefaultAzureCredential 将使用您本地的 Azure CLI 凭据。
  • 对于 Azure 应用服务部署,DefaultAzureCredential 使用应用的托管标识来实现安全的无密码身份验证。

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