Files
memabra/docs/ROUTER_BASELINE.md
2026-04-15 11:06:05 +08:00

213 lines
4.7 KiB
Markdown
Raw 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.
# Rule-Based Router Baseline
## 目标
定义 memabra 在 Phase 1 使用的第一版路由策略。这个版本不学习,只靠显式规则和候选对象属性做动作选择。
它的价值不在于聪明,而在于:
- 可观察
- 可解释
- 可回放
- 可作为 learned router 的基线
## 动作空间
router 当前允许的动作:
1. `direct_answer`
2. `inject_memory`
3. `load_skill`
4. `call_tool`
5. `clarify`
6. `composite_action`
### direct_answer
适用场景:
- 纯分析、命名、结构设计、解释类任务
- 不依赖实时状态
- 没有明显外部资源调用必要
### inject_memory
适用场景:
- 用户偏好
- 项目约定
- 环境事实
- 历史已知稳定事实
### load_skill
适用场景:
- 任务像一个可复用 procedure
- 存在已知工作流
- 过往在类似任务中复用价值高
### call_tool
适用场景:
- 需要获取当前状态
- 需要访问文件、系统、网页、进程、时间等实时信息
- 需要执行动作而不是纯推理
### clarify
适用场景:
- 高风险且候选信号弱
- 信息缺失会显著改变动作选择
- 所有候选都低置信度
### composite_action
适用场景:
- 先 memory 再 tool
- 先 skill 再 tool
- 先 memory 再 skill
当前 baseline 先以单动作为主,组合动作先作为保留动作类型。
## 候选打分思路
每个候选对象都有公共字段:
- `confidence`
- `success_rate`
- `cost`
- `freshness`
- `risk`
baseline 不做复杂学习,只用线性直觉打分。
### memory score
```text
memory_score = confidence + freshness + success_rate - cost - risk
```
### skill score
```text
skill_score = confidence + success_rate - cost - risk
```
### tool score
```text
tool_score = confidence + success_rate - cost - risk
```
注意:
- memory 更看 freshness
- tool 更看 risk
- skill 更看 success_rate
## 第一版规则
### Rule 1: reasoning-first 任务优先 direct_answer
若用户输入中明显包含以下信号:
- why
- think
- design
- name
且不存在强 tool 触发词,则优先 `direct_answer`
### Rule 2: 需要实时状态时优先 tool
若输入中出现:
- check
- run
- open
- current
- list
- time
则优先找高置信 `tool` 候选。
额外门槛:
- `confidence >= 0.6`
- `risk <= 0.7`
### Rule 3: 用户/项目稳定事实优先 memory
若输入中出现:
- prefer
- remember
- usually
- my
- our
则优先找高置信、较新鲜的 `memory` 候选。
额外门槛:
- `confidence >= 0.65`
- `freshness >= 0.3`
### Rule 4: 可复用工作流优先 skill
若输入中出现:
- fix
- deploy
- review
- setup
- workflow
则优先找高 success_rate 的 `skill` 候选。
额外门槛:
- `confidence >= 0.55`
- `success_rate >= 0.4`
### Rule 5: 没把握就 clarify
如果没有任何一类候选达到门槛,则返回 `clarify`
这条规则很丑,但很必要。
宁可问一句,也别瞎调一堆工具把屋顶掀了。
## 冲突解决顺序
当多个动作同时触发时baseline 使用以下优先级:
```text
tool > memory > skill > direct_answer > clarify
```
原因:
- 实时信息需求通常最硬
- 事实约束其次
- skill 更像增强器
- 纯回答放在明确无外部需求时
后续版本可改成:
- 先 task intent classification
- 再 per-type ranking
- 最后做 global arbitration
## 已知局限
1. 关键词触发太脆
2. 不看长程上下文
3. 不支持真正的组合动作规划
4. 不做反事实选择比较
5. 容易被表面词汇误导
## baseline 的真正用途
不是追求高智能,而是提供:
- 第一版可运行系统
- 第一批可记录轨迹
- 第一批失败样本
- learned router 的比较对象
## 下一步
从这个 baseline 往后长,有三条路线:
1. 引入显式特征工程
2. 引入候选 reranker
3. 引入 bandit / lightweight policy learning
在此之前,不要急着把 heuristic 糊成“伪智能”。先把 replay 和 metrics 做出来。
---
## 实现进展FeatureScoringRouter (v2)
已在 `src/memabra/router.py` 中实现 `FeatureScoringRouter`,作为对 `RuleBasedRouter` 的升级:
- 明确特征打分memory / skill / tool 分别使用不同权重组合 `confidence``success_rate``freshness``cost``risk`
- 失败惩罚:候选 `id` 出现在 `TaskContext.recent_failures` 中时,自动扣减 0.5 分
- 复合动作前置条件:`CandidateObject` 新增 `preconditions` 字段,支持声明如 `["memory"]` 等前置类型
- 复合动作执行:`ExecutionEngine` 已支持 `composite_action` 决策类型,按 `composite_steps` 顺序递归执行子步骤
- 打分透明度:`RouteDecision.score_breakdown` 记录每个候选的最终得分,方便追溯与评估
`FeatureScoringRouter` 保持了可解释性,同时为后续学习型策略提供了结构化特征输出。