基础原理
AI 的结构化输出是什么?
要求模型用 JSON 回答只是一个请求,不是保证——回答仍然可能格式不正确地返回。真正约束模型输出的是什么,为什么有些机制会强制执行而有些只是提出要求,以及无论哪种情况校验为什么依然重要。
全部文章 · 最近核实:
结构化意味着下游代码可以依赖这份形状
结构化输出把回答限定在一个定义好的形状里——固定的一组字段、特定的类型、一份允许值的枚举——而不是一段自由文本。这不是风格问题;读取这份回答的程序可以在已知的路径上取出一个值,而不需要解析句子、猜测含义。
有两种不同的方式可以要求它
第一种基于提示词:指令告诉模型只用符合某个描述格式的 JSON 来回答。这几乎适用于任何模型,也不需要特殊的 API 支持,但它只是一个请求,模型仍然可能忽略它、部分执行错误,或者把它包在你并没有要求的说明文字里。第二种由供应商强制实现:一些供应商提供一种模式,通常叫做结构化输出或 JSON 模式,在这种模式下生成过程本身被约束,使得每一步只能生成与结构定义一致的词元。这是一种比一条指令更强的机制,而不只是听起来更严格——而且它和工具调用(参见AI 工具调用是怎么运作的)是完全不同的功能:工具调用塑造的是一个具名函数的参数,而不是模型自己的回答。
提示词里的指令是请求,不是保证
当结构仅仅来自提示词的措辞时,模型仍然可能产生不匹配的输出——多一个字段、少一个字段、JSON 前面带着说明文字、类型错误的值。任何只依赖提示词结构的系统,都需要为解析失败准备一套真正的应对方案,而不是假设它永远不会发生。
供应商强制的结构是另一种保证
当供应商直接针对结构定义约束生成过程时,输出的格式会可靠得多,因为不合规的词元从一开始就被排除在生成之外,而不只是被"不鼓励"。具体哪些供应商和模型支持这一点、支持到什么严格程度,各不相同,而且会随时间变化——把基于提示词的结构和供应商强制的结构当作两种不同的可靠性等级,而不是能互相替代、达到同样效果的两种做法。
格式有效不等于答案正确
即便有最强的强制约束,结构定义也只限制形状,不限制含义。一个摘要字段可以是语法上完全有效的 JSON,却仍然装着三句啰嗦的话而不是一句;或者在一个标注为"计数"的字段里,放着一个自信满满却错误的数字。含糊或过于宽松的结构定义,往往会产生技术上有效、但用起来仍然不可靠的输出。
解析成功不等于可以信任
不管结构来自提示词还是供应商的强制约束,成功解析一条回答只能确认格式被遵守了,并不能说明字段里的值是否准确、是否在合理范围内、是否讲得通。把解析出来的对象当作已核实的数据,而不是当作一个需要核查的说法来对待,正是结构化输出系统在生产环境中最常出错的地方。
常见问题
- 结构化输出和工具调用是一回事吗?
- 不是。工具调用提出的是一个具名函数及其参数,供你的应用视情况执行;结构化输出则是把模型自己的回答塑造成一种定义好的格式。这两种机制既可以单独使用,也可以搭配使用。
- 在提示词里要求模型返回 JSON,能保证拿到有效的 JSON 吗?
- 不能。这只是一个请求,模型仍然可能出错——多余的文字、缺失的字段、错误的类型。只依赖提示词措辞的系统,需要为解析失败准备明确的兜底方案,而不能假设它总能成功。
- 如果供应商强制执行某个结构定义,结果就一定正确吗?
- 可以保证结果按照结构定义是格式良好的——字段对、类型对。但不能保证那些字段里的值是准确或合理的;强制约束限制的是形状,不是真实性。
- 使用结构化回答之前,我还需要校验它吗?
- 需要。成功解析一条回答只能确认格式匹配,不代表内容正确。无论结构是怎么产生的,对数值做范围检查、类型检查和合理性检查仍然是必要的。
与其阅读,不如亲自试试
ClawAI 的评判(judge)功能通过提示词指令要求模型给出特定的 JSON 格式,当回答不匹配时,它会回退到一个明确定义的"解析失败"状态,而不是去猜——这正是一个直接、真实运行的例子,说明提示词里要求的结构定义是一个请求,而不是保证。