ImportError: print(“Missing dependency: pip install jsonschema ollama”)

用户在使用 Ollama 的 /api/chat 接口,通过 format 参数传递 JSON Schema 要求模型输出结构化数据(如函数调用、用户信息生成)时,返回的 content 字段为空数组 [] ,不符合 Schema 的约束(要求至少 1 个元素)。

ImportError: print("Missing dependency: pip install jsonschema ollama")

ImportError: print(“Missing dependency: pip install jsonschema ollama”)

快速结论:此报错并非真正缺少依赖,而是 Ollama 在处理复杂 JSON Schema(尤其是包含 oneOfconst 等关键字的嵌套结构)时,结构化输出未能正确生成有效 JSON,导致返回空数组 []。优先排查是否使用了复杂的 Schema 结构。

问题场景

用户在使用 Ollama 的 /api/chat 接口,通过 format 参数传递 JSON Schema 要求模型输出结构化数据(如函数调用、用户信息生成)时,返回的 content 字段为空数组 [],不符合 Schema 的约束(要求至少 1 个元素)。

报错原文

curl -X POST http://localhost:11434/api/chat -H "Content-Type: application/json" -d '{
  "model": "llama3.2",
  "messages": [{"role": "user", "content": "Create a random new user"}],
  "stream": false,
  "format": { 
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "array",
    "minItems": 1,
    "maxItems": 1,
    "uniqueItems": true,
    "items": {
      "oneOf": [
        { ... }
      ]
    }
  }
}'

# Output:
{
    "message": {
        "content": "[]"
    },
    "done_reason": "stop"
}

原因分析

Ollama 在处理含有 oneOfconst 等复杂约束的 JSON Schema 时,可能未能正确尊重结构化输出约束。尽管模型正常结束(done_reason: "stop"),但输出内容 [] 明显违反了 Schema 中 minItems: 1 的要求。用户测试发现,如果移除数组层级(即直接使用 oneOf 而非 items.oneOf),问题可能缓解。此外,Issue 评论指出 该 Schema 在 llama.cpp 的最新构建中工作正常,报错与 llama.cpp 无关,而是 Ollama 自身在处理嵌套 JSON Schema(尤其是 oneOf 结合 const)时存在缺陷

环境排查

  • 确认 Ollama 版本(可运行 ollama --version 查看)
  • 确认 llama.cpp 版本是否影响(本 Issue 中 llama.cpp 构建 4313 正常,Ollama 可能使用了旧版本的后端)
  • 确认模型是否为 llama3.2 或其他支持结构化输出的模型
  • 确认 Schema 中是否包含复杂关键字:oneOfconstminItemsuniqueItems

解决步骤

  1. 简化 Schema 结构(可优先尝试)
    尝试移除数组层级,直接使用 oneOf 顶层约束,而非包裹在 items.oneOf 内部。例如,将 type: "array"items 去掉,直接要求模型返回符合 oneOf 中任意一个对象模式的 JSON。

  2. 使用不带 oneOf 的平铺 Schema
    如果业务允许,将 oneOf 替换为更简单的字段组合(如使用 enumanyOf),或单独为每个函数调用发送不同的请求。

  3. 升级 Ollama 或更新后端
    由于 llama.cpp 已经支持该 Schema,可尝试升级 Ollama 到最新稳定版,或等待官方修复。升级后重启服务并重新测试。

  4. 使用 llama.cpp 直接调用作为临时规避
    如果紧急,可以暂时使用 llama.cpp 的 --json-schema 参数直接运行模型(用户评论中确认可正常工作)。具体命令参考:

    ./build/bin/llama-cli -m ./models/7B/ggml-model-f16.gguf --prompt "Create a new user" --json-schema '{"$schema": "...", "type": "array", ...}'
    

验证方法

修改 Schema 后重新发送相同的请求,检查返回的 content 字段是否为有效 JSON,并且符合 Schema 的约束(如数组包含至少 1 个元素,且字段正确)。也可以使用 jq .message.content 解析响应,并用 Python 的 jsonschema 库验证输出。

参考来源

ollama/ollama #8063 – Ollama Not Respecting Structured Outputs

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

celebrityanime
celebrityanime
文章: 7561

发表回复

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