OpenAI API完全指南
--- title: "OpenAI API完全指南" description: "详细介绍OpenAI API的使用方法、参数配置和最佳实践" tags: ["OpenAI", "API", "GPT", "开发"] category: "llm" icon: "🧠"
OpenAI API完全指南
API概览
OpenAI API提供对GPT系列模型的访问,支持文本生成、图像生成、语音处理等多种功能。
环境配置
# 安装依赖
# pip install openai
from openai import OpenAI
import os
# 方式1:环境变量
os.environ["OPENAI_API_KEY"] = "sk-your-api-key"
# 方式2:直接传入
client = OpenAI(api_key="sk-your-api-key")
# 方式3:使用配置文件
# 在 ~/.bashrc 或 ~/.zshrc 中设置环境变量
Chat Completions API
基础调用
def basic_chat(user_message):
"""基础对话调用"""
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "你是一个有帮助的助手。"},
{"role": "user", "content": user_message}
]
)
return response.choices[0].message.content
# 使用
print(basic_chat("什么是深度学习?"))
多轮对话
def multi_turn_chat():
"""多轮对话示例"""
conversation = []
system_msg = {"role": "system", "content": "你是一个Python编程导师。"}
conversation.append(system_msg)
# 第一轮
conversation.append({"role": "user", "content": "Python的列表和元组有什么区别?"})
response1 = client.chat.completions.create(
model="gpt-4o",
messages=conversation
)
reply1 = response1.choices[0].message.content
conversation.append({"role": "assistant", "content": reply1})
print(f"助手: {reply1[:100]}...\n")
# 第二轮
conversation.append({"role": "user", "content": "能给个代码示例吗?"})
response2 = client.chat.completions.create(
model="gpt-4o",
messages=conversation
)
reply2 = response2.choices[0].message.content
print(f"助手: {reply2[:100]}...")
return conversation
# 运行多轮对话
# multi_turn_chat()
关键参数详解
def advanced_chat(user_message):
"""高级参数配置"""
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "你是一个有帮助的助手。"},
{"role": "user", "content": user_message}
],
temperature=0.7, # 创造性 (0-2)
top_p=0.9, # 核采样
max_tokens=1000, # 最大输出长度
frequency_penalty=0, # 重复惩罚
presence_penalty=0, # 新话题惩罚
stop=["\n\n"], # 停止词
user="user-123" # 用户标识
)
return response.choices[0].message.content
流式输出
def stream_chat(user_message):
"""流式输出"""
stream = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "user", "content": user_message}
],
stream=True
)
full_response = ""
for chunk in stream:
if chunk.choices[0].delta.content:
content = chunk.choices[0].delta.content
print(content, end="", flush=True)
full_response += content
print() # 换行
return full_response
# 使用
# stream_chat("写一个简短的Python函数计算斐波那契数列")
结构化输出
JSON模式
import json
def extract_info_json(text):
"""强制JSON输出"""
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "提取文本中的信息并以JSON格式返回。"},
{"role": "user", "content": f"文本:{text}"}
],
response_format={"type": "json_object"}
)
return json.loads(response.choices[0].message.content)
# 使用
result = extract_info_json("张三,男,28岁,北京人,在腾讯工作")
print(result)
Pydantic结构化输出
from pydantic import BaseModel
from typing import Optional
class Person(BaseModel):
name: str
gender: str
age: int
city: str
company: Optional[str] = None
def extract_person(text: str) -> Person:
"""使用Pydantic进行结构化输出"""
response = client.beta.chat.completions.parse(
model="gpt-4o",
messages=[
{"role": "system", "content": "从文本中提取人物信息。"},
{"role": "user", "content": f"文本:{text}"}
],
response_format=Person
)
return response.choices[0].message.parsed
# 使用
person = extract_person("李四,女,25岁,上海人,就职于阿里巴巴")
print(f"姓名: {person.name}, 公司: {person.company}")
函数调用(Function Calling)
import json
# 定义函数
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "获取指定城市的天气信息",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "城市名称"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "温度单位"
}
},
"required": ["city"]
}
}
}
]
# 模拟函数实现
def get_weather(city, unit="celsius"):
return {"city": city, "temperature": 25, "unit": unit, "condition": "晴"}
# 使用函数调用
def chat_with_tools(user_message):
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "user", "content": user_message}
],
tools=tools,
tool_choice="auto"
)
message = response.choices[0].message
# 检查是否需要调用函数
if message.tool_calls:
for tool_call in message.tool_calls:
function_name = tool_call.function.name
arguments = json.loads(tool_call.function.arguments)
# 执行函数
result = get_weather(**arguments)
# 将结果返回给模型
messages = [
{"role": "user", "content": user_message},
message,
{
"role": "tool",
"tool_call_id": tool_call.id,
"content": json.dumps(result, ensure_ascii=False)
}
]
# 获取最终回复
final_response = client.chat.completions.create(
model="gpt-4o",
messages=messages
)
return final_response.choices[0].message.content
return message.content
# 使用
result = chat_with_tools("北京今天天气怎么样?")
print(result)
文件上传与处理
def upload_file(file_path, purpose):
"""上传文件"""
with open(file_path, "rb") as file:
response = client.files.create(
file=file,
purpose=purpose
)
return response.id
# 上传文档用于分析
# file_id = upload_file("document.pdf", "assistants")
使用Assistant API
def create_assistant():
"""创建自定义助手"""
assistant = client.beta.assistants.create(
name="代码助手",
instructions="你是一个专业的Python开发助手,帮助用户编写和优化代码。",
model="gpt-4o",
tools=[
{"type": "code_interpreter"},
{"type": "file_search"}
]
)
return assistant
def chat_with_assistant(assistant_id, user_message):
"""与助手对话"""
# 创建线程
thread = client.beta.threads.create()
# 添加消息
client.beta.threads.messages.create(
thread_id=thread.id,
role="user",
content=user_message
)
# 运行助手
run = client.beta.threads.runs.create(
thread_id=thread.id,
assistant_id=assistant_id
)
# 等待完成并获取结果
# ... (实际使用需要轮询状态)
return thread.id
错误处理
from openai import OpenAI, APIError, RateLimitError, APITimeoutError
def safe_api_call(messages, max_retries=3):
"""安全的API调用"""
for attempt in range(max_retries):
try:
response = client.chat.completions.create(
model="gpt-4o",
messages=messages
)
return response.choices[0].message.content
except RateLimitError:
print(f"速率限制,等待后重试... (尝试 {attempt + 1})")
time.sleep(2 ** attempt)
except APITimeoutError:
print(f"请求超时,重试... (尝试 {attempt + 1})")
except APIError as e:
print(f"API错误: {e}")
return None
return None
成本优化
def optimize_cost(user_message, use_mini=True):
"""根据任务复杂度选择模型以优化成本"""
if len(user_message) < 100 and use_mini:
# 简单任务使用更便宜的模型
model = "gpt-4o-mini"
else:
model = "gpt-4o"
response = client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": user_message}]
)
# 计算成本估算
usage = response.usage
if model == "gpt-4o":
cost = (usage.prompt_tokens * 2.5 + usage.completion_tokens * 10) / 1_000_000
else:
cost = (usage.prompt_tokens * 0.15 + usage.completion_tokens * 0.6) / 1_000_000
return response.choices[0].message.content, cost
总结
OpenAI API提供了丰富的功能,通过掌握基础调用、流式输出、结构化输出和函数调用等技术,可以构建强大的AI应用。合理选择模型和参数,能够有效平衡性能和成本。