让 Ollama 本地模型输出固定字段,可以在 /api/chat 的 format 中传 JSON Schema,再对 message.content 做 JSON 解析和规则校验。Schema 约束字段结构,原文事实仍要逐项核对。下面提取一条演示工单的类型和编号,不创建订单、不执行退款。
本文依据为 2026 年 10 月 1 日读取的官方资料,未在读者的本地模型上运行。工单和预期字段为虚构验证输入,不是实测模型输出。不同模型遵循约束的表现需要用自己的样本核对。

前提:本地服务已经能完成普通对话
先执行 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 字段。
用三层检查决定是否进入下游
- 请求层:HTTP 成功且 done 为真,返回字段完整。失败时保留状态和错误,不把错误响应当正文解析。
- 结构层:json.loads 成功,jsonschema 检查必需字段、枚举、类型和多余字段。不能靠正则从一大段解释里随意抠一个对象就宣布符合协议。
- 事实层:编号 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