2.6 输出格式控制:让 Claude 乖乖听话
Prompt Engineering 的终极目标往往不仅仅是获得“正确”的答案,更是获得“可用”的答案。 对于开发者而言,最令人头疼的就是 Claude 回复了一堆 “Here is the JSON you requested...” 的废话,或者在 JSON 里加了注释导致 JSON.parse 报错。
本节将传授几招确保留下 干净的机器可读输出 (Clean Machine-Readable Output) 的绝技。
2.6.1 核心技术:Prefill
兼容性提示:自 Claude 4.6 系列及 Mythos Preview 起,所有更新的模型(含 Opus 5.5、Sonnet 5.5、Fable 5.1、Opus 5、Sonnet 5、Opus 4.6/4.7/4.8、作为迁移基线的 Sonnet 4.6、Fable 5 与 Mythos 5)均不再支持对最后一条 assistant 消息做 Prefill,使用时会返回 400 错误;在对话中段插入 assistant 消息不受影响。对于这些新模型,请使用 Structured Outputs(见 2.6.3 节)或系统提示词来控制输出格式。以下内容仅适用于 Claude Sonnet 4.5 / 3.5 等仍支持 Prefill 的模型。
这是 Claude 早期模型独特的格式控制技术。 在通用的 Chat Completions API(如 OpenAI)中,通常 Assistant 的消息是由模型生成的。但在 Claude 的 Messages API 中,可以手动代替 Assistant 说“第一句话”。
这就像是在它的嘴边放了一句话,强迫它接下去。
强制 JSON 输出
不要仅仅在 System Prompt 里求它。直接把 { 塞进它的嘴里。
API Payload:
{
"messages": [
{"role": "user", "content": "请分析这段文本的情感,输出 JSON。文本:..."},
{"role": "assistant", "content": "{"} // <--- 关键!
]
}Claude 的反应: 它必须从 { 后面接着写。它 不可能 再说 “好的,这是你的分析:”,因为 { 已经发出来了。它只能继续生成 "sentiment": "positive"...。
后端拼接:
强制 XML 输出
同理,预填充 <root> 标签。
引导思维方向
Prefill 不仅能控制格式,还能控制内容方向。
User: “给我写个故事。”
Assistant (Prefill): “这是一个漆黑风暴的夜晚,”
Claude: “侦探史密斯压低了帽檐...”
2.6.2 移除“废话”
如果无法使用 API 的 Prefill 功能(例如在使用某些第三方客户端),可以通过 Prompt 咒语来减少废话。
负面约束法
示例示范法
通过 Few-Shot 展示“沉默”的美德。
2.6.3 标准格式详解
JSON Mode
对于 API 集成,JSON 是王道。建议定义 Schema:
Claude 非常擅长遵循这种类 JSON Schema 的定义。
Structured Outputs:原生结构化输出
除了通过 Prompt 控制外,Claude API 支持两类结构化输出能力:
JSON outputs:通过
output_config.format指定 JSON Schema,让最终响应按 schema 返回。Strict tool use:通过工具定义中的
input_schema与strict: true保证工具调用参数符合 schema。选择原则:纯数据抽取或结构化报告优先用
output_config.format;需要调用业务函数时再使用 strict tool use。
CSV
当需要生成大量数据供 Excel 分析时。
Markdown 表格
最适合人类阅读的结构化格式。
2.6.4 长度控制
Claude 有时会变得很啰嗦。
极简
“Be extremely concise. No filler words.”(极度简洁,无废话)
字数限制
“Strictly under 50 words.”(严格控制在 50 字以内,注意 token vs word 差异)
段落限制
“Answer in exactly 3 bullet points.”(确切使用 3 个要点)
针对性
“Only answer the 'What', ignore the 'Why'.”(只答是什么,不答为什么)
2.6.5 Stop Sequences:停止序列
这是 API 层面的核武器。可以告诉 API:“一看到某个特定字符,就立即切断生成”。
场景:只希望 Claude 填空。 Prompt: Q: 1+1=? A: Stop Sequence: \n\nQ:(下一道题的开头)
当 Claude 生成 2 后,它想顺着格式继续编下一道题,但碰到了 \n\nQ:,API 强制截断。得到了干净的 2。
注意:stop sequence 不能只含空白字符。单独的
\n会被 API 以invalid_request_error拒绝(提示each stop sequence must contain non-whitespace),所以序列里要带上Q:、###这类非空白字符。
现在,已掌握了提示工程的所有组件:基础原则、XML 结构、System Prompt、Few-Shot、CoT 和格式控制。 但是,怎么知道写的 Prompt 到底好不好?如何科学地改进它?
➡️ Prompt 优化方法论
最后更新于
