请求很小,差别却不小
设想 AI 助手需要准备一个位移为 10 毫米的提案。接收程序要求对象包含数值和计量单位两个字段。助手返回 10 和 cm。JSON 可以解析,字段符合要求,数值甚至可能位于允许范围内。然而,它表示的是 100 毫米。问题不是缺少标点,而是提案改变了请求。
通过检查究竟证明了什么?我们构造三个谓词,也就是答案为真或假的问题:是否符合模式 S、是否满足范围 B,以及是否符合目标 I。读者只需想象一把尺子就能跟随推理;公式和代码会把“有效输出”中容易被忽略的含义展开。这里不执行移动、设备调用或企业操作,全部案例仅模拟提案。
先于模型:定义必须成立的条件
本例的目标不是从模型自身输出中推断的,而是事先已有且被认为可信的参考量:1/100 米。领域上限仅为教学而设定,为 3/20 米,即 150 毫米。二者信息不同:上限约束问题模型中的提案范围,参考量说明实际请求的位移。没有超过上限,并不等于到达了所要求的位置。
这个前提限定了结果的适用范围。我们证明某些检查不足以验证已经明确的结构化请求,并不证明系统能够自动理解任意自然语言指令。如果用户只说“稍微移动一下”,目标就尚未给出。精确数值比较无法恢复从未提供的信息。系统必须先获得可用的规格,并在应用语境中处理歧义。
我们要求模式检查什么
JSON 是数据表示格式,JSON Schema 用来描述文档必须满足的约束。这里使用 Draft 2020-12 方言。基础模式要求实例为对象,必须具有 value 和 unit 字段,不允许额外字段,value 是包含端点的 0 至 150 之间的 number,unit 只能为 mm 或 cm。这些是本例契约的规则,不是计量或智能体的普遍属性。尤其要注意,数值上限 150 尚未解释单位。
x 表示提案,AND 要求全部条件同时成立。类型很重要:字符串“10”不等于数值 10,布尔值 true 也不是本契约中的数值量。不支持的单位或额外字段同样会被拒绝。这些检查有实际价值,可以防止程序解释约定格式以外的数据。但是,10 mm 和 10 cm 都完全符合上述规则。
把数量转换到共同单位
比较物理量需要统一表示。定义归一化函数 N,将符合 S 的提案转换为米。它改变书写方式,而不改变所描述的位移。1 厘米转换为 1/100 米,10 毫米转换为 10/1000 米,二者均为 1/100 米。先检查类型和单位,再做转换;不能为未知字段随意赋予含义。
B 检查转换后的量是否落在本例模型的区间内,I 检查它是否等于参考量。方括号表示逻辑比较结果,不是新的单位。对于 10 cm,N(x)=1/10 米,小于 3/20 米,却不等于 1/100 米。因此 S 为真、B 为真、I 为假。一个反例已经足以推翻“符合模式且未超限就必然符合目标”这一普遍推论。
反向例子可以防止过度严格的修补方案。如果只与一条预期 JSON 字符串比较,预期字符串写的是 10 mm,那么 1 cm 也会被拒绝,尽管位移相同。目标检查需要适合领域的等价关系。本例采用转换后数量相等,但这并不意味着任意文档都可视为等价。例如,文本标识符可能必须逐字符一致。
更强的模式:跨字段条件
不能因此断言 JSON Schema 只检查标点,或者无法表达 B。对于本例的两种单位,只需增加条件:unit 为 cm 时,value 不得超过 15。基础模式已将毫米数值限制为 150。allOf 用于组合约束,if 和 then 应用条件规则。因此在已定义契约内,强化后的模式 S_B 也能表达换算后的范围。
上式是便于阅读的组合记法,不能原样粘贴为 JSON 文档;完整有效的模式位于归档中。代码检查它在全部 302 个网格案例上与 S 和 B 的组合一致。然而,10 cm 仍能通过 S_B,却没有达到目标。增强领域契约能解决一类错误,但不会自动补充当前请求的参考量。
目标已知时,还可以生成针对当前请求的模式,通过常量与分支只允许 10 mm 或 1 cm。“模式”和“含义”之间没有神奇的界线,关键在于实际编码了哪些信息和约束。一种方案在程序中完成换算和比较,另一种把部分相同逻辑放入模式。二者都依赖可信目标及正确的需求转写。
一个可以完整检查的有限实验
实验使用 Python 3.14.0 和 jsonschema 4.26.0 的 Draft202012Validator。枚举 0 至 150 的全部整数,分别搭配两种单位,共 151 乘以 2,即 302 个提案。这不是语言模型的输出样本,没有提示词或 AI 服务调用,也不估计概率。我们完整枚举自行构造的有限集合,使结果无需依赖图表即可核对。
按构造方式,302 个提案全部满足 S。B 接受全部 151 个毫米数值,以及厘米单位下 0 至 15 的 16 个数值,合计 167 个。I 只接受两个整数配对:10 mm 和 1 cm。因此有 165 个提案满足范围,却不符合目标。如果更换网格、区间或加入其他小数,数量就会变化。反例的逻辑结论仍然成立,但这些数字不是智能体的通用基准。
| 提案 | S | B | I |
|---|---|---|---|
| 10 mm | T | T | T |
| 1 cm | T | T | T |
| 10 cm | T | T | F |
| 100 mm | T | T | F |
| 20 cm | T | F | F |
| "10" mm | F | — | — |
| true mm | F | — | — |
表中 T 表示真,F 表示假。横线表示不适用:模式检查失败后,不再把提案作为允许的数量解释,也不计算 B 或 I。把未执行检查与否定结果混为一谈,会让日志难以解读。图中重复这些案例,请重点观察 10 cm 和 100 mm 两行:前两列通过,最后一列失败。

