补充一个区分:最终都可能得到 Pydantic 对象,不代表生成过程和保证相同。
with_structured_output 同时包含“让服务端怎样生成”和“客户端怎样解析校验”两层。
| method | 生成侧做什么 | 需要额外注意 |
|---|---|---|
json_mode |
对支持该协议的服务,请求 JSON 输出 | 仍要在提示中说明字段、类型和 JSON 格式;不能据此保证符合你的 schema |
json_schema |
将 schema 交给支持原生结构化输出的服务 | 模型、端点、支持的 schema 子集,以及 strict 能力都需要核对 |
function_calling |
使用工具调用协议表达结果 | 服务必须支持相应工具协议,不能因接口路径兼容就默认支持 |
你传入 BaseModel 时,成功解析和校验后才得到该类实例;缺字段、类型不符或请求失败,都可能让调用抛错。json_mode 不是“已经把 BaseModel 的全部约束交给服务端执行”。
你这里配置了自定义 base_url,判断支持情况时要看实际服务商 + 模型 + API 端点的文档,不能只根据“模型擅长 JSON / TypeScript”或“支持 OpenAI 兼容接口”来判断。
建议用固定的小 schema 做兼容性检查:一个必填字符串、一个有取值范围的字段,先确认正常请求,再检查信息不足时的返回。
调试时可设置 include_raw=True,区分 raw、parsed 与 parsing_error;但它只帮助查看解析结果,网络或服务端拒绝请求仍可能直接抛异常。
不要在方法失败时悄悄切换模式并当作同一种保证,最好把最终采用的模式和本地校验结果记录下来。
参考:LangChain 方法参数说明、OpenAI JSON mode 与 Structured Outputs 的区别。
这是按当前文档补充的解释,尚未对你的服务执行 API 测试。方便的话请补充脱敏后的服务商、模型标识、langchain-openai 版本和具体 schema;无需提供密钥,就能进一步判断应选哪种模式。