一个生产级的 Jev 问题,就是一份决策契约(decision contract)。它定义:哪些状态字段可见、指令是什么含义、存在哪些结果、哪条逃逸路径是安全的、置信度如何解读、哪些动作可以随之发生,以及哪个契约版本产生了这个结果。把问题当成随手一写的提示词,等于扔掉类型化判断的核心优势。
内部标识符不是指令。一个名为 safe_to_publish 的字段对应用代码有用,却不会教会模型「安全」的含义。可操作的定义必须出现在指令与判据里;否则系统中就存在一条对开发者可见、对模型输入却缺席的语义规则。
# weak: label in code, meaning left to the model "safe_to_publish" # strong: operational definition in the instructions "Publishing is safe when every claim has a source, no credential appears, and no user is identified."
最小契约包含:状态 schema、指令、选项描述或量表、回退结果、置信度阈值、后果等级、允许动作、升级路径、模型版本与契约版本。契约应当无需阅读整个应用就能被评审。
「允许动作」字段尤其重要:它防止一个分类结果悄悄膨胀成权限。契约可以允许内部路由,同时禁止任何外部副作用。核验最终动作没有越过这个边界,仍是执行框架的职责。
选项、用户、工具与语言都会变化。一次语义修订就能改变生产行为,哪怕应用代码一行未动。把决策契约单独版本化,变更才可以被评审、用历史样本重新评估、灰度发布,并回滚。
契约评审应确认:每个状态字段都是必需的;每个结果都可区分;每个开放菜单都有逃逸出口;每个置信度区间都映射到明确路由。评审者还应确认「允许动作」比模型的判断更窄,而精确约束仍留在代码里。
判据(criteria)的修订值得回归测试:在上一版本的标注样本上重跑,检查各类别准确率与校准,并要求对行为变化做出解释。更短的提示词并不自动等于更安全、更易维护的契约。
每个生产决策都应产出一份回执(receipt)。回执把判断与当时存在的状态、策略绑定起来,是审计、校准、事故复盘以及跨契约版本比较的最小单元。
| 回执字段 | 用途 |
|---|---|
contract version 契约版本 | 标识语义程序 |
state reference 状态引用 | 关联被评估的证据快照 |
full distribution 完整分布 | 保留不确定性,而不只是胜者 |
selected threshold 所选阈值 | 解释所处运行区间 |
consequence class 后果等级 | 解释为何允许某条路由 |
route 路由 | 记录 automate、improve 或 human |
resulting action 最终动作 | 把判断与执行连接起来 |
生命周期分四步。其一,定义状态与结果;其二,在不可变快照上评估契约;其三,让结果经过后果感知阈值与确定性策略路由;其四,记录回执与最终动作。任何一步都不应藏进另一步。
把「评估」与「路由」分开,同一份分布就能服务不同策略:内部队列可以在较低阈值上自动化,公开声明则要求更高阈值;不可逆动作可以在任何置信度下都要求人工审查。语义判断是可复用的,权限策略是场景专属的。
契约测试应覆盖:正常情况、含糊情况、证据缺失、对抗性措辞、过期选项,以及「没有一个选项合适」的样例。测试不仅要评估所选答案,还要评估置信度是否随证据质量单调变化。只在简单样例上准确的契约,还没有准备好去控制一个分支。
router@1 broad options router@2 adds none-of-the-above router@3 separates billing from account access router@4 consequence-specific thresholds
事故期间,回执应能回答:模型看到了什么、哪个契约解读了它、概率如何分布、哪个阈值被触发、应用了哪条确定性策略、随后执行了什么动作。缺了这些环节,团队只能看到失败,却无法定位被破坏的边界。
回执还支持反事实评估:新的契约版本可以在历史状态快照上重放,而不必重复原来的副作用。当目标是「更安全的路由」而非「仅仅是不同的标签」时,这种对比必不可少。