更新于

reasoning_effort 参数的任务分级方法:如何按任务复杂度调档


推理模型(o 系列、GPT-5 系列)最容易被误用的地方,不是提示词写得不好,而是推理强度用错了档位。同一个任务,reasoning_effort 设高了浪费 token 和延迟,设低了又可能让模型跳步骤、答错。这篇文章讲清楚这个参数到底控制什么、怎么按任务类型分级,以及在实际业务里怎么落地一套”自动调档”的简单策略。

一、reasoning_effort 到底控制什么

reasoning_effort 是推理模型 API 里用来控制模型”内部思考量”的参数,常见取值是 low / medium / high(部分新模型细分到更多档位,比如 minimal)。它不改变模型权重,而是改变模型在给出最终答案前,允许自己生成多少”推理 token”——这部分 token 用户看不到,但计入用量和延迟。

关键认知有三点:

  1. 它是每次请求生效的运行时参数,不是模型选择。同一个模型,不同 reasoning_effort 是不同的成本和延迟曲线。
  2. 推理 token 是计费的。哪怕最终回复只有几十字,high 档下模型可能内部消耗几千 token 做链式推理,这部分费用比可见输出高得多。
  3. 不是所有任务都随档位提升而变准。简单任务设到 high 有时反而因为模型”想多了”而绕远路,输出更啰嗦甚至自我推翻。

一个实测直觉(以中等难度代码生成任务为例):

档位相对延迟相对 token 消耗典型适用场景
minimal / low1x1x格式转换、简单分类、已有明确规则的判断
medium2–4x3–6x多步骤代码生成、中等复杂度数据分析
high4–10x+8–20x+数学证明、复杂 debug、多约束规划

具体倍数因任务和模型版本而异,但”档位每上一级,成本不是线性增长而是跳跃增长”这个规律是稳定的。

二、按任务复杂度分级的实用方法

与其凭感觉设置,不如建立一套可复用的分级标准。可以从三个维度打分,再映射到档位。

维度一:步骤数量

任务需要几步中间推理才能到答案?

  • 1 步(如”这段文本是中文还是英文”)→ low
  • 2–4 步(如”从这段日志里提取错误类型并归类”)→ lowmedium
  • 5 步以上(如”设计一个数据库 schema 并解释每个外键约束的取舍”)→ mediumhigh

维度二:是否存在唯一正确答案

  • 有明确唯一答案、可验证(数学题、代码是否能跑通、逻辑谜题)→ 倾向调高档位,因为多花的推理 token 能实际换来正确率提升
  • 开放式、主观判断(文案润色、头脑风暴)→ 档位提升对质量提升有限,lowmedium 通常够用

维度三:错误代价

  • 错了容易被用户/下游立刻发现并修正(如聊天建议)→ 可以用低档位,靠人工兜底
  • 错了代价高、难发现(如财务计算、生产环境的自动化决策)→ 宁可多花成本调高档位

把三个维度合成一个简单的决策表:

def pick_reasoning_effort(steps: int, has_unique_answer: bool, error_cost_high: bool) -> str:
    score = 0
    score += 0 if steps <= 1 else (1 if steps <= 4 else 2)
    score += 1 if has_unique_answer else 0
    score += 1 if error_cost_high else 0

    if score <= 1:
        return "low"
    elif score <= 3:
        return "medium"
    else:
        return "high"

# 示例:提取结构化字段 —— steps=2, 无唯一答案, 错误代价一般
pick_reasoning_effort(steps=2, has_unique_answer=False, error_cost_high=False)
# => "low"

# 示例:多步财务对账逻辑 —— steps=6, 有唯一答案, 错误代价高
pick_reasoning_effort(steps=6, has_unique_answer=True, error_cost_high=True)
# => "high"

这套打分不追求精确,目的是把”设置 reasoning_effort”从拍脑袋变成有依据的团队约定,方便代码评审时被质疑和调整。

三、常见误区

误区一:全局统一设成 high”保险”。这是最常见的浪费来源。很多产品里 80% 的请求是简单分类、格式化、简单问答,统一用 high 会让整体 API 账单出现数量级差异,却对这部分简单任务的准确率没有实质提升。

误区二:任务变复杂了却没跟着调档。反过来,如果产品迭代中 prompt 逐渐堆叠了更多约束条件(比如从”总结这段话”变成”总结这段话,同时按情感分类,同时提取实体,同时给出置信度”),原来的 low 档位配置很可能已经不够用,需要重新评估。

误区三:把 reasoning_effort 当作 max_tokens 的替代品。两者是正交的——reasoning_effort 控制模型愿意”想”多少,max_tokens(或对应的输出长度限制)控制最终能”说”多少。压缩输出长度不能替代对推理强度的合理设置,反而可能让模型在思考不足的情况下被迫截断输出。

误区四:忽略档位对超时设置的影响high 档位下单次请求延迟可能是 low 档位的数倍,如果服务端超时时间是按低档位场景配置的,批量切换到高档位后要同步检查超时阈值,否则会出现大量请求被中断重试、实际成本翻倍的情况。

四、动态调档的工程实践

比静态分级更进一步的做法,是让系统在运行时动态决定档位,常见有两种模式:

模式一:分级路由。先用一个便宜的分类步骤(可以是规则,也可以是低档位模型)判断任务复杂度,再路由到对应 reasoning_effort 的正式请求。这类似于本站之前讨论过的模型选型策略里”先分诊、再对症”的思路。

模式二:失败重试升档。默认用较低档位处理,当输出未通过校验(比如格式不对、逻辑自检失败)时,自动用更高档位重试一次。这种策略在批量任务里能显著压低平均成本,代价是失败案例的延迟会更高——需要评估这个延迟波动业务是否能接受。

两种模式都需要基础设施支持,如果业务量不大,直接维护一份按任务类型分级的静态配置表(如第二节的打分表)往往性价比更高,不必一开始就上动态路由。

五、结合中转 API 使用时的注意点

如果通过 API 中转服务调用带 reasoning_effort 参数的模型,有两点需要额外确认:

  • 中转是否透传该参数。部分中转服务对请求体做过归一化处理,如果没有显式支持 reasoning_effort 字段,可能被静默丢弃,导致所有请求实际都跑在默认档位上,这类问题往往要抓包或对比响应里的 usage 字段才能发现。
  • 计费口径是否区分推理 token。有些中转按”总 token”统一计费,有些按官方标准区分可见输出与推理 token 分别计费,后者更能反映真实成本结构,便于按本文的分级方法做成本核算。

六、相关阅读

reasoning_effort 用对档位只是成本优化的第一步,搭配稳定透传参数、按真实用量计费的中转服务,才能把推理模型的成本真正管起来,YoTradeApi 支持主流推理模型的完整参数透传,方便按本文方法做精细化调优。