ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Tacit 自蒸馏模型实战:AnyJev 用「一次前向」回答决策问题,1.7B 到 9B 全评测

Tacit 自蒸馏模型实战:AnyJev 用「一次前向」回答决策问题,1.7B 到 9B 全评测

【免费下载链接】AnyJev

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

项目地址:https://gitcode.com/gh_mirrors/an/AnyJev
点击查看免费下载

Tacit 是 AnyJev 的自蒸馏模型系列:让 LLM 用「一次前向」直接回答决策问题——不生成文本、不解析、不训练,从模型下一 token 的分布里读出每个选项的真实概率。本文带你看懂它的工作原理,并汇总 Tacit-1.7B 到 Tacit-9B 共 5 个尺寸在 JevBench 和 bev-decision 上的完整评测数据:一次前向准确率 0.598~0.823,开启自适应推理(adaptive)后最高冲到 0.887。

1. 什么是「Jev 风格决策模型」:30 秒入门

传统用法是:把选项塞进 prompt,让模型输出一段文字,再正则解析出答案——慢、贵,还会解析失败。

AnyJev 的思路是把问题类型化(typed question):选择题choice、判断题yes_no、评分题score。模型只跑一次前向,答案读自「下一个 token 恰好是某个选项标签」的 log 概率,重归一化后就是一份带概率的决策。不生成任何 token,也就没有解析失败一说。

完整流程分四步,图里一眼看完:

步骤做什么
① Ask给一段状态(state)+ 一个类型化问题
② Shift选项的每一种轮换顺序都问一遍,抵消位置偏差
③ Correct除以无标签估计出来的「标签先验」
④ Decide输出一个自带概率分布的决策

两条路线可以选:

  • 免训练Decider(L0 档):任何开源因果 LLM 即插即用,零训练、零标签;
  • 自蒸馏Tacit:本文主角。用自蒸馏训练出来的检查点,模型学会「一次前向就给出推理才能得到的答案」。

每个决策都会带上自己的route(one_forward或cot),下游代码可以据此校验,约定见 docs/levels.md。

2. 为什么要一次前向:先看「原始 logits」的坑

直接把选项写进 prompt、softmax 限制在标签上(raw 档),有个著名毛病:答案会随选项顺序变。下图是 Qwen3-8B 在一条真实 BANKING77 样本上的现场演示——左边直接读 logits,右边 L0 把顺序轮换后校正,两种顺序下 L0 给出的答案一致。

L0 靠 K 次轮换把位置偏差平均掉、再除掉标签先验——不需要任何标注,但代价是K 次前向。

Tacit 的自蒸馏就是为省掉这 K 次:训练时让模型模仿「自己推理(CoT)后的答案」,于是一次前向就能给出接近 L0 的质量,还不受选项顺序影响。这是「训练」与「免训练」之外的第三条路:不碰人类标注、不借别的模型,只用自己的推理结果蒸自己。

3. Tacit 最快上手:3 种方式跑起来

方式一:transformers 进程内加载(最简单)

pip install "anyjev[hf]"
from anyjev import Tacit tacit = Tacit.from_pretrained("morriszjm/Tacit-9B") 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"] # "track_order", {选项: 概率}, "one_forward"

返回的probs是每个选项的概率,margin是 top-2 的 log 概率差——这个 margin 后面会决定要不要升级推理。

方式二:标准vllm serve(生产推荐)

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)

服务端保持原版 vLLM 不动,客户端只加载 tokenizer。engine="vllm"则把 vLLM 跑在同一进程里。

方式三:HTTP 网关(多客户端共享一个上限)

python -m anyjev.serve --model morriszjm/Tacit-9B --upstream http://127.0.0.1:8000 --adaptive --port 8100

POST /v1/decide提交决策,GET /v1/stats查看升级比例。网关实现见 anyjev/serve.py。

4. 自适应升级:把最难的决策才交给推理,还带上限

