Initial standalone memabra release

This commit is contained in:
Carlos Ouyang
2026-04-15 11:06:05 +08:00
commit 58f9f221b1
464 changed files with 30256 additions and 0 deletions

213
docs/ROUTER_BASELINE.md Normal file
View File

@@ -0,0 +1,213 @@
# 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` 保持了可解释性,同时为后续学习型策略提供了结构化特征输出。