Jev 替代品
AnyJev
零训练去偏——来自诺基亚应用研究
一句话结论
当你已经在从开源 LLM 读 logits、却发现重排选项会改变答案时,就该加上 AnyJev。它的 L0 层零标注:循环移位边缘化消除位置偏置,无标签先验估计消除模型的标签偏置。在 Qwen3-8B 上,它把 Banking77 的顺序翻转率从 0.227 降到 0.077,注入集更是降到 0.000。
AnyJev 不训练模型,也不提供权重。它是套在你已经在跑的 LLM 之上的一层,专门修掉"直读 logits"最容易犯的两个错:选项因为排在前面而获胜,以及答案不管输入是什么都偏向某一边。它的招牌演示很具体——同一个垃圾邮件问题,在除掉模型自身的标签先验后,从 0.62 翻成 0.41。
Read the logits
No new weights. Intercept the model right before it answers and read the probability of each option instead of letting it write.
搜索别名
关键规格
- Licence
- Apache-2.0
- Author
- Jiamu (Morris) Zhang、Tianze Yang、Liang Wu —— 诺基亚;Yucheng Shi —— 腾讯
- Backbone
- 任意开源 LLM —— 自身不带权重
- Size
- L2 头约 100KB
- Latency
- 每次调用一次 prefill;不生成
- Wire format
- 库 + CLI + MCP;Jev 兼容服务端在路线图上
- Install
- pip install "anyjev[hf]"
AnyJev 对 Jev,以及对"朴素读 logits"
AnyJev 在 Laya 自己的 typed-decisions 集(2,000 条决策)上重新测了 Laya 与多个 Qwen 模型,而不是引用别人的数字。Jev 一行是已公布值且未重跑——项目自己明确说明了这一点。
| AnyJev 对 Jev,以及对"朴素读 logits" | AnyJev | Jev |
|---|---|---|
| 顺序翻转率,raw → L0(Qwen3-8B,Banking77) | 0.227 → 0.077,零标注 | 未以翻转率口径公布 |
| typed-decisions,Qwen3-32B + L0 | 零样本 0.700 | 0.727(已公布) |
| L1 之后的标定误差 | 200 条标注后 ECE 0.034 | 0.144(已公布) |
| 同一集上微调后的 Laya | 0.768 但 ECE 0.215 —— 准,但标定差 | 0.727,ECE 0.144 |
| 是否需要训练 | L0 不需要;L1 需 100–500 条标注;L2 用闭式头 | 闭源权重,RLCD 训练 |
什么时候该选 AnyJev
当你的决策流水线已经在读 logits、而你也注意到重排选项列表会改变答案时,马上加上 AnyJev。这种不稳定不是趣闻——它意味着一次重构就能改变线上行为——而 AnyJev 在零标注的情况下就能消掉它。之后如果你有几百条标注,L1 能买回整个 System One 理念本该提供的东西:概率的诚实性。在同样那 2,000 条决策上,它的 ECE 是 0.034,而微调过的 Laya 是 0.215。
什么时候该放弃它
别指望它把原始准确率抬多少。L0 是偏置修正,不是更强的模型:在 typed-decisions 上,它把 Qwen2.5-7B 从 0.621 提到 0.628,把 Qwen3-8B 从 0.626 提到 0.640。如果基座模型根本表达不了这个决策,去偏救不了它。另外,在没有验证"报 0.9 就真有约 90% 正确"之前,不要把它接到有后果的动作上。
三步接入 AnyJev
from anyjev import Decider, Question
from anyjev.backends.hf import HFBackend
d = Decider(HFBackend("Qwen/Qwen3-8B"))
route = Question.choice(
"这个请求该交给哪个处理方?",
["billing", "technical", "sales", "other"], name="route")
safe = Question.noul(
"这个待执行的工具调用是否具有破坏性且不可逆?", name="safe")
done = Question.score(
"任务完成度 0 到 1 之间是多少?", bins=5, name="done")
r = d.decide(state, [route, safe, done])
r["route"].argmax # "billing"
r["route"].distribution # {"billing": 0.81, ...}
r["safe"].p_true # 0.12
r.level # "L0" —— 已去偏,但尚未标定
# 每个问题有 100–500 条标注后,得到 L1 产物:
art = d.calibrate(safe, calib_states, calib_labels)
r = d.decide(state, [safe], level="L1")关于 AnyJev 的常见问题
AnyJev 与 TypeSafe 或 Jev 有关系吗?
没有。它自己的包首页第一屏就写着:与 TypeSafe AI 或 Jev 无关联、未获其背书、也未派生自它们。它的所有对比都是自己实测且可从提交的结果复现,而不是引用厂商口径。
L0、L1、L2 有什么区别?
L0 什么都不需要:用循环移位边缘化消除选项位置偏置,用无标签的先验估计消除标签偏置。L1 在此基础上按(模型, 问题)拟合温度,需要 100–500 条标注。L2 拟合一个约 100KB 的闭式头。每个结果都会标注它来自哪一档,所以你的代码可以拒绝直接使用 raw 答案。
去偏能让模型更准吗?
只能小幅提升。在 Laya 的 typed-decisions 集上,L0 把 Qwen2.5-7B 从 0.621 提到 0.628,把 Qwen3-8B 从 0.626 提到 0.640。大收益在稳定性与标定上:顺序翻转率下降约三分之二,ECE 从最高 0.331 降到 L1 之后的约 0.04–0.16。
为什么答案稳定比答案准确更重要?
因为不稳定的答案会让重构变得危险。如果重排选项列表就会改变决策,那么一次例行代码改动就在悄悄改变线上行为,而这种问题再高的准确率也补不回来。一个读位置而不是读含义的模型,坏在聚合准确率里根本看不见的地方。
来源
- nokia-applied-research/AnyJev —— 官方仓库
- PyPI anyjev —— 完整基准表与分档契约
- Laya —— AnyJev 重测所用的 typed-decisions 基准
本页所有对比数字均为第三方公开口径或对公开仓库的阅读,不是本站实测。我们没有对 TypeSafe Jev 本体做过实测,且其主客户协议禁止利用其输出开发同类产品。