共计 2234 个字符,预计需要花费 6 分钟才能阅读完成。
真实开发痛点案例
最近团队接入了 ChatGPT API 开发客服助手,上线第一天就遇到三个典型问题:

- Token 超限中断对话:用户连续提问 10 分钟后突然收到空白回复,检查发现未统计上下文累计 token 数导致超出模型限制(GPT-3.5-turbo 的 4096 tokens 限制)
- 多轮对话记忆丢失:客户抱怨每次提问都要重新说明需求,排查发现服务端未持久化对话历史(conversation history)
- 响应时间波动大:白天高峰期平均响应超过 8 秒,夜间却只要 2 秒,未做请求并发控制
核心技术方案
认证方式选择
- API Key(推荐初学者)
- 在 OpenAI 账户设置页直接获取
- 通过
Authorization: Bearer sk-xxx头传递 -
注意:密钥需定期轮换,避免泄露
-
OAuth 2.0(适合企业级)
- 需要先注册应用获取 client_id
- 支持细粒度权限控制
- 实现代码示例:
from authlib.integrations.httpx_client import OAuth2Client async def get_oauth_token(): async with OAuth2Client( client_id='your_client_id', client_secret='your_secret', token_endpoint='https://api.openai.com/v1/oauth/token' ) as client: return await client.fetch_token()
流式响应性能对比
测试环境:AWS t3.medium 实例,上海区域通过代理访问
| 请求方式 | 平均延迟 | 内存占用 | 适用场景 |
|---|---|---|---|
| stream=False | 2.1s | 低 | 简单问答 |
| stream=True | 1.3s | 较高 | 长文本生成 |
关键实现代码:
async def stream_response(prompt):
response = await openai.ChatCompletion.acreate(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": prompt}],
stream=True,
timeout=10
)
async for chunk in response:
yield chunk['choices'][0]['delta'].get('content', '')
对话历史管理
方案 A:服务端 Session 存储
- 使用 Redis 存储对话上下文(context window)
- 每个用户分配唯一 session_id
- 优点:状态集中管理
# Redis 对话历史存取示例
import pickle
async def save_context(session_id, messages):
await redis.setex(f"chat:{session_id}",
3600, # 1 小时过期
pickle.dumps(messages)
)
方案 B:客户端缓存
- 通过 Cookie 或 localStorage 保存最近 5 轮对话
- 适合静态网站
- 注意加密敏感信息
完整代码实现
import openai
from functools import wraps
import re
# 防御 prompt 注入
def sanitize_input(text):
return re.sub(r'[<>\"\\]','', text[:1000])
# 自动重试装饰器
def retry(max_retries=3):
def decorator(func):
@wraps(func)
async def wrapper(*args, **kwargs):
for attempt in range(max_retries):
try:
return await func(*args, **kwargs)
except openai.error.APIError as e:
if attempt == max_retries - 1:
raise
await asyncio.sleep(2 ** attempt)
return wrapper
return decorator
@retry()
async def chat_completion(messages):
return await openai.ChatCompletion.acreate(
model="gpt-3.5-turbo",
messages=messages,
temperature=0.7,
)
生产环境注意事项
中国地区访问配置
- 推荐使用香港 / 新加坡代理
- 在代码中设置全局代理:
import os os.environ['HTTP_PROXY'] = 'http://proxy.example.com:8080' os.environ['HTTPS_PROXY'] = 'http://proxy.example.com:8080'
敏感信息加密
- 使用 AWS KMS 或 Vault 加密 API Key
- 禁止在日志中输出完整响应
监控指标建议
- 使用 Prometheus 收集:
api_latency_seconds分位值tokens_used_per_request分布- 配置 Grafana 报警规则
开放性问题思考
- 限流应对方案:
- 静态 fallback:返回预置常见问题答案
-
动态降级:切换至轻量模型(如 text-davinci-003)
-
GDPR 合规建议:
- 对话日志匿名化处理
- 提供用户数据删除接口
- 存储加密 + 自动过期
经过三个迭代周期优化,我们的问答助手现在能稳定处理 200+ 并发请求,日均对话量提升 4 倍。建议初期开发者先聚焦核心流程,再逐步完善高级功能。
正文完
发表至: 未分类
近一天内
