← AI 使用指南

开发集成 · 工程实践

国内服务器调用 OpenAI/Claude API 的工程要点

线上调用失败,多数不是模型的问题,而是超时设得太短、重试没有退避、并发没有上限。这篇按工程顺序给出具体参数和处置办法。

先把失败分成四类

看到报错就改代码是最费时间的做法。先按现象归类,每一类的排查方向完全不同:

现象常见原因先查什么
连接阶段就超时出口网络不通,或域名解析失败在服务器上直接发起一次简单请求,看是解析失败还是连不上
连上了但一直等不到内容读超时设得太短,或上游在排队看首字节返回时间,再对比自己的超时设置
立刻返回鉴权类错误密钥无效、没读到环境变量、被吊销打印密钥的前几位和长度,确认注入生效
返回过载或网关类错误上游短时过载,或自身触发了频率限制看官方状态页,再看自己单位时间的请求量

归类的价值在于:前两类要改网络或超时配置,第三类要查密钥注入,第四类要么等待要么降速。用同一套办法去治四类问题,只会把时间耗在无关的地方。

超时参数怎么设

大部分客户端库把超时当成一个整体,实际上要拆成三段来看,分别对应不同的问题:

还有一个容易被忽略的点:关闭流式会显著拉长等待。长回答需要几十秒才能生成完,这段时间里服务端不返回任何数据,读超时必须设得很大才不会误判为失败。建议凡是面向用户的功能一律开启流式,只有后台批处理任务才用非流式。

重试:必须带退避和抖动

不带退避的重试等于放大故障。上游刚刚过载,你立刻再打一次,只会让它更慢。可执行的做法:

  1. 先判断该不该重试。频率限制、过载、网关错误值得重试;参数错误、鉴权失败、内容不合规重试多少次都一样,直接放弃并记录。
  2. 退避按指数增长:第一次等 1 秒,第二次 2 秒,第三次 4 秒,第四次 8 秒,上限封顶在 30 秒左右。
  3. 在等待时间上叠加一个随机量,范围取等待时长的三分之一以内。多个实例同时重试时,这个抖动能把请求错开,避免形成新的峰值。
  4. 限制总次数,建议最多 4 次。超过这个次数还失败,说明问题不在瞬时波动,继续重试只是浪费额度。
  5. 如果响应里带有建议等待时间的字段,优先听它的,不要自作主张用更短的时间重试。

另外要注意幂等性。查询类请求随便重试;一旦是「生成并入库」这类有副作用的操作,重试前必须用请求标识去重,否则一次网络抖动可能变成两条记录。给每个逻辑请求生成一个唯一标识,随请求一起传,落库时按它判重。

并发与速率控制

密钥管理

错误码排查表

返回码含义处理方式
400请求本身有问题,如参数不合法、模型名不存在不重试。把完整错误信息记下来,对照文档逐项检查
401密钥无效或未正确注入不重试。确认环境变量、前后空格、是否被吊销
403密钥有效但没有该模型的权限不重试。换模型或申请权限
404地址或模型名写错不重试。核对请求路径
413单次请求内容过大不重试。拆分输入或先做摘要
429触发频率限制,或账户额度耗尽区分两种:前者退避后重试,后者充值后才有效
500 / 502 / 503 / 504服务端或网关异常退避重试,并准备降级模型
529上游整体过载拉长退避时间,或切到备用模型

429 需要特别说明:同一个返回码对应两种完全不同的原因,处理方式也相反。判断方法是看错误内容里是频率相关还是额度相关的描述。把这两种混为一谈,会出现「一直重试但永远失败」的情况,白白烧掉几个小时。

上线前的观测与回归

把这些做完,调用层才算稳定。剩下的模型选型和提示词优化,才是可以慢慢迭代的部分。

常见问题

服务器所在地区会影响调用稳定性吗?

会。不同地区到上游的网络路径质量差别明显,表现为延迟波动和连接失败率不同。上线前建议在目标地区实测一轮,而不是在本地开发机上判断。

本地调试正常,部署到服务器就报错,先查什么?

先查密钥注入和超时设置这两项。本地调试通常是从文件里读配置,服务器上依赖环境变量,容易读不到;超时设置在服务器上往往沿用默认值,而默认值通常偏短。

重试会不会导致重复计费?

会,而且很常见。上游已经生成完但响应在回程中断时,你重试一次就是两次计费。解决办法是记录请求标识并做去重,同时把重试次数上限压到四次以内。