adaptive=True开启后,Tacit 会做一件事:margin 小于tau(默认 0.5)的决策,打开 thinking 重新推理一次。推理结束后照旧读标签概率分布,所以升级后的答案同样带概率、同样不会解析失败。

关键在上限:最近cot_window(默认 1000)个决策里,最多只有max_cot_share(默认 20%)会升级。流量再难,成本也有界——这是能长期在线服务的保险丝。

参数默认值含义
adaptiveFalse低置信度决策交给模型自身推理
tau0.5top-2 log 概率差低于它即判「低置信」
max_cot_share0.2滑动窗口内升级比例上限
cot_window1000上限统计的窗口大小
cot_max_tokens8192单次推理的 token 预算

每次升级都会如实记录:route == "cot"、保留第一遍结果在first_pass、tacit.stats给出计数。核心逻辑就在 anyjev/tacit.py 里,一个文件读完。

5. 完整评测:1.7B 到 9B,五尺寸全量数据

评测用 scripts/eval_tacit.py 跑在标准vllm serve(vLLM 0.17.1)上,题目按数据集原始顺序逐题决策,原始 JSON 全部落在 bench/results_tacit/2026-10-06/,可复核。

两个测试集:

  • JevBench公开集:231 题,混合 choice / yes_no / score;
  • bev-decision测试集:46,320 题,真实决策规模。
模型底座JevBench 一次前向自适应bev-decision 一次前向自适应
Tacit-1.7BQwen3-1.7B0.619—0.598—
Tacit-2BQwen3.5-2B0.671—0.626—
Tacit-4BQwen3-4B0.7230.758(升级 14.3%)0.6630.704(升级 17.8%)
Tacit-8BQwen3-8B0.736—0.663—
Tacit-9BQwen3.5-9B0.8230.887(升级 15.2%)0.7270.755(升级 18.1%)

几个值得划重点的数字:

  • 🚀升级是精准的外科手术。Tacit-9B 在 JevBench 上只把 35 题(15.2%)送进推理,这 35 题从做对 18 道提升到做对33道,净增 15 道;bev-decision 上升级 8,366 题,做对数从 3,771 提升到5,086,净增 1,315 道。
  • 💰代价有界:Tacit-9B 升级题平均每题多生成 458(bev)~567(JevBench)个 token;Tacit-4B 只需 187~305 个。
  • ⚡快:Tacit-1.7B 单张 H100 NVL 跑完 46,320 题只用了61.9 秒;Tacit-9B 在 4 副本上 231 题 JevBench 用时 93.1 秒。
  • 📈尺寸收益明显:一次前向准确率从 1.7B 的 0.619 一路升到 9B 的 0.823,JevBench 上 9B 甚至超过了更大的常规推理方式。
  • 🧭 小模型(1.7B/2B/8B)的自适应结果仍在路上,见 ROADMAP.md。

6. 从数据到源码:每个数字都能查到出处

想查什么去哪里
五个模型的完整评测 JSON(含硬件、耗时、命令)bench/results_tacit/2026-10-06/
评测脚本与题目映射逻辑scripts/eval_tacit.py
Tacit 决策 API、升级上限实现anyjev/tacit.py
one_forward/cot路由与 level 约定docs/levels.md
L0 的旋转预算(K 次前向降到约 7 次)docs/rotation_budget.md
免训练 Decider 后端(HF/vLLM/SGLang/llama.cpp)anyjev/backends/

7. 总结:什么时候该选哪条路

  • 不想训练、手头有任意开源 LLM→ 免训练Decider(L0 档,零标签,代价 K 次前向);
  • 要高吞吐、低延迟的在线决策服务→Tacit:一次前向拿概率,adaptive=True给最难的那 15%~20% 上推理保险,成本全程有界;
  • 显存有限→ 从 Tacit-1.7B 起步也有 0.619 的 JevBench 准确率,单卡轻松跑。

一句话记住 Tacit:答案来自推理,延迟来自一次前向。

【免费下载链接】AnyJev

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

项目地址:https://gitcode.com/gh_mirrors/an/AnyJev
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进