跳转至

22 结构化输出

难度:中级|前置:LLM 基础|目标:让模型输出进入可靠程序边界

为什么不能解析一段随意文本

错误做法:

让模型回答“正确/错误、分数、原因”
→ 用字符串查找“正确”

模型可能改变措辞、顺序和语言,程序解析脆弱。

结构化结果:

{
  "is_correct": false,
  "score": 0.5,
  "confidence": 0.72,
  "error_type": "calculation",
  "explanation": "第二步计算错误"
}

Schema 的三层作用

1. 语法结构

  • 必填字段;
  • 类型;
  • 枚举;
  • 数组和嵌套对象。

2. 业务规则

Schema 合法后继续校验:

0 ≤ score ≤ max_score
confidence < 0.7 → 人工复核
is_correct=true → score 必须等于满分

3. 业务权限

即使参数合法,也要判断用户是否有权操作目标资源。

失败处理

模型输出
→ 解析
  ├─ 成功 → 业务校验
  └─ 失败 → 带错误信息修复一次
               ├─ 成功
               └─ 失败 → 回退/人工

不要无限让模型“再试一次”。

Schema 设计原则

  • 字段少而明确;
  • 使用枚举代替自由文本分类;
  • 描述字段含义和单位;
  • 区分未知、空值和不适用;
  • 不让模型生成可由程序计算的字段;
  • 给 Schema 版本号。

置信度

模型自报置信度不是可靠概率。可以作为信号之一,但必须通过历史数据校准,并结合:

  • 规则检查;
  • 检索质量;
  • 多次一致性;
  • 人工标注;
  • 任务风险。

自测

  1. JSON 可解析为什么仍不代表业务正确?
  2. 哪些字段不应该让模型生成?
  3. 结构化输出连续失败后应该怎么办?
  4. 模型置信度为什么不能直接当真实概率?

完成标准

  • 能为一个判题或诊断结果设计 Schema
  • 能写出至少三条业务校验
  • 能设计有限重试和回退
  • 能解释 Schema 版本的意义

下一单元:Tool Calling 可靠性