结构化输出还需过事实校验这一关
文章用刻意构造的虚构书目示例说明:输出即使能解析、字段齐全且类型正确,也可能编造来源中未知的年份。练习区分语法、结构和事实核对,强调格式合规不能替代内容验证。
完整中文译文
JSON 能被解析、字段齐全、类型正确,里面的事实仍然可能是编的。作者用三本虚构图书演示了一个容易漏掉的问题:来源没有提供出版年份,输出却填上了一个看起来合理的整数。
这不是某个模型的实测翻车记录,而是刻意构造的练习。它值得程序员花几分钟看,因为它把 AI 数据提取中的检查拆清楚了:语法、结构、来源一致性,任何一层都不能替下一层作保证。
为什么格式全对,数据还是错的
练习给出的来源只有三条记录:
- Paper Signals,作者 A. Dube,2021 年,评分 4。
- Quiet Circuits,作者 T. Moyo,2023 年,评分 5。
- Small Useful Things,作者 N. Rao,年份未知,评分 3。
输出约定也很明确:恰好三条记录,只能使用小写的 title、author、year、rating 四个键;year 是整数或 null,rating 是 1 到 5 的整数。
下面这段刻意构造的错误输出,用来说明格式检查会漏掉什么:
[
{
"title": "Paper Signals",
"author": "A. Dube",
"year": 2021,
"rating": 4
},
{
"title": "Quiet Circuits",
"author": "T. Moyo",
"year": 2023,
"rating": 5
},
{
"title": "Small Useful Things",
"author": "N. Rao",
"year": 2020,
"rating": 3
}
]
要看的是最后一条记录的 "year": 2020。它符合整数类型,却没有来源支持。只检查数组长度、字段、类型和评分范围的校验器,完全可能放行。
解析成功只能证明格式可读,不能证明内容可信。
把检查拆成三层,才能知道错在哪里
作者建议分别检查三个问题。
第一层是语法:字符串能不能被 JSON.parse 接受?例如,添加尾随逗号,应当在这里失败。这一层不关心书名和年份是否真实。
第二层是结构:是否恰好三条记录?键是否精确匹配?字段类型和取值范围是否正确?把评分改成字符串,或者把整数评分改成 9,都应当在这里被拦住。
第三层才是来源一致性:逐项对照输入,确认输出有没有改写、遗漏或补造信息。那个类型正确的 2020,需要这一层才能识别。
修复方式是把第三本书的年份改为 "year": null。这里的 null 表示「提供的来源没有年份」,并不是断言这本书没有出版年份。如果业务必须拿到年份,就应标记为待核实,而不是悄悄补齐。
作者还给了一段约束提示词,用来明确提取范围和缺失值规则:
Convert only the three supplied fictional book records to a JSON array. Use exactly title, author, year and rating. Preserve unknown year as null. Do not add authors, titles or dates. Return JSON only. After generation, I will separately check syntax, shape and each value against the source.
要看的是 Preserve unknown year as null,以及最后一句关于生成后独立检查的约定。提示词说明了要求,但不能代替检查结果。
练习的方法也很直接:每次只改一个地方,分别加入尾随逗号、字符串评分、评分 9,或用合理年份替换 null,然后判断应该由哪一层发现错误。
我的判断
这篇最有用的地方,是把「格式正确」和「忠于来源」分开了。对于 AI 提取任务,校验器接受一个值,与输入材料支持这个值,是两件事。
但它只是教学示例。作者明确说明,图书是虚构的,错误也是人为构造的,没有提供模型对照、错误率或提示词效果数据。因此,不能据此判断某个模型有多容易编造,也不能宣称这段提示词能降低多少错误。
常见的结构校验仍然有用,它负责发现缺字段、类型错误和越界值。本文补上的是它覆盖不到的一层。至于来源核对如何自动化,原文没有说清;三条明确记录可以人工逐项检查,更复杂的材料还需要另行设计核验办法。
作者维护的 Open Practice 是独立、非认证的实践活动集合。完整练习包含虚构测试样例、本地 JSON 检查器、可编辑笔记和离线导出;学习材料免费,可选托管 AI 工具有各自限制,也可以不注册 AI 账号、直接人工查看参考内容。这些是练习条件,不是产品效果证明。
能拿来做什么
- 在前端或 Node 的 AI 数据提取流程中,把解析、结构校验和来源核对分别处理,避免一个「校验通过」掩盖不同层面的结果。
- 对输入中缺失的字段明确约定表示方式。这个例子允许年份使用
null,业务必须知道年份时,再进入待核实流程。 - 用文中的四种改动检查现有流程:尾随逗号、字符串评分、评分
9、补造年份,并确认每种错误由哪一层发现。 - 编写提取提示词时,写清记录范围、精确字段和未知值规则,同时保留原始输入,供生成后逐项比对。