模型会偷懒,但是有节奏地偷懒——Budget-Aware Lazy Reasoning in Code LLMs
模型会偷懒,但是有节奏地偷懒
越想越好是个神话。推理投入的边际收益存在拐点,而 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 来决定:
- 用什么推理模式(直接生成 / 轻量 CoT / 全量 CoT + 工具调用)
- 分配多少 token 预算
- 是否触发多轮自省(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 的表层特征,不需要调用大模型,不需要跑任何推理。真正的推理预算分配发生在看过任务之后。
工程可行性
这个方案在工程上可以这样落地:
- 静态 diff 分析器:在调用 LLM 之前,用传统代码分析(CLOC、AST diff、 import 分析)得出任务复杂度特征
- Token Budget Enforcer:在 LLM API 层面强制设置
max_tokens上限,防止模型在简单任务上超支 - Fallback 策略:Direct 模式失败(代码质量低于阈值)时,自动升级到 Light CoT,再失败则升级到 Full CoT
这是一种成本可预期的 Agent 架构:每次推理的实际花费,在调用前就能估算出来,而不是等账单来了才知道。
核心隐喻:推理不是免费的。把它当成预算来分配,而不是当无限资源来燃烧。
💬 评论
💡 使用 GitHub 账号登录 即可参与讨论