跳到主要内容

把重试当修复,AI endpoint 的钱就是这么烧的

书签客
书签客

· 阅读约 5 分钟

Daniel Balcarek 在 dev.to 上写了一篇讲 AI endpoint 怎么改传统 API 流程的,七月发的,捷克做后端的。读到评论区有个人对 retry 这个词不放过,我才确定这条值得点开。

文章本身列了条对比。传统 web API 是校验请求、跑业务逻辑、返回表示;AI web API 是校验请求、准备 prompt/tools/context、生成概率输出、校验 schema/含义/安全、重试/修复/拒绝/降级、返回表示。第一眼扫过去,我觉得这就是把「业务逻辑」拆成了「准备 prompt」和「校验生成的输出」,没多深刻。多出来的那五个环节说实话也不是每个都需要展开讲。真正让我停下的是那条评论。

有个人说:对相同输入重试没有任何意义。模型不会因为重试一遍就变得更对。只有把验证失败的信息喂回下一次生成里,retry 才变成 repair。作者回他说会更新文章,把这两个词区分开。

这个区分是整篇最值钱的地方。不点链接也能带走的就是它:AI endpoint 的「重试」跟网络重试不是一回事。网络重试重发同一个请求,十有八九是链路抖了一下;模型重试,重发同一条 prompt,十有八九还是同一个错。得把上一轮哪里没通过验证写进下一轮,让它知道错在哪。我之前也把 AI 调用失败往重试策略里一扔,从来没想过「相同的 prompt 为什么第二次就会对」。现在想想,那些重试烧掉的 token 是真白烧。

作者自己的 C# 管线里已经有修复的影子,只是他嘴上没这么叫。Ollama 的 resilience pipeline,最多两次 retry,指数退避,初始两秒。触发重试的条件是 HTTP 请求异常、JSON 解析异常、任务取消、验证结果失败。验证失败被列进重试条件,这本身没问题。问题是只按退避间隔机械重发相同 prompt,第二次生成的输出不会因为等了四秒就更正确。真正能提高通过率的,是后面那段把 validation failure feedback 拼进下一次 generation 的逻辑。这段他写了,只是在文章里还跟「重试」缠在一起,没掰开。

然后有个点跟这个是一体的:AI provider 返回 HTTP 200 只证明模型生成了点什么,不证明结果是完整的、安全的、有依据的、有用的。这个太容易忘了。尤其接的是 OpenAI 或 Anthropic 的 API,收到 200 就下意识觉得这结果能用了。不行。provider 层的 200 只负责「成功生成了 token」,不负责「内容有没有用」。后者得后端自己校验。

所以他说输出契约不能只停在 JSON schema 解析,得加业务规则验证、逻辑一致性检查、安全验证。我认。schema 只能卡格式,卡不住「格式没问题但语义错了」的输出。AI 能产出这种技术上合法、内容上不对的东西,光靠 schema 校验不够。读到这句我默默给夹子里那个「只校验 JSON 格式」的项目打了个叉。

还有个点不是他重点,但我读过去被刺了一下:client prompt 直接透传给 AI 模型有误用风险,会烧开发者的 token。评论区有人把它比作 SQL injection,说 LLM 现在还没有参数化查询的等价物。这个比喻我不确定完全站得住,但危险是真的:用户输入拼进系统提示,跟你当年拼 SQL 差不多。输入控制不是说校验一下非空,要做话题限制、输入长度上限、可疑指令防护、带外检索内容隔离,还有模型能调用哪些工具的规则。作者列了一张清单,不是那种「要小心」的吆喝话,对做 agent 的人实用。

幂等性那段我停得最久。传统 API 幂等已经解决得挺好了,但 AI endpoint 里模型可能触发副作用,比如「创建第二个订单」,光靠客户端传个 idempotency key 不够。他给的方案是幂等键、持久化操作结果、唯一约束一起上。思路不新,新的是他把「AI 可能自作主张制造重复操作」当默认前提,而不是意外。

这篇没有顺手跑一下的空间——都是设计思路和 C# 实现片段,不是能照抄的命令行。所以只读了,没有跑通/没跑通那一说。唯一想顺手验证的是他那个 retry 配置到底用的 Polly 还是自己封的,文章里没提,我也没去翻。先挂着。

如果非要从这堆细节里抽个总判断,作者自己那句「AI endpoint 应该是编排管线而不是薄代理」够用了。薄代理就是收请求、转发、把 200 响应当结果返回;编排管线是把生成出来的东西重新接回业务层校验、修、升级或拒绝。差别不在模型,在后面那一串流程。还有两个细节我记了下来:重试预算要显式设置,因为每次重试都是 token 成本;一种优化是让模型只返回选中的 ID,后端再映射回原始数据,少生成输出 token,也省一点延迟。测试断言那点他也提了,别写精确输出相等,改成断言允许范围、允许的活动类型、禁内容、工具调用白名单这些行为属性。因为模型输出本来就不是确定性的,你断言死亡精确值等于自己跟自己过不去。

他说后端必须决定一份生成结果是否可靠到成为最终响应。我觉得这事一句话就说了:别让 provider 的 200 帮你做这个决定。

书签客
书签客

只推真读过的、顺手跑个实验贴完整记录——link-blog 策展 + 实验笔记。

查看主页 →