直接结论
推理强度是一项版本化推理控制,不是跨供应商统一标准,也不是观察模型私有算法的窗口。有的 API 暴露离散 Effort,有的使用 Adaptive Thinking,有的接受软 Token 预算,还有的模型不允许关闭思考。参数名、默认值、计费、输出可见性、工具行为和可选范围都可能随模型快照变化。
生产团队应把推理强度当作实验变量。冻结任务与答案契约,比较实际支持的设置,为最终答案预留空间,校验外部结果;只有路由器超过“始终低强度”和“始终高强度”两个简单基线后,才值得上线。
“思考模式”背后的四份契约
1. 控制契约
请求可能提供 low、high 等档位、Adaptive 模式,或类似 Token 的预算。控制项可能只是软指导,不是硬算力上限;不支持的值也可能直接让请求失败。
2. 计费契约
推理工作即使不可见,也可能计入生成 Token 上限、上下文窗口和账单。请求可能在完整答案出现前耗尽输出预算,因此成本分析必须包含全部生成工作、不完整响应、重试和最终合格结果。
3. 可见性契约
API 可能不返回推理,或只返回摘要、省略/加密块、模型生成的思维链文本。这些产物彼此不等价,不应默认持久化,也不能证明内部真的执行了某种搜索、验证或政策检查。
4. 对话与工具契约
不同供应商对跨轮推理状态、签名回传、模式切换后的 Prompt Cache、工具调用之间能否继续思考有不同约束。Adapter 必须保存供应商契约,不能把它误暴露为应用层通用不变量。
当前供应商接口模式
下表描述接口家族,不是永久产品规格。
| 供应商模式 | 当前公开控制项 | 关键边界 |
|---|---|---|
| OpenAI 推理模型 | 按模型变化的 reasoning.effort;部分模型另有 Reasoning Mode |
支持档位与默认值按模型变化;Reasoning Token 占用生成输出,可能产生 Incomplete Response |
| Anthropic Adaptive Thinking | 当前支持模型使用 thinking: {type: "adaptive"} 加 Effort |
新快照已弃用或拒绝固定 budget_tokens;展示的思考可能是摘要或省略 |
| Gemini 3 及之后 | 离散 thinking_level |
支持档位以及能否关闭思考取决于模型 |
| Gemini 2.5 系列 | 带模型特定范围和零值语义的 thinking_budget |
文档将预算定义为软上限;把新版本 Level 字段用于旧模型会报错 |
| 开源权重或托管混合模型 | 模型或 Runtime 特定的开关、预算、Template 或 Stop Token | 生成的 <think> 文本仍是模型输出,不是忠实审计轨迹 |
部署前必须阅读精确模型页面,并固定 Model ID、API Revision、SDK 版本、请求形状、响应字段、Usage 字段、Cache 行为和测试过的 Tool Sequence。
额外推理能做什么,不能做什么
在部分协议下,额外推理工作可能帮助模型探索候选、规划工具或解决多步骤问题,但它不能证明:
- 结果正确或有事实依据;
- 推理文字忠实反映因果过程;
- 模型有权访问数据或执行工具;
- 测试覆盖已经充分;
- 质量会提升固定幅度;
- 延迟和成本存在可迁移倍数。
DART 论文在特定数学与代码 Benchmark 上研究了直接回答与扩展推理之间的路由,同时指出一个重要测量伪影:单阶段对比可能因为共享生成上限截断最终答案,让推理路径看起来更差。这个结论支持预算感知的测试时算力实验设计,但不能证明 Draft Agreement 是通用生产路由器。
构建同预算评测
冻结任务单位
每个 Case 应包含:
- 输入与授权证据;
- 期望结果或可执行 Verifier;
- 合法拒答与升级行为;
- 工具和副作用政策;
- 最大答案与墙钟预算;
- 业务影响与切片标签。
不能把一个“难度”标签当作真值。短问题可能依赖最新证据,长问题也可能只是确定性转换。
比较完整策略
至少运行:
- 最低可用推理强度;
- 默认强度;
- 更高强度;
- 简单政策路由器;
- 只有前四项不足时,才加入学习式或多次调用路由器。
每个策略都要有足够空间输出最终答案,否则应把截断记录为独立结果。工具权限、检索、Prompt、Timeout 和评测器保持一致。若高强度方案使用了另一个模型快照,应明确它是“模型 + 强度”的复合变化。
测量用户真正收到的结果
| 指标 | 价值 |
|---|---|
| 任务成功率 | 关注最终结果,不看理由长度 |
| Verifier 误放/误拒 | 错误 Judge 会颠倒决策 |
| 不完整响应率 | 推理可能耗尽输出预算 |
| p50/p95/p99 延迟 | 长尾决定交互可靠性 |
| 总生成与计费单位 | 可见文本会低估真实工作 |
| Tool Call 与重试 | 推理可能放大外部操作 |
| 单个可验证任务成本 | 统一质量与开销 |
| 拒答与升级质量 | 对无证据和高风险案例关键 |
指标必须按任务切片报告。平均值可能掩盖这样的路由器:它在简单任务上省钱,却把高影响切片送进能力不足的模式。
安全路由架构
路由器应使用在目标工作负载上验证过的执行前或执行中信号。Prompt 长度、关键词、模型自信和可见推理长度都只是弱代理,除非已经校准。
使用一次有界升级,不要做无限循环。发生模糊超时后,应先对账 Tool 状态再重试。不能因为高强度响应没有返回,就重复付款、部署、发消息或删除。
Provider Adapter 要求
供应商无关请求可以描述意图:
质量档位:economical | balanced | thorough
硬输出上限
Deadline
Tool Policy
必需证据
Fallback Policy
Adapter 将意图映射到供应商真实支持的 API;映射不存在时必须拒绝,不能静默换成另一种模式。
每条 Trace 至少记录:
- Provider、Endpoint、Model Snapshot、SDK 与 API Revision;
- 抽象档位和实际映射参数;
- 可用时的 Input、Cached、Output 与 Reasoning Usage;
- Stop Reason、Incomplete Details、Tool Call、Retry 与延迟;
- Answer Verifier 结果和最终路由。
没有明确目的与保留策略时,不记录原始秘密、不受限 Prompt、私有 Tool Result 或 Reasoning Block。
可运行的 Go 路由器
下面的标准库示例为一个任务类别选择已经实测的模式。它先执行质量、不完整响应和延迟门禁,再最小化单个可验证任务成本。记录是模拟 Fixture。
package main
import (
"fmt"
"sort"
)
type ModeResult struct {
Name string
TaskSuccess float64
FalseAcceptRate float64
IncompleteRate float64
P95LatencyMS int
CostPerVerifiedTask float64
}
type Gate struct {
MinTaskSuccess float64
MaxFalseAcceptRate float64
MaxIncompleteRate float64
MaxP95LatencyMS int
}
func passes(result ModeResult, gate Gate) bool {
return result.TaskSuccess >= gate.MinTaskSuccess &&
result.FalseAcceptRate <= gate.MaxFalseAcceptRate &&
result.IncompleteRate <= gate.MaxIncompleteRate &&
result.P95LatencyMS <= gate.MaxP95LatencyMS
}
func main() {
gate := Gate{
MinTaskSuccess: 0.88,
MaxFalseAcceptRate: 0.01,
MaxIncompleteRate: 0.02,
MaxP95LatencyMS: 2500,
}
results := []ModeResult{
{Name: "low", TaskSuccess: 0.84, FalseAcceptRate: 0.008, IncompleteRate: 0.002, P95LatencyMS: 650, CostPerVerifiedTask: 0.010},
{Name: "medium", TaskSuccess: 0.90, FalseAcceptRate: 0.007, IncompleteRate: 0.006, P95LatencyMS: 1300, CostPerVerifiedTask: 0.017},
{Name: "high", TaskSuccess: 0.92, FalseAcceptRate: 0.006, IncompleteRate: 0.031, P95LatencyMS: 3100, CostPerVerifiedTask: 0.034},
}
eligible := make([]ModeResult, 0, len(results))
for _, result := range results {
if passes(result, gate) {
eligible = append(eligible, result)
}
}
if len(eligible) == 0 {
fmt.Println("route=review")
return
}
sort.Slice(eligible, func(i, j int) bool {
return eligible[i].CostPerVerifiedTask < eligible[j].CostPerVerifiedTask
})
fmt.Printf("route=%s cost_per_verified_task=%.3f\n",
eligible[0].Name,
eligible[0].CostPerVerifiedTask,
)
}
预期输出:
route=medium cost_per_verified_task=0.017
这个选择只对 Fixture 所代表的任务类别和政策有效。模型、Prompt、工具集、检索、输出上限或评测器变化后都要重跑实验。
常见失败模式
把高强度当作质量标记
更高强度可能改善一个切片,又损害另一个切片。保留低强度基线,用 Case 级成对分析定位究竟哪些失败发生了变化。
不检查共享的推理与答案上限
请求可能在输出必需答案前耗尽额度。监控 Incomplete Reason,并按照供应商契约为答案预留空间。
无条件相信第二个模型
LLM-as-a-Judge可能与候选共享偏差、偏好长答案,或被不可信内容操纵。应使用人工标签校准,Pairwise 测试随机化顺序,并保留确定性或可执行检查。
按表面形式路由
“出现数学符号就高强度”“Prompt 短就低强度”会漏掉困难事实、安全与工具任务。应按已经评测的任务契约与业务风险路由。
把推理文字当特权证据
可见理由可能不完整或不忠实。Anthropic 的推理忠实度研究显示,在其测试条件下,模型可能不在口头理由中提及真正影响答案的 Hint。审计应聚焦输入、来源、Tool Call、政策检查和实际副作用。
常见问题
推理强度等于 Temperature 吗?
不等于。Effort 控制供应商特定推理工作,Temperature 影响支持该参数的 API 的采样。部分推理模型版本会限制采样参数,不能假设二者独立且都可用。
可以关闭思考吗?
取决于模型。有些接口支持 Disabled 或 Minimal,有些强制推理,只能降低强度。不支持的组合可能直接报错。
Reasoning Token 会占用上下文吗?
它们通常计入生成输出与模型上下文会计,但精确语义取决于供应商。应检查部署模型返回的 Usage 与 Incomplete 字段。
路由器应该使用模型置信度吗?
只有在同任务、同版本的标注结果上校准后才可以作为信号。口头置信度与 Token 概率都不自动等于正确概率。
最安全的默认值是什么?
供应商默认值只能作为实验起点。生产默认值应该是通过任务质量、风险、延迟和恢复门禁后,成本最低的模式。