从文本到数值:代码实际做了什么
归档包含 experiment.py、实际模式、固定版本依赖和完整结果。解析器使用 Decimal 读取小数,并明确拒绝 NaN 和 Infinity;不能假设每个 Python 解析器都会自动实施相同策略。通过验证后,Fraction 精确表示换算比例,因此与 1/100 和 3/20 的比较不依赖于 0.01 或 0.15 的二进制近似。这种精确性针对声明的数值,不代表物理传感器精度。
assess 过程依次区分解析、模式检查、换算、范围和目标,并在结果中保留原始文本,以明确检查的是哪个提案。附加测试包括把数字写成字符串、布尔值、未知单位、额外字段、缺失字段、负数及非有限数。1.0 cm 案例验证被允许的小数表示仍然符合参考量。文末短代码隔离反例,归档中的代码还执行模式验证及完整枚举。
在固定这个小型模式的前提下,枚举成本随提案数量线性增长。这不是对 JSON Schema 一般复杂度的结论,后者可能包含引用及更复杂结构。实验不测量智能体延迟或推理成本。复现时安装 requirements.txt 中指定版本,运行 experiment.py,再用 plot.py 生成四种语言的图。不需要生成模型或设备连接。
证明范围以外的内容
真实测量可能需要容差。如果需求允许以米为单位的绝对误差 epsilon,I 可以改为 |N(x)−q|≤epsilon。epsilon 必须来自需求,不能在看到答案后再选择,以便让它通过。相对误差比较在接近零时还需要额外策略。本例使用精确数量和零容差只是为了使反例易于检验,并不是通用计量规则。
即使对象通过三个谓词,也不因此获得控制设备的权限。身份、授权、应用状态及物理条件都不在这两个字段中。B 是数学案例中的范围限制,不能证明机器人安全、无碰撞或具有认证。JSON 重复字段策略、输入大小限制及解析资源也需要另行决定。本例不是完整的 API 安全验证。
我们不声称 EL-AI 已有在生产环境执行这些检查的智能体或机器人系统。对工业及协作机器人的兴趣是计划探索的方向,本文的应用联系属于教学假设。文章提供的证据是验证器和数值比较在已公开合成数据上的行为。评估真实智能体需要代表性请求、独立参考、错误分类及明确协议,302 个网格点不能代替这些工作。
回答开篇问题
有效 JSON 证明的是符合已经写出的约束,而不是符合仅存在于设计者脑中的约束。本例中,结构和范围检查会接受 10 cm,尽管请求是 10 mm。统一单位并与可信参考比较,可以发现这个差别,也能接受 1 cm 这种正确数量的不同表示。关键不是放弃模式,而是理解每项检查回答什么问题,以及缺少什么信息。
来源与复现
已阅读的一手文档:Draft 2020-12 Validation 的 6.1.1–6.1.3、6.2.2、6.2.4、6.5.3 节;Core 的 10.2.1.1、10.2.2、10.3.2.3 节。方言名称包含 2020-12,而查阅文档标明的是 2022 年 6 月 16 日的 Internet-Draft 修订版,不将其描述为最终 RFC。实际执行的验证器版本为 4.26.0,也核对了分发页面。本文是带有教学实验的方法论解释,不是经过同行评审的原创研究。
JSON Schema Draft 2020-12 — Validation.
JSON Schema Draft 2020-12 — Core.
from fractions import Fraction
proposal={"value":10,"unit":"cm"}
metres=Fraction(proposal["value"])*Fraction(1,100)
bounded=0 <= metres <= Fraction(3,20)
intent=metres == Fraction(1,100)
assert bounded and not intent
print(metres,bounded,intent) # 1/10 True False
代码、数据与说明 · JSON. 教学计算使用 Python 3.14.0,图使用 Matplotlib 3.11.2。分析由 AI 辅助,不声称经过同行评审或人工审核。原创 ImageGen 封面仅作示意,不记录 EL-AI 人员、场所或实际安装。来源查阅于 2026 年 10 月 21 日。

