你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
在本教程中,通过将 Azure OpenAI 与 Python Web 应用程序集成并将其部署到 Azure 应用服务来构建智能 AI 应用程序。 创建 Flask 应用,该应用将聊天完成请求发送到 Azure OpenAI 中的模型,并使用托管标识连接到服务。
你将学会如何:
- 创建 Azure OpenAI 资源并部署语言模型。
- 生成连接到 Azure OpenAI 的 Flask 应用程序。
- 将应用程序部署到 Azure 应用服务。
- 在开发环境和 Azure 中实现无密码安全身份验证。
Prerequisites
1.创建 Azure OpenAI 资源
在本部分中,将使用 GitHub Codespaces 中的 Azure CLI 创建 Azure OpenAI 资源。
选择“空白”磁贴中的“使用此模板”以创建新的空白代码空间。
在 Codespace 终端中,安装 Azure CLI。
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash登录 Azure 帐户。
az login按照终端中的说明进行身份验证。
通过为资源组和 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,该组件在标准部署类型下的多个区域可用。在选择位置之前,请参阅 模型摘要和区域可用性表 ,以验证首选区域中的模型支持。
使用自定义域创建资源组和 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 应用
在 codespace 终端中,创建虚拟环境并安装所需的 PIP 包。
python3 -m venv .venv source .venv/bin/activate pip install flask openai azure.identity dotenv pip freeze > requirements.txt在工作区根目录中,创建一个名为 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()在其中创建 模板 目录和 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>在终端中,获取 OpenAI 端点:
az cognitiveservices account show \ --name $OPENAI_SERVICE_NAME \ --resource-group $RESOURCE_GROUP \ --query properties.endpoint \ --output tsv通过将前面的 CLI 输出中的值添加到
AZURE_OPENAI_ENDPOINT来运行应用。AZURE_OPENAI_ENDPOINT=<output-from-previous-cli-command> flask run选择“ 在浏览器中打开 ”以在新浏览器选项卡中启动应用。提交问题以查看响应消息。
3.部署到 Azure 应用服务并配置 OpenAI 连接
应用在本地工作后,将其部署到 Azure 应用服务,并使用托管标识设置到 Azure OpenAI 的服务连接。
首先,使用 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部署应用后,使用托管标识在 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在命令的终端输出
az webapp up中找到已部署应用的 URL,并在 Web 浏览器中导航到该应用。az webapp browse在 Web 应用中,在文本框中输入一条消息,然后选择“ 发送”。 为应用提供几秒钟时间以回复来自 Azure OpenAI 的消息。
应用现已部署并连接到具有托管标识的 Azure OpenAI。
常见问题
- 如何连接到 OpenAI 而不是 Azure OpenAI?
- 是否可以使用 API 密钥而不是托管标识连接到 Azure OpenAI?
- DefaultAzureCredential 的工作原理是什么?
如何连接到 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 和语义内核支持此方法。
- 有关将 API 密钥与语义内核配合使用的详细信息,请参阅 语义内核入门。
- 有关将 API 密钥与 Azure OpenAI 客户端库配合使用的详细信息,请参阅 “使用 Azure OpenAI 响应 API”。
Important
使用应用服务中的 API 密钥等连接机密时,应 使用 Key Vault 引用 ,而不是直接在代码中存储机密。 这种做法可确保敏感信息保持安全,并集中管理。
DefaultAzureCredential 的工作原理是什么?
通过 DefaultAzureCredential 自动选择最佳可用身份验证方法来简化身份验证。
- 在本地开发期间,您运行
az login后,DefaultAzureCredential将使用您本地的 Azure CLI 凭据。 - 对于 Azure 应用服务部署,
DefaultAzureCredential使用应用的托管标识来实现安全的无密码身份验证。
此方法允许代码在本地和云环境中安全无缝地运行,而无需修改。