Nemotron 3 reasoning-effort controls (chat_template_kwargs.enable_thinking/low_effort, reasoning_budget) silently ignored on both /v1/chat/c

在 Ollama 的 OpenAI 兼容端点(/v1/chat/completions)中使用 NVIDIA Nemotron 3 模型时,官方推荐的 reasoning-effort 控制字段(chat_template_kwargs.enable_thinking/low_effort、reas

快速结论:在 Ollama 的 OpenAI 兼容端点(/v1/chat/completions)中使用 NVIDIA Nemotron 3 模型时,官方推荐的 reasoning-effort 控制字段(chat_template_kwargs.enable_thinking/low_effort、reasoning_budget)会静默失效,因为 Ollama 不支持 extra_body 字段解析。正确的替代方案是使用 OpenAI 标准参数 reasoning_effort(取值 none / medium / high)来控制思考深度。

适用环境:Ollama 0.20.4,模型 nemotron-3-super:120b(nemotron_h_moe 架构,Q4_K_M 量化),已确认可在 OpenAI 兼容路由和原生 /api/chat 路由复现。

最快修复方案:在 OpenAI 兼容端点中,改用 reasoning_effort 参数替代 chat_template_kwargsreasoning_budget。Ollama 维护者实测:reasoning_effort="none" 产生 0 字符思考内容,"medium" 约 1241 字符,"high" 约 1790 字符,控制效果方向正确且可预期。

注意事项:Ollama 原生路由(/api/chat)对 Nemotron 3 的 reasoning 控制字段支持情况在 Issue 中未被验证修复,如果必须使用原生路由,需等待后续版本支持或改用 OpenAI 兼容路由。

问题场景

用户运行 Ollama 0.20.4 并加载 NVIDIA Nemotron 3 120B 模型,先后通过 OpenAI 兼容路由(POST /v1/chat/completions,字段放在 extra_body 中)和原生路由(POST /api/chat,字段提升为顶层键)发送相同的代码审查提示词,期望通过 chat_template_kwargs.enable_thinkingchat_template_kwargs.low_effortreasoning_budget 控制模型的思考深度和推理预算。实测中这些字段对生成的 reasoning 内容量没有产生方向一致的调节效果,且 enable_thinking=false 时生成的 reasoning 反而比无约束基线更多。

报错原文

Nemotron 3 reasoning-effort controls (chat_template_kwargs.enable_thinking/low_effort, reasoning_budget) silently ignored on both /v1/chat/completions and /api/chat
A3 (reasoning explicitly **off**) produced **more** reasoning (19372 chars) than the unconstrained A0 baseline (13224 chars) — reasoning was not suppressed at all.
A2 (smaller budget, 256) produced **more** reasoning than A1 (larger budget, 1024) on both API surfaces (9846 > 7776 compat; 14707 > 7153 native) — budget ordering is inverted, not merely noisy.

原因分析

可能原因:extra_body 并不是 OpenAI API 规范的标准部分(参考 OpenAI Chat Completions API 官方文档字段列表),因此 Ollama 的 OpenAI 兼容端点在解析请求时不会读取 extra_body 下嵌套的 chat_template_kwargsreasoning_budget,这些字段实际上从未到达模型的 chat template 或采样器。用户在 Issue 中观察到的 reasoning 长度波动,本质上是模型默认 temperature=1 下的随机采样噪声,不是字段控制的结果。Ollama 对思维链/推理深度的标准控制方式是通过 OpenAI 兼容端点中的 reasoning_effort 参数实现,它不在 extra_body 中传递,而是作为请求顶层字段。

环境排查

  • 确认 Ollama 版本:Issue 报告为 0.20.4,建议升级到最新版后重测 reasoning_effort 支持情况
  • 确认模型拉取参数:使用 ollama show --parameters 检查模型 blob 上是否设置了 temperature、top_p 等默认值
  • 检查调用端代码是否把 reasoning_effort 放在请求顶层(而非 extra_body 内)
  • 确认使用的 API 端点:OpenAI 兼容路由为 /v1/chat/completions,原生路由为 /api/chat

解决步骤

  1. 停止在 extra_body 中传 chat_template_kwargsreasoning_budget,该字段不是 OpenAI API 标准部分,Ollama 不会解析。
  2. 改用 OpenAI 兼容端点,在请求顶层传入 reasoning_effort 字段,取值可为 "none""medium""high",分别对应关闭思考、中等思考深度、高思考深度。
  3. 如需精细控制推理预算(如 NVIDIA RAG 2.5 指南推荐的 low_effort=true + reasoning_budget=256),可优先尝试结合 reasoning_effort=”medium” 与系统提示词中的长度约束来近似实现。
  4. 如果必须使用原生路由 /api/chat,可优先尝试将 reasoning_effort 作为顶层请求键传入;该方案在 Issue 中未被验证,仅作为推测性替代。

验证方法

使用 curl 对同一模型和相同的简单提示词分别发送 reasoning_effort="none""medium""high" 请求,检查返回的 choices[0].message.reasoning 长度。如果控制生效,应观察到 none 约为 0 字符、medium 适中、high 最长(Ollama 维护者实测参考值:none=0,medium=1241,high=1790)。另外可用一组重复请求(建议 7 次以上)验证字段效果的方向一致性是否稳定,排除温度=1 的采样随机性干扰。

参考来源

ollama/ollama #17785

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 22017

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注