共计 2349 个字符,预计需要花费 6 分钟才能阅读完成。
背景痛点:为什么需要这篇指南
第一次用 Python 调用 ChatGPT API 时,我踩了不少坑。从莫名其妙的认证错误,到响应慢得让人怀疑人生,再到处理长文本时的手忙脚乱。最头疼的是,官方文档虽然全面,但生产环境遇到的问题它可不会告诉你。比如:

- 认证配置错误:把 API 密钥硬编码在代码里,或者.env 文件没生效
- 响应延迟高:同步请求阻塞整个应用,用户体验直接崩盘
- 流式处理复杂:想要逐字显示结果?自己手动处理 chunked 响应吧
- 敏感内容过滤:突然返回个违规内容,你的应用可能就被举报了
技术方案选型:官方库 vs 自定义实现
1. 官方 openai 库
优点:
- 开箱即用,几行代码就能跑起来
- 自动处理认证和基础错误
缺点:
- 同步请求默认阻塞
- 流式响应需要额外配置
- 自定义中间件困难
2. aiohttp 自定义实现
优点:
- 原生支持异步,性能更好
- 完全控制请求生命周期
- 方便添加自定义逻辑(如重试、过滤)
缺点:
- 需要自己处理更多细节
- 维护成本略高
最终选择:对于生产环境,推荐用官方库 + 异步流式处理的组合方案,平衡开发效率和性能。
核心代码实现
带错误重试的 API 封装类
import os
import openai
from tenacity import retry, stop_after_attempt, wait_exponential
from typing import Optional, Dict, Any
class ChatGPTClient:
"""带自动重试机制的 ChatGPT 客户端"""
def __init__(self):
self.api_key = os.getenv("OPENAI_API_KEY")
openai.api_key = self.api_key
@retry(stop=stop_after_attempt(3),
wait=wait_exponential(multiplier=1, min=4, max=10)
)
async def chat_completion(
self,
messages: list[Dict[str, str]],
model: str = "gpt-3.5-turbo",
temperature: float = 0.7,
stream: bool = False
) -> Any:
"""
执行聊天补全,自动重试 3 次
:param messages: 消息历史,格式如[{"role": "user", "content": "你好"}]
:param model: 使用的模型
:param temperature: 创意度,0-1
:param stream: 是否使用流式响应
"""
try:
return await openai.ChatCompletion.acreate(
model=model,
messages=messages,
temperature=temperature,
stream=stream
)
except Exception as e:
print(f"API 调用失败: {str(e)}")
raise
流式响应处理示例
async def handle_stream_response(stream):
"""处理流式响应,逐块打印结果"""
full_response = ""
async for chunk in stream:
content = chunk["choices"][0].get("delta", {}).get("content", "")
if content:
full_response += content
print(content, end="", flush=True) # 逐字打印
return full_response
敏感词过滤中间件
class ContentFilter:
"""敏感词过滤中间件"""
BANNED_WORDS = ["暴力", "色情", "政治敏感词"] # 示例敏感词库
@classmethod
def filter(cls, text: str) -> str:
"""过滤敏感内容,替换为 ***"""
for word in cls.BANNED_WORDS:
if word in text:
text = text.replace(word, "***")
return text
生产环境考量
1. Token 计算策略
- 中文大约 1 个 token= 2 个字符
- 最大上下文长度(如 gpt-3.5-turbo 是 4096 tokens)
- 推荐使用
tiktoken库精确计算
2. 请求限速方案
- 免费账号:3 RPM (每分钟请求数)
- 付费账号:根据层级不同
- 实现建议:
from ratelimit import limits, sleep_and_retry
# 限制每分钟 20 次调用
@sleep_and_retry
@limits(calls=20, period=60)
async def safe_api_call():
# 你的 API 调用
pass
3. GDPR 合规建议
- 欧盟用户数据必须存储在欧盟服务器
- 个人身份信息 (PII) 必须加密或匿名化
- 提供数据删除接口
三大避坑指南
1. 突发 429 错误(请求过多)
- 现象:突然返回 429 状态码
- 解决方案:
- 实现指数退避重试机制
- 监控用量接近限额时预警
- 付费账号申请提升限额
2. 上下文超长截断
- 现象:长文本被莫名截断
- 解决方案:
- 主动计算 token 数并截断
- 使用 ” 继续 ” 提示让 AI 接着上文输出
- 考虑分块处理 + 摘要组合
3. 回复内容不合规
- 现象:返回了不适当内容
- 解决方案:
- 设置 system message 明确约束
- 后置过滤敏感词
- 开启 OpenAI 的 moderation 端点
下一步尝试
如果你已经掌握了基础 API 调用,可以尝试:
- 用 LlamaIndex 构建本地知识增强的 ChatGPT 代理,让 AI 能回答你私有数据的问题
- 实现自动化 PII 擦除功能,自动识别并遮蔽电话号码、邮箱等敏感信息
- 结合 LangChain 构建更复杂的 AI 工作流
希望这篇指南能帮你避开我踩过的那些坑。Happy coding!
正文完
