共计 1920 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点
国内开发者想要直接调用 ChatGPT API 主要面临两个障碍:

- 网络限制 :OpenAI 的 API 域名被 GFW 阻断,直接访问会返回连接超时或重置
- 支付限制 :OpenAI 不接受国内发行的信用卡,绑卡环节需要境外支付工具
这些限制导致我们不得不寻找合规的技术方案来绕过这些障碍。
方案对比
方案 A:海外云服务器反向代理
- 原理 :在境外服务器搭建 Nginx 反向代理,将 API 请求转发至 OpenAI
- 优点 :
- 完全控制代理规则
- 可自定义缓存策略
- 缺点 :
- 需要维护服务器
- 存在被墙风险
方案 B:Cloudflare Workers 无服务器中转
- 原理 :利用 Cloudflare 边缘计算节点转发请求
- 优点 :
- 无需维护服务器
- 全球分布式低延迟
- 缺点 :
- 免费版有请求次数限制
- 需要处理 CORS
方案 C:国内合规代理服务
- 原理 :使用 Moonshot 等已备案的中间服务
- 优点 :
- 开箱即用
- 合规有保障
- 缺点 :
- 存在数据泄露风险
- 价格较高
核心实现
Python 异步请求示例
import aiohttp
from cryptography.fernet import Fernet
# 加密存储 API Key
key = Fernet.generate_key()
cipher = Fernet(key)
encrypted_api_key = cipher.encrypt(b'your-api-key')
async def chat_completion():
proxy = 'http://your-proxy:8080'
headers = {'Authorization': f'Bearer {cipher.decrypt(encrypted_api_key).decode()}'}
async with aiohttp.ClientSession() as session:
async with session.post(
'https://api.openai.com/v1/chat/completions',
proxy=proxy,
headers=headers,
json={"model": "gpt-3.5-turbo", "messages": [{"role": "user", "content": "Hello!"}]},
timeout=30
) as response:
async for chunk in response.content:
print(chunk.decode())
Node.js 自动重试实现
const axios = require('axios');
const {HttpsProxyAgent} = require('https-proxy-agent');
const proxyAgent = new HttpsProxyAgent('http://proxy:8080');
const client = axios.create({
baseURL: 'https://api.openai.com',
httpsAgent: proxyAgent,
timeout: 30000,
retry: 3, // 自动重试次数
retryDelay: 1000 // 重试间隔
});
// 响应拦截器实现重试
client.interceptors.response.use(null, (error) => {
const config = error.config;
if(!config || !config.retry) return Promise.reject(error);
config.__retryCount = config.__retryCount || 0;
if(config.__retryCount >= config.retry) {return Promise.reject(error);
}
config.__retryCount += 1;
return new Promise(resolve => {setTimeout(() => resolve(client(config)), config.retryDelay);
});
});
生产考量
IP 轮换策略
- 维护代理 IP 池(至少 5 个可用 IP)
- 通过失败率自动剔除劣质 IP
- 使用加权随机算法选择 IP
上下文管理
- 使用 Redis 存储对话历史
- 为每个会话分配唯一 ID
- 设置合理的 TTL 避免内存泄漏
内容过滤
- 在代理层过滤敏感词
- 对 API 返回内容做二次校验
- 记录审计日志
避坑指南
- 请求频率控制 :
- 单个 IP 不超过 60 RPM
-
并发连接数建议≤3
-
错误处理 :
- 429 错误:指数退避重试
-
503 错误:切换备用代理
-
账单监控 :
- 设置每日消费警报
- 实现用量统计面板
延伸思考
当代理服务不可用时,可以考虑以下降级方案:
- 切换至本地缓存的对话模板
- 启用备用 AI 服务(如文心一言 API)
- 对用户展示友好错误页面
这些方案需要根据业务场景做权衡,核心是要保证基本功能可用性。
正文完
