Skip to content
项目

nokia-applied-research/AnyJev has 1,602 GitHub stars and 180 forks. GitHot measured +2 stars in 24 hours and +18 in 7 days. Last checked 2026-11-11 18:11 UTC. Last push 2026-10-21.

这些数字如何统计

Turn any LLM into a Jev-style decision model: typed decisions, real probabilities, no training. (continue updating, welcome any issue and PR request)

实测星标增长

24小时
+2
7天
+18
15天
正在收集历史
1个月
正在收集历史

各周期内的星标净变化,周期相互重叠,并非每日新增。缺失的测量保持空白。星标代表关注度,不代表软件质量。

README.zh-CN.md

原文

Jiamu Zhang1     Tianze Yang1     Yucheng Shi2     Evan Chen1
Zixiang Nie1     Kelly Wan1     Liangjie Hong1     Ninghao Liu3     Liang Wu1

1 Nokia, Sunnyvale, CA, USA      2 Tencent Hunyuan      3 The Hong Kong Polytechnic University

把选项顺序倒过来:直接读 logits 会翻转答案,AnyJev L0 两种顺序给出同一个答案
Qwen3-8B,一条真实的 BANKING77 样本。图中每个数字都是模型的真实输出。

[!TIP] 🆕 Tacit:AnyJev 的自蒸馏模型,1.7B 到 9B,已发布在 Hugging Face。 每个决策一次前向。打开 adaptive=True 后,一部分低置信度的决策会交给模型自己推理,这部分的比例有上限。 支持 transformers、进程内 vLLM 和原版 vllm serve。 pip install "anyjev[hf]",然后 Tacit.from_pretrained("morriszjm/Tacit-9B")。 从这里开始 ↓

[!NOTE] 🏆 Decision Index 0.4.1 上的 AnyJev Tacitus。 AnyJev Tacitus 31B 从 Gemma-4-31B 微调、用 AnyJev 读出,总分(Full score)66.47,2026-10-21 在排行榜上并列第 3。 详情 ↓

[!NOTE] 🏆 不训练,上公开排行榜。 免训练的 Decider(L0,两次轮换)用原版 Gemma-4-31B,在 Decision Index 0.3 上的总分(Full score)是 60.22,2026-10-12 在 149 个条目中排第 5。 详情 ↓

⚡ 跑起来

在 Python 里用 Tacit 模型。

from anyjev import Tacit

tacit = Tacit.from_pretrained("morriszjm/Tacit-9B")          # transformers,一张 GPU
d = tacit.decide(state="Customer: my package was due last Monday and it still has not arrived.",
                 question="What does the customer want?",
                 options=["track_order", "cancel_order", "refund", "change_address"])
d["answer"], d["probs"], d["route"]    # 一个选项、{选项: 概率}、"one_forward" 或 "cot"

kind 可以是 "choice"(默认)、"yes_no" 或 "score"(这时 options 是从低到高排好的档位,从 1 开始编号;first_level=0 则从 0 开始)。 decide_batch([...]) 接收由这样的 dict 组成的列表。

把最难的决策交给推理,并设上限。

tacit = Tacit.from_pretrained("morriszjm/Tacit-9B", adaptive=True, tau=0.5, max_cot_share=0.2, cot_window=1000)

如果一个决策排前两名的选项在 log-probability 上相差不到 tau,它会打开 thinking 重新回答一次。 推理结束后,答案读的是选项标签上的概率分布,所以它同样带概率,也不会出现解析失败。 无论流量多难,最近 cot_window 个决策里最多只有 max_cot_share 会转去推理。 每次转推理都会如实标出(route == "cot",并保留第一遍的结果),tacit.stats 里有计数。

在 vLLM 上跑。 服务端用原版 vLLM,客户端只需要 tokenizer。

pip install "anyjev[client]"
vllm serve morriszjm/Tacit-9B --host 127.0.0.1 --port 8000
tacit = Tacit.from_pretrained("morriszjm/Tacit-9B", engine="server",
                              base_url="http://127.0.0.1:8000", adaptive=True)

engine="vllm"(pip install "anyjev[vllm]")会在同一个进程里直接起 vLLM。

给多个客户端共用一个上限的 HTTP 端点。

python -m anyjev.serve --model morriszjm/Tacit-9B --upstream http://127.0.0.1:8000 --adaptive --port 8100
curl -s 127.0.0.1:8100/v1/decide -H 'Content-Type: application/json' \
  -d '{"state": "Customer: my package has not arrived.", "question": "What does the customer want?", "options": ["track_order", "refund"]}'

POST /v1/decide 接收单个决策,或者 {"items": [...]};GET /v1/stats 返回转推理的比例。 网关默认只监听 127.0.0.1,本身不带鉴权。

