Python调用OpenAI API的完整教程
本文详细讲解如何使用Python调用OpenAI API。内容涵盖环境配置、基础对话、流式输出、多轮对话、JSON模式、错误处理、函数调用及异步并发。通过具体代码示例,帮助开发者快速掌握API集成技巧,提升应用开发效率。
环境准备与初始化
在开始编码前,建议创建独立的虚拟环境以隔离依赖。通过终端执行以下命令安装官方SDK:
pip install openai
随后激活环境并安装依赖:
python -m venv ai-env # Windows ai-env\Scripts\activate # macOS/Linux source ai-env/bin/activate pip install openai
访问OpenAI官网注册账号并生成API Key。请注意,Key仅显示一次,务必妥善保存以防泄露。
基础对话与流式输出
最简调用仅需初始化客户端并发送消息。以下示例展示了如何获取GPT-4o-mini对“递归”的解释:
from openai import OpenAI
client = OpenAI(api_key="sk-your-api-key-here")
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "user", "content": "用一句话解释什么是递归"}
]
)
print(response.choices[0].message.content)普通调用需等待生成完毕。若需实现逐字显示的“打字机”效果,可启用流式输出(stream=True):
from openai import OpenAI
client = OpenAI(api_key="sk-your-api-key-here")
stream = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "user", "content": "写一首关于编程的五言绝句"}
],
stream=True # 关键参数
)
for chunk in stream:
if chunk.choices[0].delta.content is not None:
print(chunk.choices[0].delta.content, end="", flush=True)
print() # 换行多轮对话与上下文管理
模型本身无记忆,需手动维护历史消息列表。随着对话变长,Token消耗会增加,生产环境中建议对长对话进行截断或摘要处理。
from openai import OpenAI
client = OpenAI(api_key="sk-your-api-key-here")
# 维护对话历史
messages = [
{"role": "system", "content": "你是一个Python编程助手,回答简洁专业。"}
]
def chat(user_input):
messages.append({"role": "user", "content": user_input})
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=messages
)
assistant_msg = response.choices[0].message.content
messages.append({"role": "assistant", "content": assistant_msg})
return assistant_msg
# 测试多轮对话
print(chat("Python的列表推导式是什么?"))
print(chat("能给几个实际例子吗?"))
print(chat="和map/filter比哪个好?"))实用技巧:格式控制与参数调节
通过设置response_format可强制输出JSON,便于程序解析:
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "user", "content": "列出3个Python Web框架,用JSON格式返回,字段:name, description, stars"}
],
response_format={"type": "json_object"} # 强制JSON输出
)
import json
data = json.loads(response.choices[0].message.content)
print(json.dumps(data, indent=2, ensure_ascii=False))Temperature参数控制输出的随机性:0适合事实问答,0.7为通用场景,1.0+适用于创意写作。
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "给我起一个技术博客名字"}],
temperature=0.9 # 0=保守确定,1=创意发散
)配置超时与重试机制可提升稳定性:
from openai import OpenAI
import time
client = OpenAI(
api_key="sk-your-api-key-here",
timeout=30.0, # 请求超时30秒
max_retries=2 # 最多重试2次
)通过response.usage可查看Token消耗统计:
# 响应对象中包含token统计
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "你好"}]
)
usage = response.usage
print(f"输入Token: {usage.prompt_tokens}")
print(f"输出Token: {usage.completion_tokens}")
print(f"总计Token: {usage.total_tokens}")错误处理机制
捕获常见异常以增强代码健壮性:
from openai import OpenAI, APIError, RateLimitError, APIConnectionError
client = OpenAI(api_key="sk-your-api-key-here")
try:
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "Hello"}]
)
except RateLimitError:
print("⚠️ 请求太频繁,请稍后重试")
except APIConnectionError:
print("⚠️ 网络连接失败,检查网络设置")
except APIError as e:
print(f"⚠️ API错误:{e.status_code} - {e.message}")
else:
print(response.choices[0].message.content)函数调用(Function Calling)
Function Calling允许AI调用外部工具。以下示例演示如何定义天气查询工具并处理AI的调用请求:
import json
client = OpenAI(api_key="sk-your-api-key-here")
# 定义工具
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "获取指定城市的天气信息",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "城市名称"
}
},
"required": ["city"]
}
}
}
]
# 第一次调用:AI决定是否使用工具
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "北京今天天气怎么样?"}],
tools=tools
)
message = response.choices[0].message
if message.tool_calls:
# AI想要调用工具
tool_call = message.tool_calls[0]
args = json.loads(tool_call.function.arguments)
print(f"AI想调用: {tool_call.function.name}({args})")
# 这里执行实际函数,模拟返回结果
weather_result = {"city": "北京", "temperature": "22°C", "condition": "晴"}
# 第二次调用:把工具结果传回给AI
response2 = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "user", "content": "北京今天天气怎么样?"},
message,
{
"role": "tool",
"tool_call_id": tool_call.id,
"content": json.dumps(weather_result, ensure_ascii=False)
}
],
tools=tools
)
print(response2.choices[0].message.content)模型选择与异步调用
不同模型适用场景不同:gpt-4o适用于复杂推理,gpt-4o-mini适合日常对话,o3-mini侧重数学逻辑。日常开发推荐gpt-4o-mini,复杂任务推荐gpt-4o。
高并发场景建议使用异步调用:
import asyncio
from openai import AsyncOpenAI
async def main():
client = AsyncOpenAI(api_key="sk-your-api-key-here")
# 并发5个请求
tasks = [
client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": f"用5个字形容数字{i}"}]
)
for i in range(5)
]
responses = await asyncio.gather(*tasks)
for i, resp in enumerate(responses):
print(f"{i}: {resp.choices[0].message.content}")
asyncio.run(main())总结
基础调用仅需3行代码,多轮对话需维护messages列表,流式输出用于提升用户体验,Function Calling使AI具备调用外部工具能力。日常开发使用gpt-4o-mini,复杂任务使用gpt-4o。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









