Skip to content

Latest commit

 

History

5 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

llmRouter

当前项目已切换为 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 侧原型增量学习框架

新增 query_side/,用于把 Query 建模为“已知任务 + 未知任务”的原型分布表示:

  • modules.py:DeBERTa 编码器 + 双投影头(h_known, h_unknown
  • prototype.py:子原型空间初始化、近邻分配、负载自适应阈值、OOD 原型生长
  • losses.pyL_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)和在线增量策略。

用 dataset 快速测试

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,适合首轮实验。

与 RouterBench 方法对比(含 Cost)

新增 evaluate_routerbench.py,会输出以下方法在验证集上的:

  • 平均 Performance
  • 平均 Cost(来自数据集 <model>|total_cost
  • 平均 Utility(perf − lam_cost × 行内 min–max cost)

对比方法包括:

  • ours_theta(Θ + 行内效用)
  • oracle_utility
  • oracle_performance
  • strongest_model
  • cost_only
  • random

运行示例:

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 侧原型交互画像框架(新)

新增 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)

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages