Ollama 本地模型怎么输出 JSON?用 JSON Schema 提取字段并验证结果

在 Ollama 本地 Chat API 中传入 JSON Schema,提取工单类型和编号,并分别检查生成完成、字段结构与原文事实。

让 Ollama 本地模型输出固定字段,可以在 /api/chat 的 format 中传 JSON Schema,再对 message.content 做 JSON 解析和规则校验。Schema 约束字段结构,原文事实仍要逐项核对。下面提取一条演示工单的类型和编号,不创建订单、不执行退款。

本文依据为 2026 年 10 月 1 日读取的官方资料,未在读者的本地模型上运行。工单和预期字段为虚构验证输入,不是实测模型输出。不同模型遵循约束的表现需要用自己的样本核对。

Ollama 本地模型怎么输出 JSON?用 JSON Schema 提取字段并验证结果

前提:本地服务已经能完成普通对话

先执行 ollama list,选择已经下载且支持文本对话的本地模型,记录完整标签。本文不要求重新安装或下载特定大模型,也不把显存数字当作兼容性结论。

Ollama 结构化输出说明区分 format=”json” 与提供完整 Schema:前者主要约束 JSON 格式,后者约束具体结构。该说明当前注明 Ollama Cloud 不支持这项结构化输出,不能把本机示例地址替换为云地址后假定能力相同。

定义字段,也定义“没出现”的情况

例子只接收 category 和 ticket_id。category 允许“物流、退款、其他”,ticket_id 允许字符串或 null;原文没有编号时填 null,不能创造一个符合格式但没有出处的编号。additionalProperties=false 用于拒绝多余字段。

在独立环境安装 requests 和 jsonschema:python -m pip install requests jsonschema。将代码保存为 ollama_fields.py,运行 python ollama_fields.py –model 后接 ollama list 中的实际标签。

import argparse
import json
import requests
from jsonschema import validate

parser = argparse.ArgumentParser()
parser.add_argument("--model", required=True)
args = parser.parse_args()
schema = {
    "type": "object",
    "properties": {
        "category": {"type": "string", "enum": ["物流", "退款", "其他"]},
        "ticket_id": {"type": ["string", "null"]},
    },
    "required": ["category", "ticket_id"],
    "additionalProperties": False,
}
text = "演示工单 T-100:包裹物流停了三天,请帮忙核实。"
response = requests.post("http://127.0.0.1:11434/api/chat", json={
    "model": args.model,
    "messages": [{"role": "user", "content":
        "只提取原文事实;缺失编号填 null。按以下 Schema 返回 JSON:"
        + json.dumps(schema, ensure_ascii=False) + "\n原文:" + text}],
    "format": schema,
    "stream": False,
    "options": {"temperature": 0},
}, timeout=180)
response.raise_for_status()
payload = response.json()
if not payload.get("done"):
    raise ValueError("生成尚未完成")
content = payload["message"]["content"]
result = json.loads(content)
validate(instance=result, schema=schema)
print(result)
assert result == {"category": "物流", "ticket_id": "T-100"}

官方文档建议把 Schema 同时作为字符串放入提示词,帮助模型对齐输出目标;temperature=0 用于减少采样变化,不是事实正确保证。Chat API 文档可核对 format、stream、options、done 和 message 字段。

用三层检查决定是否进入下游

  1. 请求层:HTTP 成功且 done 为真,返回字段完整。失败时保留状态和错误,不把错误响应当正文解析。
  2. 结构层:json.loads 成功,jsonschema 检查必需字段、枚举、类型和多余字段。不能靠正则从一大段解释里随意抠一个对象就宣布符合协议。
  3. 事实层:编号 T-100 确实来自输入,类型是物流。结构合法但编号编造,仍判失败并禁止交给业务动作。

jsonschema 官方验证接口说明 validate 会针对不符合 Schema 的实例抛出 ValidationError。实际程序需要捕获并保存该异常,交给补充或人工核对流程,而不是静默填默认值。

再测没有编号与未知类别

将 text 改为“演示消息:请问店铺几点营业?”,人工目标是 category=其他、ticket_id=null。对应断言也改为这个目标。再检查没有编号的物流消息是否仍输出 null;保留每条输入、实际对象和校验结果。

不要把“期望对象”直接放进待测原文,也不要把本文断言当成模型已经实测成功的证明。真实上线前应包括拼写变化、长消息、多个编号和不能确认类型的样本,并规定需要人工处理的情况。

失败时先确认是哪一层

  • 连接失败:先检查本地服务,不先调整 Schema。
  • 标签错误:从 ollama list 读取真实本地标签,不自动切到另一个模型。
  • JSON 或字段校验失败:保存原始 content,检查版本、模型和所用 Schema;不给下游发送半成品对象。
  • 字段结构正确但内容不符:改提取任务与事实核对规则,不能仅靠增加 Schema 字段解决语义错误。

读者下一步是先跑两条固定演示输入,把“已生成、结构合法、事实正确”分别记录。只有三项都通过,才能把同一接口用于自己的受控资料。

Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/31972.html

赞 (0)
AI小管家的头像AI小管家
LM Studio 怎么本地部署 DeepSeek 并提供 API?下载模型、启动服务与请求验证
上一篇 2小时前
RAG 的 PDF 文本怎么提取?用 PyMuPDF 保存页码、文本块和坐标
下一篇 2小时前

相关推荐

联系我们

联系我们

1

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
关注微信
分享本页
返回顶部