模型输出数组每项都合法,怎样查出同一个业务 ID 被写了两遍
模型返回十条记录,每条都符合 Schema,仍可能只有九个业务对象。原因是同一个 ID 被输出两遍,而且两遍的内容还可能互相冲突。数组对象合法性和业务键唯一性是两个检查,不能用前者替代后者。
唯一的是哪个键
本文以订单 id 为单字段业务键,要求非空字符串,保留前导零,不将大小写或空格自动归一。真实项目如果按“店铺加订单号”识别唯一性,应采用复合键,而不是只抓订单号。这一选择必须来自业务合同,不能由客户端根据样本字段名猜测。
JSON Schema 的 uniqueItems 比较完整数组元素是否相等;同一个 ID、不同备注的两个对象不是同一完整值,因此不能指望这个约束单独识别业务冲突。结构化输出即使满足对象类型,也不自动完成跨元素的实体去重。
反向索引保留全部位置
检查器先验证每项及其业务键,再建立键到数组索引列表。某个键对应两个或更多位置时,输出全部索引,并进一步区分对象完全相同还是内容不同。不要在遍历时直接赋值 by_id[id]=item,它会覆盖先前对象,丢掉最需要审核的冲突证据。
附件有同 ID 同内容、同 ID 不同状态、不同 ID 相同描述和缺 ID 四类情况。前两类都拒绝进入唯一记录集合,第三类允许,最后一类单独标缺键。不同实体描述相同很常见,不能按备注文字去重;完全相同的重复项也应说明来源,而不是默认当作无害。
查到冲突以后暂停什么
在人工决定合并语义前,停止这组结果的自动入库或写工具调用。可以继续对其他独立项做检查,但最终报告必须显示哪些 ID 仍有冲突,不能用原始数组长度当成功记录数。若需要部分接受,合同应说明接受集合与隔离集合如何对账,避免一批数据重复提交时再次遗漏。
失败反例是选“最后一条更新”的对象,但样本没有可靠更新时间。数组顺序不是业务优先级;模型先写哪个也不构成最新事实。若上游确实提供版本号或来源时间,应先验证其语义和一致性,再设计冲突解决,而不是在通用去重函数里随手排序。
复合键还需防止拼接碰撞。例如直接用无分隔字符串连接两字段,会把不同组合合并。可以使用元组做内部键,输出时保留独立字段。本文样本只演示单键,但明确拒绝把它推广成自动实体合并系统。通过结论只表示这份数组在指定键合同下没有重复,不表示内容来自真实原文或已被业务系统确认。
配套文件与依据
本文的合成输入和参考结果可下载独立样本 a015.json,离线检查器 a015.py与样本放在同一目录后运行。检查器不调用模型接口。 使用 Python 3.12 或兼容版本,将上述文件下载到同一目录,执行 python a015.py。
留言讨论
评论发布后会被人工复核,违规内容将被删除。
如果发表没有反应,可以前往联系我们告诉我们。