三者经常被混为一谈:JSON Mode 只保证「是 JSON」,不保证符合你的 schema;Structured Outputs(strict: true / response_format 带 JSON Schema)保证字段和类型对齐;函数调用是让模型「决定调哪个后端函数」。只要最终数据不要工具动作时,用结构化输出;要查库/下单/发消息时,用函数调用;两者也可叠加。无论哪种,模型给的值仍是不可信输入,业务校验不能省。
适用场景:信息抽取、打标分类、生成可直接渲染的 UI 数据、给下游系统喂参数。
structured-output json-schema response-format validation
操作步骤
- 先写 schema/Pydantic 模型:字段、类型、必填、枚举先定死。
- 能用 strict/结构化输出的模型就开 strict;不支持的模型退到 JSON Mode + 本地校验 + 一次修正重试。
- 校验分两层:格式校验(schema)+ 业务校验(数值范围、ID 是否存在、权限)。
代码示例
from openai import OpenAI
from pydantic import BaseModel
client = OpenAI(base_url="https://tokenbuddy.cc/v1", api_key="{{API_KEY}}")
class CalendarEvent(BaseModel):
name: str
date: str
participants: list[str]
# 具体方法名(parse / responses 等)随 SDK 与接口版本变化,以本站支持情况实测为准接入本站 API:不是每个模型对结构化输出的支持程度都一样——上线前拿本站目标模型跑一组固定测试样本,统计 schema 通过率再定选型,不要听信「都支持」。
注意事项
- ⚠️ 以为开了 JSON Mode 就不会出格式事故
- ⚠️ schema 里塞太多可选字段,模型会偷懒全填空——必填和可选要想清楚
- ⚠️ 把模型抽取的金额/日期不校验直接入账/下单
来源:https://docs.kanaries.net/articles/openai-function-calling