fischer-agentkit/docs/plans/2026-06-15-002-feat-e2e-cap...

284 lines
14 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: "feat: E2E能力分析框架改进与路由智能化提升"
type: feat
status: superseded
superseded_by: "2026-06-16-005-refactor-routing-architecture-plan"
superseded_reason: "路由智能化提升部分已被 SimpleRouter 架构简化替代。E2E 能力分析框架部分可合并到 2026-06-16-005 的 U5 回测验证单元。"
closed: 2026-06-16
created: 2026-06-15
plan-depth: standard
---
# E2E能力分析框架改进与路由智能化提升
## Summary
改进E2E能力分析框架解决当前基准数据集与实际技能不对应、覆盖面窄仅19条、指标判断过于简化等核心问题。同时将ExpertTeamRouter集成到CostAwareRouter自动触发链路增加路由器直接回测层并将基准用例扩展至60条使召回率/F1/过拟合检测等指标具备统计意义。
## Problem Frame
当前E2E能力分析框架存在四个关键问题
1. **基准数据与实际技能脱节**`benchmark_dataset.py` 中的 `expected_skill`(如 `email_composer`、`i18n_translator`)与 `configs/skills/` 中的15个实际技能不对应导致路由回测结果无意义
2. **覆盖面过窄**仅19条基准用例PRF统计不稳定缺少 SemanticRouter、ExpertTeamRouter、AlignmentGuard 的专项基准
3. **指标判断粗糙**`complexity_correct` 直接等于 `execution_mode_correct`,无法独立评估复杂度估算;改进策略中的 `target_module` 引用了旧文件名
4. **团队路由未自动集成**`ExpertTeamRouter` 与 `CostAwareRouter` 独立运行,`TEAM_COLLAB` 模式无法自动触发
## Requirements
- R1: 基准数据集中的 `expected_skill` 必须与 `configs/skills/` 中的实际技能一一对应
- R2: 基准用例数量扩展至60条覆盖路由/执行/团队/一致性/对齐守卫五个维度
- R3: 增加路由器直接回测层不经过HTTP API能区分路由错误与API层错误
- R4: `complexity_correct` 独立于 `execution_mode_correct`,基于 HeuristicClassifier 分数与期望复杂度的映射判断
- R5: ExpertTeamRouter 集成到 CostAwareRouter.route() 中,高复杂度任务自动触发 TEAM_COLLAB
- R6: 增加 SemanticRouter 专项基准(相似度分数分布、三档精确率)
- R7: 增加 AlignmentGuard 约束检查基准
- R8: 修正改进策略中的 target_module 文件路径
- R9: 报告输出保持中文
## Key Technical Decisions
### KTD1: 双层回测架构
**决策**在现有HTTP API层E2E测试之上增加路由器直接回测层。
**理由**纯API测试无法区分"路由器选错了技能"和"API层传递参数出错"两种失败模式。直接回测层调用 `CostAwareRouter.route()` 方法,记录 `SkillRoutingResult` 的完整字段(`match_method`、`match_confidence`、`execution_trace`),使根因分析能精确定位到具体路由层。
**替代方案**保持纯API层测试 → 被否决因为无法满足R3的精确诊断需求。
### KTD2: ExpertTeamRouter 集成方式
**决策**:在 `CostAwareRouter._route_layer2()` 末尾增加 ExpertTeamRouter 检查点。当 Layer 2 判定 `execution_mode=REACT``complexity >= 0.7` 时,调用 `ExpertTeamRouter.resolve()` 判断是否升级为 `TEAM_COLLAB`
**理由**:保持三层路由的递进式架构不变,仅在 Layer 2 出口处增加团队模式升级逻辑,最小化对现有路由流程的侵入。
### KTD3: 复杂度正确性判断策略
**决策**:基于 HeuristicClassifier 返回的浮点复杂度分数与期望复杂度等级的映射区间判断:`low=[0, 0.3)`、`medium=[0.3, 0.7)`、`high=[0.7, 1.0]`。
**理由**:直接使用浮点分数比仅比较执行模式更精确,能区分"复杂度分数0.29被判为low但期望medium"和"复杂度分数0.65被判为medium且期望medium"两种情况。
### KTD4: 基准用例与实际技能对齐
**决策**:从 `configs/skills/` 的15个实际技能中提取 `intent.keywords``intent.description`,自动生成基准用例的 `expected_skill`,而非手动硬编码。
**理由**:手动维护的技能名容易与实际配置脱节(当前问题)。自动对齐确保基准数据始终反映最新的技能配置。
---
## Implementation Units
### U1. 基准数据集与实际技能对齐
**Goal**: 修复 benchmark_dataset.py 中 expected_skill 与实际技能的对应关系扩展至60条用例
**Dependencies**: 无
**Files**:
- `tests/e2e/benchmark_dataset.py` — 重写基准数据集
- `tests/e2e/benchmark_generator.py` — 新增:从技能配置自动生成基准用例
**Approach**:
1. 新增 `BenchmarkGenerator` 类,读取 `configs/skills/*.yaml`,提取每个技能的 `intent.keywords`、`intent.description`、`intent.examples`,自动生成 `BenchmarkCase`
2. 为每个技能生成3-5条基准用例1条原始输入 + 2-4条改写
3. 保留手动定义的边界用例(问候语、身份识别、无匹配回退)
4. 新增维度:`alignment`(对齐守卫)、`semantic_router`(语义路由专项)
5. 总目标路由20+、执行15+、团队10+、一致性10+、对齐守卫5+
**Patterns to follow**: `BenchmarkCase` Pydantic frozen model 模式
**Test scenarios**:
- 生成的基准用例 expected_skill 全部存在于 configs/skills/ 中
- 每个技能至少有1条基准用例
- paraphrases 非空的用例占比 > 60%
- 总用例数 >= 60
**Verification**: 运行 `python -c "from tests.e2e.benchmark_dataset import ALL_BENCHMARKS; print(len(ALL_BENCHMARKS))"` 确认 >= 60
### U2. 路由器直接回测层
**Goal**: 增加不经过HTTP API的路由器直接回测记录完整路由结果
**Dependencies**: U1
**Files**:
- `tests/e2e/test_capability_router_direct.py` — 新增:路由器直接回测
- `tests/e2e/conftest.py` — 增加 router fixture
**Approach**:
1. 在 conftest.py 中增加 `cost_aware_router` fixture直接实例化 `CostAwareRouter`(使用 MockLLMProvider
2. 新增 `test_capability_router_direct.py`,对每个基准用例调用 `router.route(query)` 并记录完整 `SkillRoutingResult`
3. 记录字段:`skill_name`、`execution_mode`、`complexity`、`match_method`layer0/layer1/layer1.5/layer2、`match_confidence`、`execution_trace`
4. 将路由器回测结果也写入 MetricsCollector增加 `match_method``match_confidence` 字段
**Patterns to follow**: 现有 `test_capability_routing.py` 的参数化测试模式
**Test scenarios**:
- Layer 0 规则匹配:问候语 → DIRECT_CHAT@skill:xxx → 对应技能
- Layer 1 复杂度分类:简单问答 → low多步分析 → high
- Layer 1.5 语义路由:同义改写 → 相同技能,相似度 > 0.6
- Layer 2 能力匹配:高复杂度 → REACT/TEAM_COLLAB
- 路由器回测与API回测结果一致性 > 90%
**Verification**: 运行 `pytest tests/e2e/test_capability_router_direct.py -v` 全部通过
### U3. 指标体系增强
**Goal**: 修复 complexity_correct 判断逻辑,增加语义路由/团队路由指标,修正 target_module 路径
**Dependencies**: U1
**Files**:
- `tests/e2e/capability_metrics.py` — 增强指标模型和分析器
- `tests/e2e/benchmark_dataset.py` — 增加 semantic_router / alignment 类别
**Approach**:
1. `CapabilityObservation` 增加 `actual_complexity_score: float | None`、`actual_match_method: str | None`、`actual_match_confidence: float | None` 字段
2. `complexity_correct` 改为基于分数区间映射判断KTD3
3. `MetricsAnalyzer` 增加 `analyze_semantic_router()` 方法:按 high/medium/low 三档统计精确率
4. `MetricsAnalyzer` 增加 `analyze_team_routing()` 方法:统计 `explicit_team` vs `complexity_suggestion` 的成功率
5. 修正 `plan_improvements()` 中所有 `target_module``cost_aware_router.py` → `chat/skill_routing.py`
6. 报告增加"语义路由分析"和"团队路由分析"章节
**Patterns to follow**: 现有 `MetricsAnalyzer` 的分析方法模式
**Test scenarios**:
- complexity_correct 独立于 execution_mode_correct
- 语义路由三档精确率计算正确
- 团队路由成功率计算正确
- target_module 路径与实际代码对应
- 中文报告输出包含新增章节
**Verification**: 运行 `pytest tests/e2e/test_capability_routing.py tests/e2e/test_capability_react.py -v` 通过
### U4. ExpertTeamRouter 集成到 CostAwareRouter
**Goal**: 高复杂度任务自动触发 TEAM_COLLAB 模式
**Dependencies**: U2
**Files**:
- `src/agentkit/chat/skill_routing.py` — 修改 `_route_layer2()` 增加团队升级逻辑
- `src/agentkit/experts/router.py` — 增加 `can_handle()` 方法供路由器查询
- `tests/unit/chat/test_skill_routing.py` — 增加团队路由单元测试
**Approach**:
1.`CostAwareRouter._route_layer2()` 末尾,当 `execution_mode == REACT``complexity >= COMPLEXITY_THRESHOLD` 时,调用 `ExpertTeamRouter.resolve(content, complexity)`
2. 如果 `ExpertTeamRouter` 返回有效结果,升级 `execution_mode``TEAM_COLLAB`,并在 `execution_trace` 中记录 `"team_upgrade": True`
3.`ExpertTeamRouter` 中增加 `can_handle(content: str) -> bool` 方法,检查是否有匹配的专家模板
4. 保持向后兼容:如果 `ExpertTeamRouter` 不可用(未配置专家模板),静默跳过
**Patterns to follow**: 现有 `_route_layer2()` 的 Vickrey 拍卖路径模式
**Test scenarios**:
- 高复杂度 + 有专家模板 → TEAM_COLLAB
- 高复杂度 + 无专家模板 → 保持 REACT
- 低复杂度 → 不触发团队路由
- @team 前缀 → 直接 TEAM_COLLABLayer 0 处理)
- execution_trace 包含 team_upgrade 标记
**Verification**: 运行 `pytest tests/unit/chat/test_skill_routing.py -v -k team` 通过
### U5. AlignmentGuard 与 CascadeDetector 指标集成
**Goal**: 将对齐守卫约束违规和级联告警纳入E2E指标收集
**Dependencies**: U3
**Files**:
- `tests/e2e/test_capability_alignment.py` — 新增:对齐守卫基准测试
- `tests/e2e/capability_metrics.py` — 增加 alignment 维度指标
**Approach**:
1. 新增 `test_capability_alignment.py`包含5+条对齐守卫基准用例:
- 否定约束测试("不要提及价格"→ 输出不含价格)
- 肯定约束测试("必须包含摘要"→ 输出含摘要)
- 级联告警测试连续5次相似查询 → 触发 CascadeAlert
2. `CapabilityObservation` 增加 `alignment_violations: int`、`cascade_alert: bool` 字段
3. `MetricsAnalyzer` 增加 `analyze_alignment()` 方法
4. 报告增加"对齐守卫分析"章节
**Patterns to follow**: 现有 `test_capability_team.py` 的测试模式
**Test scenarios**:
- 否定约束:输出不包含禁止内容
- 肯定约束:输出包含必要内容
- 级联告警:连续交互触发告警
- 无约束:正常通过
**Verification**: 运行 `pytest tests/e2e/test_capability_alignment.py -v` 通过
### U6. 运行脚本与CI集成
**Goal**: 更新运行脚本支持分层回测和CI集成
**Dependencies**: U2, U3, U4, U5
**Files**:
- `scripts/run_e2e.sh` — 增加直接回测和分层运行选项
- `tests/e2e/conftest.py` — 确保 pytest_sessionfinish 报告生成正确
**Approach**:
1. `run_e2e.sh` 增加 `--direct` 选项(仅运行路由器直接回测)
2. `run_e2e.sh` 增加 `--alignment` 选项(仅运行对齐守卫测试)
3. `run_e2e.sh` 增加 `--full` 选项运行全部API + 直接 + 对齐)
4. 确保报告输出目录 `test-results/e2e/` 在 CI 中作为 artifact 上传
5. 增加 `--baseline` 选项:与上次报告对比,输出指标变化趋势
**Patterns to follow**: 现有 `run_e2e.sh` 的选项模式
**Test scenarios**:
- `--direct` 仅运行路由器直接回测
- `--alignment` 仅运行对齐守卫测试
- `--full` 运行所有能力测试
- `--analyze` 生成完整中文报告
- 报告文件正确保存到 test-results/e2e/
**Verification**: 运行 `./scripts/run_e2e.sh --direct``./scripts/run_e2e.sh --analyze` 验证
---
## Scope Boundaries
### In Scope
- 基准数据集与实际技能对齐并扩展至60条
- 路由器直接回测层
- 指标体系增强(复杂度、语义路由、团队路由)
- ExpertTeamRouter 集成到 CostAwareRouter
- AlignmentGuard 指标集成
- 运行脚本更新
### Out of Scope
- CostAwareRouter 三层架构重写
- 新增 LLM Provider
- 前端界面修改
- 生产环境部署
- intent.examples 嵌入到 SemanticRouter可作为后续优化
- disambiguation_keywords 配置字段(改进策略已规划,但属于技能配置层面的独立改进)
### Deferred to Follow-Up Work
- 基于用户真实查询日志的基准用例持续扩充
- 复杂度评估模型训练(替代启发式规则)
- 意图泛化CI防线的 GitHub Actions 配置
- OutputStandardizer.quality_score 与路由决策的关联分析
---
## Risks & Mitigations
| 风险 | 影响 | 缓解措施 |
|------|------|----------|
| ExpertTeamRouter 集成可能影响现有路由性能 | Layer 2 增加一次 resolve() 调用 | 仅在 complexity >= 0.7 时触发,且 can_handle() 快速返回 |
| 基准用例自动生成可能产生低质量用例 | PRF 指标失真 | 人工审核自动生成的用例,保留手动边界用例 |
| 路由器直接回测需要 MockLLMProvider 完整支持 | 某些路由路径无法测试 | 优先覆盖 Layer 0/1Layer 1.5/2 标记为需要真实 LLM |
| 60条用例可能增加E2E运行时间 | CI 流水线变慢 | 按维度分组运行,支持 `--fast` 快速失败模式 |
---
## System-Wide Impact
- **路由层**`skill_routing.py` 增加 ExpertTeamRouter 调用点,影响所有高复杂度请求的路由决策
- **测试层**新增3个测试文件conftest.py 增加2个 fixture运行脚本增加4个选项
- **报告层**能力分析报告增加3个章节语义路由、团队路由、对齐守卫
- **配置层**无配置文件变更disambiguation_keywords 推迟到后续)