目录
- 一、什么是格式化输出?
- 二、用来干什么?
- [三、 实现方式](#三、 实现方式)
-
- 方式一:提示词工程
- [方式二:Function Calling / Tool Use ------结构化的过渡方案](#方式二:Function Calling / Tool Use ——结构化的过渡方案)
- [方式三:JSON Mode ------保证格式有效](#方式三:JSON Mode ——保证格式有效)
- [方式四:JSON Schema / Structured Outputs](#方式四:JSON Schema / Structured Outputs)
- 四、各方式对比
- 五、目前知名厂商模型对各个方式的支持
一、什么是格式化输出?
大模型格式化输出(Structured Output)是指通过技术手段约束大语言模型(LLM),使其生成符合特定、预定义格式(如JSON、XML等)的响应,而非自由格式的文本。
二、用来干什么?
使得大模型的输出,能够被后续程序节点解析。
在实际生产中,下游代码需要的不是一段流畅的自然语言,而是可解析的、结构固定的数据。
三、 实现方式
方式一:提示词工程
这是最早期、最朴素的方式------在系统提示或用户提示中直接要求模型"以JSON格式返回"。
python
"请以JSON格式返回结果,包含name、age、email三个字段。"
特点与局限 :
这种方式完全依赖模型的指令遵循能力,模型端在训练和推理阶段均未做任何特殊处理,输出结构并不稳定
方式二:Function Calling / Tool Use ------结构化的过渡方案
Function Calling(函数调用)最初是为"让模型调用外部工具"而设计的,但开发者很快发现它能有效产出结构化数据。
基本原理:
客户端在请求中定义工具的参数JSON Schema,大模型发起工具调用,入参就是格式化数据,工具处理完成得到最终格式化输出
API格式(OpenAI示例):
python
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "介绍下阿凡达这个电影"}],
tools=[{
"type": "function",
"function": {
"name": "return",
"parameters": {
"type": "object",
"properties": {
"date": {"type": "string"},
"name": {"type": "string"},
"desc": {"type": "string"}
},
"required": ["date","name"."desc"]
}
}
}],
tool_choice={"type": "function", "function": {"name": "return"}}
)
# 模型将电影相关信息,放到工具入参中,并返回
模型端的实现:
- 训练阶段指令微调,模型在训练阶段经过专门微调,学会了识别函数定义并输出结构化参数。
- 推理阶段约束解码,在推理阶段,生成token之前,系统会检查下一个token哪些是合法的,哪些是非法的,将非法的采样概率设为负无穷。能够保证JSON 语法正确(括号配对、无多余逗号)、字段名完全匹配 Schema、字段类型正确、枚举值不超范围、必填字段不缺失。
方式三:JSON Mode ------保证格式有效
JSON Mode是OpenAI在2023年11月发布的功能。通过response_format参数确保模型一定返回有效的JSON对象,但不保证JSON的结构与你的预期一致。
需要辅助提示词说明json结构和字段信息。
API格式(OpenAI示例):
python
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "你是一个数据分析助手"},
{"role": "user", "content": "分析这段文本的情感"}
],
response_format={"type": "json_object"} # 启用JSON Mode
)
模型端的实现
- 训练阶段:模型经过针对性训练(如通过强化学习 + 模式验证奖励),提升生成有效JSON的能力
- 推理阶段:服务端在推理时强制约束输出为合法JSON,但不校验具体结构
其他兼容提供商:
Groq、Together AI、DeepSeek等通过兼容OpenAI API格式支持JSON Mode;Google Gemini通过generationConfig中的responseMimeType = "application/json"实现类似功能。
方式四:JSON Schema / Structured Outputs
同样是OpenAI在2024年8月发布的功能;
是Json mode 方式的升级和补全
API格式(OpenAI示例):
python
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "user", "content": "创建一个无线游戏耳机的产品信息"}
],
response_format={
"type": "json_schema",
"json_schema": {
"name": "product_listing",
"schema": {
"type": "object",
"properties": {
"name": {"type": "string"},
"brand": {"type": "string"},
"price": {"type": "number"},
"category": {"type": "string"},
"features": {
"type": "array",
"items": {"type": "string"}
}
},
"required": ["name", "brand", "price", "category"],
"additionalProperties": False
},
"strict": True # 启用严格模式,确保100%合规
}
}
)
模型端的实现
通过约束解码(Constrained Decoding) 技术,在推理层将你提供的JSON Schema编译为语法规则,在逐token生成时实时过滤------只允许生成符合Schema的token,从根本上杜绝"生成非法JSON"或"结构不符"的可能。
四、各方式对比
| 方式 | 保证有效JSON | 保证符合Schema | 模型端实现机制 | 可靠性 |
|---|---|---|---|---|
| 提示词工程 | ❌ | ❌ | 无特殊处理 | ~36% |
| Function Calling | ✅ | 部分(仅参数层) | 指令微调 | ~86% |
| JSON Mode | ✅ | ❌ | 训练(RL)+推理软约束 | 有效JSON 100% |
| Structured Outputs | ✅ | ✅ | 推理硬约束(约束解码) | 100% |
五、目前知名厂商模型对各个方式的支持
| 厂商 | JSON Mode (json_object) | JSON Schema (json_schema) | 实现方式与说明 |
|---|---|---|---|
| OpenAI | ✅ | ✅ | 通过 response_format 参数控制。json_schema + strict: true 启用约束解码,100% Schema 合规 |
| 阿里云通义千问 | ✅ | ❌(公开文档未明确) | 设置 response_format: {"type": "json_object"},需在 system/user message 中包含 "JSON" 字样。思考模式模型暂不支持结构化输出 |
| DeepSeek | ✅ | ❌ | 设置 response_format: {"type": "json_object"},需在 prompt 中包含 "json" 字样并提供 JSON 格式样例。不支持 OpenAI 的 json_schema 结构化输出 |
| 智谱 GLM | ✅ | ✅ | 支持 json_object 和 json_schema 两种类型。json_schema 模式下支持 strict 参数(true/false)控制是否严格遵循 Schema。GLM-4.7 及以上版本原生支持结构化输出 |