跳到主要内容

SGLang 结构化输出

概念

Structured Generation Language(SGL) 可以理解为:用"结构化的指令 + 约束 + 模板"来引导模型输出可控、可解析、可复用的结果(例如 JSON、表格、分段文档、代码骨架等),从而降低"随意发挥"和后处理成本。

它通常由三类要素组成:

  1. 结构(Schema/格式):规定输出长什么样(字段、层级、类型、必填/可选)。
  2. 生成规则(Constraints):规定怎么生成(不得编造、必须引用来源、长度限制、枚举值、校验规则)。
  3. 模板(Template):把结构与规则落到可复用的"提示模板/片段",并支持参数化(变量注入)。

为什么需要 SGL

  • 可解析:输出稳定成机器可读格式(JSON/YAML/CSV/Markdown 表格)。
  • 可验证:能做自动校验(缺字段、类型不符、超长、非法枚举值)。
  • 可复用:相同任务在不同项目/团队中重复使用,降低提示工程成本。
  • 可组合:复杂任务拆成多个结构化子任务,最后拼装成一份交付物。
  • 更安全:通过"只允许在限定字段里回答"等约束,减少越界内容与幻觉。

典型应用场景

  1. 信息抽取
  2. 内容生产
  3. 代码与配置
  4. 对话型工作流

一个最小 SGL 示例(JSON 结构输出)

目标:让模型输出"读书笔记"且可解析。

你将输出严格的 JSON(不要包含多余文字、不要使用 Markdown)。
JSON Schema(概念性):
{
"title": string,
"author": string | null,
"summary": string,
"key_points": string[3..7],
"action_items": { "item": string, "why": string }[0..5]
}

约束:
- key_points 至少 3 条,最多 7 条
- 如果无法确定作者,author = null
- 不要编造书中不存在的内容;不确定则在 summary 中说明不确定点

输入:
《XXXX》全文/节选如下:…

设计 SGL 的实用原则(Checklist)

  • 先定"消费方式":输出给人看还是给程序用?决定用 Markdown 还是 JSON。
  • 先定 Schema,再写提示:字段名、类型、枚举、必填项优先。
  • 明确错误处理:缺信息时填 null / 空数组 / 给出 unknown_reason 字段。
  • 减少自由文本范围:把自由发挥限制在少数字段里(如 summary),其他字段尽量结构化。
  • 加示例(Few-shot):给 1 个正例往往比加 10 条规则更有效。
  • 分步生成:复杂输出分两步:先生成结构/大纲,再填充内容。

在 Notion 里的用法建议

  • 数据库属性承接结构化字段(例如:状态、标签、负责人、日期)。
  • 用页面正文承接长文本(例如:摘要、正文、附录)。
  • 对于固定格式输出,优先用"模板按钮/数据库模板"配合 SGL 生成,减少人工整理。

可直接复用的 SGL 模板(可复制)

1) 会议纪要 → 行动项抽取(JSON)

输出严格 JSON,不要额外文字:
{
"meeting_title": string,
"date": "YYYY-MM-DD" | null,
"decisions": string[],
"action_items": [
{ "owner": string | null, "task": string, "due": "YYYY-MM-DD" | null }
],
"risks": string[]
}

规则:
- 只根据输入内容,不要推测
- owner 不明确则为 null

输入如下:
{{MEETING_NOTES}}

2) 文章/文档 → 摘要卡片(Markdown 固定结构)

请按以下 Markdown 结构输出(不要改标题名):

## 一句话结论


## 关键要点(3-5条)
1. …
2. …
3. …

## 适用场景
- …

## 不适用/风险
- …

输入文档:
{{DOC}}

相关概念对照

  • Prompt Template:提示模板(SGL 的载体之一)。
  • Schema / JSON Schema:结构定义(SGL 的核心)。
  • Guardrails:约束与防护栏(类型、枚举、长度、来源要求等)。
  • Function calling / Tools:把输出对接到可执行动作(常与 SGL 搭配)。
  • Structured Output:结构化输出(SGL 目标)。

如果你希望这页更贴合你的用法,可以告诉我:你主要想用 SGL 做「抽取」「写作」「代码」「工作流」里的哪一种,以及你更偏好 JSON 还是 Markdown 结构。