结构化输出
区分 JSON 语法、schema 形状与业务语义,建立解析、校验、有限修复和失败返回的证据链。
学习目标
- 能解释“结构化输出”如何让模型输出通过机器校验后才进入程序控制流
- 能区分结构化输出、JSON Schema、语法校验、业务校验、修复预算,并指出它们在请求、状态或执行边界中的位置
- 能固定输入,沿以下证据定位首个分叉:schema 版本、原始响应、解析错误、字段错误、业务错误、修复次数、验证对象与下游调用数
- 能注入“从回复中正则截取一段 JSON 后直接执行,忽略缺字段、额外字段和业务边界”,在同一预算和权限下完成故障、恢复与重放
来源、课程编排与适用边界
“结构化输出”以Anthropic 公开全文《Building effective agents》为总纲,并用Anthropic《Building effective agents》核对本单元机制;工具与外部能力的角色再由MCP 官方规范交叉检查。
这不是一本具有“官方九章目录”的纸质书。平台把公开文章中的 augmented LLM、工作流、智能体、上下文和工具工程重组为 9 个教学单元;下列 72 个节点是站内课程地图,不冒充 Anthropic 原文目录。正文、代码、图表和练习均为独立教学重写,产品或模型版本变化时应重新验证。
本单元的八个课程坐标
- 结构化输出:作为“让模型输出通过机器校验后才进入程序控制流”的第 1 个课程坐标,必须进入正文解释、交互观察或练习证据。
- JSON 语法:作为“让模型输出通过机器校验后才进入程序控制流”的第 2 个课程坐标,必须进入正文解释、交互观察或练习证据。
- JSON Schema:作为“让模型输出通过机器校验后才进入程序控制流”的第 3 个课程坐标,必须进入正文解释、交互观察或练习证据。
- 类型校验:作为“让模型输出通过机器校验后才进入程序控制流”的第 4 个课程坐标,必须进入正文解释、交互观察或练习证据。
- 业务语义:作为“让模型输出通过机器校验后才进入程序控制流”的第 5 个课程坐标,必须进入正文解释、交互观察或练习证据。
- 有限修复:作为“让模型输出通过机器校验后才进入程序控制流”的第 6 个课程坐标,必须进入正文解释、交互观察或练习证据。
- 失败返回:作为“让模型输出通过机器校验后才进入程序控制流”的第 7 个课程坐标,必须进入正文解释、交互观察或练习证据。
- 原始响应存证:作为“让模型输出通过机器校验后才进入程序控制流”的第 8 个课程坐标,必须进入正文解释、交互观察或练习证据。
术语与状态合同
↡结构化输出:按明确机器合同生成而非只面向人阅读的结果;在“结构化输出”中按以下证据核对:schema 版本、原始响应、解析错误、字段错误、业务错误、修复次数、验证对象与下游调用数。、↡JSON Schema:描述 JSON 对象字段、类型和约束的声明式规范;在“结构化输出”中按以下证据核对:schema 版本、原始响应、解析错误、字段错误、业务错误、修复次数、验证对象与下游调用数。、↡语法校验:确认文本是否能被 JSON 解析器接受;在“结构化输出”中按以下证据核对:schema 版本、原始响应、解析错误、字段错误、业务错误、修复次数、验证对象与下游调用数。、↡业务校验:验证跨字段、权限和真实资源等领域规则;在“结构化输出”中按以下证据核对:schema 版本、原始响应、解析错误、字段错误、业务错误、修复次数、验证对象与下游调用数。、↡修复预算:允许重试或纠错的次数、token 与时间上限;在“结构化输出”中按以下证据核对:schema 版本、原始响应、解析错误、字段错误、业务错误、修复次数、验证对象与下游调用数。。
本页不变量是:只有通过语法、schema 和业务三层校验的对象才能进入下游执行。任何“成功”结论都要保存以下证据:schema 版本、原始响应、解析错误、字段错误、业务错误、修复次数、验证对象与下游调用数,不能把模型口头确认当作环境事实。
关键机制与可推翻实验
可解析不等于符合 schema
合法 JSON 仍可能缺字段、类型错误或包含未允许属性。解析器只解决语法,schema 校验才解决结构合同。
动手试:分别输入截断 JSON、缺字段 JSON 和多字段 JSON,保存每层错误。
schema 正确不等于业务正确
日期范围、金额上限、资源存在性和权限等约束无法只靠基本类型表达。业务验证必须在确定性代码中执行。
动手试:让模型返回格式正确但结束日期早于开始日期的对象,确认业务层拒绝。
修复必须有预算和原始证据
剥离代码围栏或再次请求可以修复常见错误,但无限修复会增加成本并掩盖模型回归。每次尝试都要保留原始响应和错误。
动手试:注入连续两次坏响应,验证达到重试上限后返回结构化失败。
下游只消费已验证对象
未通过全部校验的内容不得触发工具或数据库写入。把部分字段先执行再补校验会留下难以回滚的副作用。
动手试:在 schema 失败样本中监听工具注册表,确认调用次数为零。
先预测,再操作三类证据
1. 模型与结构边界
在“结构化输出”中先画出责任、数据或候选空间,再预测“让模型输出通过机器校验后才进入程序控制流”会在哪个节点改变结果。
第 1 / 5 步 · ① 模型回话可能不干净——把 JSON 包在 ```json 围栏里,或前后多说一句废话
解析容错重试五步:模型回话 → 剥壳 → 校验 →(不合规回灌再试 / 合规产出对象)。可暂停、单步、拖进度。
最小可运行实现
def decode_response(raw, schema, max_repairs=1):
attempts = []
current = raw
for index in range(max_repairs + 1):
try:
value = json.loads(strip_fence(current))
validate_schema(value, schema)
validate_business_rules(value)
return {"ok": True, "value": value, "attempts": attempts}
except ValidationError as error:
attempts.append({"raw": current, "error": str(error)})
if index == max_repairs:
return {"ok": False, "attempts": attempts}
current = request_repair(current, error)这段实现只负责暴露“让模型输出通过机器校验后才进入程序控制流”的最小合同。交付版本还要补齐超时、日志、权限、密钥隔离和可重复评测;缺少以下证据时,代码能运行也不代表本章结论成立:schema 版本、原始响应、解析错误、字段错误、业务错误、修复次数、验证对象与下游调用数。
练习与答案
练习
问题 1:系统边界。 怎样用最小输入证明“只有通过语法、schema 和业务三层校验的对象才能进入下游执行”?
问题 2:课程坐标。 结构化输出、JSON 语法、JSON Schema、类型校验、业务语义、有限修复、失败返回、原始响应存证如何进入可操作验证?
问题 3:故障恢复。 怎样证明“从回复中正则截取一段 JSON 后直接执行,忽略缺字段、额外字段和业务边界”已经修复?
本章回顾
- “结构化输出”的主问题是让模型输出通过机器校验后才进入程序控制流。
- 核心不变量是只有通过语法、schema 和业务三层校验的对象才能进入下游执行。
- 首要反例是从回复中正则截取一段 JSON 后直接执行,忽略缺字段、额外字段和业务边界。
- 最小证据包包含schema 版本、原始响应、解析错误、字段错误、业务错误、修复次数、验证对象与下游调用数。
名词解释
本章出现的专业名词,用大白话再讲一遍。
- 结构化输出
按明确机器合同生成而非只面向人阅读的结果。在“结构化输出”中必须能按以下证据重新定位:schema 版本、原始响应、解析错误、字段错误、业务错误、修复次数、验证对象与下游调用数。
- JSON Schema
描述 JSON 对象字段、类型和约束的声明式规范。在“结构化输出”中必须能按以下证据重新定位:schema 版本、原始响应、解析错误、字段错误、业务错误、修复次数、验证对象与下游调用数。
- 语法校验
确认文本是否能被 JSON 解析器接受。在“结构化输出”中必须能按以下证据重新定位:schema 版本、原始响应、解析错误、字段错误、业务错误、修复次数、验证对象与下游调用数。
- 业务校验
验证跨字段、权限和真实资源等领域规则。在“结构化输出”中必须能按以下证据重新定位:schema 版本、原始响应、解析错误、字段错误、业务错误、修复次数、验证对象与下游调用数。
- 修复预算
允许重试或纠错的次数、token 与时间上限。在“结构化输出”中必须能按以下证据重新定位:schema 版本、原始响应、解析错误、字段错误、业务错误、修复次数、验证对象与下游调用数。