要学会 Fast-Fail,否则 Token 不知不覺就没了

很多人做 AI 项目落地,失败时第一反应是“再教它一次”:把 Prompt 写更长、加更多约束、堆更多 repair 回路。

但如果你的系统经常遇到这种情况:

  • 模型先自言自语分析 2000 字,真正的 JSON/结论放在最后
  • 输出被截断(finish_reason=length),关键结构化结果没出来
  • 明明要求 JSON/FILE,它却回一段“解释我为什么这么做”

那你缺的往往不是“更长的 Prompt”,而是一个成本工程策略:Fast-Fail

Fast-Fail 的核心很简单:

一旦确认“大模型返回输出的形态不对”,立刻止损,马上重试。不要等它把话说完,更不要指望它“后面会乖乖吐结构化结果”。

在这里插入图片描述

1) Fast-Fail 是什么

Fast-Fail 是一种面向成本的生成策略:用“更早的失败判定”换“更小的总成本”。

它不是:

  • 情绪化地判模型“垃圾”
  • 对模型苛刻
  • 为了追求一次输出 100% 完美

它是大模型产出工程止损:

把最浪费 Token 的部分(长篇胡说 + 截断 + 多轮修复)砍掉。

在这里插入图片描述

2) 为什么它是“最省钱策略”

你花钱买的不是“模型说话时间”,而是大模型“可交付输出”。

当模型进入“长篇解释模式”,会发生三种典型浪费:

  • Token 浪费:解释性文字吞掉预算,结构化输出被挤到后半段
  • 时间浪费:你等它讲完才发现没用,或者最后被截断
  • 修复浪费:repair 链越长,越容易把错误变成新错误

Fast-Fail 把这三种浪费压成一句话:错了就立刻重来
在这里插入图片描述

3) 什么情况下应该 Fast-Fail(可判定的信号)

Fast-Fail 必须是“机器可判定”的,不靠感觉。

3.1 结构化输出(JSON)

  • 要求 JSON object:输出在前 N 个字符内没有出现 {
  • 要求 JSON array:输出在前 N 个字符内没有出现 [
  • 输出前缀明显是解释性文字(“我需要先分析…”、“首先…”、“下面我将…”)

3.2 文件式输出(FILE:)

  • 要求 FILE: 前缀,但输出不含 FILE: 或者前缀位置过靠后

3.3 明确的截断信号

  • finish_reason=length
  • 或者 Raw Output 明显缺括号/缺引号/未闭合

这些信号出现时,最贵的错误是:继续等它“可能会在后面给你正确格式”。

3.4 真实样本

下面这些片段来自项目跑链路时保存下来的 Raw Output。它们的共同点是:

模型当下的输出形态已经错了,继续等下去只会更贵。

样本 A:Phase 1 前缀不是 JSON,模型开始“解释任务”

===== Phase 1 Fast-Fail(前綴非 JSON,將直接重試) @ 2026-08-16 01:53:14.306 =====
我们需要回答用户要求:仅输出一段合法 JSON 物件,不要解释文字,不要包 code fence。
我们需要解析需求文档:这是一个【某金融业务流程】(已脱敏)...

这时候最省钱的动作不是“等它讲完”,而是立刻重试,让它回到 JSON-only 的交付模式。

样本 B:Phase 2 要求 JSON array,但开头不是 [

===== Phase 2 Fast-Fail(前綴非 JSON 陣列,將直接重試) @ 2026-08-16 03:28:56.770 =====
We need answer with JSON only. Need parse task. We need only expand whitelist modules...

这种输出往往会把“该吐数组”的预算消耗在解释里,等到它想起要吐 [ 时,已经接近截断线了。

样本 C:同样是 Phase 1,模型一上来先做“业务方案复述”

===== Phase 1 Fast-Fail(前綴非 JSON,將直接重試) @ 2026-08-16 06:03:11.398 =====
我们需要输出一个 JSON 对象。我们需要根据需求文档规划 modules。需求文档是【某业务方案】(已脱敏)...

你想要的不是“它复述得对不对”,而是“它有没有按约定把结构先吐出来”。Fast-Fail 处理的就是这个优先级:先交付形态,再谈内容质量。

4) Fast-Fail 的正确搭配:保留 Raw Output(不要黑箱)

Fast-Fail 不是“看一眼就扔掉”,它必须配一件事:保留 Raw Output

理由很现实:你需要区分三种情况:

  • 模型根本没按要求输出结构
  • 模型输出了结构,但被解释文字包住
  • 模型输出被截断,结构没闭合

不留 Raw Output,你会把所有失败都归因成“模型不行”,然后开始堆 Prompt、堆 repair,成本只会更高。

5) 设计一个“温和但坚定”的重试策略

Fast-Fail 的关键在:"果断重来给它一个更容易成功的第二次机会”。

一个实用的顺序是:

  • 第一次:正常 Prompt(带 Harness 约束)- Fast-Fail:若前缀信号不对,立刻重试
  • 第二次:更短、更硬的 Prompt(把输出形态写死,禁止解释)
  • 仍失败:再进入 repair(只在必要时)

这背后的原则是:优先用更强约束的重试,把模型从“解释模式”拉回“交付模式”
在这里插入图片描述

6) 最小实现(MVP):三件事就够

现在最小可用版本只要做下面三件事:

6.1 前缀信号检测

  • JSON object:在前 200–500 字符内是否出现 {
  • JSON array:在前 200–500 字符内是否出现 [
  • FILE:在前 200–500 字符内是否出现 FILE:

6.2 Raw Output 记录

每次调用至少记录输出下面格式:

  • 时间戳、model、finish_reason、latency
  • 本次任务标签(Phase/模块/目标输出类型)
  • Raw Output 原文

6.3 失败归因标签

要求整理失败状态最小集合:

  • NON_JSON_TEXT
  • LENGTH_TRUNCATED
  • INVALID_JSON / SCHEMA_MISMATCH
  • NETWORK_ERROR(注意:很多网络错误属于 doubtful state)

7) 有些人的对Fast-Fail 意见

7.1 “Fast-Fail 会不会把正确答案错杀?”

会。但工程上你要优化的不是“单次最优”,而是“总体交付成本”。

当你要的是结构化输出时,“偶尔错杀”通常比“每次都等它长篇胡说到最后再截断”便宜得多。

7.2 “为什么不直接让模型别解释?”

你当然可以写,但你控制不了它每次都听话。

Fast-Fail 的价值在于:不管它听不听话,你都能把成本锁死

在这里插入图片描述

8) 一句话收尾

Fast-Fail 是一种工程态度:把“可能会成功的长等待”换成“可控的短重试”。当你开始用它,你会发现很多所谓的 Loop,本质只是没有止损机制。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值