Jevstiller 通过有限样本边界保证与 Jev 98% 的一致性

TL;DR – Jevstiller 的成就

Jevstiller 通过 Jev 自身的预测学习一个轻量级分类器,并应用严格校准的置信度阈值,从而保证不超过 2% 的请求会获得与 Jev 不同的标签。该本地模型在 CPU 上约 15 ms 内即可响应,缩短了直接调用 Jev 所需的 300 ms 网络延迟。


系统构建方式

模型架构

  • 编码器: 冻结的 bge‑small 句子编码器(384 维,在 CPU 上使用 ONNX Runtime)。
  • 头部: 在 Jev 的完整概率分布(而非仅最高标签)上训练的多项逻辑回归(单线性层 + softmax)。
  • 大小与延迟: 几百 KB;在单个 CPU 核心上推理 ≈15 ms。
  • 训练节奏: 每产生 2,000 个新的 Jev 答案后重新训练,使用几千行数据,几秒钟内完成。

路由组件

  1. k‑NN OOD 评分器 – 使用训练嵌入检测分布外 (OOD) 输入。
  2. 置信度路由器 – 应用阈值加上 OOD 截止值来决定是否由本地头部进行回答。

这两个组件在项目的 DESIGN.md (§7.3‑§7.6) 中有详细描述。


合约方程

对于流量窗口内的给定任务:

  • c = 覆盖率(本地回答的请求比例)。
  • e = 本地分歧率(回答的请求中标签与 Jev 不同的比例)。
  • 与 Jev 的总体一致性:A = 1 – c·e。

设定目标一致性 A* = 98% 可得出预算 β = 1 – A* = 2%。路由器必须保持 c·e ≤ β。

关键点: 该合约不涉及真实准确性;它仅限制与 Jev 的分歧。


为什么简单的置信度阈值扫描会失败

一种常见方法:

  1. 保留校准数据。
  2. 扫描置信度阈值。
  3. 选择 经验 分歧率 ≤ β 的最宽松阈值。

在五个公共分类任务上(每个任务 20 个随机拆分),这种 点估计规则 在每个任务的 20 个拆分中有 6‑12 个突破了 2% 的预算,有时甚至超出预算达 1%。

任务 覆盖率 (点估计) 平均分歧率 最差分歧率 预算突破
Banking77 79.8% 1.90% 2.70% 9/20
CLINC150 84.3% 2.09% 2.85% 12/20
AG News 90.3% 2.06% 2.65% 11/20
TweetEval sentiment 28.2% 1.99% 2.60% 8/20
TweetEval offensive 36.8% 1.81% 2.70% 6/20

失败原因是统计性的:所选阈值是由于噪声导致 样本 分歧率恰好较低的那个。在新的流量中,真实分歧率可能会更高。


Jevstiller 的统计稳健替代方案

四个严谨的选择确保了 98% 的保证在每个生产版本中以 ≥ 95% 的置信度成立。

  1. 损失 = 合约 – 对于每一行校准数据(训练未见),如果本地模型回答 且 与 Jev 分歧,我们记录二进制损失 1,否则为 0。平均损失正好是 c·e。因为它是一个二项比例,我们可以应用精确的 Clopper–Pearson 置信区间。
  2. 固定网格、严格优先测试 – 候选阈值是预定义的。我们从最严格到最宽松进行评估,在第一个违反 95% 区间上限的阈值处停止。这种固定序列测试(“先学习后测试”)在没有任何多重测试校正的情况下控制了族系错误率。
  3. 无校准泄漏 – OOD 截止值仅从训练集导出;校准集 仅 用于测试阈值。这避免了同一数据既用于选择又用于评估阈值的经典点估计陷阱。
  4. 余量与影子审计 – 所选阈值拟合到 85% 的预算。对校准行和实时影子流量的汇总集进行的第二次检查验证了全部预算。持续的审计流量(所有请求的 2%)始终发送给 Jev,提供无偏的实时一致性估计。如果实时边界低于目标,路由将回退到 Jev 并重新开始训练。

