共计 1556 个字符,预计需要花费 4 分钟才能阅读完成。
需求背景
国内开发者接入 ChatGPT API 时,常常面临三大挑战:

- 网络连通性问题 :OpenAI 的服务域名在国内直接访问存在困难,需要稳定的代理方案
- 支付结算限制 :国际信用卡和虚拟货币支付方式对国内用户不友好
- 内容合规要求 :生成内容需符合国内法律法规,必须内置审核机制
架构设计
代理方案选型
- Nginx 反向代理
- 优点:性能高,可复用现有服务器资源
- 缺点:需要维护海外服务器,IP 可能被封锁
-
配置示例:
location /v1/chat/completions { proxy_pass https://api.openai.com; proxy_ssl_server_name on; } -
云函数中转
- 优点:无需管理基础设施,自动扩缩容
- 缺点:冷启动延迟,成本随调用量增长
- 适用场景:中小规模临时性需求
系统组件
- 请求网关:处理鉴权与流量控制
- 内容过滤器:基于正则 + 关键词库的双层过滤
- 监控看板:API 成功率 / 延迟指标可视化
核心实现
带重试机制的 API 封装
import os
import openai
from tenacity import retry, stop_after_attempt, wait_exponential
# 通过环境变量管理敏感配置
openai.api_key = os.getenv('OPENAI_KEY')
openai.api_base = os.getenv('PROXY_ENDPOINT', 'https://api.openai.com')
@retry(stop=stop_after_attempt(3),
wait=wait_exponential(multiplier=1, min=2, max=10)
)
async def chat_completion(messages: list, **kwargs):
try:
resp = await openai.ChatCompletion.acreate(
model="gpt-3.5-turbo",
messages=_preprocess_messages(messages), # 内容预处理
timeout=30,
**kwargs
)
return _postprocess(resp.choices[0].message.content)
except openai.error.APIError as e:
# 记录错误日志(已脱敏)log_error(f"APIError: {str(e)[:200]}")
raise
# 敏感信息预处理
def _preprocess_messages(messages):
for msg in messages:
msg['content'] = filter_sensitive_words(msg['content'])
return messages
内容过滤方案
- 关键词库过滤
- 使用 AC 自动机算法实现高效匹配
-
动态加载更新词库(每小时同步一次)
-
正则表达式规则
- 匹配政治敏感、暴力等模式
- 示例规则:
POLITICAL_REGEX = re.compile(r'领导人 | 政府 | 共产党')
避坑指南
生产环境注意事项
- 频次控制策略
- 令牌桶算法控制 QPS(建议初始值:5 次 / 秒)
-
重要提示:OpenAI 对免费账户有每分钟 3 次限制
-
日志脱敏方案
- 请求 / 响应中的 API Key 替换为
****** -
用户输入内容保留前 3 个字符 +MD5 后缀
-
应急回退机制
- 当连续 3 次请求失败时,自动切换备用代理
- 降级方案:返回预定义的本地应答模板
延伸思考
当 OpenAI 官方 SDK 更新时,如何保证系统兼容性?可以考虑:
- 使用适配器模式封装 SDK 调用
- 建立版本自动化测试套件
- 维护 API 响应结构的版本映射表
结语
通过本文介绍的技术方案,我们成功解决了国内环境下使用 ChatGPT API 的主要障碍。实际部署时建议从小流量开始验证,逐步完善监控体系和应急方案。期待看到更多开发者分享他们的优化实践。
正文完
