共计 1913 个字符,预计需要花费 5 分钟才能阅读完成。
连接中断的三大杀手
调用 ChatGPT API 时最让人头疼的,莫过于突然弹出的ConnectionError。根据实际项目统计,90% 的意外终止集中在以下场景:

- 网络抖动:尤其在跨地区访问时,TCP 连接会因网络波动随机断开
- 长响应超时:当生成大段文本时,服务器响应时间可能超过默认 30 秒限制
- 会话过期:长时间未交互的会话会被服务端主动回收(默认 30 分钟)
自动恢复三板斧
1. 指数退避重试
使用 tenacity 库实现带随机抖动的重试策略,这是避免雪崩效应的关键:
from tenacity import (
retry,
stop_after_attempt,
wait_exponential_jitter
)
import openai
@retry(stop=stop_after_attempt(5), # 最大重试 5 次
wait=wait_exponential_jitter(
initial=1, # 初始等待 1 秒
max=60, # 最大等待 60 秒
jitter=0.5 # 加入 50% 随机抖动
)
)
def ask_chatgpt(prompt):
return openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": prompt}]
)
关键参数调优建议:
initial:建议从 1 秒开始,避免立即重试给服务端加压jitter:0.3-0.7 之间效果最佳,既能分散请求又不会等待过久
2. 心跳检测机制
对于长会话场景,建议每 5 分钟发送一次 ping 保持连接活性:
import websockets
import asyncio
async def keepalive_connection(ws_url):
async with websockets.connect(ws_url) as ws:
while True:
try:
await asyncio.wait_for(ws.ping(), timeout=10)
await asyncio.sleep(300) # 5 分钟间隔
except (asyncio.TimeoutError, websockets.ConnectionClosed):
await reconnect() # 实现自己的重连逻辑
3. 上下文快照
通过定期保存对话上下文,可在中断后快速恢复:
import pickle
from datetime import datetime
def save_checkpoint(conversation):
checkpoint = {"timestamp": datetime.now(),
"messages": conversation.messages[-10:] # 保留最近 10 轮
}
with open(".chatgpt_backup", "wb") as f:
pickle.dump(checkpoint, f)
生产环境避坑指南
连接池管理
异步环境下推荐使用 aiohttp.ClientSession 管理连接:
import aiohttp
async def query_api():
async with aiohttp.ClientSession(timeout=aiohttp.ClientTimeout(total=120)
) as session:
async with session.post(API_URL, json=payload) as resp:
return await resp.json()
安全重试
重试时务必擦除敏感信息:
from tenacity import RetryCallState
def before_retry(retry_state: RetryCallState):
if "api_key" in retry_state.kwargs:
retry_state.kwargs["api_key"] = "[REDACTED]"
@retry(before=before_retry)
def sensitive_operation(api_key):
pass
服务降级
当连续失败时切换备用方案:
from circuitbreaker import circuit
@circuit(failure_threshold=5)
def call_chatgpt():
try:
return ask_chatgpt(prompt)
except Exception:
return get_fallback_response() # 返回预存默认答案
思考题
在分布式系统中,当多个服务节点需要共享 ChatGPT 会话状态时,如何设计保证:
1. 会话令牌的跨节点一致性
2. 上下文的实时同步
3. 断连时的故障转移
欢迎在评论区分享你的架构方案。
正文完
