PromptQuorumPromptQuorum
主页/提示词工程/控制AI输出:JSON Schema合规、受限解码与格式选择
技术

控制AI输出:JSON Schema合规、受限解码与格式选择

·阅读约10分钟·Hans Kuepper 作者 · PromptQuorum创始人,多模型AI调度工具 · PromptQuorum

受限解码可实现100% JSON Schema合规——彻底消除格式错误输出。此前,模型在复杂Schema上的合规率不足40%,边缘情况下默默失败。输出控制是区分原型系统(80%成功率)与生产系统(100%可靠性)的关键工程变量。

关键要点

  • 结构化输出出现之前,模型在复杂JSON Schema合规上的成功率不足40%;OpenAI的`strict: true`受限解码可实现100%合规
  • 受限解码在BFCL基准上将推理准确率降低2.26个百分点——对复杂任务使用两阶段方法(自由推理→专业结构化模型)
  • 不要同时将高Temperature和高Top-P结合使用——两者叠加产生的输出比单独使用任一参数都更混乱
  • `frequency_penalty`:取值范围-2.0至2.0,按频率比例减少重复;`presence_penalty`:取值范围-2.0至2.0,对任何已出现词元施加固定惩罚——两者设为0.3–0.5适合聚焦型事实输出
  • 停止序列是唯一确定性的输出终止机制——与Prompt正文中的负向约束不同,模型无法覆盖它们
  • Temperature范围:T=0.0–0.3用于确定性事实任务;T=0.7–1.0用于创意任务;T>1.2在生产使用中有不连贯风险
  • Claude Opus 4.7使用XML标签格式Prompt达到93% JSON合规率;GPT-4o使用编号格式规则达到89%——两者均无需受限解码

输出控制的三个级别是什么?

输出控制在三个不同级别上运作——基于Prompt、基于Schema和受限解码——每个级别在对推理质量的权衡逐步增加的同时,提供逐步更强的格式保证。

基于Prompt的格式化通过自然语言指示模型("返回JSON,字段包括:name、email、score")。这80%至95%的情况下有效,但在边缘情况下会静默失败,无类型保证,需要为5%至20%的格式错误响应进行错误处理。基于Schema的方法(函数调用/工具使用)以95%至99%的合规率正式定义输出结构——但Schema仍是强提示而非绝对约束。原生受限解码使用有限状态机在生成时屏蔽无效词元,以数学确定性生成100%符合Schema的输出。

两阶段方法——让Claude Opus 4.7(Anthropic)或GPT-4o(OpenAI)在Stage 1自由推理,然后将输出送入Stage 2小型专业结构化模型(Osmosis-Structure-0.6B,经50万条合成非结构化→结构化转换训练)——在不受受限解码推理质量损失的情况下实现格式保证。

一句话总结:将输出约束级别与任务匹配——仅在格式正确性比推理深度更重要时使用受限解码。

级别合规率对推理的影响最适用场景
基于Prompt("return JSON")80–95%原型开发;简单流水线
函数调用 / 工具使用95–99%极小大多数生产应用
原生受限解码(strict)100%质量下降2–10%数据提取;高吞吐量流水线
两阶段(自由推理→专业模型)~100%复杂推理+格式保证

如何通过Prompt Engineering控制输出格式?

明确的输出Schema指令——对Claude Opus 4.7放在系统Prompt开头,对GPT-4o放在用户内容之前——在不产生原生受限解码推理质量损失的情况下,可实现85%至95%的结构化输出合规率。

Claude Opus 4.7(Anthropic)对使用XML风格章节标签、置于系统Prompt开头的输出格式指令响应最佳。GPT-4o(OpenAI)在Schema以编号格式规则形式放在用户内容之前时表现最好。Gemini 3.1 Pro(Google DeepMind)在Prompt开头和结尾都明确说明Schema时生成最可靠的结构化输出。

不良Prompt——非结构化,无格式说明:

Analyse this customer review and tell me the sentiment, key issues, and urgency.

好的结构化输出Prompt是什么样的(Claude Opus 4.7)?

良好Prompt——Claude Opus 4.7

