GPT-4 API 国内怎么调?3 种方案实测,附完整 Python 代码

1 阅读1分钟

上个月接了个私活,甲方要求做一个客服摘要功能,指定要用 GPT-4 的接口。我心想这不简单嘛,结果真动手才发现——在国内稳定调通 GPT-4 API 这件事,远没有看起来那么顺畅。

断断续续折腾了两天,试了三种方案,踩了一堆坑,最后总算跑通了。把过程记录下来,给同样需要在国内环境调 GPT-4 API 的兄弟们省点时间。

先说结论

方案延迟(首 token)稳定性上手难度适合场景
官方直连 + 云服务器中转2-4s看服务器网络有海外服务器的团队
Azure OpenAI1-3s中(审批慢)企业级项目、合规要求高
聚合 API 平台1-2s中高个人开发者、快速验证

如果你是个人开发者或者小团队,想快速跑通 GPT-4,第三种方案的性价比最高。企业项目预算充足的话,Azure 是最稳的选择。下面一个个说。

为什么国内调 GPT-4 API 这么麻烦?

这个问题其实不复杂:OpenAI 官方 API(api.openai.com)在国内网络环境下无法直接访问。

所以核心问题就是——怎么在国内服务器上,稳定、低延迟地把请求送到 GPT-4 模型,再把结果拿回来。

我遇到的具体场景是这样的:项目部署在阿里云的国内节点,Python 后端,需要调用 GPT-4 做文本摘要。甲方对延迟有要求,单次请求超过 10 秒用户体验就崩了。

方案一:海外服务器做中转代理

最朴素的思路——在能访问 OpenAI 的服务器上架一个代理,国内服务器通过这个代理转发请求。

具体做法

我在 Vultr 上开了一台东京的 VPS($6/月),用 Nginx 做反向代理:

# /etc/nginx/conf.d/openai-proxy.conf
server {
    listen 443 ssl;
    server_name your-proxy-domain.com;

    ssl_certificate /etc/letsencrypt/live/your-proxy-domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your-proxy-domain.com/privkey.pem;

    location /v1/ {
        proxy_pass https://api.openai.com/v1/;
        proxy_set_header Host api.openai.com;
        proxy_set_header Authorization $http_authorization;
        proxy_connect_timeout 60s;
        proxy_read_timeout 120s;
        proxy_buffering off;  # 流式输出必须关
    }
}

Python 调用代码:

from openai import OpenAI

client = OpenAI(
    api_key="sk-your-openai-key",
    base_url="https://your-proxy-domain.com/v1"  # 指向自己的代理
)

response = client.chat.completions.create(
    model="gpt-4",
    messages=[
        {"role": "system", "content": "你是一个文本摘要助手"},
        {"role": "user", "content": "请用100字概括以下内容:..."}
    ],
    temperature=0.3,
    max_tokens=500
)

print(response.choices[0].message.content)

实测体验

能跑通,但问题不少:

  • 延迟波动大,东京节点到国内有时候 2 秒,有时候 6 秒,取决于当时的网络状况
  • 运维成本,VPS 要续费、SSL 证书要续期、Nginx 挂了要重启
  • 流式输出偶尔会断,需要做重试逻辑

说实话如果只是自己玩玩还行,给甲方交付的项目用这个方案,晚上睡觉都不踏实。

方案二:Azure OpenAI Service

微软的 Azure 上有 OpenAI 的官方服务,国内可以通过 Azure 中国区或者东南亚节点访问,延迟和稳定性都不错。

申请流程

这是最劝退的一步。你需要:

  1. 有一个 Azure 账号(企业邮箱申请更快)
  2. 在 Azure 门户里申请 OpenAI 服务的访问权限
  3. 等审批——我等了 4 个工作日,有人说等了两周
  4. 审批通过后,在 Azure 门户创建 OpenAI 资源,部署 gpt-4 模型

调用代码

Azure 的接口跟官方 OpenAI 稍有不同,但 openai 这个 Python 库已经做了适配:

from openai import AzureOpenAI

client = AzureOpenAI(
    api_key="your-azure-openai-key",
    api_version="2024-02-01",
    azure_endpoint="https://your-resource-name.openai.azure.com"
)

response = client.chat.completions.create(
    model="gpt-4",  # 这里填你在 Azure 里部署时设置的 deployment name
    messages=[
        {"role": "system", "content": "你是一个文本摘要助手"},
        {"role": "user", "content": "请用100字概括以下内容:..."}
    ],
    temperature=0.3,
    max_tokens=500
)

print(response.choices[0].message.content)

实测体验

  • 延迟稳定,东南亚节点首 token 基本在 1-3 秒
  • 模型版本有时会滞后,官方出了新版本,Azure 上要等一段时间才能用
  • 按量付费价格跟官方差不多,但计费逻辑走的是 Azure 那套,账单看起来费劲
  • 审批流程真的慢,而且对个人开发者不太友好,企业主体申请成功率更高

如果是正经的企业项目,Azure 这条路是最合规、最稳的。但我这个私活一共就两周工期,光等审批就要耗掉一小半,不现实。

方案三:聚合 API 平台(最终选了这个)

折腾了前面两种方案之后,我想起来之前在一个技术群里看到有人提过聚合 API 这种东西——就是有平台帮你把各家大模型的接口统一封装了,你只需要改一个 base_url 就能调。

