没规定输出格式——所以得到一面墙的散文

想要结构化答案,结果是 600 字 prose,没法复制到任何下游工具。

你让模型”从这封客户邮件抽关键事实并总结”。回来 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 个形态完全一致。
  • 程序化校验一次过。
  • 同事看一个输出就能描述出格式。

如果还是没修好

  1. 切到结构化输出模式(JSON mode、tool use)——schema 变成机械强制。
  2. 程序化校验输出,不合就把校验错误连同 schema 重新 prompt。
  3. 降 temperature;格式稳定性提升。
  4. 试更强的指令服从模型(小模型有时格式更稳)。

预防建议

  • 默认:每个 prompt 末尾都带显式输出格式块。
  • 机器消费:API 层用结构化输出 / JSON mode。
  • 程序化校验;不通过就重 prompt,别用解析后修补。
  • 只在真正对话型任务用 prose。
  • 聊天工作流把格式钉进 system prompt / project 指令。
  • 审生产 prompt:没显式输出格式块的都算风险。

相关阅读

标签: #排查 #Prompt #Prompt 质量 #Prompt 工程