发布日期:2026-03-14 | 分类:框架 | 作者:探针
OpenAI API 是当前最广泛使用的 LLM 服务接口之一。本指南系统梳理了 OpenAI API 的设计模式、核心功能(Function Calling、Structured Output)、处理策略(批处理与流式)、错误处理与成本优化等关键主题。无论你是构建 Chatbot、Agent 系统还是企业级 AI 应用,这份指南都能帮助你更高效、更可靠地使用 OpenAI API。
核心结论: - Function Calling 已从实验性功能演进为生产级工具调用标准,Structured Output 进一步保证了输出格式的可靠性 - 流式处理(Streaming)是提升用户体验的关键,但批处理(Batch API)可降低 50% 成本 - 合理的错误处理和重试策略是生产环境的必备要素 - 通过 Prompt 优化、缓存和模型选择可以显著降低 API 调用成本
OpenAI API 遵循 RESTful 设计原则,核心端点包括:
| 端点 | 用途 | 典型场景 |
|---|---|---|
/v1/chat/completions |
对话补全 | Chatbot、Agent |
/v1/embeddings |
文本嵌入 | 检索、聚类 |
/v1/images/generations |
图像生成 | 创意内容 |
/v1/audio/transcriptions |
语音转文字 | 会议记录 |
/v1/batches |
批量处理 | 大规模离线任务 |
OpenAI 采用日期版本控制(如 2024-10-01-preview),主要规则:
api-version,默认使用最新稳定版OpenAI-Beta header 或 URL 参数访问新功能最佳实践:
# 固定 API 版本,避免意外行为变更
client = OpenAI(
api_key="sk-...",
default_headers={"OpenAI-Beta": "assistants=v2"}
)
官方提供 Python 和 Node.js SDK,社区维护 Go、Java、.NET 等版本。关键考量:
openai):更新最快,功能最全,推荐首选openai):适合全栈应用# 推荐的初始化模式
from openai import OpenAI
client = OpenAI(
api_key=os.environ.get("OPENAI_API_KEY"),
max_retries=3,
timeout=30.0
)
Function Calling 允许模型以结构化方式调用外部函数,是构建 Agent 系统的基石。
核心流程:
1. 定义函数 schema(JSON Schema 格式)
2. 发送请求,模型返回 tool_calls
3. 执行函数,将结果回传
4. 模型基于结果生成最终回复
tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "获取指定城市的天气信息",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "城市名称"},
"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
},
"required": ["city"]
}
}
}]
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "北京今天天气怎么样?"}],
tools=tools,
tool_choice="auto" # "auto" | "required" | {"type": "function", "name": "xxx"}
)
高级特性:
- 并行工具调用:parallel_tool_calls=true 允许模型一次性返回多个调用
- 严格模式:设置 strict: true 启用参数级别的严格验证
- 强制调用:tool_choice="required" 强制模型调用工具
Structured Output(结构化输出)是 2024 年引入的重要功能,确保模型输出严格符合指定的 JSON Schema。
from pydantic import BaseModel
class CalendarEvent(BaseModel):
name: str
date: str
participants: list[str]
response = client.beta.chat.completions.parse(
model="gpt-4o-2024-08-06",
messages=[{"role": "user", "content": "帮我提取会议信息:下周三下午3点产品评审会"}],
response_format=CalendarEvent
)
event = response.choices[0].message.parsed
# CalendarEvent(name='产品评审会', date='...', participants=[...])
对比 Function Calling vs Structured Output:
| 特性 | Function Calling | Structured Output |
|---|---|---|
| 用途 | 触发外部动作 | 格式化提取数据 |
| 输出 | 工具调用参数 | 直接的 JSON |
| 验证 | 需自行验证 | SDK 内置验证 |
| 适用场景 | Agent、API 集成 | 数据解析、表单填充 |
流式处理将响应逐 token 返回,显著改善用户体验。
stream = client.chat.completions.create(
model="gpt-4o",
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="")
关键考量: - 首 token 延迟(TTFT):通常 200-500ms,比完整响应更快 - 用户体验:用户感知等待时间显著降低 - 服务端事件(SSE):适用于 Web 应用的实时更新
注意事项:
- 流式模式下 token 用量需要从 usage 字段获取(需设置 stream_options={"include_usage": True})
- 错误处理需在流中间检查
Batch API 是 2024 年推出的功能,针对大规模离线任务提供 50% 折扣。
# 1. 准备 JSONL 文件
# {"custom_id": "req-1", "method": "POST", "url": "/v1/chat/completions", "body": {...}}
# 2. 上传并创建 batch
batch = client.batches.create(
input_file_id=file.id,
endpoint="/v1/chat/completions",
completion_window="24h"
)
# 3. 轮询状态
batch = client.batches.retrieve(batch.id)
# batch.status: validating → in_progress → completed
# 4. 下载结果
result = client.files.content(batch.output_file_id)
适用场景: - 大规模数据标注 - 批量翻译 - 离线内容生成 - 数据增强
限制: - 24 小时完成窗口 - 单批最多 50,000 个请求 - 无 SLA 保证(best-effort)
| HTTP 状态码 | 类型 | 原因 | 建议处理 |
|---|---|---|---|
| 400 | Bad Request | 请求参数错误 | 修正参数,不重试 |
| 401 | Unauthorized | API Key 无效 | 检查认证配置 |
| 429 | Rate Limited | 速率限制 | 指数退避重试 |
| 500 | Server Error | 服务端错误 | 短重试 |
| 503 | Service Unavailable | 服务过载 | 指数退避重试 |
import tenacity
@tenacity.retry(
wait=tenacity.wait_exponential(multiplier=1, min=1, max=60),
stop=tenacity.stop_after_attempt(5),
retry=tenacity.retry_if_exception_type((
openai.RateLimitError,
openai.APITimeoutError,
openai.InternalServerError
))
)
def call_openai(messages):
return client.chat.completions.create(
model="gpt-4o",
messages=messages
)
最佳实践: - 使用指数退避(exponential backoff)+ 抖动(jitter) - 对 429 错误自动重试,对 400 错误不重试 - 设置合理的超时时间(默认 10 分钟过长,建议 30-60 秒) - 记录所有错误用于监控
def call_with_fallback(messages):
models = ["gpt-4o", "gpt-4o-mini", "gpt-3.5-turbo"]
for model in models:
try:
return client.chat.completions.create(model=model, messages=messages)
except openai.RateLimitError:
continue
raise Exception("所有模型均不可用")
OpenAI 的 o1 和 o3 系列是专为深度推理设计的模型,与传统 GPT 模型的 API 使用方式有显著差异。
| 模型 | 发布时间 | 推理能力 | 输入价格 ($/1M tokens) | 输出价格 ($/1M tokens) |
|---|---|---|---|---|
| o1 | 2024-12 | 强 | $15.00 | $60.00 |
| o1-mini | 2024-09 | 中 | $3.00 | $12.00 |
| o1-pro | 2025-03 | 最强 | $60.00 | $240.00 |
| o3-mini | 2025-01 | 中-强 | $1.10 | $4.40 |
| o3 | 2025-04 | 最强 | $10.00 | $40.00 |
与 GPT-4o 的关键区别:
reasoning_effort 参数:控制推理深度(low / medium / high)temperature:推理模型使用确定性推理路径调用示例:
response = client.chat.completions.create(
model="o3-mini",
reasoning_effort="medium", # low | medium | high
messages=[
{"role": "user", "content": "分析这个算法的时间复杂度并给出证明:\n\n[算法代码]"}
]
)
# 推理 token 消耗在 response.usage 中单独列出
print(f"推理 token: {response.usage.completion_tokens_details.reasoning_tokens}")
适合场景: - 数学证明与计算 - 复杂逻辑推理 - 代码分析与调试 - 科学研究辅助
不适合场景: - 实时对话(延迟过高) - 简单问答(性价比低) - 创意写作(推理模型偏向逻辑而非创意)
成本优化建议:
- 先用 o3-mini 测试,确认需要更强推理时再升级到 o3
- 设置 reasoning_effort="low" 处理中等复杂度任务
- 对批量任务使用 Batch API(推理模型同样享受 50% 折扣)
Assistants API 是 OpenAI 提供的高级抽象层,用于构建有状态的 AI 助手,内置了代码解释器、文件检索和函数调用能力。
| 概念 | 说明 |
|---|---|
| Assistant | 预配置的 AI 实体,包含模型、指令和工具 |
| Thread | 对话会话,自动管理消息历史 |
| Message | 用户或助手的消息,支持文本和文件 |
| Run | 在 Thread 上执行 Assistant 的任务 |
| Run Step | Run 的执行步骤(工具调用等) |
# 1. 创建 Assistant
assistant = client.beta.assistants.create(
name="代码审查助手",
instructions="你是一个代码审查专家,帮助用户审查代码并提供改进建议。",
model="gpt-4o",
tools=[
{"type": "code_interpreter"},
{"type": "file_search"},
{"type": "function", "function": {...}}
]
)
# 2. 创建 Thread(会话)
thread = client.beta.threads.create()
# 3. 添加消息
client.beta.threads.messages.create(
thread_id=thread.id,
role="user",
content="请审查这段 Python 代码:[代码内容]"
)
# 4. 运行 Assistant
run = client.beta.threads.runs.create(
thread_id=thread.id,
assistant_id=assistant.id
)
# 5. 轮询等待完成
while run.status in ["queued", "in_progress"]:
time.sleep(1)
run = client.beta.threads.runs.retrieve(
thread_id=thread.id,
run_id=run.id
)
# 6. 获取回复
messages = client.beta.threads.messages.list(thread_id=thread.id)
| 维度 | Chat Completions | Assistants API |
|---|---|---|
| 状态管理 | 无(需自行维护) | 内置 Thread 管理 |
| 工具集成 | 需手动实现 | 内置代码解释器/文件检索 |
| 上下文管理 | 需自行截断/摘要 | 自动管理 |
| 灵活性 | 高 | 中(受 API 约束) |
| 成本 | 低 | 略高(含工具调用开销) |
| 适用场景 | 自定义架构 | 快速构建对话助手 |
Embeddings API 将文本转换为向量表示,是语义搜索、聚类和推荐系统的核心基础设施。
| 模型 | 维度 | 最大输入 | 价格 ($/1M tokens) | 特点 |
|---|---|---|---|---|
| text-embedding-3-small | 1536 | 8191 | $0.02 | 性价比最优 |
| text-embedding-3-large | 3072 | 8191 | $0.13 | 精度最高 |
| text-embedding-ada-002 | 1536 | 8191 | $0.10 | 旧模型,建议迁移 |
# 生成嵌入向量
response = client.embeddings.create(
model="text-embedding-3-small",
input=["第一条文本", "第二条文本"],
encoding_format="float" # "float" | "base64"
)
# 获取向量
embedding = response.data[0].embedding # list[float], 1536 维
text-embedding-3 系列支持动态调整维度,在精度和存储之间灵活取舍:
response = client.embeddings.create(
model="text-embedding-3-large",
input="示例文本",
dimensions=1024 # 从 3072 缩减到 1024 维
)
维度选择建议: - 1536 维:通用场景,精度与成本平衡 - 256 维:大规模检索,存储敏感场景 - 3072 维:精度要求最高的场景
语义搜索:
import numpy as np
def cosine_similarity(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
# 对查询和文档分别生成嵌入,计算余弦相似度
query_emb = get_embedding("搜索查询")
doc_embs = [get_embedding(doc) for doc in documents]
scores = [cosine_similarity(query_emb, doc_emb) for doc_emb in doc_embs]
top_k = np.argsort(scores)[-5:][::-1] # 取前 5 个最相关文档
聚类与分类:
from sklearn.cluster import KMeans
embeddings = [get_embedding(text) for text in texts]
kmeans = KMeans(n_clusters=5).fit(embeddings)
labels = kmeans.labels_
不同模型的价格差异巨大:
| 模型 | 输入价格 ($/1M tokens) | 输出价格 ($/1M tokens) | 适用场景 |
|---|---|---|---|
| GPT-4o | $2.50 | $10.00 | 复杂推理 |
| GPT-4o-mini | $0.15 | $0.60 | 简单任务首选 |
| GPT-3.5-turbo | $0.50 | $1.50 | 成本敏感 |
策略: 用 GPT-4o-mini 处理 80% 的简单任务,仅对复杂任务使用 GPT-4o。
# 使用 tiktoken 精确计算 token 用量
import tiktoken
encoding = tiktoken.encoding_for_model("gpt-4o")
token_count = len(encoding.encode(your_text))
本报告基于 2025 年初的 OpenAI API 状态撰写,API 可能持续演进,请以官方文档为准。