如何同时在Azure和OpenAI中使用Python OpenAI客户端?

ogsagwnx  于 2023-08-07  发布在  Python
关注(0)|答案(1)|浏览(135)

OpenAI提供了一个Python客户端,目前版本为0.27.8,支持Azure和OpenAI。
以下是如何使用它为每个提供者调用ChatCompletion的示例:

# openai_chatcompletion.py

"""Test OpenAI's ChatCompletion endpoint"""
import os
import openai
import dotenv
dotenv.load_dotenv()
openai.api_key = os.environ.get('OPENAI_API_KEY')

# Hello, world.
api_response = openai.ChatCompletion.create(
  model="gpt-3.5-turbo",
  messages=[
    {"role": "user", "content": "Hello!"}
  ],
  max_tokens=16,
  temperature=0,
  top_p=1,
  frequency_penalty=0,
  presence_penalty=0,
)

print('api_response:', type(api_response), api_response)
print('api_response.choices[0].message:', type(api_response.choices[0].message), api_response.choices[0].message)

字符串
还有:

# azure_openai_35turbo.py

"""Test Microsoft Azure's ChatCompletion endpoint"""
import os
import openai
import dotenv
dotenv.load_dotenv()

openai.api_type = "azure"
openai.api_base = os.getenv("AZURE_OPENAI_ENDPOINT") 
openai.api_version = "2023-05-15"
openai.api_key = os.getenv("AZURE_OPENAI_KEY")

# Hello, world.
# In addition to the `api_*` properties above, mind the difference in arguments
# as well between OpenAI and Azure:
# - OpenAI from OpenAI uses `model="gpt-3.5-turbo"`!
# - OpenAI from Azure uses `engine="‹deployment name›"`! ⚠️
#   > You need to set the engine variable to the deployment name you chose when
#   > you deployed the GPT-35-Turbo or GPT-4 models.
#  This is the name of the deployment I created in the Azure portal on the resource.
api_response = openai.ChatCompletion.create(
  engine="gpt-35-turbo", # engine = "deployment_name".
  messages=[
    {"role": "user", "content": "Hello!"}
  ],
  max_tokens=16,
  temperature=0,
  top_p=1,
  frequency_penalty=0,
  presence_penalty=0,
)

print('api_response:', type(api_response), api_response)
print('api_response.choices[0].message:', type(api_response.choices[0].message), api_response.choices[0].message)


例如api_type和其他设置是Python库的全局变量。
下面是转录音频的第三个示例(它使用Whisper,它在OpenAI上可用,但在Azure上不可用):

# openai_transcribe.py

"""
Test the transcription endpoint
https://platform.openai.com/docs/api-reference/audio
"""
import os
import openai
import dotenv
dotenv.load_dotenv()

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


这些都是最小的例子,但我使用类似的代码作为我的webapp(一个Flask应用程序)的一部分。
现在我的挑战是:
1.**使用Azure中的ChatCompletion端点;**但是:
1.使用OpenAI的Transcribe端点(因为它在Azure上不可用)
有没有办法做到这一点?
我有几个选择:

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

我对这些不太满意,觉得我可能错过了一个更明显的解决方案。
或者当然.或者,我可以只使用Whisper与不同的供应商(例如.复制)或完全替代耳语。

参见

oxalkeyp

oxalkeyp1#

库中的每个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)

字符串

相关问题