全部教程

原创专题

Ollama 结构化输出:用 format 传 JSON Schema,再校验返回值

给 /api/chat 的 format 传入 JSON Schema,并在客户端解析、校验 message.content,写入下游之前先拦住格式和字段错误。

AI Nav City撰写 / 更新 资料核验

让本地模型输出 JSON,难点是下游能不能放心使用。本文目标是从一段合成故障说明里取出 title、severity 和 steps 三个字段,并在写入任何系统前完成校验。前提是本机已有可用于 /api/chat 的模型,且 Ollama 在本地运行;官方页注明 Ollama 云端目前不支持结构化输出。这里只依据官方页写出请求并离线校验样例回复,没有启动 Ollama,也没有调用任何模型。

操作与验收顺序

  1. 写契约

    先定字段、类型和必填项,再生成 JSON Schema。[1]

  2. 构造请求

    format 放 Schema,stream 设为 false。[1]

  3. 解析并校验

    先解析 message.content,再用 Schema 校验,失败就不写入。[1]

分步检查输入、操作和结果;执行范围见末节。

先写 Schema 和必填字段

原创练习的输出是一条故障记录:title 为字符串,severity 只能是 low、medium、high,steps 是字符串数组,三项都必填。官方页的做法是把 JSON Schema 传给 format 字段,并建议同时把这份 Schema 以字符串形式放进提示词,帮助模型对齐。Python 可以用 Pydantic 的 model_json_schema(),JavaScript 可以用 Zod 的 z.toJSONSchema(),同一份定义既生成 Schema,也用于之后的校验。[1]

构造 /api/chat 请求

请求体含 model、messages、stream 和 format 四项:stream 设为 false,format 放上面的 Schema 对象。官方页的 curl 示例就是这个形态,模型名用的是 gpt-oss;你本机是否有该模型没有核实,请换成已下载的模型。官方页还建议把 temperature 设为 0 以获得更确定的结果,但只在 Python 示例里用 options 演示,REST 请求体里怎么放,本页没写,去 API 参考页确认后再加。format 写成字符串 json 时没有字段定义,字段要靠你自己校验。[1]

message.content 是字符串:先解析再校验

官方页的 Python 与 JavaScript 示例都是先取 message.content,再用 model_validate_json 或 Zod 的 parse 解析,写法表明 JSON 在字符串里,需要自己解析。离线用 Ajv 做了 8 项合成回复检查:合规回复通过;缺少 steps、severity 为 urgent、steps 里混入数字都被拒绝;被截断的 JSON 和包在代码围栏里的 JSON 在解析阶段就失败。示例 Schema 没写 additionalProperties: false,多出的 note 字段照样通过;下游要求严格时,在客户端 Schema 里自己加这一条。[1]

失败处理与检查范围

解析失败、校验失败或必填字段缺失时,不要写入下游,也不要在原响应上手工补字段;记录原始响应后重试或交给人工。本文练习的 Schema 用了 enum,官方页的示例用的是 Pydantic 的 Literal 字段,服务端是否严格按 enum 约束输出没有验证,所以客户端校验不能省。离线只检查了 curl 脚本的 bash 语法、请求体 JSON 与样例回复;没有运行 Ollama,也不能说明任何模型的抽取准确率。[1]

本文来源

本站原创整理;官方说明与编辑建议分别标注。

  1. Ollama · 核验来源
    查看资料