结构化输出 结构化输出
别名:
Structured Outputs
让模型输出程序可直接消费的数据结构(对象 / 数组 / 布尔值)而不是自由文本。手段有提示词要求 JSON、包进 markdown 代码块、裸 JSON + 严格指令,或 API 内置的强制 JSON 参数——但「约束 ≠ 保证」,输出仍要走「提取 → 校验 → 兜底」流水线,见[第 05 章](/chapters/05-structured-output/)。
它是什么
结构化输出指让模型输出程序可直接消费的数据结构(对象 / 数组 / 布尔值)而不是自由文本。动机很直接:程序没法消费自然语言——正则解析自由文本是死路,措辞一换就断、程序无法自验证、没有稳定契约(不能 JSON.parse、不能类型检查、不能存数据库)。第 05 章的「意图解析器」开场反例就是这条路。
三种约束手段与「约束 ≠ 保证」
业界有三招层层递进的手段:提示词要求 JSON、要求包进 markdown 代码块、直接返回裸 JSON + 严格指令 + 低 temperature。三者都只是降低解析成本,没有一项能保证输出必然合法——模型偶尔就是会给一段带错逗号、漏必填字段的 JSON。API 内置的强制 JSON 参数(OpenAI 的 response_format、Anthropic 的 Structured Outputs)在采样层用约束解码保证合法,把失败率降到接近零而不是零,且 schema 有子集限制——校验层依然要有。
流水线三工位
本教程的答案是「提取 → 校验 → 兜底」完整流水线:extractJson 提取(extract-json 词条)、基于 JSON Schema 的校验器把关(json-schema + validation)、parseStructured 兜底重试。更「原生」的一条路是用 function-calling 把 JSON 形状声明成工具的 input_schema,让模型为了「调用工具」而产出严格合规的参数——第 06 章水到渠成。
小结
把 LLM 当成会出错的外部组件:无论 prompt 写得多好,输出都默认不可信,走完整流水线才能把「概率文本」变成「可信数据」。