Skip to content

JSON、结构化输出与 Schema 校验 ​

核心答案:能解析、符合字段契约、内容正确,是三道不同的门。 JSON 解决表示格式;结构化输出约束模型按指定结构生成;服务端 Schema 校验检查收到的数据是否满足契约。教材事实与教学质量仍需业务规则和评审。

三层失败 ​

输入格式层Schema 层业务层
{ "level": }无法解析未进入未进入
{"level": 7},要求字符串可以解析类型不符未进入
{"answer": "3"},题目是 1+1可以解析可以合规答案错误

JSON Schema 的对象规则还区分属性定义、必填属性与额外属性限制。写了 properties 不代表字段自动必填。

最小例子:两次通过仍可能答错 ​

python
import json
from pydantic import BaseModel, ConfigDict

class Exercise(BaseModel):
    model_config = ConfigDict(strict=True, extra="forbid")
    question: str
    answer: str

raw = '{"question":"1+1=?","answer":"3"}'
item = Exercise.model_validate(json.loads(raw))
assert item.answer != str(1 + 1)

在项目 Python 环境运行该例,可看到格式与类型检查通过,却不能证明业务正确。这里的算术断言只用于演示,不是开放式教材的通用评审器。Pydantic Models说明模型校验及类型转换;需要严格类型时必须显式选择策略。

教材系统中的处理 ​

教材、评审报告、工具参数分别定义契约。格式或字段错误走有上限的结构修复;合法教材中的错误走评审问题与定点修订。两种失败的计数与日志应分开,否则无法判断是接口协议不稳定还是内容质量不足。

对支持严格结构化输出的模型发送 Schema,同时在服务端再次校验。拒绝响应、截断与连接中断可能没有预期教材对象,必须先处理响应状态,再解析正文。不要把无法解析的响应当成空教材继续发布。

局部修订还需要业务约束:稳定 ID 存在、不能修改未授权内容、引用来源真实存在。Schema 可以描述字段,不能独自证明“这次只改了要求的段落”。见核心章节。

自测与误区 ​

分别删除 answer、把 answer 改成数字、加入额外字段,再观察校验异常。最后把答案改成合法字符串“3”,说明为什么还需要独立评审。

不要认为 json.loads 成功就是结构化输出,也不要把供应商的 strict 选项当成权限校验。供应商通常只支持 JSON Schema 子集,不应无条件发送应用中的所有复杂约束。

官方资料与版本边界 ​

核验日期:2026-11-03。不同端点的结构化输出参数位置不同,模型支持的 Schema 子集也不同;示例中的 Pydantic 语法不可直接用于 v1。

学习复现系统 · 事实、实验与假设分开记录