你让模型”从这封客户邮件抽关键事实并总结”。回来 600 字散文。客户订单号埋在第 2 段,SLA 违约时长在第 4 段还带 hedge,问题类别是暗示而非声明。你的工单系统一个字段都消化不了。你追问”给我 JSON”,2 秒拿回完美 JSON。模型一直能做结构化输出——你没要求,它就走默认散文。模型默认散文是因为训练数据把这种回答标为”认真应答”。
本文讲为什么显式格式规范是单项收益最高的 prompt 改动之一,以及怎么写跨次稳定的 schema 块。
常见原因
1. 完全没”输出格式”区块
你没提格式,就拿到默认——五段散文。模型没有任何反向信号。
如何判断:你的 prompt 里没 ## 输出 区块、没 schema 块、没”按 … 返回”。
2. 顺嘴提了格式,不是 schema
“给个简短总结”不是格式。“返回 3 条 bullet、每条带粗体字段名”是。
如何判断:格式指令是一个短语,不是结构化规范。
3. 只给了示例,没写规则
你展示了一个结构化示例,指望模型复用形状。它可能复用,也可能”差不多结构”但形态不完全一致。
如何判断:有示例但没明写”按此形态”。
4. 冲突线索把它推向 prose
“温暖口语化” + “返回 JSON”——模型解析向 prose 偏,因为温暖只能寄生在 prose 里。
如何判断:语气和格式方向相反。
5. 后续轮次忘了格式
第 1 轮你写了 JSON。到第 4 轮模型漂回散文,因为你不再指定。格式在上下文里漏出去。
如何判断:第 1 轮格式对,后面回退。
动手前先确认
- 想清楚下游消费者:人读、JSON 解析、数据库行、工单字段。
- 草拟理想形状:字段、顺序、类型、枚举值。
- 机器消费定严格 schema。
- 人读定结构模板(标题、bullet 数、最长字数)。
- 计划每轮都强制格式,不只是第 1 轮。
需要收集的信息
- 当前 prompt 含任何格式暗示。
- 你拿到的散文输出。
- 你想要的格式样例。
- 下游约束(必填 JSON key、长度上限、允许枚举值)。
- 模型 + system prompt。
最短修复路径
Step 1:加显式”输出格式”块
## 输出格式
只返回此 JSON(无散文、无解释):
\`\`'json
{
"order_number": "<字符串,格式 ORD-XXXXX>",
"issue_category": "billing | shipping | refund | other",
"sla_breach_minutes": "<整数或 null>",
"customer_sentiment": "positive | neutral | negative"
}
\`\`\`
显式块主导输出形状。
Step 2:禁止格式外的散文
输出规则:
- 只返回 JSON 块。无前缀、无后缀。
- 不要"以下是您的输出:"开场白。
- 闭括号后无评论。
- 输入无法解析时返回 schema 但所有字段设 null。
这能挡掉”以下是您的 JSON:……”包装把解析器搞挂。
Step 3:用代码栅栏 + 明确语言标签
JSON / YAML / SQL / 代码用栅栏:
\`\`'json
{ ... }
\`\`\`
很多解析器和模型自己把栅栏块当受保护区。
Step 4:人读输出给结构化模板
输出格式:
- 3 个 bullet,每个以 **<字段>:** 粗体开头。
- 字段名:原因、修复、验证。
- 每条 ≤25 字。
- 无引言、无总结。
示例:
- **原因:** Stripe webhook secret 周五过期了。
- **修复:** 在 Stripe dashboard 轮换,粘到 Vercel 环境变量。
- **验证:** 发一个测试 webhook,日志里见到 200。
结构 + 示例锚定形状比单独任何一个稳。
Step 5:每轮都钉格式
聊天工作流里把格式块在每个 prompt 末尾重贴,或挪进 system prompt / project 指令。近期偏好意味着最新一轮决定格式。
Step 6:API 工作流用结构化输出模式
OpenAI 的 JSON mode、Anthropic 带 schema 的 tool use、Gemini 的 structured output——这些机械强制 schema。模型物理上产不出非法 JSON。比 prompt 级请求强得多。
怎么确认已经修好
- 输出不修改就能被下游系统解析。
- schema 块外无散文。
- 同 prompt 跑 3 次,3 个形态完全一致。
- 程序化校验一次过。
- 同事看一个输出就能描述出格式。
如果还是没修好
- 切到结构化输出模式(JSON mode、tool use)——schema 变成机械强制。
- 程序化校验输出,不合就把校验错误连同 schema 重新 prompt。
- 降 temperature;格式稳定性提升。
- 试更强的指令服从模型(小模型有时格式更稳)。
预防建议
- 默认:每个 prompt 末尾都带显式输出格式块。
- 机器消费:API 层用结构化输出 / JSON mode。
- 程序化校验;不通过就重 prompt,别用解析后修补。
- 只在真正对话型任务用 prose。
- 聊天工作流把格式钉进 system prompt / project 指令。
- 审生产 prompt:没显式输出格式块的都算风险。