Azure 聊天补全示例 (预览)

注意:有新版本的 openai 库可用。请参阅 https://github.com/openai/openai-python/discussions/742

本示例将介绍使用 Azure OpenAI 服务进行聊天补全。

设置

首先,我们安装必要的依赖项。

! pip install "openai>=0.28.1,<1.0.0"

为了使以下各节正常工作,我们首先需要设置一些内容。让我们从 api_baseapi_version 开始。要查找您的 api_base,请访问 https://portal.azure.com,找到您的资源,然后在“资源管理”->“密钥和终结点”下查找“终结点”值。

import os
import openai
openai.api_version = '2023-05-15'
openai.api_base = '' # 请在此处添加您的终结点

我们接下来需要设置 api_typeapi_key。我们可以从门户获取密钥,也可以通过 Microsoft Active Directory 身份验证获取。根据此,api_typeazureazure_ad

设置:门户

让我们先看看如何从门户获取密钥。访问 https://portal.azure.com,找到您的资源,然后在“资源管理”->“密钥和终结点”下查找其中一个“密钥”值。

openai.api_type = 'azure'
openai.api_key = os.environ["OPENAI_API_KEY"]

注意:在此示例中,我们通过在代码中设置变量来配置库以使用 Azure API。对于开发,请考虑改设置为环境变量:

OPENAI_API_BASE
OPENAI_API_KEY
OPENAI_API_TYPE
OPENAI_API_VERSION

(可选) 设置:Microsoft Active Directory 身份验证

现在让我们看看如何通过 Microsoft Active Directory 身份验证获取密钥。如果要使用 Active Directory 身份验证而不是门户中的密钥,请取消注释以下代码。

# from azure.identity import DefaultAzureCredential

# default_credential = DefaultAzureCredential()
# token = default_credential.get_token("https://cognitiveservices.azure.com/.default")

# openai.api_type = 'azure_ad'
# openai.api_key = token.token

令牌的有效期为一段时间,之后将过期。为了确保每次请求都发送有效的令牌,您可以通过挂钩到 requests.auth 来刷新即将过期的令牌:

import typing
import time
import requests
if typing.TYPE_CHECKING:
    from azure.core.credentials import TokenCredential

class TokenRefresh(requests.auth.AuthBase):

    def __init__(self, credential: "TokenCredential", scopes: typing.List[str]) -> None:
        self.credential = credential
        self.scopes = scopes
        self.cached_token: typing.Optional[str] = None

    def __call__(self, req):
        if not self.cached_token or self.cached_token.expires_on - time.time() < 300:
            self.cached_token = self.credential.get_token(*self.scopes)
        req.headers["Authorization"] = f"Bearer {self.cached_token.token}"
        return req

session = requests.Session()
session.auth = TokenRefresh(default_credential, ["https://cognitiveservices.azure.com/.default"])

openai.requestssession = session

部署

在本节中,我们将使用 gpt-35-turbo 模型创建一个部署,然后可以使用它来创建聊天补全。

部署:手动创建

让我们使用 gpt-35-turbo 模型创建一个部署。访问 https://portal.azure.com,找到您的资源,然后在“资源管理”->“模型部署”下创建一个新的 gpt-35-turbo 部署。

deployment_id = '' # 在此处填写门户中的部署 ID

创建聊天补全

现在让我们向部署发送一个示例聊天补全。

# 有关所有可能的参数,请参阅 https://platform.openai.com/docs/api-reference/chat-completions/create
response = openai.ChatCompletion.create(
    deployment_id=deployment_id,
    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 = openai.ChatCompletion.create(
    deployment_id=deployment_id,
    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 "role" in delta.keys():
            print(delta.role + ": ", end="", flush=True)
        if "content" in delta.keys():
            print(delta.content, end="", flush=True)