跳到主要内容
SUN / 笔记
← 全部文章

结构化输出与 Schema 校验

合法 JSON、符合 Schema 和业务语义正确是三个不同层次;结构化输出必须同时处理协议、校验、截断、重试和业务约束。

来源拆分自:高德 Agent 研发面,记忆和评测问很细;以下保留原整理中的工程补充与校正。

如何让大模型稳定输出标准 JSON?

视频归纳的失效原因

  • LLM 按 Next Token 概率生成,本身不是严格的语法状态机。
  • 对话对齐让模型倾向于先说“好的,下面是结果”,给解析器增加额外文本。
  • 长输出可能撞上 Token 上限,造成括号缺失或数组在中途截断。

常见生产事故包括:

  1. JSON 外包着 Markdown 代码块。
  2. 长数组在中途截断,结构未闭合。
  3. Key 漂移,例如 user_id 变为 userid 或“用户ID”。
  4. 类型边界错误,例如要求 int 却返回 "18" 或 null。

四层纵深防御

层级 手段 作用
1. 提示工程约束 JSON Schema、明确字段说明、Few-shot 让模型理解目标结构,解决基础格式问题
2. 原生协议控制 API 的 JSON Mode、Function Calling 或 Tool Calling 优先使用模型服务原生结构化接口
3. 解码约束 Token Masking、FSM、Outlines 等 在生成阶段屏蔽不符合语法或 Schema 的 Token
4. 解析、自愈与重试 严格校验、json-repair、Pydantic、携带错误信息重试 处理截断、类型错误和边界异常

伪代码:

python
for attempt in range(2):
    raw = call_model(schema=OutputModel.model_json_schema())
    try:
        return OutputModel.model_validate_json(raw)
    except ValidationError as error:
        if attempt == 0:
            add_feedback(error.errors())
        else:
            raise StructuredOutputError(raw) from error

补充与校正

  • 合法 JSON、符合 Schema、业务语义正确是三件事。 约束解码可以提高前两者的确定性,但不能保证字段事实正确,也不能替代业务校验。JSON Schema 2020-12 Core
  • 普通 Logit Bias 只适合粗粒度鼓励或抑制 Token,不能独自保证任意 JSON Schema;真正的约束解码需要按当前语法状态动态屏蔽非法 Token。Outlines 的官方架构说明采用的正是这种生成时约束。Outlines 架构
  • “自动修复”必须有限次,并保留原始输出和校验错误;无限 repair/retry 会隐藏模型能力问题并放大成本。

相关阅读

相关文章

Agent 运行时:状态、重试与幂等 →