Ollama produces invalid JSON when using thinking mode with structured output

当你在 Ollama 中同时启用 think: true (thinking 模式)和 format (结构化 JSON 输出)时, response 字段开头会出现重复的 {" ,导致下游 JSON 解析失败,报错核心为 Ollama produces invalid JSON when usin

快速结论:当你在 Ollama 中同时启用 think: true(thinking 模式)和 format(结构化 JSON 输出)时,response 字段开头会出现重复的 {",导致下游 JSON 解析失败,报错核心为 Ollama produces invalid JSON when using thinking mode with structured output。优先排查是否在结构化输出请求中同时开启了 thinking 模式。

适用环境:Issue 中确认的信息:Ollama 0.9.0,macOS,Apple GPU/CPU;后续评论提到 Ollama 0.9.6 同样出现该问题,并使用 qwen3 模型。评论中还提到 Gemma3 模型在 Ollama 0.7 及更新版本存在性能问题(与 KV cache 量化相关,属于另一条讨论线)。

最快修复方案:暂无确认的一步修复方案。Issue 中未给出官方修复或明确验证过的单步配置修正,仅提供了应用侧 JSON 解析器的临时绕过方案(见下方“解决步骤”)。

注意事项:下方绕过方案属于用户评论中提供的临时 workaround,并非官方修复,且只针对 {"{" 前缀这一已知畸形模式;如果模型输出出现其他变形(如多余换行、缺少闭合括号等),该方案不一定适用。是否升级 Ollama 版本能彻底解决,Issue 中没有明确验证结论。

问题场景

用户通过 Ollama 的 /api/generate 接口调用 qwen3:0.6b 模型,同时请求两件事:thinking 模式(think: true)和结构化输出(format 指定 JSON Schema,要求返回包含 summary 字符串字段的对象)。返回结果中 response 字段不是合法 JSON,而是以 {"{ 开头,导致后续依赖 JSON 解析的链路(如 LangChain 的 JsonOutputParser)报错。当把 think 设为 false 时,response 是合法 JSON。

报错原文

Ollama produces invalid JSON when using thinking mode with structured output

response: "{\"{\"summary\": \"This is a test post about Python programming...\"}\n"

注意 response 开头出现两次 {":
{"{

关闭 thinking 后正常返回:

"response":"{\n  \"summary\": \"This test post is about Python programming...\"\n}"

原因分析

可能原因是:当 think: true 与 format(结构化 JSON 输出)同时启用时,Ollama 在生成 JSON 的流程中重复拼接了开头左花括号,导致 response 以 {"{ 这种畸形前缀开始。Issue 正文的复现结果显示,关闭 thinking 模式后输出恢复正常,说明该问题与 thinking 模式下的输出处理路径有关。评论中还有用户提到“结构化输出请求时 thinking 过程被省略”,但这被作者标注为“另一个话题”,不能直接当作本问题的根因。Issue 未给出官方定位结论,因此这里以现象和复现条件为准。

环境排查

  • 确认 Ollama 版本:Issue 报告为 0.9.0,后续评论提到 0.9.6 仍存在。
  • 确认操作系统:macOS;GPU/CPU 为 Apple。
  • 确认模型:qwen3:0.6b,评论中提到 qwen3 系列。
  • 确认请求参数:是否同时设置了 think: true 和 format(JSON Schema)。
  • 确认解析链路:下游是否使用 LangChain JsonOutputParser 或其他严格 JSON 解析器。
  • 如涉及 Gemma3:检查是否设置了 OLLAMA_KV_CACHE_TYPE(评论中用户反馈移除该变量后 Gemma3 性能恢复,但这与本 Issue 的 JSON 畸形问题不是同一现象)。

解决步骤

  1. 先做最小复现:用 Issue 中的 curl 请求,分别测试 think: true 和 think: false,对比 response 字段开头是否为 {"{。
  2. 确认问题确实只在 think: true + format 组合下出现;如果关闭 thinking 后 JSON 合法,则符合本 Issue 的现象。
  3. 如果业务上可以接受,优先关闭 thinking 模式,让 response 直接返回结构化 JSON(Issue 中已验证此路径返回合法 JSON)。
  4. 如果必须保留 thinking 模式,可优先尝试应用侧解析器绕过:继承 JsonOutputParser,在 parse_result 中对缓冲区做前缀修正。评论中给出的可行做法是:当缓冲区以 {"{" 开头时,替换为 { + 去掉前 3 个字符后的内容,再调用 parse_json_markdown 解析。
  5. 将该修正放在流式/非流式解析之前,解析成功后清空缓冲区;捕获 JSONDecodeError,在 partial 模式下返回 None,否则抛出 OutputParserException。
  6. 如果不想在应用层打补丁,可关注 Ollama 后续版本是否修复该 thinking + structured output 组合问题;Issue 中未给出明确的版本修复结论。

验证方法

用相同的 curl 请求(think: true + format)重新调用,检查返回的 response 字段是否不再是 {"{ 开头,并能被标准 JSON 解析器成功解析。如果使用应用侧绕过方案,则确认原本抛出的 OutputParserException: Invalid json output 不再出现,且解析出的对象包含 summary 字段。若切换为 think: false 后 JSON 始终合法,可作为对照验证。

参考来源

ollama/ollama #10929

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 25531

发表回复

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