第 08 讲 · 结构化输出:让模型返回能直接反序列化的 JSON
一、问题现场:模型返回的 JSON 是怎么翻车的
1.1 一次真实的上线事故
我们团队的工单分类接口上线第二天早上 9 点 40 分,监控群里开始刷HttpMessageNotReadableException。一天下来 1847 次调用,失败 213 次,失败率 11.5%。前端同学很委屈:“模型有时候返回得挺好,有时候就报错,是不是你们后端没做好容错?”
我们当时第一反应是"提示词写得不够狠",于是把"只返回 JSON,不要有任何其他文字"加粗、大写、重复了三遍,还在末尾加了一句"违反格式你将被惩罚"。当天失败率从 11.5% 降到了……11.9%。没降,还略升了。
后来我们把那 213 条失败样本捞出来逐条看,才发现问题根本不在"模型不听话",而在于:
- 我们假设模型返回的是"一段 JSON",实际上它返回的是"一段以 JSON 为主要内容的自然语言文本";
- 我们假设"格式错误"是一种错误,实际上它是八种不同的错误,每一种的成因和解法都不一样;
- 我们假设加强提示词能提高成功率,实际上这一层有明确的天花板。
这一讲要解决的,就是怎么把模型的输出变成可以直接readValue的 Java 对象,