参数 默认值 含义
adaptive False 把低置信度的决策交给模型自己推理
tau 0.5 低置信度的判定:排前两名的选项 log-probability 之差小于 tau
max_cot_share 0.2 最近 cot_window 个决策里最多这个比例转去推理;None 表示不设上限
cot_window 1000 上限统计最近多少个决策;None 表示从加载起累计
cot_max_tokens 8192 单个决策的推理预算
engine "transformers" "vllm" 在本进程里起 vLLM;"server" 连接 base_url 上已经在跑的 vllm serve

其他任何模型,免训练。 Decider 能从任意开源因果语言模型里读出同样的类型化决策,不需要训练,也不需要标签。

from anyjev import Decider, Question
from anyjev.backends.hf import HFBackend          # 或 anyjev.backends 里的 VLLMBackend / SGLangBackend(url, model)、LlamaCppBackend(gguf)

d = Decider(HFBackend("Qwen/Qwen3-8B"))           # 默认 level="L0"
route = Question.choice("这条工单该由哪个团队处理?",
                        ["账单", "技术", "销售", "其他"], name="route")
r = d.decide("同一笔订单我的卡被扣了两次钱。", [route])["route"]
r.distribution, r.level                           # {选项: 概率}、"L0"

对于有 K 个选项的 choice,L0 会把选项的每一种轮换各问一次。打开旋转预算后,一个决策需要几次就只读几次:

d = Decider(backend, adaptive_shifts=True, canonical_order=True)
d.calibrate_adaptive(route, unlabelled_tickets, target=0.01)   # 几百条状态,不需要标签

停止门槛对照的是我们自己读满所有轮换得到的答案,所以不需要标签。在经过证明的 1% 分歧率下,平均读 7.2 次轮换而不是 18 次。 vLLM 上每秒决策数是原来的 2.2×,transformers 上是 2.3×–2.7×,准确率不变 (docs/rotation_budget.zh-CN.md)。

✨ 这是什么

给模型一个状态和一个类型化的问题(单选、是/否或打分), 得到一个带选项概率的决策,直接从模型的下一个 token 分布里读出来,不解析任何文本。有两种用法:

  • AnyJev 免训练(Decider) 适用于任意开源 LLM,不需要训练。直接读标签 logits 时,换个选项顺序答案就会变, 而且结果带着模型对某些标签的偏好。L0 不用一条标签就能把这两样都去掉。
  • AnyJev 自蒸馏(Tacit) 用的是 Tacit 模型。它们通过自蒸馏训练:模型学会在一次前向里给出它推理之后才会得出的答案。 不用人工标签,也不用其他模型。每个决策一次 prefill;打开 adaptive=True 后,一部分决策会转去推理,比例有上限。
⚪ 直接读 logits 🔵 L0
零标签
需要的标签 无 无
选项倒序后答案翻转率 0.230 0.073
准确率 0.747 0.803
校准误差(ECE) 0.240 0.184
≤5% 错误率下可自动决策的比例 7.7% 46.3%

Qwen3-8B,BANKING77 20 类,300 条测试样本 · bench/results_v01/2026-09-22/Qwen__Qwen3-8B.json

最后一行最要紧。准确率只涨了六个点,但置信度足以在 ≤5% 错误率下自动处理的决策,从 7.7% 涨到 46.3%,而且一条标签都没用。

📊 Tacit 结果

模型 基座 JevBench 公开集(231) 分流 bev-decision 测试集(46,320) 分流
Tacit-9B Qwen3.5-9B 0.823 0.887 15.2% 0.727 0.755 18.1%
Tacit-8B Qwen3-8B 0.736 — 0.663 —
Tacit-4B Qwen3-4B 0.723 0.758 14.3% 0.663 0.704 17.8%
Tacit-2B Qwen3.5-2B 0.671 — 0.626 —
Tacit-1.7B Qwen3-1.7B 0.619 — 0.598 —

两个测试集全部样本上的准确率(JevBench 公开集; bev-decision 测试集),按数据集存储顺序。第一列:每个决策一次前向 (adaptive=False)。分流:adaptive=True,默认参数(tau=0.5,每 1,000 个决策里最多 20% 转去推理),小字是转去推理的比例。 用 vllm serve(vLLM 0.17.1)服务,scripts/eval_tacit.py 运行 · bench/results_tacit/2026-10-06/

打开转推理后,平均每个决策多生成的 token:Tacit-9B 在 JevBench 上 567 个、bev-decision 上 458 个;Tacit-4B 分别是 305 和 187 个。Tacit-8B、2B、1.7B 打开转推理的结果随后补上。

🏆 Decision Index 上的 AnyJev Tacitus

AnyJev Tacitus 31B 是从 google/gemma-4-31B-it 微调出来的决策模型,推理技术和训练一起设计。每个决策都用 AnyJev 的读出方式一次 prefill 读出,不生成 token。在 Decision Index 0.4.1 排行榜上,按总分(Full score)并列第 3(2026-10-21); 从 0.4 版起,总分只计私有部分。

