907 words
5 minutes
LLM 中的 Schema
LLM 中的 Schema
在大型语言模型中,Schema 是用于定义模型输出结构的一种机制,让模型返回的数据符合预定义的格式。
核心用途
当你需要模型输出结构化数据(而非自由文本)时使用,例如:
- 提取表单数据
- API 响应格式化
- 自动化工作流中的数据交换
典型例子:JSON Schema
{ "name": "string", "age": "number", "email": "string"}主要实现方式
| 方式 | 说明 |
|---|---|
| JSON Schema | 通过 schema 定义字段类型、格式、约束 |
| Vercel AI SDK | generateObject() 支持 schema 校验 |
| Anthropic Claude | 支持 XML/tagged output 限制输出格式 |
| OpenAI | response_format: { type: "json_schema" } |
Schema vs Prompt 约束:核心区别
Prompt 约束:弱约束
靠自然语言描述期望输出:
请用JSON格式返回用户信息,包含name, age, email三个字段。age必须是数字,email必须是邮箱格式。问题:
- 模型可能不遵循
- 格式可能不稳定
- 结构复杂时难以描述清楚
- 无法保证类型严格性
Schema 约束:强约束
通过代码层面的 schema 定义:
import { generateObject } from 'ai'import { z } from 'zod'
const { object } = await generateObject({ model, schema: z.object({ name: z.string(), age: z.number(), email: z.string().email() }), prompt: '提取用户信息'})优势:
- 类型校验 — 运行时检查,类型错误直接抛异常
- 确定性 — 模型必须输出匹配 schema 的内容,否则报错
- 可复用 — 可以在多个地方使用同一个 schema
- 工具链集成 — 自动生成 TypeScript 类型、文档、测试
本质区别
| 维度 | Prompt 约束 | Schema 约束 |
|---|---|---|
| 执行位置 | 模型理解(可能出错) | 代码校验(100% 可靠) |
| 失败处理 | 依赖模型自觉 | 不符合就失败 |
| 复杂结构 | 难以描述 | 清晰定义嵌套 |
| 类型安全 | 无 | 自动类型推导 |
类比
- Prompt 约束 = 口头约定君子协定
- Schema 约束 = 签合同 + 法律保护
Schema 如何实现强约束
Schema 的”强约束”并非来自模型本身,而是来自双层机制。
第一层:Prompt 层面的引导
Schema 作为 prompt 的一部分告诉模型”你应该这样输出”:
You must respond in valid JSON matching this schema:{"type": "object", "properties": {"name": {"type": "string"}}, ...}这依赖模型的配合——模型尝试遵循 schema。
第二层:验证层面的强制
这是关键——模型输出后,结果会被校验:
LLM Output → JSON Parser → Schema Validator → 通过/拒绝如果输出不合法,直接报错或重试。
真实执行流程(以 Vercel AI SDK 为例)
const { object } = await generateObject({ model, schema: z.object({ name: z.string(), age: z.number() }), prompt: '提取用户信息'})实际过程:
- 发送请求 — prompt + schema 一起发给模型
- 模型生成 — 模型输出文本(尽力符合 schema)
- 解析 JSON — 把模型输出当作 JSON 解析
- Zod 校验 — 验证解析结果是否符合 schema 定义
- 返回结果 — 如果校验失败,抛异常或重试
为什么说”强约束”
模型可能生成不合规的输出,但这不重要——因为:
不合规输出 → 解析失败 → 抛异常 → 或触发重试 → 重新生成Schema 的强大之处不在于”让模型不犯错”,而在于对错误输出零容忍。
总结
Schema = "尽力遵循" + "事后验证"
弱约束:只有第一层强约束:两层都有,且第二层是决定性的| Prompt 约束 | Schema 约束 | |
|---|---|---|
| 模型生成阶段 | 尽力遵循 | 尽力遵循 |
| 校验阶段 | 无 | 强制校验,不合格就失败 |
| 结果保证 | 依赖模型自觉 | 100% 保证 |
LLM 中的 Schema
https://sgjki547.top/posts/llm_schema/