nokia-applied-research/AnyJev
Turn any LLM into a Jev-style decision model: typed decisions, real probabilities, no training. (continue updating, welcome any issue and PR request)
📦 AnyJev – 将任何 LLM 变成校准的决策模型
AnyJev(Any Jev)是一个 Python 库,让您可以向开源 LLM 提出类型化问题(例如多选、是/否或数值评分),并直接从模型的 next‑token logits 获得基于概率的决策。它不生成文本,不需要微调,且可以在零标签示例下运作。使用数百个标签,您可以升级到更高准确度的“L2”头,其运行成本基本上等同于一次前向传播。
🎯 它解决了什么问题?
- LLM 的原始 logits 不稳定 – 翻转答案选项的顺序通常会翻转模型的预测,且置信分数校准不佳。
- 由于分数不可信,大多数流程会退回人工审查,浪费资源。
- AnyJev 提供三个级别的校准:
- L0 – 零标签校正,移除选项顺序偏差。
- L1 – 使用每个问题 100-500 个标签的温度缩放。
- L2 – 在 100-300 个标签上训练的闭式线性头(收缩 LDA / ridge),以单次截断前向传播的成本提供校准的概率。
🚀 快速开始(来自 README)
pip install "anyjev[hf]"
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"
)
risky = Question.noul("这个工具调用是否具有破坏性?", name="risky")
done = Question.score("任务完成度如何?", bins=5, name="done")
# 执行决策
state = {"conversation": [...], "tool_call": {...}}
result = d.decide(state, [route, risky, done])
print(result["route"].distribution) # {'billing': 0.81, 'technical': 0.07, ...}
print(result["risky"].p_true) # 0.12
print(result["done"].value) # 0.35
print(result.level) # "L0"
稍后添加标签以升级到 L1/L2:
# 为一个问题收集 100‑500 个标签示例
d.calibrate(risky, states, labels) # L1 – 温度缩放
d.fit_head(route, states, labels) # L2 – 闭式头
d.save_artifacts("qwen3-8b.json") # 存储头(≈100 KB)
现在 d.decide(..., level="auto") 将在存在头时自动使用 L2,否则回退到 L1 或 L0。
🧠 运作方式(高层级)
| 级别 | 所需标签 | 功能 | 不做什么 |
|---|---|---|---|
| raw | 无 | 返回每个选项的 token logits 的 soft‑max(朴素基线)。 | 任何偏差校正或校准。 |
| L0 | 无 | 将选项列表旋转 K 次,平均 logits,并除以估计的标签先验。移除顺序翻转偏差。 | 不使模型的不确定性在统计上校准。 |
| L1 | 每个问题 100‑500 | 在 L0 之上拟合温度缩放。 | 不改变选项的排名。 |
| L2 | 每个问题 100‑300 | 在模型深度约 ⅔ 处的隐藏状态上求解闭式线性头(收缩 LDA / ridge)。每个输入一次提示,然后在服务时进行廉价的矩阵乘法。 | 无法转移到不同的问题或模型,除非重新拟合。 |
L2 头是小型工件(≈100 KB),包含 [hidden, K] 矩阵、偏差、标准化向量和温度。它们在 CPU 上几秒内计算,然后用于推理,只需一次截断前向传播(例如,在 36 块模型中的第 24 块停止)。
📊 报告结果(Qwen3‑8B 在 BANKING77 20 路基准上)
| 指标 | 原始 logits | AnyJev L0(零标签) | AnyJev L1(100‑500 标签) | AnyJev L2(100‑300 标签) |
|---|---|---|---|---|
| 答案顺序翻转率 | 0.230 | 0.073 | 0.077 | – |
| 准确度 | 0.747 | 0.803 | 0.807 | – |
| 期望校准误差 | 0.240 | 0.184 | 0.095 | – |
| 自动可决策 @ ≤5 % 误差(可安全自动化的流量比例) | 7.7 % | 46.3 % | 52.0 % | – |
延迟:L2 的成本约为 Qwen3‑8B 完整前向传播的 ≈0.68×(一个提示提前停止)。L0 需要 K 次预填充(在 H100 上,K=20 时每次决策约 0.25 秒)。
🛣️ 路线图(截至 README)
- ✅ 使用单次预填充实现
choice、noul、score问题。 - ✅ L0(零标签)和 L1 工件;级别强制。
- ✅ L2 闭式头、自动无标签适应、
observe循环。 - ✅ 五个 Qwen3 模型的预建头和演示 CLI。
- ⏳ 速度优化,使每个决策更便宜。
- ⏳ 支持通过 vLLM / SGLang 服务(使用固定块处的残差流)。
- ⏳ 完整代理循环评估(在真实代理中替换 LLM)。
- ⏳ 头的公共中心、交互式 Space 和技术报告。
- ⏳ 扩展到更多基础模型(Llama、Gemma、Mistral、DeepSeek)和更大的选项集(>26)。
⚠️ 限制(明确列出)
- 准确度是相对于教师 LLM 测量的,而非人类黄金标准。
- L2 头是每个问题和每个模型特定的;它们不会跨问题或跨模型转移(目前仅提供 Qwen3 头)。
- 校准无法弥补模型根本无法回答任务的情况(例如迷宫导航、扫雷)。
- 当一个标签主导先验时,L0 可能损害准确度。
- 该库目前每个选择最多支持 26 个选项(跨度读出计划中)。
- 5 % 风险下的覆盖率估计在 n = 300 测试项目时具有高变异性。
- 所有决策都在隔离中评估,而非在端到端代理循环中。
📦 安装与许可
- 使用可选的 Hugging‑Face 后端安装:
pip install "anyjev[hf]"。 - 包发布在 PyPI(
anyjev),支持 Python 3.8+。 - 许可: Apache‑2.0。
📚 进一步阅读与引用
- 完整方法描述:
docs/method_v3.md。 - 基准测试:
docs/results_bench.md、docs/results_exit.md。 - 演示脚本:
demo/jev_mode、demo/games(2048、扫雷)。 - 引用方式:
@software{anyjev2026,
title = {AnyJev: Turn any LLM into a Jev-style decision model},
author = {Zhang, Jiamu and Yang, Tianze and Shi, Yucheng and Wu, Liang},
year = {2026},
url = {https://github.com/nokia-applied-research/AnyJev}
}
底线: AnyJev 提供了一种实用、无需标签的方式,将任何开源 LLM 的原始、嘈杂 logits 转换为可信赖的、概率校准的决策,以及一个轻量级闭式头(L2),以最小的推理成本带来接近最先进的准确度。
相关
- 项目
- 项目
- 项目
- 项目