共计 3763 个字符,预计需要花费 10 分钟才能阅读完成。
背景与痛点
ChatGPT API 为开发者提供了强大的自然语言处理能力,但在实际集成过程中,开发者常面临以下挑战:

- 认证管理:API 密钥需要安全存储和轮换,避免泄露风险
- 响应延迟:网络延迟和 API 处理时间影响用户体验
- 错误处理:需要妥善处理 API 限流、服务不可用等异常情况
- 成本控制:不当的调用方式可能导致不必要的 token 消耗
这些痛点直接影响应用的稳定性和用户体验,需要通过合理的架构设计和最佳实践来解决。
技术选型
Python 生态中有多种 HTTP 客户端可供选择,以下是主要选项的对比分析:
- requests
- 优点:简单易用,同步阻塞式调用
- 缺点:不支持异步,性能瓶颈明显
-
适用场景:简单脚本或低并发需求
-
aiohttp
- 优点:异步支持,高并发性能好
- 缺点:学习曲线较陡,需配合 asyncio 使用
-
适用场景:高并发生产环境
-
httpx
- 优点:同时支持同步和异步,API 设计优雅
- 缺点:相对较新,社区资源较少
- 适用场景:需要灵活切换同步 / 异步的场景
对于生产环境,推荐使用 aiohttp 或 httpx 的异步模式,能够更好地处理并发请求。
核心实现
基础 API 调用
import os
from typing import Dict, Any
import aiohttp
class ChatGPTClient:
def __init__(self, api_key: str = None):
self.api_key = api_key or os.getenv('OPENAI_API_KEY')
self.base_url = 'https://api.openai.com/v1/chat/completions'
self.headers = {'Authorization': f'Bearer {self.api_key}',
'Content-Type': 'application/json'
}
async def create_chat_completion(
self,
messages: list[Dict[str, str]],
model: str = 'gpt-3.5-turbo',
temperature: float = 0.7,
max_tokens: int = 500
) -> Dict[str, Any]:
"""
创建聊天完成
:param messages: 消息列表,格式为[{'role': 'user', 'content': '你好'}]
:param model: 使用的模型名称
:param temperature: 生成文本的随机性控制
:param max_tokens: 最大 token 数
:return: API 响应
"""payload = {'model': model,'messages': messages,'temperature': temperature,'max_tokens': max_tokens}
async with aiohttp.ClientSession() as session:
async with session.post(
self.base_url,
headers=self.headers,
json=payload
) as response:
if response.status == 200:
return await response.json()
else:
error = await response.text()
raise Exception(f'API 请求失败: {response.status}, {error}')
错误处理增强版
import logging
from aiohttp import ClientError, ClientResponseError
class EnhancedChatGPTClient(ChatGPTClient):
async def create_chat_completion(
self,
messages: list[Dict[str, str]],
model: str = 'gpt-3.5-turbo',
temperature: float = 0.7,
max_tokens: int = 500,
retries: int = 3
) -> Dict[str, Any]:
"""增强版聊天完成,包含错误重试机制"""
last_error = None
for attempt in range(retries):
try:
return await super().create_chat_completion(messages, model, temperature, max_tokens)
except ClientResponseError as e:
last_error = e
if e.status == 429: # 速率限制
wait_time = 2 ** (attempt + 1) # 指数退避
logging.warning(f'速率限制,等待 {wait_time} 秒后重试...')
await asyncio.sleep(wait_time)
elif e.status >= 500: # 服务器错误
logging.warning(f'服务器错误,重试中({attempt + 1}/{retries})...')
await asyncio.sleep(1)
else:
raise
except ClientError as e:
last_error = e
logging.warning(f'网络错误,重试中({attempt + 1}/{retries})...')
await asyncio.sleep(1)
raise Exception(f'API 请求失败,重试 {retries} 次后仍然不成功: {last_error}')
性能优化
1. 异步批处理
对于需要处理大量独立请求的场景,可以使用异步批处理:
import asyncio
async def batch_process_requests(requests: list[Dict[str, Any]], max_concurrency: int = 10):
"""
批量处理请求
:param requests: 请求列表
:param max_concurrency: 最大并发数
"""
semaphore = asyncio.Semaphore(max_concurrency)
client = EnhancedChatGPTClient()
async def process_request(request):
async with semaphore:
return await client.create_chat_completion(**request)
return await asyncio.gather(*[process_request(r) for r in requests])
2. 响应缓存
对于重复性请求,可以使用缓存减少 API 调用:
from functools import lru_cache
import json
class CachedChatGPTClient(EnhancedChatGPTClient):
@lru_cache(maxsize=1024)
def _generate_cache_key(self, messages, model, temperature, max_tokens):
"""生成缓存键"""
return json.dumps({
'messages': messages,
'model': model,
'temperature': temperature,
'max_tokens': max_tokens
}, sort_keys=True)
async def create_chat_completion(self, *args, **kwargs):
cache_key = self._generate_cache_key(*args, **kwargs)
if cache_key in self._cache:
return self._cache[cache_key]
response = await super().create_chat_completion(*args, **kwargs)
self._cache[cache_key] = response
return response
生产环境避坑指南
- 速率限制处理
- 实现指数退避算法
- 监控 API 使用情况,设置合理的 QPS
-
考虑使用多个 API 密钥轮询(如果允许)
-
超时设置
# aiohttp 客户端超时配置 timeout = aiohttp.ClientTimeout(total=30, connect=10) async with aiohttp.ClientSession(timeout=timeout) as session: # API 调用 -
日志记录
- 记录请求 / 响应时间
- 记录错误详情和重试次数
-
敏感信息脱敏
-
监控告警
- 设置 API 错误率告警
- 监控响应时间
- 跟踪 token 使用情况
安全考量
- API 密钥管理
- 永远不要将 API 密钥硬编码在代码中
- 使用环境变量或密钥管理服务
-
定期轮换密钥
-
数据隐私
- 避免发送敏感个人信息
- 考虑数据脱敏
-
了解并遵守相关数据保护法规
-
请求验证
- 验证用户输入
- 限制输入长度
- 设置合理的 max_tokens
互动思考题
假设你正在开发一个客服机器人,需要同时处理来自多个用户的 ChatGPT 请求。请设计一个系统,要求:
- 能够高效处理高并发请求
- 具备良好的错误恢复能力
- 能够防止 API 滥用
- 支持对话上下文管理
欢迎在评论区分享你的设计方案或实现代码!
正文完
