大模型结构化输出怎么保证?JSON Schema、约束解码和校验重试怎么配合?

第 1183 题 约 2 分钟读完

本文目录
  1. 面试怎么回答
  2. 几种保证方式
  3. 格式正确不等于内容正确
  4. Schema 设计的技巧
  5. 失败的处理
  6. 批量抽取的数据链路

面试怎么回答

我会优先用模型或推理框架支持的结构化输出,传入 JSON Schema,有约束解码的能从机制上保证格式;也可以把输出定义成工具参数。但格式正确不等于内容正确,所以程序侧一定用 Schema 校验,再做业务校验,比如枚举范围、数值区间、字段之间的逻辑。Schema 设计上字段少而明确,用枚举,允许 unknown,不逼模型编答案。校验失败把错误带回去让模型修正,有限次数后进入人工队列,不用默认值悄悄填。批量抽取按 ETL 来做,记录模型、提示词和 Schema 版本,结果带校验状态落表,抽样评估准确率。

先把这段讲顺;面试官追问时,再展开下面的原理和细节。

详细讲解

数据团队用大模型做信息抽取、分类、生成 SQL,下游都是程序在读结果,最怕的是:模型偶尔多输出一句解释、少一个字段、把数字写成字符串,下游直接解析失败。面试官想看你怎么从「能用」做到「稳定可用」。

几种保证方式

  1. 提示词约束:在提示词里给出格式和示例。最简单,但不能保证 100% 遵守;
  2. JSON 模式 / 结构化输出:现在主流模型和推理框架都支持传入 JSON Schema,输出严格符合结构。有的是在服务端做约束解码,生成每个 Token 时只允许符合语法的候选,从机制上保证格式正确;
  3. 工具调用:把需要的输出定义成一个工具的参数,让模型「调用」这个工具,结果就是结构化的参数;
  4. 事后校验:不管用哪种方式,程序都要用 Schema 校验,失败时重试或修复。

格式正确不等于内容正确

约束解码保证的是结构,不保证:

  • 枚举值选得对;
  • 日期、金额的值合理;
  • 必填字段不是瞎编的。

所以还要做业务校验:枚举范围、数值区间、字段之间的逻辑关系(比如结束时间晚于开始时间),以及在原文里能找到依据。

Schema 设计的技巧

  • 字段少而明确,嵌套不要太深;
  • 用枚举代替自由文本;
  • 允许「不确定」:给出 unknown 选项或者可空字段,而不是逼模型编一个答案;
  • 先推理后输出:可以加一个 reason 字段放在结论字段前面,帮助模型先思考再给结论(注意顺序会影响生成)。

失败的处理

  • 校验失败时,把错误信息带回去让模型修正,最多重试几次;
  • 仍然失败的进入人工队列或者标记为失败,不要用默认值悄悄填上;
  • 统计各类失败的比例,作为优化 Schema 和提示词的依据。

批量抽取的数据链路

大批量抽取(比如从 100 万条工单抽取问题类型)要像普通 ETL 一样:记录模型版本、提示词版本、Schema 版本;结果落表并带上校验状态;抽样人工评估准确率。