试了几个,有的注册完发现 GPT-4 不可用,有的延迟高得离谱。最后留下来在用的是 ofox.ai,主要是它兼容 OpenAI 的协议,我代码几乎不用改。

调用代码

你感受一下改动量——基本就改了 base_url 和 api_key:

from openai import OpenAI

client = OpenAI(
    api_key="your-ofox-key",
    base_url="https://api.ofox.ai/v1"  # 聚合接口,一个 Key 调 GPT-4/Claude/Gemini
)

response = client.chat.completions.create(
    model="gpt-4",
    messages=[
        {"role": "system", "content": "你是一个文本摘要助手"},
        {"role": "user", "content": "请用100字概括以下内容:..."}
    ],
    temperature=0.3,
    max_tokens=500
)

print(response.choices[0].message.content)

流式输出也是标准写法:

stream = client.chat.completions.create(
    model="gpt-4",
    messages=[
        {"role": "user", "content": "用200字总结一下量子计算的核心原理"}
    ],
    stream=True
)

for chunk in stream:
    delta = chunk.choices[0].delta
    if delta.content:
        print(delta.content, end="", flush=True)

实测数据

我在阿里云北京节点上跑了一组测试,输入大概 800 token,输出限制 500 token:

指标数值
首 token 延迟0.8-1.5s
完整响应时间4-7s
连续 50 次请求成功率100%
流式输出正常

说实话延迟比我自己架的代理还稳,主要是不用操心服务器运维的事了。

踩坑记录

几个我实际踩到的坑,挨个说一下:

坑 1:model 参数写错

OpenAI 的模型命名改过好几次。gpt-4 是基础版,gpt-4-turbo 是更快更便宜的版本,gpt-4o 是最新的多模态版本。别搞混了,不同模型价格差挺多。

如果你只是做文本处理,用 gpt-4o 性价比最高,速度比 gpt-4 快一大截。

# 推荐用这个,便宜且快
model="gpt-4o"

# 不推荐,又贵又慢(除非你需要特定能力)
model="gpt-4"

坑 2:流式输出没处理好 SSE

如果你是 Web 项目,后端需要把流式结果透传给前端,要注意 SSE(Server-Sent Events)的格式。我一开始用 Flask 写的,结果发现前端收到的 chunk 是乱的,后来才发现是 response 的 Content-Type 没设对:

from flask import Flask, Response

app = Flask(__name__)

@app.route("/api/chat", methods=["POST"])
def chat():
    def generate():
        stream = client.chat.completions.create(
            model="gpt-4o",
            messages=[{"role": "user", "content": "你好"}],
            stream=True
        )
        for chunk in stream:
            delta = chunk.choices[0].delta
            if delta.content:
                yield f"data: {delta.content}\n\n"
        yield "data: [DONE]\n\n"

    return Response(
        generate(),
        mimetype="text/event-stream",  # 这行别忘了
        headers={"Cache-Control": "no-cache"}
    )

坑 3:超时没设

默认的 openai 客户端超时时间是 600 秒。在生产环境这个值太大了,网络一抖你的请求就挂在那里。建议显式设一下:

from openai import OpenAI
import httpx

client = OpenAI(
    api_key="your-key",
    base_url="https://api.ofox.ai/v1",
    timeout=httpx.Timeout(30.0, connect=5.0)  # 总超时30秒,连接超时5秒
)

坑 4:错误重试

生产环境一定要加重试。OpenAI 接口偶尔会返回 429(限流)或 500,不做重试的话用户体验很差:

import time
from openai import RateLimitError, APITimeoutError

def call_gpt4_with_retry(messages, max_retries=3):
    for i in range(max_retries):
        try:
            response = client.chat.completions.create(
                model="gpt-4o",
                messages=messages,
                temperature=0.3,
                max_tokens=500
            )
            return response.choices[0].message.content
        except RateLimitError:
            wait = 2 ** i  # 指数退避:1s, 2s, 4s
            print(f"限流了,等 {wait} 秒重试...")
            time.sleep(wait)
        except APITimeoutError:
            print(f"超时,第 {i+1} 次重试...")
            time.sleep(1)
    raise Exception("重试次数用完,调用失败")

三种方案怎么选?

我的判断标准很简单:

  • 你有现成的海外服务器 + 运维能力 → 方案一,省钱但费心
  • 企业项目,需要合规和 SLA → 方案二 Azure,稳但审批慢
  • 个人项目 / 快速验证 / 不想折腾 → 方案三聚合 API,改个 URL 就能跑

我那个私活最后用的方案三,两天工期,一天写业务逻辑,半天调接口和测试,剩下半天写文档。甲方测试没出问题,顺利交付了。

小结

国内调 GPT-4 API 说到底就是解决网络可达性的问题,技术上没什么深奥的。核心代码就那几行,大部分时间其实花在选方案和踩坑上。

几个建议:

  1. 能用 gpt-4o 就别用 gpt-4,又快又便宜
  2. 生产环境一定要加超时和重试
  3. 流式输出比非流式体验好很多,多写几行代码值得
  4. 选方案的时候先想清楚项目阶段——验证期别过度工程化,上线了再考虑稳定性

有问题评论区聊,看到会回。