如何同时使用Python OpenAI客户端调用Azure与OpenAI服务?
同时使用Azure ChatCompletion与OpenAI Transcribe的解决方案
OpenAI官方Python客户端(版本0.27.8)同时支持Azure OpenAI与原生OpenAI平台,以下是调用各平台接口的示例:
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 ChatCompletion调用示例
# 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. # 除了上述`api_*`配置,OpenAI与Azure的调用参数也有区别: # - 原生OpenAI使用`model="gpt-3.5-turbo"` # - Azure OpenAI使用`engine="部署名称"`!⚠️ # > 需要将engine设置为你在Azure门户部署GPT-35-Turbo或GPT-4时指定的部署名 # 以下是我在Azure资源中创建的部署名称 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库的全局变量,切换平台时会影响全局设置。
OpenAI Transcribe调用示例(基于Whisper,Azure暂不支持)
# openai_transcribe.py """ Test the transcription endpoint """ 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)
需求与问题
在Flask Web应用中,需同时实现:
- 使用Azure的ChatCompletion接口;
- 使用OpenAI的Transcribe接口(Azure暂不支持该功能)。
曾考虑的方案:
- 每次调用前修改全局配置,但担心引发意外副作用;
- 复制/分叉库以同时运行两个版本,分别对应不同服务商,操作过于繁琐;
- 使用OpenAI Whisper的其他替代客户端。
对以上方案均不满意,希望找到更直观的解决方案,也可考虑其他服务商的Whisper服务或替代工具。
可行解决方案
方案1:创建独立客户端实例(推荐)
在openai-python 0.27.8版本中,可通过创建openai.OpenAI和openai.AzureOpenAI的独立实例,隔离不同平台的配置,避免全局变量冲突:
Azure ChatCompletion实例
import os import openai from dotenv import load_dotenv load_dotenv() # 创建Azure OpenAI客户端实例 azure_client = openai.AzureOpenAI( api_key=os.getenv("AZURE_OPENAI_KEY"), api_version="2023-05-15", azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT") ) # 调用Azure ChatCompletion def azure_chat_completion(): response = azure_client.chat.completions.create( model="gpt-35-turbo", # 对应Azure部署的模型名称 messages=[{"role": "user", "content": "Hello!"}], max_tokens=16, temperature=0 ) print(response.choices[0].message.content)
OpenAI Transcribe实例
# 创建原生OpenAI客户端实例 openai_client = openai.OpenAI( api_key=os.getenv("OPENAI_API_KEY") ) # 调用OpenAI Transcribe def openai_transcribe(audio_path): with open(audio_path, "rb") as audio_file: transcript = openai_client.audio.transcriptions.create( model="whisper-1", file=audio_file, prompt="Part of a Bosnian language class.", response_format="verbose_json" ) print(transcript)
该方式通过独立实例隔离配置,不会互相干扰,适合在Web应用中同时调用两个平台的接口。
方案2:用上下文管理器临时切换全局配置
若不想创建多个实例,可使用上下文管理器临时修改全局配置,调用完成后恢复原设置:
import os import openai from dotenv import load_dotenv from contextlib import contextmanager load_dotenv() # 保存原始全局配置 original_api_type = openai.api_type original_api_base = openai.api_base original_api_version = openai.api_version original_api_key = openai.api_key @contextmanager def use_azure_openai(): try: # 切换到Azure配置 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") yield finally: # 恢复原始配置 openai.api_type = original_api_type openai.api_base = original_api_base openai.api_version = original_api_version openai.api_key = original_api_key @contextmanager def use_openai(): try: # 切换到原生OpenAI配置 openai.api_type = "" openai.api_base = "https://api.openai.com/v1" openai.api_version = "" openai.api_key = os.getenv("OPENAI_API_KEY") yield finally: # 恢复原始配置 openai.api_type = original_api_type openai.api_base = original_api_base openai.api_version = original_api_version openai.api_key = original_api_key # 使用示例 def call_azure_chat(): with use_azure_openai(): response = openai.ChatCompletion.create( engine="gpt-35-turbo", messages=[{"role": "user", "content": "Hello!"}], max_tokens=16 ) print(response.choices[0].message.content) def call_openai_transcribe(audio_path): with use_openai(): with open(audio_path, "rb") as audio_file: transcript = openai.Audio.transcribe( model="whisper-1", file=audio_file, prompt="Part of a Bosnian language class." ) print(transcript)
该方式适合兼容旧代码的场景,但多线程/多进程环境下可能存在竞态问题,Web应用中需谨慎使用。
方案3:使用第三方Whisper客户端
若不想依赖openai-python库的全局配置,可直接使用Whisper官方Python包本地运行,或调用其他第三方服务:
本地运行Whisper
import whisper model = whisper.load_model("base") result = model.transcribe("minitests/minitests_data/bilingual-english-bosnian.wav", prompt="Part of a Bosnian language class.") print(result["text"])
该方式无需调用OpenAI API,但需本地部署模型,适合对数据隐私要求较高的场景。
内容的提问来源于stack exchange,提问作者Fabien Snauwaert
相关产品推荐
相关产品推荐

