如何同时使用Python openai客户端与Azure和OpenAI?

Fab*_*ert 2 python python-module azure openai-api openai-whisper

OpenAI 提供了一个 Python 客户端,目前版本为 0.27.8,它同时支持 Azure 和 OpenAI。

\n

以下是如何使用它为每个提供商调用 ChatCompletion 的示例:

\n
# openai_chatcompletion.py\n\n"""Test OpenAI\'s ChatCompletion endpoint"""\nimport os\nimport openai\nimport dotenv\ndotenv.load_dotenv()\nopenai.api_key = os.environ.get(\'OPENAI_API_KEY\')\n\n# Hello, world.\napi_response = openai.ChatCompletion.create(\n  model="gpt-3.5-turbo",\n  messages=[\n    {"role": "user", "content": "Hello!"}\n  ],\n  max_tokens=16,\n  temperature=0,\n  top_p=1,\n  frequency_penalty=0,\n  presence_penalty=0,\n)\n\nprint(\'api_response:\', type(api_response), api_response)\nprint(\'api_response.choices[0].message:\', type(api_response.choices[0].message), api_response.choices[0].message)\n
Run Code Online (Sandbox Code Playgroud)\n

和:

\n
# azure_openai_35turbo.py\n\n"""Test Microsoft Azure\'s ChatCompletion endpoint"""\nimport os\nimport openai\nimport dotenv\ndotenv.load_dotenv()\n\nopenai.api_type = "azure"\nopenai.api_base = os.getenv("AZURE_OPENAI_ENDPOINT") \nopenai.api_version = "2023-05-15"\nopenai.api_key = os.getenv("AZURE_OPENAI_KEY")\n\n\n# Hello, world.\n# In addition to the `api_*` properties above, mind the difference in arguments\n# as well between OpenAI and Azure:\n# - OpenAI from OpenAI uses `model="gpt-3.5-turbo"`!\n# - OpenAI from Azure uses `engine="\xe2\x80\xb9deployment name\xe2\x80\xba"`! \xe2\x9a\xa0\xef\xb8\x8f\n#   > You need to set the engine variable to the deployment name you chose when\n#   > you deployed the GPT-35-Turbo or GPT-4 models.\n#  This is the name of the deployment I created in the Azure portal on the resource.\napi_response = openai.ChatCompletion.create(\n  engine="gpt-35-turbo", # engine = "deployment_name".\n  messages=[\n    {"role": "user", "content": "Hello!"}\n  ],\n  max_tokens=16,\n  temperature=0,\n  top_p=1,\n  frequency_penalty=0,\n  presence_penalty=0,\n)\n\nprint(\'api_response:\', type(api_response), api_response)\nprint(\'api_response.choices[0].message:\', type(api_response.choices[0].message), api_response.choices[0].message)\n
Run Code Online (Sandbox Code Playgroud)\n

ieapi_type和其他设置是 Python 库的全局变量。

\n

这是转录音频的第三个示例(它使用 Whisper,它在 OpenAI 上可用,但在 Azure 上不可用):

\n
# openai_transcribe.py\n\n"""\nTest the transcription endpoint\nhttps://platform.openai.com/docs/api-reference/audio\n"""\nimport os\nimport openai\nimport dotenv\ndotenv.load_dotenv()\n\n\nopenai.api_key = os.getenv("OPENAI_API_KEY")\naudio_file = open("minitests/minitests_data/bilingual-english-bosnian.wav", "rb")\ntranscript = openai.Audio.transcribe(\n    model="whisper-1",\n    file=audio_file,\n    prompt="Part of a Bosnian language class.",\n    response_format="verbose_json",\n)\nprint(transcript)\n
Run Code Online (Sandbox Code Playgroud)\n

这些是最小的示例,但我使用类似的代码作为我的 web 应用程序(Flask 应用程序)的一部分。

\n

现在我的挑战是我想:

\n
    \n
  1. 使用 Azure 中的 ChatCompletion 端点;但:
  2. \n
  3. 使用 OpenAI 的转录端点(因为它在 Azure 上不可用)
  4. \n
\n

有什么办法可以做到吗?

\n

我心里有几个选择:

\n
    \n
  • 在每次调用之前更改全局变量。但我担心这可能会导致我没有预料到的副作用。
  • \n
  • 复制/分叉该库以同时运行两个版本,每个提供者一个版本,但这也感觉非常混乱。
  • \n
  • 使用 OpenAI 的 Whisper 的替代客户端(如果有)。
  • \n
\n

我对这些不太满意,觉得我可能错过了一个更明显的解决方案。

\n

或者当然\xe2\x80\xa6 或者,我可以将 Whisper 与不同的提供程序(例如 Replicate)一起使用,或者完全替代 Whisper。

\n

也可以看看

\n\n

小智 5

库中的每个 API 都接受配置选项的按方法覆盖。如果要访问 Azure API 来完成聊天,可以显式传入 Azure 配置。对于转录端点,您可以显式传递 OpenAI 配置。例如:

import os
import openai

api_response = openai.ChatCompletion.create(
    api_base=os.getenv("AZURE_OPENAI_ENDPOINT"),
    api_key=os.getenv("AZURE_OPENAI_KEY"),
    api_type="azure",
    api_version="2023-05-15",
    engine="gpt-35-turbo",
    messages=[
    {"role": "user", "content": "Hello!"}
    ],
    max_tokens=16,
    temperature=0,
    top_p=1,
    frequency_penalty=0,
    presence_penalty=0,
)
print(api_response)



audio_file = open("minitests/minitests_data/bilingual-english-bosnian.wav", "rb")
transcript = openai.Audio.transcribe(
    api_key=os.getenv("OPENAI_API_KEY"),
    model="whisper-1",
    file=audio_file,
    prompt="Part of a Bosnian language class.",
    response_format="verbose_json",
)
print(transcript)
Run Code Online (Sandbox Code Playgroud)