Azure 聊天完成示例(预览)

, ,
Mar 28, 2023
Open in Github

本示例将介绍如何使用Azure OpenAI服务进行聊天补全。它还包括有关内容过滤的信息。

设置

首先,我们安装必要的依赖项并导入我们将使用的库。

! pip install "openai>=1.0.0,<2.0.0"
! pip install python-dotenv
import os
import openai
import dotenv

dotenv.load_dotenv()

认证

Azure OpenAI 服务支持多种认证机制,包括 API 密钥和 Azure Active Directory 令牌凭证。

use_azure_active_directory = False  # Set this flag to True if you are using Azure Active Directory

使用API密钥进行身份验证

要设置OpenAI SDK以使用Azure API密钥,我们需要将api_key设置为与您的终端点关联的密钥(您可以在Azure门户中的"资源管理"下的"密钥和终端点"中找到此密钥)。您还可以在这里找到您的资源的终端点。

if not use_azure_active_directory:
    endpoint = os.environ["AZURE_OPENAI_ENDPOINT"]
    api_key = os.environ["AZURE_OPENAI_API_KEY"]

    client = openai.AzureOpenAI(
        azure_endpoint=endpoint,
        api_key=api_key,
        api_version="2023-09-01-preview"
    )

使用 Azure Active Directory 进行身份验证

现在让我们看看如何通过Azure Active Directory进行身份验证。我们将从安装azure-identity库开始。这个库将提供我们进行身份验证所需的令牌凭证,并通过get_bearer_token_provider辅助函数帮助我们构建一个令牌凭证提供者。建议使用get_bearer_token_provider而不是向AzureOpenAI提供静态令牌,因为这个API会自动为您缓存和刷新令牌。

有关如何使用 Azure OpenAI 设置 Azure Active Directory 身份验证的更多信息,请参阅文档

! pip install "azure-identity>=1.15.0"
from azure.identity import DefaultAzureCredential, get_bearer_token_provider

if use_azure_active_directory:
    endpoint = os.environ["AZURE_OPENAI_ENDPOINT"]

    client = openai.AzureOpenAI(
        azure_endpoint=endpoint,
        azure_ad_token_provider=get_bearer_token_provider(DefaultAzureCredential(), "https://cognitiveservices.azure.com/.default"),
        api_version="2023-09-01-preview"
    )

注意:如果未提供以下参数,AzureOpenAI 将从相应的环境变量中推断它们:

  • api_key 来自 AZURE_OPENAI_API_KEY
  • azure_ad_token 来自 AZURE_OPENAI_AD_TOKEN
  • api_version 来自 OPENAI_API_VERSION
  • azure_endpoint 来自 AZURE_OPENAI_ENDPOINT

部署

在本节中,我们将创建一个GPT模型的部署,该模型可用于生成聊天完成。

部署:在 Azure OpenAI Studio 中创建

让我们部署一个模型以用于聊天完成。前往https://portal.azure.com,找到您的Azure OpenAI资源,然后导航到Azure OpenAI Studio。点击“部署”选项卡,然后为您想要用于聊天完成的模型创建一个部署。您为模型提供的部署名称将在下面的代码中使用。

deployment = "" # Fill in the deployment name from the portal here

创建聊天完成

现在让我们使用我们构建的客户端创建一个聊天完成。

# For all possible arguments see https://platform.openai.com/docs/api-reference/chat-completions/create
response = client.chat.completions.create(
    model=deployment,
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Knock knock."},
        {"role": "assistant", "content": "Who's there?"},
        {"role": "user", "content": "Orange."},
    ],
    temperature=0,
)

print(f"{response.choices[0].message.role}: {response.choices[0].message.content}")
response = client.chat.completions.create(
    model=deployment,
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Knock knock."},
        {"role": "assistant", "content": "Who's there?"},
        {"role": "user", "content": "Orange."},
    ],
    temperature=0,
    stream=True
)

for chunk in response:
    if len(chunk.choices) > 0:
        delta = chunk.choices[0].delta

        if delta.role:
            print(delta.role + ": ", end="", flush=True)
        if delta.content:
            print(delta.content, end="", flush=True)

内容过滤

Azure OpenAI 服务包括对提示和完成响应的内容过滤。您可以了解更多关于内容过滤以及如何配置它的信息这里

如果提示被内容过滤器标记,库将引发一个带有content_filter错误代码的BadRequestError异常。否则,您可以访问响应中的prompt_filter_resultscontent_filter_results以查看内容过滤的结果以及哪些类别被标记。

import json

messages = [
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": "<text violating the content policy>"}
]

try:
    completion = client.chat.completions.create(
        messages=messages,
        model=deployment,
    )
except openai.BadRequestError as e:
    err = json.loads(e.response.text)
    if err["error"]["code"] == "content_filter":
        print("Content filter triggered!")
        content_filter_result = err["error"]["innererror"]["content_filter_result"]
        for category, details in content_filter_result.items():
            print(f"{category}:\n filtered={details['filtered']}\n severity={details['severity']}")
messages = [
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": "What's the biggest city in Washington?"}
]

completion = client.chat.completions.create(
    messages=messages,
    model=deployment,
)
print(f"Answer: {completion.choices[0].message.content}")

# prompt content filter result in "model_extra" for azure
prompt_filter_result = completion.model_extra["prompt_filter_results"][0]["content_filter_results"]
print("\nPrompt content filter results:")
for category, details in prompt_filter_result.items():
    print(f"{category}:\n filtered={details['filtered']}\n severity={details['severity']}")

# completion content filter result
print("\nCompletion content filter results:")
completion_filter_result = completion.choices[0].model_extra["content_filter_results"]
for category, details in completion_filter_result.items():
    print(f"{category}:\n filtered={details['filtered']}\n severity={details['severity']}")