Ollama produces invalid JSON when using thinking mode with structured output

这个报错通常出现在 Ollama 的 /api/generate 接口同时启用 think: true 与 format 结构化输出时,返回的 response 字段会在开头多出一个 { ,形成非法的 JSON。优先排查 think 与结构化输出叠加的场景。

快速结论:这个报错通常出现在 Ollama 的 /api/generate 接口同时启用 think: trueformat 结构化输出时,返回的 response 字段会在开头多出一个 {,形成非法的 JSON。优先排查 think 与结构化输出叠加的场景。

适用环境:Issue 中确认的环境为 macOS、Apple GPU/CPU、Ollama 0.9.0,模型为 qwen3:0.6b;另有用户在 Ollama 0.9.6 上报告同类问题。

最快修复方案:暂无确认的一步修复方案。可优先尝试的临时手段是在解析前修正响应前缀,例如评论中给出的 CustomJsonOutputParser 将开头的 {"{" 改为 {;或改用 think: false 获取合法 JSON。

注意事项:上述前缀修正属于调用方打补丁,并非官方修复,且只针对 {"{" 这一已知异常前缀;关闭 thinking 后 Issue 提到结构化输出中的 thinking 过程会被省略,这属于另一话题,可能带来行为差异。

问题场景

用户通过本地 Ollama 服务的 /api/generate 接口调用 qwen3:0.6b 模型,在请求体中同时设置 "think": true"format"(JSON Schema 结构化输出)时触发。表现为返回体会在 response 字段开头输出重复的左花括号,导致下游 JSON 解析失败。同一请求在 think: false 时能返回合法 JSON。

报错原文

Ollama produces invalid JSON when using thinking mode with structured output

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

Note `{"` occurs twice at the beginning of `response`.

原因分析

从 Issue 证据看,问题集中在 think: trueformat 结构化输出同时启用时的响应拼接逻辑:模型输出被以某种方式拼接,使 response 开头出现 {"{",从而产生非法 JSON。评论中有人将其归类为结构化输出相关的异常前缀问题,并给出针对该前缀的解析器补丁。

此外,评论中另一位用户提到在 Ollama 0.7 及更新版本(含 0.9.0)配合 Gemma3 模型时遇到性能问题,移除 OLLAMA_KV_CACHE_TYPE(原为 q8_0)后恢复,怀疑与 KV cache 量化有关。该反馈与本 Issue 的 JSON 非法前缀是否同源,Issue 中未给出明确证据,只能视为可能相关的背景信息,不要直接当作本问题的根因。

环境排查

  • 确认 Ollama 版本:Issue 报告为 0.9.0,另有用户报告 0.9.6 上仍有同类问题。
  • 确认模型:Issue 使用 qwen3:0.6b
  • 确认请求参数:是否同时设置了 "think": true"format"
  • 确认操作系统与硬件:Issue 为 macOS、Apple GPU/CPU。
  • 如遇性能异常,检查是否设置了 OLLAMA_KV_CACHE_TYPE(评论中涉及 q8_0,但属另一反馈,需与 JSON 问题区分验证)。

解决步骤

  1. 先用最小复现请求确认问题:think: true + format 请求 /api/generate,观察 response 是否以 {"{" 开头。
  2. 对照测试 think: false 的同一请求,确认此时 response 是否为合法 JSON,以定位问题与 thinking 模式的关联。
  3. 如需保留 thinking 模式,可优先尝试在调用方解析前修正异常前缀,例如评论中提供的思路:当缓冲区以 {"{" 开头时,将其替换为单个 {,再交给 JSON 解析器。
  4. 若下游不依赖 thinking 的中间过程,可优先尝试临时改为 think: false 来规避非法 JSON,但需注意结构化输出中 thinking 过程可能被省略。
  5. 关注该 Issue 的后续状态与 Ollama 官方修复;截至 Issue 关闭时间,正文与评论中均未给出一行式的官方配置修复。

验证方法

重新发送开启 think: trueformat 的请求,检查返回体 response 字段是否为可被标准 JSON 解析器成功解析的字符串,即开头不再出现重复的 {"{";同时确认下游解析器(含自定义补丁)能正常返回结构化对象。

参考来源

ollama/ollama #10929

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 25051

发表回复

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