`/api/generate` with `think:true` leaks Qwen reasoning into `response`, while `/api/chat` separates it

当你在 Ollama 中用 `/api/generate` 并设置 `"think": true` 调用带 `thinking` 能力的 Qwen 模型(如 `qwen3:14b`)时,如果返回的 `response` 里混入了完整的 ... 内容、而 `thinkin

快速结论:当你在 Ollama 中用 `/api/generate` 并设置 `”think”: true` 调用带 `thinking` 能力的 Qwen 模型(如 `qwen3:14b`)时,如果返回的 `response` 里混入了完整的 <think>...</think> 内容、而 `thinking` 字段为空,通常说明你正在使用过期的本地模型版本或偏旧的 Ollama。优先检查并更新 `qwen3:14b` 模型和 Ollama 本体。

适用环境:Issue 已确认环境为 Ollama 0.34.0(Windows / Nvidia GPU / Intel CPU),模型为 `qwen3:14b`,请求为非流式 `POST /api/generate`,参数包含 `”think”: true`、`”stream”: false`、`options: {temperature:0, seed:1, num_predict:2048}`。后续作者升级到 Ollama 0.34.2 并更新模型后不再复现。

最快修复方案:ollama pull qwen3:14b 拉取最新模型,并升级 Ollama 到 0.34.2(或更新版本),然后重跑相同的 `/api/generate` 请求。Issue 作者正是通过这两步更新后恢复正常。

注意事项:由于作者同时更新了模型和 Ollama,无法确定是哪一项单独修复了问题,因此建议两项都更新。升级前可用 ollama list 记录旧的模型 ID 以便回退。

问题场景

用户在本地运行 Ollama 服务,用非流式 /api/generate 请求 qwen3:14b,并设置顶层参数 "think": true。模型声明支持 `thinking` 能力,但返回结果中,完整的 <think>...</think> 推理内容被塞进了 response 字段,而本该承载推理过程的 thinking 字段长度为 0。对同样的模型与提示,/api/chat 请求能正确把推理分离到 message.thinking,只把最终答案放到 message.content。两个请求的 prompt、seed、temperature、num_predict 均一致,且都以 done_reason: "stop" 正常结束,未使用 stopformat、tools 或 raw 模式。

报错原文

/api/generate
done_reason=stop
eval_count=160
response_len=752
thinking_len=0
response starts with "<think>\nOkay, the user wants me to reply..."
response contains both <think> and </think>

/api/chat
done_reason=stop
eval_count=163
message.content="OK"
message.thinking_len=729
message.content contains no thinking tags

原因分析

维护者最初怀疑 GenerateHandler 在配置了内置 parser 时会跳过 thinking 标签抽取,即使该 parser 并不处理 thinking。这可以解释为什么 <think> 块残留在 response 中。但随后维护者修正了说法:handler 测试中复现的失败是在显式配置内置 qwen3 parser 的情况下出现的,而当前 qwen3:14b 的 registry 配置并未声明该 parser,因此这并不能作为上报行为的确定原因。

问题最终由上报者自己定位:他使用的是 16 个月前发布的旧版 qwen3:14b(模型 ID 7d7da67570e2)。在更新模型到 bdbd181c33f2、并把 Ollama 从 0.34.0 升级到 0.34.2 之后,/api/generate 就能正确把推理写进 thinking。由于两项同时变更,无法确定单独哪一项决定了修复。

环境排查

  • 确认 Ollama 版本:ollama -v,若为 0.34.0 及更早,考虑升级到 0.34.2 或更新。
  • 确认 qwen3:14b 的模型 ID 与拉取时间:ollama list。出现问题的旧模型为 7d7da67570e2(约 16 个月前)。
  • 确认请求参数:非流式、顶层 think: true、未使用 format/tools/raw/stop。
  • 确认返回值中 response 是否仍含 <think>/</think> 标签、thinking 是否为空。
  • 操作系统/GPU 在本 Issue 中为 Windows + Nvidia + Intel,但这不是问题成因的直接证据。

解决步骤

  1. ollama -v 查看当前 Ollama 版本。
  2. ollama list 记录 qwen3:14b 当前的模型 ID,便于必要时回退。
  3. 执行 ollama pull qwen3:14b 拉取最新版模型。
  4. 将 Ollama 升级到 0.34.2 或更新版本(Windows 下重新运行官方安装包即可)。
  5. 重启 Ollama 服务,再次发起原本的非流式 /api/generate 请求,观察 responsethinking 字段。

验证方法

重新执行上报中的请求,例如:

curl -s http://localhost:11434/api/generate -d '{
  "model": "qwen3:14b",
  "prompt": "Reply with exactly OK after thinking.",
  "think": true,
  "stream": false,
  "options": {"temperature": 0, "seed": 1, "num_predict": 2048}
}' | jq '{response,thinking}'

预期结果:response 只包含最终答案(如 "OK"),不含 <think>/</think> 标签;thinking 字段非空并包含推理内容。若与 /api/chat 的输出行为一致,即说明问题已解决。

参考来源

ollama/ollama #18554

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 24788

发表回复

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