bookworm-smart-assistant/docs/strategic-evolution-v6.md

411 lines
12 KiB
Markdown
Raw Permalink Normal View History

# Bookworm v6.0 战略演进设计文档
> 基于 v5.8 全维度审计 + 计算机哲学评审,设计三个核心演进方向
**创建日期**: 2026-03-04
**状态**: 设计稿 (待实施)
**影响范围**: 路由引擎 / 技能组织 / 质量闭环 / 视觉测试 / LLM 网关
---
## S1: 概率性路由引擎
### 问题陈述
当前 38 条消歧规则是**手工编码的信道编码**,维护成本随技能数 O(N²) 增长。
当技能数 >100 时,消歧规则将成为维护瓶颈 (需 ~80+ 条)。
### 设计方案: 三阶段渐进演化
#### 阶段 1: 强化隐式反馈闭环 (v5.9)
**现有基础**:
- `implicit-feedback.js` 已实现 5 分钟窗口内的路由确认/纠正推断
- `route-ab-test.js` 已实现 Thompson Sampling + 收敛检测
- `route-weights.json` 已支持权重增量 [-0.5, +0.5]
**增强点**:
```
1. 在 route-auditor.js (Stop hook) 中自动触发 implicit-feedback
当前: 手动运行 / 无集成
增强: 每次会话结束自动推断本次所有路由的正确性
2. 将 implicit-feedback 结果自动回流到 route-weights.json
当前: 只写 route-feedback.jsonl未回流
增强: 添加 applyImplicitWeights() 函数
confirmed → weight += 0.05 (限幅)
corrected → weight -= 0.1, 正确技能 += 0.1
3. 扩展 A/B 实验的触发范围
当前: 仅 top-2 差距 < 15% 时触发
增强: 加入消歧规则命中时的强制实验
当消歧规则覆盖 BM25 结果时 → 50% 概率保留 BM25 原选择
收集对比数据 → 验证消歧规则是否真的优于 BM25
```
**实现路径**:
```javascript
// route-auditor.js 增强 (Stop hook)
const implicit = require('../scripts/implicit-feedback.js');
const feedback = implicit.inferFeedback({ maxDays: 1 });
implicit.applyToWeights(feedback); // 新增函数
```
**预期效果**: 消歧规则中 ~30% 可通过数据验证其必要性,不必要的规则可退役。
#### 阶段 2: 学习型消歧 (v6.0)
**核心设计**: 将硬编码规则转化为可学习的软规则
```
消歧规则现状:
{ "pattern": "React+Bug", "action": "debugger" } // 硬编码
学习型消歧:
{
"pattern": "React+Bug",
"baseAction": "debugger",
"learnedWeight": 0.85, // 从反馈数据学习
"alternatives": {
"frontend-expert": 0.10,
"reviewer-expert": 0.05
},
"confidence": 0.92, // 基于样本量
"sampleCount": 47
}
```
**实现**: 新增 `scripts/adaptive-disambiguator.js`
```javascript
// 核心算法: Bayesian Rule Learning
class AdaptiveDisambiguator {
constructor(rules, feedbackHistory) {
this.rules = rules;
this.priors = this.initPriors(rules);
}
// 每条规则维护一个 Dirichlet 分布
// α_i = 先验 + 命中后成功次数
initPriors(rules) {
return rules.map(r => ({
pattern: r.pattern,
// 先验: 硬编码 action 获得 α=10 的强先验
alphas: { [r.action]: 10, _other: 1 },
totalSamples: 0,
}));
}
// 根据后验分布选择 action
selectAction(matchedRuleIdx, candidates) {
const prior = this.priors[matchedRuleIdx];
// 样本充足 (>30) 且收敛 → 确定性选择
if (prior.totalSamples > 30) {
const maxAlpha = Math.max(...Object.values(prior.alphas));
const winner = Object.keys(prior.alphas)
.find(k => prior.alphas[k] === maxAlpha);
if (maxAlpha / prior.totalSamples > 0.8) return winner;
}
// 样本不足或未收敛 → Thompson Sampling
return this.thompsonSample(prior.alphas, candidates);
}
// 记录反馈
recordFeedback(ruleIdx, selectedSkill, wasCorrect) {
const prior = this.priors[ruleIdx];
if (wasCorrect) {
prior.alphas[selectedSkill] = (prior.alphas[selectedSkill] || 0) + 1;
} else {
prior.alphas[selectedSkill] = Math.max(0, (prior.alphas[selectedSkill] || 1) - 0.5);
}
prior.totalSamples++;
}
}
```
**安全机制**:
- 硬编码规则作为强先验 (α=10),需要大量反面证据才能推翻
- 前 30 个样本内不改变行为,仅收集数据
- 任何规则的学习权重偏离先验 >50% 时,写入 evolution-log 并标记审查
#### 阶段 3: 向量嵌入补充 (v6.x)
**方案**: 用 MCP 调用嵌入模型,为每次查询生成向量,与预计算的技能向量做余弦相似度
```
用户输入 "优化首屏加载速度"
BM25 路由: frontend-expert (0.72), performance-expert (0.68)
↓ (差距 < 15%, 触发向量补充)
Embedding: text-embedding-3-small
query_vec = embed("优化首屏加载速度")
skill_vecs = precomputed (每个技能 description 的 embedding)
cos_sim: performance-expert (0.89), frontend-expert (0.76)
融合: BM25(0.5) + Embedding(0.3) + Context(0.2)
performance-expert: 0.5*0.68 + 0.3*0.89 + 0.2*ctx = 0.607 + ctx
frontend-expert: 0.5*0.72 + 0.3*0.76 + 0.2*ctx = 0.588 + ctx
```
**前置条件**:
- 集成 LiteLLM/OpenRouter MCP 或 本地 ollama embedding
- 预计算 68 个技能向量 → `skills-embeddings.json`
- 仅在 BM25 top-2 差距 < 15% 时触发 (节省 API 调用)
**延迟预算**: +200-500ms (仅低置信度查询触发)
---
## S2: 层级化技能组织
### 问题陈述
68 技能平铺在同一层级BM25 评分 O(N*K*T) 随 N 线性增长。
消歧冲突以 O(N²) 增长。当前 61 个关键词冲突已经很高。
### 设计方案: 两级路由
```
Layer 1: 域路由 (Domain Router)
├── dev (22 技能: frontend, backend, mobile, ...)
├── architecture (11 技能: architect, database, cloud-native, ...)
├── devops (6 技能: devops, devsecops, git, sre, ...)
├── quality (3 技能: tester, reviewer, project-audit)
├── product (4 技能: product-manager, designer, ux, coordinator)
├── business (9 技能: business-plan, finance, sales, ...)
├── content (5 技能: tech-writer, copywriter, email, ...)
├── ai-data (3 技能: ai-ml, data-analyst, data-engineer)
├── security (1 技能: security-expert)
└── meta (4 技能: genesis-engine, prompt-optimizer, ...)
Layer 2: 技能路由 (Skill Router)
在选定域内做精确 BM25 匹配
```
### 数据结构
`skills-index.json` 中新增 `domain` 字段:
```json
{
"domains": {
"dev": {
"keywords": ["代码", "开发", "实现", "写", "组件", "API", "接口", ...],
"skills": ["frontend-expert", "backend-builder", "mobile-expert", ...]
},
"architecture": {
"keywords": ["架构", "设计", "选型", "DDD", "微服务", ...],
"skills": ["architect-expert", "database-tuning-expert", ...]
}
}
}
```
### 路由流程
```
用户输入 "React 组件性能优化"
Layer 1: 域分类器
dev: 0.7 (React, 组件)
architecture: 0.3 (性能, 优化)
→ 选择 dev (top-1),保留 architecture 作为辅助域
Layer 2: 域内 BM25 (仅 22 技能)
frontend-expert: 0.85
performance-expert: 0.72 (跨域辅助)
→ 最终: frontend-expert
消歧规则: 仅需覆盖**域内冲突** (22 技能间 vs 68 技能间)
域内冲突数: ~15 条 (vs 全局 38 条)
```
### 复杂度分析
| 指标 | 当前 (平铺) | 层级化 | 改善 |
|------|-----------|--------|------|
| BM25 评分次数 | 68 | ~10 (域) + ~22 (域内) = 32 | -53% |
| 消歧规则维护 | O(N²) ≈ 38 | O(K) + O((N/K)²) ≈ 15 | -60% |
| N=100 时规则数 | ~80 | ~25 | -69% |
| N=200 时规则数 | ~160 | ~45 | -72% |
### 兼容性设计
- 层级化路由与现有平铺路由**并行运行** (A/B 测试)
- route-ab-test 框架可直接复用
- 域分类器复用现有 BM25 引擎,仅更换索引维度
- 消歧规则按域分组,无需全局重写
### 实现路径
```
v5.9: 在 skills-index.json 中为每个技能添加 domain 字段 (手工标注)
v6.0: 实现 domain-router.js (Layer 1 路由器)
v6.1: 在 route-interceptor 中 A/B 测试 flat vs hierarchical
v6.2: 收敛后切换默认路由策略
```
---
## P3-13: 视觉回归测试
### 设计方案
`zero-defect-guardian` 技能中集成 Playwright 截图对比:
```
修改前截图 → 修改代码 → 修改后截图 → 像素对比 → 差异报告
```
**实现**:
```javascript
// scripts/visual-regression.js
const { chromium } = require('playwright');
async function captureBaseline(url, selector, outputPath) {
const browser = await chromium.launch();
const page = await browser.newPage({ viewport: { width: 1280, height: 720 } });
await page.goto(url);
const element = selector ? await page.$(selector) : page;
await element.screenshot({ path: outputPath });
await browser.close();
}
async function compareSnapshots(baselinePath, currentPath, diffPath) {
// pixelmatch 库 (npm i pixelmatch pngjs)
const pixelmatch = require('pixelmatch');
const { PNG } = require('pngjs');
// ... 像素对比逻辑
return { mismatchPercentage, diffPixels };
}
```
**集成点**:
- `zero-defect-guardian` SKILL.md 增加 visual regression 章节
- tester-expert 的 E2E 测试模板增加截图对比步骤
- quality-gate D4 性能维度增加视觉回归检查
---
## P3-14: LLM Gateway MCP
### 设计方案
创建统一 LLM 调用网关:
```json
// mcp-templates.md 新增
"llm-gateway": {
"args": ["/c", "npx", "-y", "mcp-server-litellm", "--config", "./litellm.yaml"],
"command": "cmd", "type": "stdio"
}
```
**litellm.yaml 模板**:
```yaml
model_list:
- model_name: gpt-4o
litellm_params:
model: openai/gpt-4o
api_key: ${OPENAI_API_KEY}
- model_name: qwen-plus
litellm_params:
model: dashscope/qwen-plus
api_key: ${DASHSCOPE_API_KEY}
- model_name: embedding
litellm_params:
model: openai/text-embedding-3-small
api_key: ${OPENAI_API_KEY}
```
**用途**: ai-ml-expert 中的 RAG/Agent 开发可通过 MCP 直接调用多模型。
---
## P3-15: 多模态闭环
### 设计方案
```
Figma 设计稿 → get_design_context (Figma MCP)
AI 生成代码 → frontend-expert / canvas-ui-designer
启动本地 dev server → Bash: npm run dev
Playwright 截图 → mcp__playwright__browser_take_screenshot
与 Figma 原稿对比 → visual-regression.js
差异 > 5% → 自动修复循环 (最多 3 轮)
差异 ≤ 5% → PASS
```
**关键约束**: 需要 Figma MCP + Playwright MCP 同时可用。
---
## P3-16: Skill 热加载
### 设计方案
当前添加新技能需要:
1. 创建 `skills/new-skill/SKILL.md`
2. 运行 `node scripts/generate-skill-index.js` 重建索引
3. 重启 Claude Code 会话
**热加载方案**:
-`post-edit-dispatcher.js` 检测 `skills/*/SKILL.md` 的写入
- 自动触发 `generate-skill-index.js` 重建索引
- 路由引擎在下次调用时自动加载新索引 (已有的 loadIndex() 每次读文件)
```javascript
// post-edit-dispatcher.js 增强
function checkSkillHotReload(filePath) {
if (/skills\/[^/]+\/SKILL\.md$/.test(filePath)) {
// 异步重建索引 (不阻塞当前 hook)
const { execFile } = require('child_process');
execFile(process.execPath,
[path.join(ROOT, 'scripts/generate-skill-index.js')],
{ timeout: 10000 },
() => {} // 静默完成
);
return '[skill-hot-reload] 检测到技能文件变更,索引已自动重建';
}
return null;
}
```
**无需重启会话**: 因为 `loadIndex()` 每次路由都从磁盘读取 skills-index.json。
---
## 实施路线图
```
v5.9 (2周内):
├── S1-Phase1: implicit-feedback 自动化 + 消歧规则 A/B 验证
├── S2-Step1: skills-index.json 添加 domain 字段
└── P3-16: Skill 热加载 (dispatcher 增强)
v6.0 (1月内):
├── S1-Phase2: Bayesian 学习型消歧器
├── S2-Step2: domain-router.js 实现
├── P3-13: visual-regression.js 实现
└── P3-14: LLM Gateway MCP 模板
v6.1 (2月内):
├── S2-Step3: flat vs hierarchical A/B 测试
├── P3-15: 多模态闭环 (Figma→Code→Screenshot→Diff)
└── S1-Phase3: 向量嵌入补充 (依赖 LLM Gateway)
v6.2 (季度):
└── 收敛与清理: 退役无效消歧规则, 切换默认路由策略
```
---
*设计完成: 2026-03-04 | 审阅状态: 待 self-auditor 验证*