模型会偷懒,但是有节奏地偷懒

越想越好是个神话。推理投入的边际收益存在拐点,而 Claude Code 和 Copilot 的使用者每天都在为这个拐点付代价。

核心问题:不是”想不想”,是”值不值”

LLM 的推理成本是 token 数量乘以每 token 价格。对于代码任务:

  • 一个简单的变量重命名:3 个 token 能解决,触发 512 token 的 CoT(Chain-of-Thought)是浪费
  • 一个涉及多文件依赖的重构:省掉 CoT 可能会漏掉边界情况,多花 5 倍 token 是值得的

传统做法:要么全局开 CoT,要么全局关 CoT。

真实需求:根据任务的内在复杂度,动态决定推理投入。

Lazy Reasoning Scheduler 的工作方式

核心框架:给每个代码任务一个预期修复收益(Expected Fix Benefit, EFB),用 EFB 来决定:

  1. 用什么推理模式(直接生成 / 轻量 CoT / 全量 CoT + 工具调用)
  2. 分配多少 token 预算
  3. 是否触发多轮自省(self-reflection loops)

EFB 的计算

EFB 估算三个因子:

因子一:任务复杂度估计

  • diff 大小(文件数 × 修改行数)
  • 涉及的包/模块数量
  • 是否涉及跨语言边界(如 Python 调用 C 扩展)
  • 是否触及测试文件(修改测试往往比修改实现更复杂)

因子二:失败历史信号

  • 这个文件/模块最近被修改过几次(高频修改区往往是复杂区)
  • 之前的类似任务需要几次修复迭代
  • CI 最近是否有相关报错

因子三:上下文稀缺度

  • 所需上下文(其他文件、文档、依赖API)是否已在 context window 中
  • 如果需要频繁跨文件检索,全量推理能更好利用已有的宽 context

推理模式分级

模式 触发条件 典型 token 预算
Direct EFB 低,diff 简单 32-128 tokens
Light CoT EFB 中,有分支逻辑 256-512 tokens
Full CoT + Tools EFB 高,涉及多文件或复杂控制流 1024-4096+ tokens
Multi-round Reflection 前轮输出置信度低,触发重试 叠加计算

关键洞察:边际收益曲线是反的

这个工作的反直觉发现在于:对于简单任务,Direct Generation 的质量实际上高于 CoT 版本。

原因是:CoT 引入的中间推理步骤在简单任务上会产生干扰噪声。模型在”我应该返回一个字符串”这个任务上,不需要先想”字符串是由字符序列组成的…“这类废话,这些废话反而会轻微扰乱输出的格式。

这对应了人类的经验:专家做简单决策更快,不是因为想得少,而是因为路径短。新手才会在简单事情上过度分析。

对 CI 内 Agent 的影响

最直接的应用场景:CI 中的 Agent 评审。

CI 场景的特点:

  • 大量 PR 需要评审,频率高,总 token 消耗巨大
  • 90% 是简单改动(typo、格式、small fix)
  • 10% 是重大逻辑变更,需要深入分析
  • Token 预算在 CI 环境里是真实金钱

Lazy Reasoning Scheduler 的价值:把 90% 简单 PR 的评审成本从”全量 CoT”降到”Direct”,把省下来的 token 预算集中给那 10% 复杂 PR。

这不是省小钱。这是把推理资源从噪声转移到信号。

与现有方法的关键区别

方法 策略
固定 CoT 无脑全开,浪费简单任务
固定 Direct 无脑全关,复杂任务质量不足
Mix-of-Experts 路由 模型自己学路由,但路由决策本身消耗 token
Lazy Reasoning 先低成本估计 EFB,再决定是否花大钱

Lazy Reasoning 的核心效率在于:决策本身很便宜。估计 EFB 只需要看 diff 的表层特征,不需要调用大模型,不需要跑任何推理。真正的推理预算分配发生在看过任务之后。

工程可行性

这个方案在工程上可以这样落地:

  1. 静态 diff 分析器:在调用 LLM 之前,用传统代码分析(CLOC、AST diff、 import 分析)得出任务复杂度特征
  2. Token Budget Enforcer:在 LLM API 层面强制设置 max_tokens 上限,防止模型在简单任务上超支
  3. Fallback 策略:Direct 模式失败(代码质量低于阈值)时,自动升级到 Light CoT,再失败则升级到 Full CoT

这是一种成本可预期的 Agent 架构:每次推理的实际花费,在调用前就能估算出来,而不是等账单来了才知道。


核心隐喻:推理不是免费的。把它当成预算来分配,而不是当无限资源来燃烧。