基于 ML 的模型选择
基于 ML 的选择学习决策候选池中哪个模型最适合某个请求。当历史评测数据比固定优先级顺序或少量手写规则携带更多信息时,它很有用。
选择器在路由决策匹配之后运行。它只能从该决策的 modelRefs 中选择;它不会发现、部署或认证 provider 模型。
可用选择器
| 选择器 | 如何选择 | 在以下情况考虑 |
|---|---|---|
| KNN | 在相似查询上组合记录的质量和速度 | 相似请求往往偏好同一模型,且可追溯性很重要 |
| KMeans | 将请求映射到已学习的簇 | 工作负载形成稳定簇,且查找成本很重要 |
| SVM | 使用已学习的决策边界 | 候选模型在特征空间中干净分离 |
| MLP | 用神经网络为候选打分 | 你有足够数据训练非线性选择器;Router 在 CPU 上执行训练后的产物 |
没有普遍最好的选择器。将每个候选与简单基线比较,例如固定默认、随机选择,以及同一留出数据集上的最佳单模型。
训练前准备
你需要:
- 两个或更多 OpenAI 兼容模型端点
- 代表性查询和标准答案,或其他可辩护的评分方法
- 足够的重复覆盖,以便在重要工作负载切片上评测每个候选模型
- 训练和在线推理时相同的嵌入模型
- 密钥、速率限制、成本以及模型响应保留计划
基准测试将每个所选查询发送到多个 provider 端点,并存储其响应、质量分数和延迟。当提示词或响应包含用户数据时,将输出视为敏感。
控制面板工作流
在控制面板中打开 /ml-setup 以运行引导工作流:
- 上传模型端点 YAML 文件和查询 JSONL 文件。
- 对候选模型做基准测试。
- 训练一个或多个选择器。
- 定义决策并下载配置片段。
Benchmark 和 Train 步骤会在控制面板的 ML 数据目录下产生数据和模型产物。
生成的 ml-model-selection-values.yaml 是迁移片段,不是独立的规范 Router 配置。其 config.model_selection、config.strategy 和 config.decisions 字段必须经过评审,并映射到完整配置中的 global.router.model_selection、global.router.strategy 和 routing.decisions。添加所需的 listeners 和 providers,然后在部署前运行 vllm-sr config validate --config ...。
命令行工作流
1. 安装训练依赖
cd src/training/model_selection/ml_model_selection
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txt
2. 准备评测查询
每行使用一个 JSON 对象。ground_truth 是为模型输出打分所必需的;category 可选,但对切片评测有用。
{"query":"What is the derivative of x^2?","ground_truth":"2x","category":"math","metric":"MATH"}
{"query":"Which city is the capital of France?","ground_truth":"B","category":"other","metric":"em_mc","choices":"A) London B) Paris C) Berlin D) Rome"}
选择与任务匹配的指标。基准支持精确/包含匹配、选择题提取、GSM8K 和 MATH 答案提取、文本 F1 以及代码评测。检查基准输出,而不是假设一个指标适合每个领域。
3. 描述候选端点
将凭据放在环境变量中。不要把字面 API 密钥写进 YAML 文件。
models:
- name: local-small
endpoint: http://localhost:8000/v1
- name: hosted-model
endpoint: https://provider.example/v1
api_key: ${PROVIDER_API_KEY}
4. 对每个候选做基准测试
python benchmark.py \
--queries queries.jsonl \
--model-config models.yaml \
--output benchmark-output.jsonl \
--concurrency 4
从低并发开始。仅在确认每个端点都能维持请求速率,且 provider 速率限制没有扭曲延迟测量后,再提高并发。