当前位置: 首页 > news >正文

Go 推理客户端:重试要懂模型调用的副作用

Go 推理客户端:重试要懂模型调用的副作用

一、模型调用不是普通 GET

Go 后端服务调用模型接口时,常会封装重试逻辑。网络抖动、限流、超时都可能触发重试。但模型调用不是普通 GET,它有成本、可能产生不同输出,也可能触发下游工具调用。重试要懂副作用。

盲目重试会放大成本,拖长延迟,还可能让用户看到不一致结果。

二、先区分错误类型

flowchart TD A[模型调用失败] --> B{错误类型} B --> C[网络超时] B --> D[限流] B --> E[上下文过长] B --> F[格式错误] C --> G[可重试] D --> G E --> H[不可重试] F --> I[看任务策略]

网络短暂失败和 429 限流可以重试;上下文过长、认证失败通常不可重试;格式错误是否重试,要看是否能通过更严格提示词修复。

还要控制总时间预算。每个下游重试都不能突破用户请求的整体超时。

三、客户端要带策略

type RetryPolicy struct { MaxAttempts int BaseDelay time.Duration MaxElapsed time.Duration }

重试策略要按功能配置。实时聊天、后台总结、批量任务不能用同一套重试次数。

model_client_retry: chat: attempts: 1 max_elapsed_ms: 2500 batch_summary: attempts: 3 max_elapsed_ms: 30000

实时请求宁愿快失败,也不要让用户等很久。

四、幂等和日志很重要

如果模型调用背后会触发工具或写入,就必须有幂等键。否则重试可能重复执行副作用。

日志里要记录 attempt、错误类型、延迟、模型和最终结果。没有这些信息,成本和延迟异常时很难排查。

客户端还要支持请求级 context。上游请求取消后,下游模型调用也应该停止等待。否则用户已经断开连接,后端仍在消耗模型资源。

ctx, cancel := context.WithTimeout(parentCtx, 2500*time.Millisecond) defer cancel() resp, err := client.Generate(ctx, req)

重试时要带抖动,避免多个实例同时重试打穿推理网关。指数退避如果没有 jitter,在故障恢复瞬间仍然可能形成流量尖峰。

retry_backoff: base_ms: 100 max_ms: 1000 jitter: true

还要记录重试带来的额外成本。一次用户请求因为重试产生两次模型调用,账单和限额系统都应该知道。否则成本分析会低估失败场景。

对于流式响应,重试更要谨慎。已经向用户输出部分 token 后,重新请求可能生成不同后续内容。流式任务通常更适合失败后提示重试,而不是自动拼接。

客户端还要暴露调用结果分类,而不是只返回error。业务层需要知道这是用户输入问题、平台限流、模型超时、网关失败还是输出校验失败。错误分类越清楚,上层越容易决定是否降级。

type ModelCallResult struct { Retryable bool Category string Attempts int CostTokens int }

例如context_too_long可以提示用户缩短内容,rate_limited可以进入排队或降级模型,output_schema_invalid可以触发一次受控修复。把所有失败都包装成 500,只会让调用方写出更粗糙的重试。

最后,推理客户端应把策略和观测做成默认能力。业务代码只传任务类型和请求上下文,不应该在每个服务里复制一套重试判断。复制越多,线上行为越不可预测。

五、总结

Go 推理客户端重试要区分错误类型、功能场景、时间预算和副作用。

可靠不是多试几次,而是在该重试时重试,在不该重试时及时失败。

http://www.gsyq.cn/news/1637357.html

相关文章:

  • WebShell溯源实战:从CVI-360001告警到漏洞根因挖掘
  • HelloAgents:RAG——让 Agent 学会检索知识
  • 基于STM32单片机智能手环心率血氧体温GPS定位跌倒计步器系统设计12(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_
  • 在浏览器里逛唐长安城,这个开源项目让我直接穿越了!
  • 记录arm64内核调试环境搭建qemu_arm64_linux_01
  • 漏扫发现-Web服务篇Poc开发Yakit插件编写Afrog项目Yaml语法Yak语言接受匹配
  • 《用AI做公众号流量主》第13课:为什么 99% 的人用 AI 生产的都是“电子垃圾”?
  • 手中有机, 心中不慌 (5 只 二手 Android 手机)
  • CTF ECC基础离散对数爆破 解题Writeup
  • Agent 云原生运行时:智能体也需要健康检查
  • Java毕设项目:中小型乡村民宿山庄综合业务管理系统的设计与实现 基于 Java 的民宿客户信息与消费记录管理系统 (源码+文档,讲解、调试运行,定制等)
  • AT 指令学习手册:从对话逻辑到实战排错
  • Avalonia NativeControlHost
  • CSS Cascade Layer:样式优先级要靠架构,不靠赌命名
  • 原神120帧解锁终极指南:免费提升游戏流畅度的完整教程
  • 服务器安全(Windows Server+Linux)
  • 基于STM32单片机车位引导 智能停车场计费系统 刷卡识别 WIFI成品12(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_
  • Linux groupdel命令详解|用户组删除、主组报错解决、强制删除实战教程
  • 21_LangChain源码总览_读源码前必看的地图
  • 2026年VIVO嵌入式岗位高频面试题(含参考答案)
  • 郴州热门火锅店理性测评|行业避坑+科学选型指南
  • 2026年精选好口碑苦荞粉推荐,健康美味不容错过
  • Codex 编程智能体入门指南
  • 2026封神!5款AI论文平台实测,小白变学霸,初稿直逼优秀模板!
  • 单卡训练大模型:LLaMA Factory显存优化实战
  • 【Crypto】RSA 小指数入门解密
  • Harness 介绍及使用场景
  • GORM 单表操作与高级查询
  • 哪怕MCP再强,我也劝你保留一点“控制欲”
  • Python异步代理池实战:从requests阻塞到httpx.AsyncClient,爬虫效率翻倍的踩坑记录