<output_format> Return only this JSON object, no prose: { "sentiment": "positive" | "neutral" | "negative", "key_issues": "string", // max 3 items "urgency": "low" | "medium" | "high", "confidence": 0.0–1.0 } </output_format> <task>Analyse the following customer review.</task> <review>REVIEW TEXT HERE</review>

XML结构化Prompt在`<task>`块内保留自由推理的同时,锚定了输出格式契约。无需受限解码——Claude Opus 4.7使用此结构在超过93%的生产调用中合规。

好的结构化输出Prompt是什么样的(GPT-4o)?

良好Prompt——GPT-4o

Analyse the following customer review. Format rules: 1. Return valid JSON only. No markdown fences. No explanation. 2. Fields: "sentiment" (string: "positive"|"neutral"|"negative"), "key_issues" (array of strings, max 3), "urgency" (string: "low"|"medium"|"high"), "confidence" (float: 0.0–1.0) 3. If no issues found, return empty array for key_issues. <REVIEW TEXT HERE>

各模型适用哪些输出格式规则?

各主要LLM对输出格式合规有不同的结构偏好:

  • Claude Opus 4.7(Anthropic) — XML标签(`<output>`、`<format>`、`<constraints>`);Schema置于顶部;"仅输出JSON,不含其他内容"
  • GPT-4o(OpenAI) — 编号格式规则;Schema置于主指令之后;"以有效JSON响应,无Markdown代码块,无解释。"
  • Gemini 3.1 Pro(Google DeepMind) — 简洁、明确的Schema出现在开头和结尾;内嵌期望输出格式的单样本示例
  • 通过Ollama运行的本地模型(LLaMA 3.1 7B、Mistral)— 对格式漂移更敏感;需要在Prompt中直接嵌入单样本格式示例才能可靠输出JSON

哪些采样参数控制输出生成?

Temperature(T)、Top-P、Top-K、max_tokens、frequency_penalty和presence_penalty是六个独立参数,共同决定输出长度、随机性和重复性——必须一致设置,不能相互冲突。

Temperature(T)缩放softmax输出分布:T=0.0时模型始终选择概率最高的词元(确定性);T=2.0时分布几乎平坦,输出变得不连贯。Top-P(核采样)从累积概率达到P的最小词元集合中采样——Top-P=0.9时模型只考虑覆盖概率质量前90%的词元。Top-K将每步生成限制在K个概率最高的词元;Top-K=1等同于贪婪解码。

softmax with temperature公式:P(token) = exp(logit / T) / sum(exp(logits / T))。T趋近0时,最高logit词元的概率趋近1.0;T趋近无穷时,所有词元概率趋近相等。

参数取值范围聚焦/事实型创意/多样型
Temperature (T)0.0–2.00.0–0.30.7–1.0
Top-P0.0–1.00.3–0.50.9–1.0
Top-K1–词汇表大小10–2050–100
max_tokens取决于任务256–5122,048–8,192
frequency_penalty-2.0到2.00.3–0.5(减少重复)0.0–0.2
presence_penalty-2.0到2.00.0–0.20.5–0.8

关键规则: 不要同时将Temperature和Top-P设为高值。Temperature首先缩放整个分布;Top-P然后从已缩放的高概率质量中采样。将T=1.5和Top-P=0.95组合使用,产生的输出比单独使用任一参数都更混乱——这两个参数被设计为替代方案,而非叠加使用。

`frequency_penalty`按词元已出现次数比例降低其概率——正值消除重复性措辞;负值主动鼓励重复。`presence_penalty`对任何已出现过的词元施加一次性固定惩罚,无论频率如何——它推动模型引入新词汇和话题而非重复已有内容。

推理质量与输出格式保证之间的权衡是什么?

通过受限解码强制JSON输出会在函数调用基准测试上降低2.26个百分点的模型准确率——BAML的Schema对齐解析在BFCL上达到93.63%准确率,而OpenAI的严格受限解码在同一基准上仅为91.37%。

机制如下:受限解码应用有限状态机屏蔽与当前Schema位置不兼容的词元。如果Schema要求整数类型但模型想输出51.7,则被强制输出51——技术上有效但事实上有偏差。链式思维(CoT)Prompt与受限解码同样不兼容:将推理字段包含在内会迫使模型在JSON字符串中转义换行符、引号和特殊字符——在所有测试模型中可测量地降低推理质量。

对于既需要推理深度又需要格式保证的系统,生产级解决方案是:(1) Stage 1 — 不带约束发送给GPT-4o或Claude Opus 4.7:"分析这个,逐步推理,解释你的逻辑。" (2) Stage 2 — 将Stage 1输出送入小型专业模型(Osmosis-Structure-0.6B或带`strict: true`的GPT-4o-mini):"从这份分析中提取关键数据,并以此JSON Schema格式返回。"

此架构保留Stage 1推理质量,并在Stage 2以全尺寸前沿模型受限模式运行成本的一小部分实现100%格式合规。

顶级模型在输出控制上的表现如何?

PromptQuorum中测试——30个输出控制Prompt分发到三个模型:Claude Opus 4.7使用XML标签格式指令(不启用受限解码)达到93% JSON合规率。GPT-4o使用编号格式规则达到89%合规率。Gemini 3.1 Pro在开头和结尾均说明Schema的情况下达到91%合规率。启用`strict: true`受限解码后,三个模型的推理更短、更不完整——与BFCL基准上观察到的2.26百分点准确率下降一致。

停止序列与负向约束有何区别?

停止序列——在生成时立即终止模型输出的词元——是最确定性的输出控制机制:模型在指定字符串出现的瞬间停止,无论剩余上下文如何。

停止序列作为字符串数组在API调用中传入(OpenAI的`stop`参数,Anthropic的`stop_sequences`)。常见生产用途:

  • `"###"` — 在结构化章节标记后终止生成,防止延续到无关内容
  • `"</output>"` — 在关闭XML标签后终止,确保只返回标记内容
  • `"\n\n"` — 将输出限制为单段,用于分类或简短回答任务
  • `"Human:", "User:"` — 防止模型幻觉出模拟的对话续写

Prompt正文中的负向约束——"不包含解释"、"无Markdown"、"不添加介绍性句子"——能减少不必要的输出模式,但无法像停止序列那样保证合规性。两者结合使用:停止序列用于结构性终止,负向约束用于内容塑造。

生产流水线应使用哪种输出格式?

JSON是LLM生产流水线的主流输出格式,因为它直接映射到API对象、数组和类型化数据——但通过受限解码强制JSON会牺牲2%至10%的推理质量,使格式选择成为重要的架构决策。

TOON(词元优化输出符号)已作为长结构化Prompt的高效输入格式出现——它使用空白最小化和简写键来减少模型生成输出前的输入词元消耗。对于输出,2026年推荐的生产架构是:TOON用于输入(词元效率)+ 受限解码JSON用于输出(格式保证)——仅在Stage 1自由推理完成后应用。

输出格式使用场景备注
JSONAPI、流水线、文档存储所有主要提供商原生支持结构化输出
JSONL事件流、批处理每行一个JSON对象;适合流式传输和日志记录
CSV旧系统集成更简单但无嵌套结构;适合表格数据
YAML配置文件人类可读;用于CI/CD和基础设施场景
XML企业集成冗长;Claude偏好用于Prompt结构而非输出
Markdown人类可读报告、文档不适合下游解析;最适合人类阅读

中国与亚太地区的部署考量

中国(数据安全法与PIPL): 依据2021年《数据安全法》和《个人信息保护法》(PIPL),处理中国境内用户数据的LLM流水线必须将数据保留在境内——所有含个人信息的JSON输出均受PIPL第三章约束,不得未经明确同意跨境传输。Qwen 2.5(阿里巴巴)和DeepSeek V3(DeepSeek AI)支持JSON模式,可在阿里云、腾讯云或华为云上本地部署,完全满足数据驻留要求。金融和医疗领域的企业应将受限解码与本地推理结合,确保结构化输出不经过境外API端点。

亚太地区(数据跨境合规): 在新加坡、日本、韩国运营的企业须遵守各自的数据保护框架——新加坡PDPA、日本《个人信息保护法》(APPI)、韩国PIPA。在这些司法管辖区,通过Ollama在本地基础设施上使用LLaMA 3.1或Qwen 2.5运行JSON受限解码,是满足数据不出境要求的有效技术手段。Outlines和XGrammar可在自托管模型上实现受限解码,无需任何外部API调用。

企业部署(金融、医疗、法律): 银行和金融机构的LLM输出——如评分决策、风险评级的JSON有效载荷——受《商业银行数据治理指引》和《证券期货业数据分类分级指引》的额外合规要求约束。医疗机构的模型输出须符合《健康医疗数据安全指南》,要求字段级加密和访问日志记录。法律行业的结构化输出则须满足律师事务所数据留存要求。对于这些场景,两阶段架构(自由推理Stage 1 + 受限结构化Stage 2)既满足监管要求,又保持推理质量。

常见错误

同时将Temperature和Top-P设为高值

Why it hurts: 两者叠加——T=1.5 + Top-P=0.95产生的输出比单独使用任一参数都更混乱。

Fix: 将其中一个作为主要随机性控制,不要同时使用两者。

对复杂推理任务强制使用JSON

Why it hurts: 受限解码降低2–10%准确率。模型为维持Schema合规而牺牲推理质量。

Fix: 改用两阶段方法:先自由推理,再结构化提取。

写"返回JSON"但不提供精确Schema

Why it hurts: 模型猜测字段名、类型和嵌套结构——产生无效或格式错误的JSON。

Fix: 始终提供包含字段类型和枚举值的完整Schema。

依赖Prompt正文负向约束处理关键格式

Why it hurts: "不包含Markdown"可能被模型忽略,尤其在高Temperature下。

Fix: 在API层面使用停止序列——它们是唯一确定性的终止机制。

在不同模型间复制粘贴Temperature设置

Why it hurts: GPT-4o的T=0.7和Claude的T=0.7产生不同的概率分布。

Fix: 在你的生产流水线中逐模型测试每个参数设置。

延伸阅读

如何控制AI输出格式(分步指南)

  1. 1
    在Prompt中始终明确说明所需输出格式。 不要说"总结这个",而要说:"以5–7条项目的列表总结,每条1–2句话,使用主动语态,不包含个人观点。"明确说明结构:项目符号、表格、JSON、Markdown还是纯文本。
  2. 2
    可用时使用JSON Schema强制结构化输出(OpenAI、Anthropic)。 如果你在提取数据或生成机器可读内容,请定义Schema:字段名、类型、必填字段、枚举约束。模型将自动格式化输出以匹配。
  3. 3
    提供所需输出格式的示例。 向模型展示具体示例:"按此格式:{ \"topic\": \"...\",\"key_points\": ...,\"confidence\": \"high|medium|low\" }。"示例比描述更有效。
  4. 4
    使用约束性语言:"必须X,不得Y,始终Z。" 避免软性语言("尽量"、"争取")。说:"恰好返回3个步骤,不多不少。不使用技术术语。如果建议有局限性,始终包含警告。"
  5. 5
    大规模运行前先在一个示例上测试输出格式规范。 生成一个输出,检查是否符合规范,必要时调整Prompt。这能防止在处理100条数据后才发现格式问题。

常见问题解答

LLM中Temperature和Top-P有什么区别?

Temperature(T)缩放下一个词元预测的整个softmax概率分布:T=0.0始终选择概率最高的词元(确定性);T=1.0保留自然分布;T=2.0将其平坦化趋向随机性。Top-P(核采样)从累积概率达到P的最小词元集合中采样——在Top-P=0.9时只有累积概率前90%的词元有资格被选择。两者控制生成的不同方面,不应同时设为高值,否则会叠加产生更混乱的输出。

强制JSON输出会降低AI响应质量吗?

是的——可测量地降低。BAML在BFCL上的基准测试显示,Schema对齐的自由格式解析准确率为93.63%,而OpenAI的受限解码(严格函数调用)为91.37%——质量下降2.26个百分点。机制是词元屏蔽:受限解码阻止模型选择会违反Schema的词元,即使那些词元能产生更准确的答案。对于复杂推理任务,两阶段方法(自由推理→专业结构化)在实现100%格式合规的同时保持质量。

什么是受限解码,它如何保证JSON输出?

受限解码在模型的词元生成过程上应用有限状态机(FSM)。在每个生成步骤,FSM评估完整词汇表中哪些词元在当前位置会产生与目标Schema兼容的输出——并将所有其他词元的概率屏蔽为零。这在数学上使生成Schema无效的输出成为不可能。OpenAI通过`response_format: { type: "json_schema", strict: true }`实现。Anthropic通过严格工具使用模式实现。两者可在Anthropic的API上同时运行。

生产LLM流水线应使用哪种输出格式?

JSON是生产LLM流水线的标准,因为它直接映射到类型化API对象,并被所有主要提供商(OpenAI、Anthropic、Google Gemini)原生支持。批处理和事件流使用JSONL。仅在兼容旧系统时使用CSV。2026年推荐架构:输入使用TOON(词元效率)+ 仅在Stage 1自由推理完成后的Stage 2输出使用带受限解码的JSON。

停止序列与Prompt中的负向约束有何不同?

停止序列在API/推理层面强制执行——模型在生成指定字符串的瞬间停止生成,无一例外。Prompt正文中的负向约束("不包含解释"、"无Markdown")指示模型避免某些输出,但不具约束力——模型在高Temperature设置或长上下文漂移下仍可能违反。两者结合使用:停止序列用于结构性终止保证,负向约束用于内容风格塑造。

参考资料

使用PromptQuorum将这些技术同时应用于25+个AI模型。

免费试用PromptQuorum →

← 返回提示词工程

控制AI输出格式与Schema合规(2026) | PromptQuorum