当前位置: 首页 > 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.jsqmd.com/news/1125372/

相关文章:

  • WebShell溯源实战:从CVI-360001告警到漏洞根因挖掘
  • 故障诊断 Agent 权限:能查很多,不代表能改很多
  • 基于STM32单片机智能手环心率血氧体温GPS定位跌倒计步器系统设计12(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_
  • 别被名字骗了:普通人如何用 Codex 打造专属的“AI 超级员工”
  • camelAI 是一款主打“随心构建”理念的编程工具
  • DIO四川资阳生产基地量产纪念仪式圆满举行 | 全球“双核制造体系”与口腔AI实验室同步启航
  • 《用AI做公众号流量主》第13课:为什么 99% 的人用 AI 生产的都是“电子垃圾”?
  • Java毕设项目:乡村物资救助与公益捐赠服务系统的设计与实现 智慧助农公益帮扶综合管理平台 (源码+文档,讲解、调试运行,定制等)
  • 手中有机, 心中不慌 (5 只 二手 Android 手机)
  • 短剧AI翻译隐性收费横评:5款平台费用明细对比避坑
  • 基于51/STM32单片机点滴速度液体检测 智能输液蓝牙监控系统 套件12(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_
  • 漏扫发现-Web服务篇Poc开发Yakit插件编写Afrog项目Yaml语法Yak语言接受匹配
  • 2026知识付费平台全对比!新手开课首选平台汇总推荐
  • 华为 eNSP 安装完全指南(人民标准版 v3.0)
  • 一起动手学LangChain吧-从零创建一个agent
  • try-throw-catch异常捕获流程
  • Redis Stream 消息队列总结
  • CTF ECC基础离散对数爆破 解题Writeup
  • 调试排查工具介绍(gdb、strace、Valgrind等)
  • JBoss 6.1.0.Final 弱口令加固实战:3步修改 jmx-console-users.properties 默认密码
  • 基于51/STM32单片机智能电饭煲 电饭锅设计 温度加热预约13(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • Java 转大模型开发:后端程序员的升级路线,把工具链跑成稳定流程
  • Agent 云原生运行时:智能体也需要健康检查
  • CenterNet实战:从零搭建到模型测试的完整环境配置指南
  • GPT 输出不符合预期?从结构化提问到多轮优化的实用方法
  • CSS Cascade Layer:样式优先级要靠架构,不靠赌命名
  • Java毕设项目:中小型乡村民宿山庄综合业务管理系统的设计与实现 基于 Java 的民宿客户信息与消费记录管理系统 (源码+文档,讲解、调试运行,定制等)
  • AT 指令学习手册:从对话逻辑到实战排错
  • Avalonia NativeControlHost
  • 做过亲子游定制之后,才知道本地靠谱旅行社不能忽略