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.

搜索别名

AnyJevanyjevAny Jevnokia-applied-research/AnyJev

关键规格

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"AnyJevJev
顺序翻转率,raw → L0(Qwen3-8B,Banking77)0.227 → 0.077,零标注未以翻转率口径公布
typed-decisions,Qwen3-32B + L0零样本 0.7000.727(已公布)
L1 之后的标定误差200 条标注后 ECE 0.0340.144(已公布)
同一集上微调后的 Laya0.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

01装上并指向你已在服务的模型:`pip install "anyjev[hf]"`,然后用 `Decider` 包住你的后端。
02默认使用 L0,并在代码里读 `decision.level`——它告诉你拿到的是 raw、去偏还是已标定的答案,下游逻辑因此可以拒绝用错档。
03当每个问题攒到 100–500 条标注后,拟合 L1,并在留出集上比对前后的 Brier 与 ECE。
python / 默认 L0,有标注再上 L1
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")
为什么 L0 不是可选项:同一个垃圾邮件问题,带正文时 P(Yes)=0.62,把正文换成 N/A 时 P(Yes)=0.70。除掉这个先验后是 0.41——判断直接翻转。

关于 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。

为什么答案稳定比答案准确更重要?

因为不稳定的答案会让重构变得危险。如果重排选项列表就会改变决策,那么一次例行代码改动就在悄悄改变线上行为,而这种问题再高的准确率也补不回来。一个读位置而不是读含义的模型,坏在聚合准确率里根本看不见的地方。

来源

本页所有对比数字均为第三方公开口径或对公开仓库的阅读,不是本站实测。我们没有对 TypeSafe Jev 本体做过实测,且其主客户协议禁止利用其输出开发同类产品。