面向Google编程CHARLES ZHANG

AI DAILY / 2026-09-23

AnyJev:无需训练把任意 LLM 变成 Jev 风格决策模型

nokia-applied-research/AnyJev

上下文与记忆GitHub · 2026-09-21

全文中文翻译 · AI 生成,仅供学习交流

nokia-applied-research/AnyJev

, 直接从下一次 token 分布的一个 prefill 中读取。无需生成、无需解析、无需微调。原始 logits 在你重排选项后会改变答案,其置信度也不可信;AnyJev 用零标签解决前者,用几百条标签解决后者。

| | 原始 logits | AnyJev L0 | AnyJev L1 |
|---|---|---|---|
| 所需标签 | 无 | 无 | 100–500 |
| 选项反转时答案翻转 | 0.230 | 0.073 | 0.077 |
| 准确率 | 0.747 | 0.803 | 0.807 |
| 校准误差 (ECE) | 0.240 | 0.184 | 0.095 |
| 在 ≤5% 误差下可自动决策的比例 | 7.7% | 46.3% | 52.0% |Qwen3-8B,BANKING77 20 类,300 条测试样本。完整表格含所有消融:docs/results_bench.md最后一行才是重点。准确率只提升了 6 个百分点,但你可以安全自动化的流量占比从 7.7% 跃升到 52.0%,在该任务上是 6.8 倍的差距(n=300 时的一个点估计,置信区间较宽,见 Limitations)。用原始 logits 时,"0.9" 还不够可信到可以据此行动,所以一切都得交给人工。一旦概率如其所示,你就可以设定阈值。

🚀 使用方法📦 1. 安装

pip install "anyjev[hf]"

💬 2. 提出类型化问题。

L0 默认开启,无需标签。

from anyjev import Decider, Question
from anyjev.backends.hf import HFBackend

d = Decider(HFBackend("Qwen/Qwen3-8B"))

route = Question.choice("Which team should handle this?",
                        ["billing", "technical", "sales", "other"],
                        name="route")

risky = Question.noul("Is this tool call destructive or irreversible?",
                      name="risky")

done = Question.score("How complete is the task?",
                      bins=5, name="done")

r = d.decide({"conversation": [...], "tool_call": {...}}, [route, risky, done])

r["route"].distribution
# {"billing": 0.81, "technical": 0.07, ...}

r["risky"].p_true
# 0.12

r["done"].value
# 0.35

r.level
# "L0"

🎯 3. 有标签时加上标签。

温度缩放是 L1;闭式 head 是 L2,也是更准确的一档。

d.calibrate(risky, states, labels)        # 100–500 条标签 → L1(一个温度)
d.fit_head(route, states, labels)         # 100–300 条标签 → L2,一次前向 + 闭式求解,秒级
d.save_artifacts("qwen3-8b.json")         # 下次 d.load_artifacts(...);每个 head 约 100 KB

r = d.decide(state, [route], level="auto") # 有 head 的走 L2,否则 L1,否则 L0
r["route"].level
# "L2"

🔁 4. 或者让循环自动喂入标签。

d.observe(route, state, label) 会在标签到达时存储,并在 30 条时自动求解 head,随后在 60、120……条时重新求解。

⚡ 服务化。

transformers 后端(anyjev.backends.hf)现已支持所有档位;通过 vLLM / SGLang 提供服务已列入路线图,本版本未包含。对于多个状态、单个问题,可使用 d.decide_batch(states, question)

🎬 一条命令即可试用。

python -m demo.jev_mode --backend fake

在不到一秒内用一个合成模型跑完全流程,无需下载。

--lifecycle 演示部署循环;去掉 --backend fake 即可用随包的 head 跑真实的 Qwen3(demo)。

🧠 工作原理| 档位 | 需要什么 | 做了什么 | 没有做什么 |
|---|---|---|---|
| 原始 | 无 | 对标签 token 做受限 softmax(即各类基线方法的做法) | 任何关于偏差或校准的处理 |
| L0 | 无 | 通过 K 次轮换平均掉位置偏差,并除掉标签先验 | 让模型的不确定性变得已校准 |
| L1 | 每个问题 100–500 条标签 | 在 L0 之上做温度缩放 | 改变排序 |
| L2 | 每个问题 100–300 条标签,加一个本地模型 | 在约 ⅔ 深度的隐藏状态上拟合一个闭式 head(收缩 LDA / ridge),每个状态一次 prompt | 迁移到另一个问题或模型 |每条决策都带有其档位,下游代码因此可以拒绝基于错误档位采取行动。L0 在 K 选 1 时需要 K 次 prefill(H100 上 batch 32、K=20 时每次决策约 0.25 秒);L2 不到一次普通前向,一次 prompt,提前停止:Qwen3-8B 上为 0.68×。

🔁 一个能自我维护的 head L2 不是一次训练。标签只需通过一次闭式求解(CPU 上秒级、无梯度、不动模型权重)即可换得一个 head。之后只有 head 的特征均值和尺度会变动,且由无标签流量重新估计,因此 head 能自动跟随其问题跨过措辞和选项顺序的变化,只有在面对新问题时才需要新的标签。

重新措辞后,现成的 Qwen3-8B head 准确率会从 0.77 掉到 0.65–0.70;新措辞的 30 条无标签请求就能把它拉回到 0.74–0.75,而完全重打标签重拟合是 0.77(JSON)。

服务时的一次决策。

存储的 head 通过一次截断前向来作答。若没有 head,同一调用会按原样回退到 L1 或 L0;路由逻辑见 docs/method_v3.md。

部署生命周期:第 0 天 L0 上线,循环提供标签,head 在秒级完成

