记忆点:JSON 管语法,Schema 管结构,Tool Call 管意图,真正执行仍在应用侧。
💡 答案要点
三者定位不同,渐进式可靠性提升:
| 特性 | JSON Mode | Structured Outputs | Function Calling |
|---|---|---|---|
| 本质 | 约束输出为合法JSON | 约束JSON符合Schema | 让模型调用工具 |
| 可靠性 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| Schema校验 | ❌ 只保证JSON合法 | ✅ 严格校验字段/类型 | ✅ 严格校验参数 |
| 适用场景 | 通用JSON输出 | 严格业务结构 | 工具/插件调用 |
JSON Mode:API层面的简单约束
python
# OpenAI JSON Mode
response = client.chat.completions.create(
model="gpt-4o",
response_format={"type": "json_object"}, # 保证输出合法JSON
messages=[{"role": "system", "content": "始终输出JSON"}]
)
# 不保证字段名、类型、必填,只保证是JSONStructured Outputs:严格Schema约束
python
from pydantic import BaseModel
class UserInfo(BaseModel):
name: str
age: int # 类型严格
email: str | None = None # 可选字段
response = client.chat.completions.create(
model="gpt-4o",
response_format={
"type": "json_object",
"json_schema": UserInfo.model_json_schema()
},
messages=[...]
)
# 100%符合Schema,字段名/类型/必填都有保证Function Calling:让模型执行动作,而非仅返回数据
python
tools = [{
"type": "function",
"function": {
"name": "search_database",
"description": "搜索产品数据库",
"parameters": {
"type": "object",
"properties": {
"product_id": {"type": "string"},
"include_inventory": {"type": "boolean"}
},
"required": ["product_id"]
}
}
}]
response = client.chat.completions.create(
model="gpt-4o",
tools=tools,
messages=[...]
)
# 模型输出 tool_calls 而非普通消息
# 可以继续处理:调用search_database → 把结果传回模型 → 生成最终回复选型决策树:
只需要合法JSON?
→ JSON Mode(简单场景,快速实现)
需要严格字段/类型校验?
→ Structured Outputs(业务系统,支付/订单/风控)
需要模型执行动作(查DB/发邮件/调用API)?
→ Function Calling(Agent工具调用,RAG检索)面试话术:
"三者层次不同:JSON Mode 通常只约束合法 JSON;Structured Outputs 进一步约束 Schema;Function Calling 表达模型建议调用哪个工具及参数,但真正执行动作的是应用。Schema 合法不等于业务安全,支付等高风险动作还必须做鉴权、金额/对象校验、幂等、审批和审计。"