总分 同技能私有测试 60% 新领域私有测试 40% 公开部分 不计分 延迟 中位数 / 平均 / p95
66.47 62.48 56.93 65.52 95 / 265 / 1,000 ms

两个私有部分和延迟由排行榜维护者测量(单进程,一张 RTX PRO 6000)。用 vLLM 0.29.0 加载时转 FP8,加上模型自带的 vLLM 插件, anyjev 0.3.0。引擎、插件和运行设置:MorrisZJ/anyjev-tacitus;结果:decision-index-results · bench/results_decision_index/2026-10-21/anyjev-tacitus-31b.json

🏆 Decision Index 上的免训练结果

L0 档的 Decider,用未改动的 google/gemma-4-31B-it:不训练、不用标签, 每个决策读两次轮换。在 Decision Index 0.3 排行榜上,按总分(Full score)在 149 个条目中排第 5(2026-10-12)。

总分 公开部分 20% 同技能私有测试 50% 新领域私有测试 30% 延迟 中位数 / 平均 / p95
60.22 59.79 59.13 52.98 98 / 260 / 1,080 ms

两个私有部分和延迟由排行榜维护者测量(单进程,一张 RTX PRO 6000)。用 vllm serve --quantization fp8(vLLM 0.29.0) 服务,anyjev 0.3.0。引擎和运行设置:examples/decision_index(提交时用的是 anyjev-l0-gemma);模型卡: AnyJev-L0-Gemma-4-31B · bench/results_decision_index/2026-10-12/anyjev-l0-gemma-4-31b.json

🧠 怎么读出一个决策

一个决策是怎么读出来的:提一个类型化的问题,在选项的每一种轮换下各读一次,在不用标签的情况下除掉标签先验,返回一个标明档位的决策

需要 做什么 不做什么
raw 无 一个 prompt,softmax 只在选项标签上做 修正顺序偏差或标签偏好
L0 无 在 K 种轮换上平均掉位置偏差,再除掉标签先验 用标签校准
Tacit one_forward 一个 Tacit 模型 一个 prompt,读法同 raw,读的是一个被训练成一次就答的模型 修正顺序偏差
Tacit cot adaptive=True 先推理,推理结束后再读标签分布 超出上限

每个 Decision 都带着它的 level,require="L0" 让下游代码拒绝更弱的档位。每个 Tacit 决策都带着它的 route。 完整约定 →

本页每个数字都读自仓库里提交的 JSON。与 TypeSafe AI 或 Jev 没有任何关联。

🧭 路线图

  • choice、noul、score 一次 prefill 读出;零标签的 L0
  • 旋转预算:L0 平均读 18 次轮换里的 7 次左右,停止门槛不用标签就能证明
  • Tacit-1.7B、2B、4B、8B、9B 发布在 Hugging Face;库里的 Tacit 支持 transformers、vLLM 和 vllm serve,带有上限的转推理和 HTTP 网关
  • 评测代码(scripts/eval_tacit.py);Tacit-9B 和 Tacit-4B 打开转推理的结果
  • 免训练路线上了公开的 Decision Index 0.3 排行榜(Gemma-4-31B 上的 L0)
  • AnyJev Tacitus 31B 上了 Decision Index 0.4.1 排行榜,并列第 3(详情)
  • 🚧 Tacit-8B、2B、1.7B 打开转推理的结果
  • 🚧 无标签的提前退出:只用模型的一部分层读出决策,层数按与完整模型的一致率来选
  • Agent 循环里的评测:把同样的决策放进真实的 agent 里
  • SGLang 后端(anyjev.backends.sglang),由 @shentonyan 贡献
  • 支持 GGUF 模型的 llama.cpp 后端(anyjev.backends.llamacpp),由 @Tusm11 贡献
  • 更多 log-prob 后端(MLX、Ollama),以及超过 26 个选项的 span 读法

带日期的计划和 help-wanted 文件:ROADMAP.md。已知局限:docs/limitations.zh-CN.md。

🤝 贡献与引用

每个后端是一个文件,其中好几个是 help wanted(ROADMAP.md、CONTRIBUTING.md)。变更记录:CHANGELOG.md。致谢:CREDITS.md。

技术报告:

@misc{zhang2026anyjevtechnicalreport,
      title={AnyJev Technical Report}, 
      author={Jiamu Zhang and Tianze Yang and Yucheng Shi and Evan Chen and Zixiang Nie and Kelly Wan and Liangjie Hong and Ninghao Liu and Liang Wu},
      year={2026},
      eprint={2610.00831},
      archivePrefix={arXiv},
      primaryClass={cs.LG},
      url={https://arxiv.org/abs/2610.00831}, 
}

Apache-2.0,见 LICENSE。Tacit 模型沿用其基座模型的 Apache-2.0 许可。数据集各有自己的许可,见 THIRD_PARTY.md。

探索相关项目