flowchart LR
    D0["day 0: define the questions,<br/>serve with level auto;<br/>every answer is L0, zero labels"] --> C["collect labels from the loop:<br/>review queue, outcomes, or the LLM<br/>being replaced; dec.observe fits at 30"]
    C --> F["fit_head per question;<br/>export_artifacts to one JSON per model"]
    F --> S["serve: L2 where a head routes,<br/>L1 or L0 elsewhere"]
    S --> W{"what changed?"}
    W -->|"wording or option order"| S
    W -->|"new question or option set"| C
    W -->|"new base model"| R["re-solve every head from<br/>the stored labelled states"]
    R --> S
    classDef shipped fill:#dcfce7,stroke:#0f9d76,color:#0f172a
    classDef decision fill:#fef3c7,stroke:#d97706,color:#0f172a
    class D0,C,F,S,R shipped
    class W decision

状态分布的漂移(不是措辞变化)对重中心化是不可见的,所以对有标签切片的周期性抽检仍然保留在流程里。完整方法见 docs/method_v3.md。

📊 结果9 / 9 🔁 在每个模型 × 任务行上,L0 零标签下选项翻转都被削减3 个模型 × 3 个任务 →0.80 🧩 类型化决策准确率Qwen3-32B 和 30B-A3B 在 L2、每个问题 300 条标签下:Jev 0.727(已发表),微调的 Laya 0.768 5 个模型 →一次决策成本为单次普通前向的 0.68×,Qwen3-8B 在 L2:一次 prompt,在第 24/36 层停止延迟 →Jev mode 在 LocalLLaMA/typed-decisions 上的表现(20 个问题,每个 300 条标签,2,000 条留出决策):

| 模型 | L0,零标签 | L2 | block | 成本 vs 一次前向 |
|---|---|---|---|---|
| Qwen3-1.7B | 0.494 | 0.730 | 18 / 28 | 0.70× |
| Qwen3-4B | 0.564 | 0.786 | 24 / 36 | 0.69× |
| Qwen3-8B | 0.647 | 0.771 | 24 / 36 | 0.68× |
| Qwen3-30B-A3B | 0.630 | 0.799 | 40 / 48 | 未测量 |
| Qwen3-32B | 0.700 | 0.798 | 52 / 64 | 0.84× |L2 的池化 ECE 为 0.03–0.05。Jev 0.727 与微调的 Laya 0.768 由各自作者在同一数据集上发布。每一格的详情:docs/results_exit.md 1.7B 模型在 64% 深度处就能达到 Jev 发表的水平;4B 则与微调的 421M Laya 持平。

100 条标签就能把 8B head 推到 0.740(20 条:0.654,300 条:0.772)。

更多:Jev mode 全 2048 与扫雷 NanoJev 迷宫在小型模型上 L0 起作用的场景研究日志,包含负面结果即日可加载的 head,以及一个 head 的成本anyjev-heads/<model>.json 为 Qwen3-1.7B / 4B / 8B / 30B-A3B / 32B 提供每个模型 23 个 head(20 个 typed-decisions 问题加三个基准任务),全部通过与用户相同的 fit_headdecide_batch 路径构建并验证(scripts/build_heads.py)。一个 head 是一个 [hidden, K] 矩阵加一个偏置、一个标准化向量和一个温度:约 100 KB,在 1.7B–8B 上 2–8 秒即可求解。

大模型的 head 还能无梯度地蒸馏到小模型:32B 的 head 给 1,200 条生成样本打标,能把 1.7B 从 0.730 拉到 0.760(4B 和 8B 不变)。

docs/jev_mode.md一张图看懂所有模型和任务每一个数字都从已提交的 JSON 重新生成(bash scripts/regen_docs.sh);在干净 checkout 上第二次运行按位复现了所有零标签数字。与 TypeSafe AI 或 Jev 无关;他们作者发布的行在此未重跑。

🧭 路线图choicenoulscore 来自同一次 prefill,不生成任何内容零标签的 L0;作为 JSON 的 L1 工件;通过 require=L2 强制档位:一个问题的闭式 head、路由、无标签适配、level="auto"observe为五个 Qwen3 模型发布的 head;一个打包好的 demo(python -m demo.jev_mode

L2 在已服务引擎(vLLM / SGLang)上:某一层的残差流,或一个截断的 checkpoint Agent 循环评估:在真实 agent 内部做同样的决策,与被替换的 LLM 对比在 Hugging Face Hub 上的 head、一个交互式 Space、一份技术报告更多模型(Llama、Gemma、Mistral、DeepSeek)、跨 26 个选项以上的 span 读出、共形弃权带日期的计划与 help-wanted 文件:ROADMAP.md。

🔍 局限性在 typed-decisions 上,"准确率"是与教师 LLM 的一致率。

金标准是某模型三次采样的均值;该教师的新一次采样与它自己的一致率为 0.735。

L2 是按问题、按模型划分的。

为其他问题拟合的 head 对新问题没有帮助,而且只发布了 Qwen3 的 head。它还需要隐藏状态:目前支持 transformers;vLLM / SGLang 在路线图上。

校准无法修复一个答不了题的模型。

在迷宫边和扫雷上,没有任何读出能胜过平凡基线。

L0 并不是在所有地方都白赢。

当某个标签占主导时,批次先验会损失准确率(见 L0 起作用的场景)。

此外:字母读出最多 26 个选项(span 读出在路线图上,尚未进入代码);在 5% 风险下的覆盖范围在 n=300 时是高方差估计;标题表格用的是 Qwen 模型;这里的每条决策都是孤立评分的,不在 agent 循环内。