Skip to content

Commit 761dac1

Browse files
docs: zh-Hans documentation about training and proposal part (#1677)
Signed-off-by: zhoujinyu <2319109590@qq.com>
1 parent 15c6c55 commit 761dac1

File tree

8 files changed

+3126
-0
lines changed

8 files changed

+3126
-0
lines changed
Lines changed: 206 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,206 @@
1+
---
2+
translation:
3+
source_commit: "eb9f384f"
4+
source_file: "docs/proposals/Prism-153key.md"
5+
outdated: false
6+
---
7+
8+
# [提案] PRISM:面向 vLLM-SR 模型选择的 153 键合法性层
9+
10+
**Issue:** #1422
11+
**作者:** Mossaab Souaissa — MSIA Systems
12+
**里程碑:** v0.3 — Themis
13+
**参考:** https://doi.org/10.5281/zenodo.18750029
14+
**白皮书:** https://github.com/user-attachments/files/25750911/PRISM-Vllm-SR-whitepaper-COMPLET-EN.pdf
15+
16+
---
17+
18+
## 1. 背景与动机
19+
20+
vLLM-SR 回答:**哪个模型最适合该请求?**
21+
PRISM 回答:**所选模型是否有资格回答这一具体查询?**
22+
23+
二者互补,而非重复。
24+
25+
### 「撒谎模型」问题
26+
27+
若无结构约束,任意模型都可回答任意查询——即便超出训练领域。这会产生**自信幻觉**:模型在不擅长的领域仍以高置信度即兴作答。
28+
29+
当前 vLLM-SR 流水线在模型选定后**没有**合法性校验。PRISM 在**不修改**既有路由逻辑的前提下增加该层。
30+
31+
### 设计原则:增量扩展、不破坏兼容
32+
33+
PRISM 作为现有组件的**可选扩展**集成:
34+
35+
- 若某模型配置中无 `prism.enabled` → 行为**不变**
36+
- 若决策中无 `type: "prism-execution"` 插件块 → **跳过** Key 3
37+
- 若请求时尚未就绪 PRISM 注册表 → 回退到 `"general"` → 标准 vLLM-SR 路由
38+
39+
| PRISM 组件 | 集成点 | 类型 |
40+
|----------------|------------------|------|
41+
| Key 1 — QUALIFICATION | `config.yaml` 中的 `model_config` | `prism.enabled: true` + 启动时自动发现 |
42+
| Key 2 — CLASSIFICATION | `req_filter_classification.go` | 新求值块 — 进程内 `candle-binding` |
43+
| Key 3 — EXECUTION | `req_filter_prism_execution.go` | 新 ExtProc 过滤器 — 沿用 `req_filter_jailbreak.go` 模式 |
44+
| 153-Registry | `pkg/registry/prism_registry.go` | 内存存储,启动时异步填充 Key 1 |
45+
46+
**本 PR 范围:仅 hybrid 模式**(Key 1 + Key 2 + Key 3)。`fine_filter``coarse_filter` 见第 9 节,为后续变体。
47+
48+
---
49+
50+
## 2. 架构概览
51+
52+
(ASCII 流程图与英文版一致,见英文 `docs/proposals/Prism-153key.md`。)
53+
54+
要点:**PHASE 1** 增加 `runPrismClassification()`**PHASE 3** 增加 `filterCandidatesByPrism()` 与重路由循环;**PHASE 4** 增加 `runPrismExecution()`。启动时 `NewPrismRegistry` 后台执行 `qualifyAllModels()`,就绪前 Key 2 将域置为 `"general"`
55+
56+
---
57+
58+
## 3. Key 1 — QUALIFICATION(启动时异步自动发现)
59+
60+
### 3.1 原则
61+
62+
运维人员****`model_config` 中声明 `prism.enabled: true`
63+
64+
`NewPrismRegistry()` 在后台 goroutine 中对每个启用模型发送 Key 1 资格提示词,解析 JSON 自声明并写入 153-Registry。路由器**立即**启动;goroutine 完成后 PRISM 才对后续请求生效。
65+
66+
初始化期间:`IsReady()``false``runPrismClassification()``ctx.PrismDomain = "general"` → 无 PRISM 的标准路由。
67+
68+
### 3.2 config.yaml — 最小人类声明
69+
70+
(YAML 示例与英文版相同。)
71+
72+
### 3.3 Key 1 资格提示词
73+
74+
(英文提示词正文与英文版相同,用于与模型交互。)
75+
76+
**HTTP 调用:** `POST http://{VLLMEndpoint.Address}:{VLLMEndpoint.Port}/v1/chat/completions`
77+
**鉴权:** `Authorization: Bearer {ModelParams.AccessKey}`(若设置 AccessKey)
78+
**超时:** 每模型 30 秒
79+
**失败或 domain 为 "general"/"unknown":** 该模型不进入注册表并打警告日志。
80+
81+
### 3.4 Go 结构体
82+
83+
`PrismModelConfig``PrismThresholds``PrismConfig` 等定义与英文版代码块一致。)
84+
85+
### 3.5 153-Registry — 异步初始化的内存存储
86+
87+
`RegistryEntry``PrismRegistry` 及方法与英文版一致。)
88+
89+
### 3.6 分数档位
90+
91+
| 分数 | 级别 | 含义 |
92+
|-------|-------|---------|
93+
| 0.00 - 0.30 | 浅显 | 通识,无专精 |
94+
| 0.31 - 0.60 | 基础 | 有专业词汇,深度有限 |
95+
| 0.61 - 0.90 | 确认 | 具备流程与方法的实际专精 |
96+
| 0.91 - 1.00 | 精通 | 标准、公式与复杂案例 |
97+
98+
### 3.7 经验分规则
99+
100+
`init` / `ACCEPTED` / `REFUSED` / `clamp` / `status` 与英文版相同。)
101+
102+
---
103+
104+
## 4. Key 2 — CLASSIFICATION(`req_filter_classification.go` 中新块)
105+
106+
### 4.1 原则
107+
108+
Key 2 是 `req_filter_classification.go` 中的新求值块,进程内使用 `candle-binding``candle.GetEmbedding()`。Key 2 **不回答问题**,只做意图分类,结果写入 `RequestContext` 供 Key 3 在 PHASE 4 使用。
109+
110+
### 4.2 RequestContext 扩展
111+
112+
`PrismDomain``PrismConfidence` 等字段与英文版一致。)
113+
114+
### 4.3 嵌入 API
115+
116+
`GetEmbedding` 签名与英文版一致。)
117+
118+
### 4.4 域嵌入缓存
119+
120+
`qualifyAllModels()` 结束时**预计算**各域嵌入并存入 `RegistryEntry.DomainEmbedding`,避免每请求重算。运行时 Key 2 仅计算**查询**的 1 次嵌入,与缓存的域嵌入做余弦相似度比较。
121+
122+
### 4.5 回退规则
123+
124+
注册表未就绪、`GetEmbedding` 出错、最佳相似度低于 `ConfidenceStrict`、未知域 → 一律 `ctx.PrismDomain = "general"`,不抛错、不阻塞请求。
125+
126+
### 4.6 置信度档位与 Key 3 行为
127+
128+
(与英文版表格一致:&lt;0.40 跳过 Key 3;0.40–0.69 严格档;0.70–0.89 灵活档;≥0.90 自动接受等。)
129+
130+
### 4.7 关键词提取
131+
132+
`extractKeywords` 与英文版一致。)
133+
134+
---
135+
136+
## 5. Key 3 — EXECUTION(新 ExtProc 过滤器)
137+
138+
### 5.1 原则
139+
140+
`runPrismExecution()` 位于 `req_filter_prism_execution.go`,模式与 `req_filter_jailbreak.go` **一致**。强制所选模型按 Key 1 在启动时固定的域自证合法性,而非运行时随意声称。
141+
142+
### 5.2 参考模式
143+
144+
`runJailbreakFilter` 与 Key 3 实现代码块与英文版一致。)
145+
146+
### 5.3 共享辅助
147+
148+
`req_filter_prism_helpers.go` 与英文版一致。)
149+
150+
### 5.4 重路由循环
151+
152+
`processor_req_body.go` 中循环与英文版一致。)
153+
154+
### 5.5 全局 REFUSED 与 HTTP 响应
155+
156+
`ctx.Blocked = true` 与越狱路径相同,沿用现有 `buildResponse()`
157+
158+
---
159+
160+
## 6. filterCandidatesByPrism — 模型选择前的预过滤
161+
162+
(逻辑与英文版 `filterCandidatesByPrism` 一致:域为 general 或未就绪时不过滤;无 PRISM 合格候选时退回全量候选,**绝不**因 PRISM 单独阻塞标准路由。)
163+
164+
---
165+
166+
## 7. PRISM 全局配置
167+
168+
(YAML `prism:` 块与英文版相同;注释说明工业场景默认阈值,通用场景可降低 `confidence_strict``expertise_min_score`。)
169+
170+
---
171+
172+
## 8. 新建/修改文件清单
173+
174+
(文件列表与英文版第 8 节一致。)
175+
176+
---
177+
178+
## 9. 三种集成模式(后续变体)
179+
180+
| 模式 | 激活的 Key | 范围 |
181+
|------|------------|------|
182+
| `hybrid` | Key 1 + 2 + 3 | **本 PR**,合法性最强 |
183+
| `coarse_filter` | Key 1 + 2 | 未来:仅路由前过滤 |
184+
| `fine_filter` | Key 1 + 3 | 未来:仅路由后校验 |
185+
186+
---
187+
188+
## 10. 待确认问题(@HuaminChen@Xunzhuo
189+
190+
1. `selectModelFromCandidates` 是否包含 `decision` 第三参数。
191+
2. 153-Registry 仅内存是否可接受 v0.3,抑或需 Redis/SQLite。
192+
3. Key 2 域嵌入与 `candle-binding` 并发/CGo 一致性。
193+
4. 是否提供 `config.recipe-prism-general.yaml` 降低通用场景阈值。
194+
5. `UnregisteredPolicy` 默认 `passthrough` vs `refuse` 的产品取舍。
195+
196+
---
197+
198+
## 11. 性能说明
199+
200+
Key 2 每请求一次 `GetEmbedding` + 与 N 个预缓存域嵌入比对;工业场景 N 常为 3–10,开销可忽略。域数量很大时可按查询哈希做嵌入相似度缓存(后续优化)。
201+
202+
---
203+
204+
## 12. 参考
205+
206+
- PRISM 白皮书与 Zenodo DOI、Issue #1422、Draft PR #1425 链接与英文版相同。
Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
---
2+
translation:
3+
source_commit: "5f14781c"
4+
source_file: "docs/proposals/advanced-tool-filtering.md"
5+
outdated: false
6+
---
7+
8+
# 工具选择的高级工具过滤
9+
10+
Issue: [#1002](https://github.com/vllm-project/semantic-router/issues/1002)
11+
12+
---
13+
14+
## 现状
15+
16+
当前工具选择仅使用嵌入相似度、相似度阈值与 top-k。当嵌入相近但意图不一致时,可能选到错误领域的工具。
17+
18+
[#1002](https://github.com/vllm-project/semantic-router/issues/1002) 提议引入高级工具过滤能力,通过更精细的相关性过滤减少误选,同时保持默认行为不变。
19+
20+
## 方案
21+
22+
在嵌入候选集合检索之后,增加**可选的高级过滤阶段**。该阶段应用确定性过滤(允许/禁止列表、可选类别门控、词面重叠阈值)以及融合嵌入相似度与词面、标签、名称、类别信号的**组合得分重排器**。若 `advanced_filtering.enabled=false`,行为与现有实现一致。
23+
24+
方案优点:延迟可控、不引入新模型依赖、可通过配置完整解释。
25+
26+
## 对比测试结果
27+
28+
测试配置:
29+
30+
- 查询集:20 条(17 正例、3 负例),覆盖天气、邮件、搜索、计算、日历等场景
31+
- 工具库:5 个工具(get_weather、search_web、calculate、send_email、create_calendar_event)
32+
- 迭代:10 次
33+
- 高级过滤配置:`min_lexical_overlap=1``min_combined_score=0.35``weights={embed:0.7, lexical:0.2, tag:0.05, name:0.05}`
34+
35+
评估结果:
36+
37+
![高级工具过滤评估结果](../../../../../static/img/proposals/advanced-tool-filtering.png)
38+
39+
| 指标 | 基线 | 高级 | 增量 |
40+
|------|------|------|------|
41+
| **准确率** | 55.00% | 90.00% | **+35.00%** |
42+
| **精确率** | 78.57% | 94.12% | **+15.55%** |
43+
| **召回率** | 64.71% | 94.12% | **+29.41%** |
44+
| **假阳性率** | 100.00% | 33.33% | **-66.67%** |
45+
| 平均延迟 | 0.0162 ms | 0.0197 ms | +0.0036 ms |
46+
| P95 延迟 | 0.0256 ms | 0.0288 ms | +0.0032 ms |
47+
48+
## 数据流
49+
50+
```mermaid
51+
flowchart TD
52+
A[请求 tool_choice=auto] --> B[提取分类文本]
53+
B --> C{启用 Tools DB?}
54+
C -->|否| D[退出]
55+
C -->|是| E{advanced_filtering.enabled?}
56+
E -->|否| F[FindSimilarTools: 嵌入 + 阈值 + top-k]
57+
E -->|是| G[FindSimilarToolsWithScores: 嵌入 + 阈值 + 候选池]
58+
G --> H[允许/禁止 + 类别过滤 + 词面重叠]
59+
H --> I[计算组合得分 + 重排]
60+
I --> J[选取 top-k 工具]
61+
F --> K[更新请求 tools]
62+
J --> K[更新请求 tools]
63+
```
64+
65+
## 配置变更
66+
67+
高级过滤默认关闭。启用时下列字段生效。
68+
69+
| 字段 | 类型 | 默认 | 范围 / 说明 |
70+
|------|------|------|-------------|
71+
| `enabled` | bool | `false` | 启用高级过滤。 |
72+
| `candidate_pool_size` | int | `max(top_k*5, 20)` | 若设置且 >0 则直接使用。 |
73+
| `min_lexical_overlap` | int | `0` | 查询与工具词表之间的最小唯一 token 重叠数。 |
74+
| `min_combined_score` | float | `0.0` | 组合得分阈值,范围 [0.0, 1.0]|
75+
| `weights.embed` | float | `1.0` | 未设置权重时 embed 默认为 1.0。 |
76+
| `weights.lexical` | float | `0.0` | 可选权重,范围 [0.0, 1.0]|
77+
| `weights.tag` | float | `0.0` | 可选权重,范围 [0.0, 1.0]|
78+
| `weights.name` | float | `0.0` | 可选权重,范围 [0.0, 1.0]|
79+
| `weights.category` | float | `0.0` | 可选权重,范围 [0.0, 1.0]|
80+
| `use_category_filter` | bool | `false` | 为 true 时在置信度足够时按类别过滤。 |
81+
| `category_confidence_threshold` | float | `nil` | 若设置,仅当决策置信度 ≥ 阈值时才应用类别过滤。 |
82+
| `allow_tools` | []string | `[]` | 工具名白名单;非空时仅保留这些工具。 |
83+
| `block_tools` | []string | `[]` | 工具名黑名单。 |
84+
85+
## 打分与过滤实现
86+
87+
### 分词
88+
89+
规则:转小写并在非字母数字处切分。仅 Unicode 字母与数字计为 token。
90+
实现见:[src/semantic-router/pkg/tools/relevance.go#L240](https://github.com/samzong/semantic-router/blob/feat/advanced-tool-filtering/src/semantic-router/pkg/tools/relevance.go#L240)
91+
92+
### 词面重叠
93+
94+
词面重叠统计下列**唯一 token** 的交集:
95+
96+
- 工具名
97+
- 工具描述
98+
- 工具类别
99+
100+
不包含标签。标签为单独信号。
101+
102+
### 组合得分公式
103+
104+
对每个候选工具:
105+
106+
```
107+
combined = (w_embed * embed + w_lexical * lexical + w_tag * tag + w_name * name + w_category * category) / (w_embed + w_lexical + w_tag + w_name + w_category)
108+
```
109+
110+
- `embed` 为相似度得分,限制在 [0,1]
111+
- `lexical``tag` 为重叠得分,按查询 token 数 / 标签 token 数归一化。
112+
- `name``category` 为二元得分(0 或 1)。
113+
- 若未设置权重,embed 默认为 1.0。
114+
- 若所有权重显式为 0,则组合得分为 0;当 `min_combined_score > 0` 时所有候选都会被滤掉。
115+
116+
### 类别置信门控
117+
118+
仅当同时满足以下条件时类别过滤才生效:
119+
120+
- `use_category_filter` 为 true,
121+
- 存在类别,且
122+
- 决策置信度 ≥ `category_confidence_threshold`(若已设置)。
123+
124+
## 错误处理与回退
125+
126+
- 工具选择失败且 `tools.fallback_to_empty=true`:请求在**无工具**的情况下继续,并记录警告。
127+
-`fallback_to_empty=false`:返回分类错误。
128+
- 无效的高级配置在加载阶段被拒绝(`validator.go` 中的范围校验)。
129+
130+
## API 变更
131+
132+
新增或修改的 API:
133+
134+
```go
135+
// src/semantic-router/pkg/tools/tools.go
136+
func (db *ToolsDatabase) FindSimilarToolsWithScores(query string, topK int) ([]ToolSimilarity, error)
137+
138+
// src/semantic-router/pkg/tools/relevance.go
139+
func FilterAndRankTools(query string, candidates []ToolSimilarity, topK int, advanced *config.AdvancedToolFilteringConfig, selectedCategory string) []openai.ChatCompletionToolParam
140+
```

0 commit comments

Comments
 (0)