共计 1327 个字符,预计需要花费 4 分钟才能阅读完成。
背景痛点
在接入 ChatGPT API 时,开发者常遇到三类典型问题:

- 401 认证失败 :由于密钥无效或过期导致的常见错误,尤其在密钥轮换场景下频发
- 速率限制触发 :默认每分钟 3,000 tokens 的配额容易被突发流量击穿,导致 429 错误
- 上下文丢失 :长对话场景下因未正确处理 message 历史导致的逻辑断裂
技术方案对比
REST API 方案
- 优点:实现简单,兼容任意 HTTP 客户端
- 缺点:长轮询消耗资源,实时性较差
- 适用场景:低频次请求 / 简单问答场景
WebSocket 方案
- 优点:持久连接降低延迟,适合流式响应
- 缺点:需要额外处理连接状态
- 适用场景:实时聊天 / 连续交互场景
flowchart TD
A[客户端] -->|1. 请求 token| B(OAuth 2.0 服务端)
B -->|2. 返回 JWT| A
A -->|3. 带认证头请求 | C(API Gateway)
C -->|4. 响应数据 | A
核心实现
OAuth 2.0 认证流程
- 在开发者平台创建应用,获取 client_id 和 secret
- 使用 PKCE 扩展生成 code_verifier 和 challenge
- 获取授权码后交换 access_token
- 通过 refresh_token 定期更新凭证
Python 请求示例(含错误处理)
import openai
from tenacity import retry, stop_after_attempt, wait_exponential
@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10))
def chat_completion(messages):
try:
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=messages,
timeout=10 # 秒
)
return response.choices[0].message.content
except openai.error.AuthenticationError:
# 处理认证失效
refresh_credentials()
raise
except openai.error.RateLimitError:
# 触发速率限制
log_rate_limit_headers()
raise
性能优化
速率限制策略
- 分级熔断:根据错误类型实施不同等待策略
- 动态窗口:基于 X -RateLimit-Reset 头动态调整请求间隔
- 请求批处理:合并多个短问题为单次请求
上下文管理优化
- 采用 LRU 缓存最近 5 轮对话
- 对历史消息进行语义压缩(如提取关键词)
- 超过 token 限制时自动裁剪最早消息
避坑指南
生产环境安全措施
- 密钥轮换:每月更新 API 密钥并废弃旧密钥
- 请求签名:对关键参数增加 HMAC 校验
- IP 白名单:限制可调用 API 的服务器 IP
Content-Type 错误排查
- 确保 Header 包含:
Content-Type: application/json - POST 请求体必须为 JSON 序列化字符串
- 文件上传需改用 multipart/form-data
互动思考
- 如何设计分布式系统下的共享对话状态?
- 当需要维护超过 8K tokens 的上下文时,有哪些替代方案?
正文完
发表至: 技术分享
近一天内
