当前项目已切换为 Query 侧原型增量学习框架(已移除基于规则的路由实现)。
llmRouter/
├── query_side/
│ ├── config.py # Query 侧配置(原型预算、阈值、损失权重)
│ ├── modules.py # DeBERTa + 双投影头(h_known, h_unknown)
│ ├── prototype.py # 子原型空间、伪标签负载阈值、OOD 生长
│ ├── losses.py # L_supcon / L_dpl / L_ood
│ └── pipeline.py # 训练步、推理、OOD 处理、需求向量导出
├── model_side/
│ ├── config.py # Model 侧配置(锚点、温度、BPR)
│ ├── profiler.py # 锚点画像与新原型迁移初始化
│ ├── bpr.py # BPR 排序更新
│ └── pipeline.py # Model 侧统一接口
├── main.py # dataset 驱动的最小训练/推理入口
├── tests/
│ ├── test_query_side_smoke.py
│ └── test_model_side_smoke.py
└── requirements.txt
新增 query_side/,用于把 Query 建模为“已知任务 + 未知任务”的原型分布表示:
modules.py:DeBERTa 编码器 + 双投影头(h_known,h_unknown)prototype.py:子原型空间初始化、近邻分配、负载自适应阈值、OOD 原型生长losses.py:L_supcon/L_dpl/L_ood(简化可训练版本)pipeline.py:统一训练步、伪标签增量、OOD 处理、需求向量导出
最小使用示例:
import torch
from query_side import QuerySideConfig, QuerySidePipeline
cfg = QuerySideConfig(num_known_tasks=3, total_prototypes=30)
pipe = QuerySidePipeline(cfg, device="cpu")
labeled_texts = ["sample a", "sample b", "sample c"]
labels = torch.tensor([0, 1, 2], dtype=torch.long)
pipe.initialize_bank(labeled_texts, labels)
out = pipe.infer(["new query"])
print(out.demand_vector.shape)注:当前实现是“可运行骨架 + 核心接口”,便于后续替换成你的真实数据加载、完整 OOD 聚类(如 HDBSCAN)和在线增量策略。
pip install -r requirements.txt
python main.py --data-path dataset/routerbench_0shot.pkl --text-col prompt --total-prototypes 300说明:监督标签由 嵌入细→粗聚类(ST MiniLM,与 QueryEncoder 解耦)自动生成;元数据写入 analysis/main_embed_labels/。total_prototypes 默认 300,适合首轮实验。
新增 evaluate_routerbench.py,会输出以下方法在验证集上的:
- 平均 Performance
- 平均 Cost(来自数据集
<model>|total_cost) - 平均 Utility(perf −
lam_cost× 行内 min–max cost)
对比方法包括:
ours_theta(Θ + 行内效用)oracle_utilityoracle_performancestrongest_modelcost_onlyrandom
运行示例:
python evaluate_routerbench.py --data-path dataset/routerbench_0shot.pkl --text-col prompt --device auto --max-samples 300 --init-batch-size 2 --batch-size 4 --max-length 64 --epochs 1 --total-prototypes 180 --lam-cost 0.2新增 model_side/,对应以下流程:
- 初始化/新模型:
在每个原型上抽取高质量 Query 锚点集A_c,进行真实模型交互(胜/负),初始化 Beta 参数
alpha_{j,c} = alpha_prior + wins, beta_{j,c} = beta_prior + fails。 - 新生成原型:
按s_{c,k} = softmax(cos(mu_c, mu_k)/tau)计算与已知原型的相关性,继承初始化:
alpha_{j,c}^0 = Σ s_{c,k} alpha_{j,k},beta_{j,c}^0 = Σ s_{c,k} beta_{j,k}。 - 老模型全量更新:
用原型-模型性能矩阵做 BPR 排序训练,得到最终模型能力向量。 - 决策(当前已支持基础版):
Theta_{j,c} = alpha/(alpha+beta),Score_j = z(q)^T Theta_j,
Utility_j = Score_j - lambda * Cost_j(成本来自数据集)。
最小使用:
import torch
from model_side import ModelSideConfig, ModelSidePipeline
cfg = ModelSideConfig()
pipe = ModelSidePipeline(cfg)
proto_ids = torch.tensor([0, 0, 1, 1, 2, 2])
model_correctness = {
"m1": torch.tensor([1, 0, 1, 1, 0, 1], dtype=torch.float32),
"m2": torch.tensor([0, 1, 0, 1, 1, 0], dtype=torch.float32),
}
profile = pipe.initialize_profiles(proto_ids, model_correctness)