外观
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 子集,不应无条件发送应用中的所有复杂约束。
官方资料与版本边界
- JSON Schema object:必填与额外字段。
- Pydantic Models:示例使用 Pydantic v2 的
model_validate。 - OpenAI Structured outputs:JSON mode 与 Schema 约束的区别。
核验日期:2026-11-03。不同端点的结构化输出参数位置不同,模型支持的 Schema 子集也不同;示例中的 Pydantic 语法不可直接用于 v1。