随着大家对 ChatGPT 更新的愈发关注,对 API 的访问需求也在不断增加。
最近我也是突然发现,Python 的 OpenAI 包也进行了从 v0.28 至 v1的大版本更新。
一般来说,这样的大版本更新,势必导致一些接口的变化。
结果不出所料,在实际使用试用的过程中,我发现对 API 的访问出现了一些明显变化。
为了更好地让大家认识更新前后的变化情况,这里将依次介绍 v1.0 更新前后的区别。
更新前(openai v0.28)
先来看一下二者在 v1.0 更新前(以 v0.28 为例),在进行 openai 的 API 访问时的区别:
虽然 Open AI 和 Azure OpenAI 服务依赖于公用 Python 客户端库,但需要对代码进行少量更改,才能在终结点之间来回切换。 本文将引导你了解在跨 OpenAI 和 Azure OpenAI 工作时将遇到的常见更改和差异。
备注
此库由 OpenAI 维护,目前为预览版。 参考发行历史记录 或 version.py 提交历史记录跟踪库的最新更新。
身份验证
建议使用环境变量。 如果之前没有进行过这种更改,我们的 Python 快速入门可引导你完成此配置。
API 密钥
OpenAI | Azure OpenAI |
Python复制import openai openai.api_key = “sk-…” openai.organization = “…” | Python复制import openai openai.api_type = “azure” openai.api_key = “…” openai.api_base = “https://example-endpoint.openai.azure.com” openai.api_version = “2023-05-15” # subject to change |
Microsoft Entra 身份验证
OpenAI | Azure OpenAI |
Python复制import openai openai.api_key = “sk-…” openai.organization = “…” | Python复制import openai from azure.identity import DefaultAzureCredential credential = DefaultAzureCredential() token = credential.get_token(“https://cognitiveservices.azure.com/.default“) openai.api_type = “azure_ad” openai.api_key = token.token openai.api_base = “https://example-endpoint.openai.azure.com” openai.api_version = “2023-05-15” # subject to change |
模型的关键字参数
OpenAI 使用
model
关键字参数指定要使用的模型。 Azure OpenAI 具有部署概念,并使用 deployment_id
关键字参数说明要使用的模型部署。 Azure OpenAI 还支持互换使用 engine
和 deployment_id
。 deployment_id
对应于在模型部署期间为模型选择的自定义名称。 根据文档中的约定,我们经常显示与基础模型名称匹配的 deployment_id
,但如果选择了与模型名称不匹配的不同部署名称,则需要在 Azure OpenAI 中使用模型时使用该名称。对于 OpenAI,
engine
虽然在大多数实例中仍然有效,但它已被弃用,因此首选使用 model
。OpenAI | Azure OpenAI |
Python复制completion = openai.Completion.create( prompt=”<prompt>”, model=”text-davinci-003″ ) chat_completion = openai.ChatCompletion.create( messages=”<messages>”, model=”gpt-4″ ) embedding = openai.Embedding.create( input=”<input>”, model=”text-embedding-ada-002″ ) | Python复制completion = openai.Completion.create( prompt=”<prompt>”, deployment_id=”text-davinci-003″ # This must match the custom deployment name you chose for your model.#engine=”text-davinci-003″ ) chat_completion = openai.ChatCompletion.create( messages=”<messages>”, deployment_id=”gpt-4″ # This must match the custom deployment name you chose for your model.#engine=”gpt-4″ ) embedding = openai.Embedding.create( input=”<input>”, deployment_id=”text-embedding-ada-002″ # This must match the custom deployment name you chose for your model.#engine=”text-embedding-ada-002″ ) |
Azure OpenAI 嵌入多输入支持
OpenAI 目前允许使用 text-embedding-ada-002 输入更多的数组。 对于 text-embedding-ada-002 版本 2,Azure OpenAI 目前支持最多 16 个输入数组。 两者都要求此模型的每个 API 请求的最大输入令牌限制保持在 8191 之下。
API 环境配置
import openai
OpenAI 的环境变量配置
openai.api_key = “sk-…”
openai.organization = “…” # optional
Azure OpenAI 的环境变量配置
openai.api_type = “azure”
openai.api_key = “…”
openai.api_base = “https://example-endpoint.openai.azure.com”
openai.api_version = “2023-05-15” # subject to change
也即在访问 Azure OpenAI 时,需要额外的
api_type
、api_base
(即终结点 endpoint )和api_version
。模型访问参数
OpenAI 的模型访问非常简单,只需要输入 Prompt 内容和模型名称,即可获得回复:
completion = openai.Completion.create(
prompt=”<prompt>”,
model=”text-davinci-003″
)
chat_completion = openai.ChatCompletion.create(
messages=”<messages>”,
model=”gpt-4″
)
embedding = openai.Embedding.create(
input=”<input>”,
model=”text-embedding-ada-002″
)
而 Azure OpenAI 则有所不同。Azure 需要自行部署模型资源,并且不同的部署可以设置不同的名称——也即我可以部署两个 GPT-4 模型,分别命名为 GPT-4-a 和 GPT-4-b 。
所以,Azure 在访问具有与模型名称不同的部署名称的模型时,还需要额外配置一个deployment_id:
completion = openai.Completion.create(
prompt=”<prompt>”,
deployment_id=”text-davinci-003″ # 模型的部署名称
如果部署名称与模型名称相同,则可以只配置 ‘engine’
engine=”text-davinci-003″
)
chat_completion = openai.ChatCompletion.create(
messages=”<messages>”,
deployment_id=”gpt-4” # 模型的部署名称
如果部署名称与模型名称相同,则可以只配置 ‘engine’
#engine=”gpt-4“
)
embedding = openai.Embedding.create(
input=”<input>”,
deployment_id=”text-embedding-ada-002″ # 模型的部署名称
如果部署名称与模型名称相同,则可以只配置 ‘engine’
#engine=”text-embedding-ada-002″
)
更新后(v1.0后)
在更新至 v1.0 后,模型访问就有点不一样了。
最大的变化点体现在:Azure OpenAI 必须通过 Microsoft Entra 安全组进行身份验证,这体现在多了一个访问参数
azure_ad_token_provider
。配置 Azure 部署
具体的操作步骤可以见微软 Azure 官方的说明,步骤非常详细,就是有些概念不太好理解,有点绕:
我做了一张图,帮助你理解整个过程,并且注明了如要添加的内容(官方步骤是通用教程):
最后记得回到“应用注册”页,记下红框所示的三个 ID:
并且按顺序依次分别填入新建的 .env 中:
AZURE_CLIENT_ID=00000000-0000-0000-0000-000000000000 # 序号 1 对应内容
AZURE_TENANT_ID=11111111-1111-1111-1111-111111111111 # 序号 2 对应内容
AZURE_CLIENT_SECRET=abcdefghijklmnopqrstuvwxyz # 序号 3 对应内容
就可以通过load_dotenv获取了:
需安装 dotenv
from dotenv import load_dotenv
load_dotenv()
配置开发环境
Azure OpenAI 的准备工作到这告一段落,现在正式进入访问参数的准备环节:
首先安装 azure-identity 包:
pip install azure-identity
然后就可以获取到 token_provider ,后续将用于模型访问:
from azure.identity import DefaultAzureCredential, get_bearer_token_provider
from openai import AzureOpenAI,OpenAI
token_provider = get_bearer_token_provider(DefaultAzureCredential(), “https://cognitiveservices.azure.com/.default”)
在 v1.0 中,OpenAI 和 Azure OpenAI 被分别定义为两个不同的类,配置完 API 环境(一般是变量)后,需要先实例化:
from openai import AzureOpenAI,OpenAI
client = OpenAI()
client_azure = AzureOpenAI()
然后配置其余的参数:
api_version = “2023-07-01-preview”
endpoint = “https://my-resource.openai.azure.com” # 你的 Azure 终结点
client = AzureOpenAI(
api_version=api_version,
azure_endpoint=endpoint,
azure_ad_token_provider=token_provider,# token_provider的配置位置
)
completion = client.chat.completions.create(
model=”deployment-name”, # 模型的部署名称
messages=[
{
“role”: “user”,
“content”: “How do I output all files in a directory using Python?”,
},
],
)
print(completion.model_dump_json(indent=2))
体验
抱着试试看的心态,我在官网上复制了 DALL·E 3 的测试代码:
response = client.images.generate(
model=”dall-e-3″,
prompt=”a white siamese cat”,
size=”1024×1024″,
quality=”standard”,
n=1,
)
image_url = response.data[0].url
结果果不其然,提示 Error 401,意思是我没有部署这个模型。
这也就意味着目前 Azure 还没有办法享受到最新的更新内容。
看起来目前只能等 Azure 上线 GPT-4 Turbo 、DALL·E 3 和其他相关模型,以及 Assistant API 等内容的适配啦。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容