结构化输出

区分 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 和业务三层校验的对象才能进入下游执行。任何“成功”结论都要保存以下证据:schema 版本、原始响应、解析错误、字段错误、业务错误、修复次数、验证对象与下游调用数,不能把模型口头确认当作环境事实。

关键机制与可推翻实验

可解析不等于符合 schema

合法 JSON 仍可能缺字段、类型错误或包含未允许属性。解析器只解决语法,schema 校验才解决结构合同。

动手试:分别输入截断 JSON、缺字段 JSON 和多字段 JSON,保存每层错误。

schema 正确不等于业务正确

日期范围、金额上限、资源存在性和权限等约束无法只靠基本类型表达。业务验证必须在确定性代码中执行。

动手试:让模型返回格式正确但结束日期早于开始日期的对象,确认业务层拒绝。

修复必须有预算和原始证据

剥离代码围栏或再次请求可以修复常见错误,但无限修复会增加成本并掩盖模型回归。每次尝试都要保留原始响应和错误。

动手试:注入连续两次坏响应,验证达到重试上限后返回结构化失败。

下游只消费已验证对象

未通过全部校验的内容不得触发工具或数据库写入。把部分字段先执行再补校验会留下难以回滚的副作用。

动手试:在 schema 失败样本中监听工具注册表,确认调用次数为零。

先预测,再操作三类证据

分步1 / 3

1. 模型与结构边界

在“结构化输出”中先画出责任、数据或候选空间,再预测“让模型输出通过机器校验后才进入程序控制流”会在哪个节点改变结果。

结构化输出、JSON 语法、JSON Schema、类型校验、业务语义、有限修复、失败返回、原始响应存证
可交互
脏输出怎么变成干净结构化对象:剥壳 → 校验 → 不合规回灌重试模型回话 → extract_json 剥壳 → schema 校验 →(不合规回灌再试 / 合规产出对象)④ 不合规:把错误回灌进 messages,再问一遍合规 ✓模型回话可能带围栏 / 夹废话剥壳 extract_json抠出那段 JSON 文本按 schema 校验字段齐不齐、类型对不对不合规 → 回灌重试把错误塞回去再问一遍产出结构化对象交给下游程序 / Agent

第 1 / 5 步 · ① 模型回话可能不干净——把 JSON 包在 ```json 围栏里,或前后多说一句废话

解析容错重试五步:模型回话 → 剥壳 → 校验 →(不合规回灌再试 / 合规产出对象)。可暂停、单步、拖进度。

模型回话常不干净——先剥壳抠出 JSON,再按 schema 校验;不合规就把错误回灌进对话重试,到上限才放弃,合规才产出能被程序直接用的结构化对象。

最小可运行实现

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 版本、原始响应、解析错误、字段错误、业务错误、修复次数、验证对象与下游调用数。

阅读导航

← 采样与解码 · 函数调用原理 →

资料与写作方式声明

本章以Building effective agents(站内九单元课程改编)权威目录界定学习范围,并结合正文列出的技术资料独立重写;不宣称复现原书正文,也不沿用原作表述。

原作版权归作者与出版社所有;本站原创教学结构与表述仅供学习交流。

讨论

评论区加载中…