让 AI 生成一段视频,最尴尬的结局不是"生成失败",而是它把你以为早就翻篇的那句"视频还没好吗?"问了几十遍,问到没电。这篇文章讲系统是怎么拦下它的。
一、先铺垫:AI 的工作节奏,"想一轮"花一格电
AI 用工具干活不是一次性的,而是一个循环:想一步 → 调工具 → 看结果 → 再想一步 → 再调……每一轮都要动用一次大模型推理。所以系统给每次会话设了一个迭代次数预算,一轮花一格,花完就强制收工——这是防止它无限循环烧钱的保险丝。
记住"预算"这个设定,它是整个故事的赌注。
二、慢任务不发"等待卡",发"取餐码"
图片和视频生成是分钟级的慢活。系统不会让工具傻站在原地等到完成——那会把整批工具调用都堵死。视频生成工具的做法是有界等待:内部最多盯 8 分钟(每 5 秒查一次),到时候还没渲染完,就把一个"取餐码"交还给 AI:
{"status":"pending","taskId":"xxx"}工具说明里也写得明白:想查进度,带着这个 taskId 再调一次同一个工具。像奶茶店:饮品没做好,给你个小票,回头再问。
MCP 接入的异步任务同理——很多远程工具返回的就是RUNNING这类进行中状态,等着 AI 稍后再来查。
图 1:慢任务的正确姿势是给一张取餐码,不是原地罚站。
三、风暴:AI 没有"时间"这个概念
设计到这里都挺合理,直到你意识到一件事:AI 的世界里没有秒表。它的两次"回合"之间只隔一次推理,模型想"等 30 秒再问"和"立刻再问",花的是几乎一样的时间。
于是它非常自然地:立刻带着同样的参数再调一次 → 还是一句 pending → 再调 → 还是 pending……每一圈的代价是一格迭代预算加一次真金白银的模型调用,产出是零。预算烧完,保险丝熔断,循环结束——用户只看到一个没头没尾的回答,视频还在后台慢慢渲染。
像一位顾客每隔十秒问一次"我的奶茶好了吗",问到打烊,奶茶还没好,而他一口都没喝上。
图 2:结果一个字没变,预算一格一格少。
四、侦探的规矩:不看"问了几次",看"连着几次得到一模一样的答案"
系统为此装了一个重复调用侦探(ReInvocationDetector),它蹲在每轮工具执行结束的地方,规则简单到近乎朴素:
| 观察到的情况 | 动作 |
|---|---|
| 同一工具、同一参数、结果一字不差 | 连击数 +1 |
| 参数变了 / 结果变了 / 调用被跳过或转去等用户 | 归零 |
| 连击到2 | WARN:口头提醒 |
| 连击到3 及以上 | ESCALATE:加重语气 |
两个容易误会的地方。第一,它数的是连续,不是累计——查任务 A、查任务 B、再查 A,不算重复,因为第二次查 A 时结果可能真的变了;结果一变,警报自动解除,所以正常的"隔一会儿再查"完全不会被冤枉。第二,它管的是所有工具,不管是内置的视频生成还是 MCP 转来的异步接口,在侦探眼里都只是"名字 + 参数 + 结果"。
五、劝阻的方式:不断电,而是递上三条出路
侦探抓到现行之后,不会掐断调用,而是往对话里插一条只有 AI 看得见的旁白(系统称之为 steering 消息):
“你用相同参数重复调用工具,得到了完全相同的结果,已连续 2 次。在没有证据表明重试会有帮助之前,避免立即重复这些调用。”
到 ESCALATE 级别,语气会变成"重复仍在继续,请改变下一步行动",并附上三条具体的出路:
- 等一会儿再查——现场有 bash 工具的话,去做一次限时的 sleep,等完再查,且不许把"等"和"查"混在同一批调用里;
- 换个思路——调整参数、换方法,或者坦白卡在哪;
- 去问人——如果"继续等还是放弃"轮不到 AI 自己做主,就单独调用 ask_question:“视频还在渲染,要继续等待还是停止?”
第三条是硬闸门:ask_question 一触发,整个循环真的会暂停,页面把问题抛给你,AI 从此没电可烧——决策权交还到人。
图 3:旁白给的从来不是"不许问",而是"问之前,先选一条路"。
六、一句话总结
这套机制没有禁止 AI 催单,它只是把催单的代价摆到 AI 面前,再把"要不要继续等"从模型的瞎猜变回人的决定。好的护栏不是路障,是路牌。
普通使用者:记住两件事
AI 突然问你"继续等还是停止",不是客套。那是侦探确认它即将原地打转,把决策权交还给你——长视频值得等,临时改个头像不值得就停。
回答到一半戛然而止,八成是预算烧完了。迭代次数是最常见的隐形天花板,催单风暴又是烧预算最快的方式之一;重开一轮,或者把任务拆小,比盯着它更有用。