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),以最小的推理成本帶來接近最先進的準確度。
相關
- 專案
- 專案
- 專案
- 專案