快速结论:当你在 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 畸形问题不是同一现象)。
解决步骤
- 先做最小复现:用 Issue 中的
curl请求,分别测试think: true和think: false,对比response字段开头是否为{"{。 - 确认问题确实只在
think: true+format组合下出现;如果关闭 thinking 后 JSON 合法,则符合本 Issue 的现象。 - 如果业务上可以接受,优先关闭 thinking 模式,让
response直接返回结构化 JSON(Issue 中已验证此路径返回合法 JSON)。 - 如果必须保留 thinking 模式,可优先尝试应用侧解析器绕过:继承
JsonOutputParser,在parse_result中对缓冲区做前缀修正。评论中给出的可行做法是:当缓冲区以{"{"开头时,替换为{+ 去掉前 3 个字符后的内容,再调用parse_json_markdown解析。 - 将该修正放在流式/非流式解析之前,解析成功后清空缓冲区;捕获
JSONDecodeError,在 partial 模式下返回None,否则抛出OutputParserException。 - 如果不想在应用层打补丁,可关注 Ollama 后续版本是否修复该 thinking + structured output 组合问题;Issue 中未给出明确的版本修复结论。
验证方法
用相同的 curl 请求(think: true + format)重新调用,检查返回的 response 字段是否不再是 {"{ 开头,并能被标准 JSON 解析器成功解析。如果使用应用侧绕过方案,则确认原本抛出的 OutputParserException: Invalid json output 不再出现,且解析出的对象包含 summary 字段。若切换为 think: false 后 JSON 始终合法,可作为对照验证。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


