大模型API调用面试总结
更新: 9/1/2026 字数: 0 字 时长: 0 分钟
同步与流式
对于传统的后端项目,多以HTTP同步返回为主,所谓同步返回,就是在前端发起一次请求后,后端一次性返回所有请求的内容
但是对于大模型,由于现实算力等因素,大模型想要一次返回所有内容有些困难,因此我们想要采取逐字返回的方式
SSE
SSE是现在主流的Agent流式返回方案,即客户端向服务端发起一次请求,服务端可以多次向客户端返回内容,直到服务端认为内容已经返回完成
除了SSE外,想要实现流式返回还有Websocket和HTTP chunked,不选择这两者的原因也很简单:
- WebSocket:服务端和客户端长连接都可互相发消息,但我们没有客户端在服务端发消息的时候接受客户端消息的需求(即大模型的对话不会被中途打断)
- HttpChunk过于底层,想要实现需要自定义太多的东西
SSE的媒体类型是text/event-stream,消息格式是一份UTF-8文本事件流。每个事件由若干行字段组成,事件之间用空行分隔;实际换行可以是 \n 或 \r\n,所以事件分隔常见写法是\n\n 或 \r\n\r\n。
Nginx
有时候Nginx开启了响应缓冲区会导致SSE积攒,这时候我们需要对Nginx的内容进行改动,保证我们的SSE可以正常使用
location /api/ {
proxy_pass http://backend;
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 300s;
proxy_set_header Connection "";
add_header Cache-Control no-cache;
}中断处理
流式调用一般会有几种中断的情况:用户取消,超时,连接中断,客户端重连。对于不同的中断情况我们有不同的关注点和处理方式
用户取消
该中断不属于错误,因此前端不应该有错误警告,同时后端应该及时中断对供应商的请求以减少对Token的消耗
超时
超时区分为:
- 连接超时:连不上供应商
- TTFT超时:连接上供应商但是获取不到第一个事件
- 总时长超时:一直输出,超过了业务可接受的时间
对于超时我们应该进行重试
断流
客户端错误的将半截内容当成成功,这里应该给用户一个错误提示,并且让用户手动重试(继续)
重连
SSE实际上是有自动重连的功能的,但大模型的输出不是传统后端业务,大多服务商基本不支持该功能
常见的错误类型
| 类型 | 示例 | 是否建议重试 | 处理方式 |
|---|---|---|---|
| 网络瞬断 | 连接重置、DNS 抖动、读超时 | 可以 | 指数退避 + 抖动,限制最大次数 |
| 供应商 5xx | 500、502、503、504 | 可以 | 短暂重试,超过阈值切换模型或降级 |
| 供应商过载 | Anthropic 529、类似 overloaded 错误 | 可以 | 慢重试,必要时熔断该供应商 |
| 429 限流 | RPM、TPM、RPD、并发限制超出 | 谨慎 | 优先看 Retry-After 和限流头,排队或降级 |
| 流式中断 | 未收到正常结束事件 | 视场景 | 用户可见任务不自动重试,后台任务可幂等重试 |
| 400 参数错误 | Schema 不合法、字段缺失、上下文超限 | 不建议 | 修请求,不要重试同一 payload |
| 401/403 鉴权错误 | API Key 无效、权限不足 | 不建议 | 告警并停用对应 Key |
| 安全拒答 | 内容策略拒绝 | 不建议 | 进入业务拒答流程 |
| 解析失败 | JSON 不完整、字段类型错误 | 可有限重试 | 带失败原因二次修复,最多 1-2 次 |
重试方案
对于重试,我们应当使用指数退避+抖动的方式,即随着重试的次数越多,重试的时间也越长,且为了防止同一时间大量请求打入请求服务器,在重试事件后加一个随机值
另一方面,为了防止用户疯狂点击重试,我们要设计幂等key,服务端应作出一下反馈:
- 如果重试已经成功,直接返回历史结果。
- 如果重试正在生成,告知用户正在重试。
- 如果失败且允许重试,创建新的重试,但仍然挂在同一个业务消息下。
- 如果失败但不可重试,直接返回失败原因。