最初的实现遗漏了步骤 1 和 2,导致偶尔出现预算违规;修正后,Banking77 重放的覆盖率从 70.6% 提高到 70.7%,且保证完好无损。


将保证扩展到 Jev 自身的置信度下限

Jev 为每个答案返回一个置信度分数。许多应用程序将低置信度视为“不确定”,并将此类情况路由给人工审核员。

  • 在 0.4.0 版本之前,Jevstiller 仅保证 标签 的一致性。
  • 自 0.4.0 版本起,任务可以指定 confidence_floor。在校准和审计期间,当 Jev 的置信度低于此下限时,本地答案也被计为分歧。
  • 相同的 2% 预算现在涵盖了标签分歧 和 Jev 不确定情况。
  • 对覆盖率的影响:在五个基准任务上,0.6 的下限使覆盖率降低了 4‑12 个百分点。

在生产中维持保证

两种动态威胁着静态边界:

  1. 模型漂移 – 本地头部会定期在新的 Jev 答案上重新训练。
  2. 数据漂移 – 流量分布或 Jev 的行为可能会发生变化。

Jevstiller 通过以下方式缓解这些问题:

  • 保留一个永久的 2% 审计切片,始终查询 Jev。
  • 在此切片上按版本测量实时一致性;如果置信区间跨越目标,则增加审计率,系统回退到 Jev。
  • 证明了快速恢复能力:当第 12 小时发生合成 Jev 变化时,本地覆盖率在四分钟内从 90% 降至 9%,在根据新答案重新训练后,49 分钟内回升至 90%。

覆盖率与一致性的权衡

  • 该边界是 保守的:在基准任务上,与简单的点估计规则相比,它牺牲了 4‑8% 的覆盖率。
  • 在 Jev 的完整概率分布(而非仅最高标签)上进行训练,在多类任务上可恢复 2‑3% 的覆盖率。
  • 调整目标一致性(例如从 98% 到 95%)在推文情感任务上使覆盖率大致翻倍,并将意图分类覆盖率从约 70% 提升至 80% 左右。
  • 在 90‑99% 的整个一致性范围内,Jevstiller 对人类标签的准确性保持在 Jev 准确性的 ±1% 以内,因为当本地模型与 Jev 分歧时,其正确率与 Jev 大致相当。
  • 覆盖率与 Jev 的 一致性 相关:在 TweetEval 任务上,Jev 与人类标签的一致性仅为 64‑74%,限制了本地模型的置信份额。

Jevstiller 不承诺的内容

  • 准确性: 保证是关于与 Jev 的一致性,而不是相对于真实情况的正确性。
  • 分级预算: 当前合约是汇总的;罕见类别可能会主导分歧预算。
  • 静态流量假设: 有限样本边界假设校准行是未来流量的随机样本。显著的分布偏移会使边界失效,这就是为什么实时审计至关重要的原因。

相关工作

  • 具有风险保证的选择性分类 – Geifman & El‑Yaniv (2017)。
  • 固定序列测试 – “Learn Then Test” (2021)。
  • 蒸馏大模型的级联 – OCaTS (EMNLP 2023), Cache & Distil (ACL 2024)。
  • 有限样本一致性合约 – BARGAIN (2025) 用于批处理;vCache (ICLR 2026) 用于语义缓存。

Jevstiller 的创新之处在于将这些想法结合到一个持续重新训练、审计、生产就绪且具有可证明一致性合约的系统中。


入门

git clone https://github.com/tomerglick57/Jevstiller && cd Jevstiller && pip install .
# 重现 Banking77 结果(无需 API 密钥,约 10 分钟)
bash experiments/reproduce.sh
# 运行完整基准测试(所有五个任务,约 1‑2 小时)
bash experiments/bench.sh --no-record

将 Docker 镜像作为 Jev 的直接代理运行:

docker run -d -p 8080:8080 -v jevstiller-data:/data ghcr.io/tomerglick57/jevstiller

将 TYPESAFE_BASE_URL 配置为指向该容器。几千个请求后,服务会打印达到的边界和实时审计间隔。

代码在 Apache 2.0 许可下发布。

Sources

相关