Files
zclaw_openfang/docs/superpowers/specs/2026-04-18-evolution-engine-design.md
iven fa5ab4e161
Some checks failed
CI / Lint & TypeCheck (push) Has been cancelled
CI / Unit Tests (push) Has been cancelled
CI / Build Frontend (push) Has been cancelled
CI / Rust Check (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
refactor(middleware): 移除数据脱敏中间件及相关代码
移除不再使用的数据脱敏功能,包括:
1. 删除data_masking模块
2. 清理loop_runner中的unmask逻辑
3. 移除前端saas-relay-client.ts中的mask/unmask实现
4. 更新中间件层数从15层降为14层
5. 同步更新相关文档(CLAUDE.md、TRUTH.md、wiki等)

此次变更简化了系统架构,移除了不再需要的敏感数据处理逻辑。所有相关测试证据和截图已归档。
2026-04-22 19:19:07 +08:00

493 lines
18 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.

# Evolution Engine 设计文档
> **日期**: 2026-04-18
> **状态**: Draft
> **目标**: 让 ZCLAW 管家从"记住用户信息"进化到"从交互中自主生成新能力"
## 1. 问题陈述
### 1.1 现状
ZCLAW 在"信息层进化"方面已有基础:
| 能力 | 状态 | 说明 |
|------|------|------|
| 记忆闭环 | ✅ 可用 | 对话→LLM 提取→FTS5+TF-IDF 存储→检索注入 system prompt |
| 经验存储结构 | ✅ 定义完整 | `Experience { pain_pattern, solution_steps, outcome }` |
| 语义路由 | ✅ 三层架构 | TF-IDF + Embedding + LLM fallback |
| 技能 CRUD API | ✅ 就绪 | `create_skill` / `update_skill` / `delete_skill` |
| Pipeline DAG | ✅ 可执行 | 并行/串行/条件分支16 个 YAML 模板 |
| 轨迹记录 | ✅ 可用 | TrajectoryRecorder 记录 UserRequest/ToolExecution/LlmGeneration |
### 1.2 核心缺口
系统在"能力层进化"方面完全空白:
| 缺口 | 影响 |
|------|------|
| 没有从对话自动生成技能 | 用户解决了问题,系统不会记住"怎么解决的"并固化成可复用技能 |
| Experience 是空壳 | 结构定义完美,但 GrowthIntegration 只提取文本记忆,不填充结构化 solution_steps |
| 用户画像不自动更新 | UserProfileStore 有字段但没有从对话自动填充的管道 |
| 轨迹数据只存不用 | TrajectoryRecorder 记录了行为但没有代码消费它来改善路由 |
| 没有 plan→execute→verify 循环 | 只能执行预定义 Pipeline不能动态分解新任务 |
### 1.3 目标
实现 Hermes Agent 级别的自我进化能力:
1. **对话→自动生成 SKILL.md** — 用户解决了复杂问题后,系统自动将解决步骤固化为可复用技能
2. **对话→动态 Pipeline** — 从用户交互中学习工作流模式,自动组装 Pipeline
3. **用户反馈→迭代优化** — 根据反馈调整 skill 的 prompt/参数,逐步提升质量
一句话:**让管家"越用越懂你",从被动问答变成主动能力积累。**
## 2. 设计决策
| 决策 | 选择 | 理由 |
|------|------|------|
| 方案 | 独立 EvolutionEngine 层 | 复用现有积木Experience/Skill/Pipeline/Memory/Trajectory只做中枢调度 |
| 目标场景 | 混合(自动执行 + 对话辅助) | 用户群混合,管家模式会根据场景自动判断 |
| 进化时机 | 分层:低风险静默,高风险确认 | 记忆层自动、技能层征得同意、工作流层明确确认 |
| 进化粒度 | 混合:记忆细粒度,技能粗粒度 | 信息积累快,能力固化有质量门控 |
| LLM 成本 | 最小化,用 Haiku 级别 | 进化分析不需要深度推理Haiku 足够 |
## 3. 架构总览
### 3.1 三层进化模型
```
┌─────────────────────────────────────────────────┐
│ EvolutionEngine (zclaw-growth) │
│ │
│ L1 记忆进化 (已有,增强) │
│ ├── 每次: 对话→提取偏好/知识/经验→FTS5存储 │
│ ├── 每次: 结构化 Experience 提取 │
│ ├── 每次: 用户画像增量更新 │
│ └── 每次: 轨迹事件记录 │
│ │
│ L2 技能进化 (新建) │
│ ├── 触发: Experience 复用次数 >= 3 或 用户主动要求 │
│ ├── 流程: 模式分析 → SKILL.md 生成/优化 → 确认 │
│ └── 产物: 新建/更新的 SKILL.md 文件 │
│ │
│ L3 工作流进化 (新建) │
│ ├── 触发: 轨迹中检测到重复的工具调用链模式 │
│ ├── 流程: 模式提取 → Pipeline YAML 组装 → 确认 │
│ └── 产物: 新建/更新的 Pipeline YAML 文件 │
│ │
│ 反馈闭环 (新建) │
│ ├── 用户对技能/工作流结果的反馈 → 质量评分 │
│ ├── 低评分 → 触发 L2/L3 重新优化 │
│ └── 高评分 + 高频使用 → 提升信任度 │
└─────────────────────────────────────────────────┘
```
### 3.2 与现有系统集成点
| 现有组件 | crate | 集成方式 |
|---------|-------|---------|
| `MemoryExtractor` | zclaw-growth | L1 增强:合并 Experience 结构化提取到同一 prompt |
| `ExperienceStore` | zclaw-growth | L2 输入:复用 `reuse_count` 作为模式检测信号 |
| `TrajectoryRecorder` | zclaw-runtime | L3 输入:分析 `compressed_trajectories` 的工具调用链 |
| `UserProfileStore` | zclaw-memory | L1 增强:自动从对话更新画像字段 |
| `SkillRegistry.create_skill()` | zclaw-skills | L2 输出:调用现有 API 生成 SKILL.md |
| `Pipeline executor` | zclaw-pipeline | L3 输出:生成 YAML 配置文件 |
| `ButlerRouter` | zclaw-runtime | 消费:新技能自动加入语义路由索引 |
| `GrowthIntegration` | zclaw-runtime | 管线增强:在 process_conversation() 中串入新提取器 |
### 3.3 关键设计约束
1. **LLM 调用最小化** — 进化分析只在触发条件满足时才调用,不是每次对话都调
2. **人确认不可绕过** — L2/L3 的产物必须经过用户确认才生效
3. **可回滚** — 每次进化产物附带版本号,用户可以回退到之前版本
4. **成本感知** — 进化分析使用较便宜的模型Haiku不用 Opus
5. **内置/用户隔离** — 用户生成的技能存放在独立目录,项目更新不覆盖定制
## 4. L1 记忆进化增强
### 4.1 现状问题
| 问题 | 根因 |
|------|------|
| Experience 结构是空壳 | GrowthIntegration 只提取文本记忆,不填充结构化 Experience |
| 用户画像不自动更新 | UserProfileStore 有 update_field() 但无调用方 |
| 轨迹数据只存不用 | CompressedTrajectory 的 satisfaction_signal 无消费代码 |
### 4.2 新增 ExperienceExtractor
与现有 MemoryExtractor 并行运行,合并到单次 LLM 调用:
```rust
// zclaw-growth/src/experience_extractor.rs
pub struct ExperienceExtractor {
llm: Arc<dyn LlmDriver>,
}
pub struct ExperienceCandidate {
pub pain_pattern: String, // 用户需求的自然语言描述
pub context: String, // 上下文信息
pub solution_steps: Vec<String>, // 解决步骤(有序)
pub outcome: Outcome, // Success | Partial | Failed
pub confidence: f32, // 提取置信度
pub tools_used: Vec<String>, // 使用了哪些 tools/hands
pub industry_context: Option<String>,
}
impl ExperienceExtractor {
/// 从完整对话中提取结构化经验
/// 与 MemoryExtractor 合并在同一次 LLM 调用中执行
pub async fn extract(
&self,
conversation: &[Message],
) -> Result<Vec<ExperienceCandidate>> { ... }
}
```
### 4.3 增强对话后处理管线
修改 `GrowthIntegration.process_conversation()`
```
对话结束
├── 现有: MemoryExtractor.extract() → 文本记忆存储
├── 新增: ExperienceExtractor.extract() → 结构化经验存储到 ExperienceStore
├── 新增: UserProfileUpdater.update() → 画像增量更新
└── 现有: TrajectoryRecorder 压缩轨迹 → 轨迹存储
```
### 4.4 画像增量更新
```rust
// zclaw-growth/src/profile_updater.rs
pub struct UserProfileUpdater;
impl UserProfileUpdater {
/// 从单次 LLM 提取结果中更新画像
/// 不额外调用 LLM复用 ExperienceExtractor 的输出
pub async fn update(
profile_store: &UserProfileStore,
extraction: &CombinedExtraction, // 包含记忆+经验+画像信号
) -> Result<()> {
// 更新字段:
// - industry: 从 Experience 中的 industry_context 推断
// - recent_topics: 追加本次对话主题
// - pain_points: 追加 Experience 的 pain_pattern
// - preferred_tools: 统计 tools_used 更新频率
// - communication_style: 分析用户消息长度/格式
}
}
```
| 画像维度 | 提取逻辑 | 更新频率 |
|---------|---------|---------|
| `industry` | 对话中提到的行业关键词 | 检测到变化时 |
| `recent_topics` | 对话主题分类 | 每次对话追加 |
| `pain_points` | Experience 中的 pain_pattern | 每次新经验 |
| `preferred_tools` | 轨迹中高频使用的 tools | 每次对话更新 |
| `communication_style` | 用户消息的长度/格式偏好 | 每次对话微调 |
### 4.5 成本控制
- ExperienceExtractor 和 MemoryExtractor **合并为单次 LLM 调用**
- 画像更新从同一个 LLM 响应中提取,不额外调用
- 总新增成本:**0 次额外 LLM 调用**prompt 更长token 开销增加约 20%
## 5. L2 技能进化
### 5.1 触发机制
| 触发条件 | 说明 | 进化级别 |
|---------|------|---------|
| `Experience.reuse_count >= 3` | 同一 pain_pattern 被检索复用了 3 次+ | 自动触发 |
| 用户明确要求 | "帮我保存成一个技能" / "下次直接这样做" | 立即触发 |
| 管家主动提议 | 检测到用户第 N 次问同类问题N=2 | 管家触发 |
| `CompressedTrajectory.outcome = Success` + 高频 | 轨迹分析发现成功模式 | 批量触发 |
### 5.2 技能生成流程
```
触发信号
Phase 1: 模式聚合 (PatternAggregator)
收集同一 pain_pattern 下的所有 Experience
对比 solution_steps找出共同步骤
Phase 2: 技能生成 (SkillGenerator) — LLM 调用Haiku
输入:聚合的模式 + 原始对话样本
输出SKILL.md 文件内容
包含name, description, triggers, tools, steps
Phase 3: 质量门控 (QualityGate)
- triggers 不与现有 75 个内置技能冲突
- tools 依赖是否已在 HandRegistry 注册
- SKILL.md 格式校验loader.rs 可解析)
- 置信度 >= 0.7
Phase 4: 用户确认 (ConfirmationGate)
管家对话中呈现:
"我注意到你经常做 [X]
我帮你整理成了一个技能 [技能名]
以后直接说 [触发词] 就能用了。确认?"
用户可以:确认 / 修改 / 拒绝
▼ (确认)
Phase 5: 注册生效 (SkillRegistrar)
调用 SkillRegistry.create_skill()
自动重建语义路由索引
通知 ButlerRouter 新技能可用
```
### 5.3 核心数据结构
```rust
// zclaw-growth/src/skill_generator.rs
pub struct SkillCandidate {
pub name: String,
pub description: String,
pub triggers: Vec<String>,
pub tools: Vec<String>,
pub steps: Vec<SkillStep>,
pub category: String,
pub source_experiences: Vec<Uuid>, // 来源 Experience ID
pub confidence: f32,
pub version: u32, // 迭代版本
}
pub struct SkillStep {
pub instruction: String, // 步骤说明
pub tool: Option<String>, // 使用的工具(如果有)
pub expected_output: String, // 预期输出
}
pub struct EvolutionEvent {
pub id: Uuid,
pub event_type: EvolutionEventType,
pub candidate: SkillCandidate,
pub status: EvolutionStatus, // Pending | Confirmed | Rejected | Optimized
pub user_feedback: Option<String>,
pub created_at: DateTime<Utc>,
}
```
### 5.4 技能迭代优化
```
用户使用自动生成的技能
├── 满意 → reuse_count++ → 强化(不改动)
└── 不满意 → 收集反馈信号
反馈分析 (LLM 调用)
├── 修改 triggers → 重新路由
├── 修改 steps → 优化流程
├── 修改 tools → 换工具
└── 降级为记忆 → 不够通用,回退为 Experience
```
### 5.5 技能存储隔离
| 类型 | 存储路径 | 来源 | 可修改 |
|------|---------|------|--------|
| 内置技能 | `skills/` | 随项目发布 | 否 |
| 用户技能 | `~/.zclaw/skills/` 或 SaaS 存储 | L2 进化生成 | 是 |
| 临时技能 | 仅内存 | 对话中临时 | 自动销毁 |
`SkillRegistry` 已支持 `add_skill_dir()`,只需增加用户技能目录扫描。
## 6. L3 工作流进化
### 6.1 触发机制
```
TrajectoryAnalyzer后台周期任务每小时执行一次
├── 扫描最近 7 天的 CompressedTrajectory
├── 按相似度聚类(工具链序列相似度)
├── 发现重复模式(出现 2 次以上的相同工具链)
└── 触发信号:发现可固化的工作流模式
```
### 6.2 Pipeline 自动组装
```rust
// zclaw-growth/src/workflow_composer.rs
pub struct WorkflowComposer {
llm: Arc<dyn LlmDriver>,
}
pub struct PipelineCandidate {
pub name: String,
pub description: String,
pub triggers: Vec<String>,
pub yaml_content: String, // 生成的 Pipeline YAML
pub source_trajectories: Vec<Uuid>, // 来源轨迹
pub confidence: f32,
}
impl WorkflowComposer {
/// 从相似轨迹中组装 Pipeline
/// 输入:聚类后的轨迹组(相同工具链模式)
/// 输出PipelineCandidateYAML + 元数据)
pub async fn compose(
&self,
trajectories: &[CompressedTrajectory],
hand_registry: &HandRegistry,
) -> Result<Option<PipelineCandidate>> { ... }
}
```
### 6.3 生成示例
用户经常做:搜索→抓取→总结→格式化
```yaml
# 自动生成的 Pipeline
name: "每日资讯简报"
description: "搜索指定主题,抓取内容,生成结构化简报"
triggers:
- "每日简报"
- "资讯汇总"
- "新闻总结"
steps:
- id: search
action: hand
hand: researcher
params:
action: search
query: "${inputs.topic}"
- id: fetch
action: hand
hand: collector
params:
urls: "${steps.search.output.urls}"
- id: summarize
action: llm_generate
params:
prompt: "将以下内容整理为结构化简报:${steps.fetch.output}"
```
## 7. 反馈闭环
### 7.1 反馈信号收集
| 信号类型 | 收集方式 | 权重 |
|---------|---------|------|
| 显式反馈 | 用户说"不好"/"换一个"/"就这样" | 高 |
| 隐式反馈 | 用户是否继续追问同类问题 | 中 |
| 使用频率 | 技能/Pipeline 被调用的次数 | 中 |
| 完成率 | 技能执行后用户是否继续操作 | 低 |
| 对比评分 | 同一任务使用技能 vs 不使用的满意度差异 | 高 |
### 7.2 闭环路径
```
用户使用进化产物(技能/Pipeline
├── 正面反馈 → 信任度++ → 推荐优先级提升
│ → 如果足够成熟 → 提升为"推荐技能"
├── 负面反馈 → 信任度-- → 触发优化循环
│ → LLM 分析失败原因
│ → 修改技能 steps/triggers/tools
│ → 重新请用户确认
└── 长期不用 → 自然衰减 → 降级为记忆 → 最终清理
```
### 7.3 反馈数据结构
```rust
// zclaw-growth/src/feedback_collector.rs
pub struct EvolutionFeedback {
pub evolution_id: Uuid, // 关联的 EvolutionEvent
pub artifact_type: ArtifactType, // Skill | Pipeline
pub signal: FeedbackSignal, // Explicit | Implicit | Usage | Completion
pub sentiment: Sentiment, // Positive | Negative | Neutral
pub details: Option<String>, // 用户原始反馈文本
pub timestamp: DateTime<Utc>,
}
```
## 8. 数据流全景
```
用户对话
├──[L1] 每次对话后 ──→ 合并 LLM 提取
│ ├── 文本记忆 (偏好/知识/经验)
│ ├── 结构化 Experience (pain→solution→outcome)
│ ├── 画像增量更新
│ └── 轨迹事件记录
│ │
│ ▼
│ 经验库 (FTS5)
│ 轨迹库 (SQLite)
│ 用户画像 (SQLite)
│ │
├──[L2] 模式触发时 ──→ 模式聚合 → 技能生成 → 质量门控 → 用户确认 → 注册
├──[L3] 周期分析时 ──→ 轨迹聚类 → 工作流组装 → 质量门控 → 用户确认 → 注册
└──[反馈] 使用后 ──→ 质量评分 → 优化/衰减/提升
```
## 9. 新增模块清单
所有模块在 `zclaw-growth` crate 中,不新增 crate
| 模块 | 文件 | 职责 |
|------|------|------|
| ExperienceExtractor | `experience_extractor.rs` | 结构化经验提取 |
| ProfileUpdater | `profile_updater.rs` | 画像增量更新 |
| PatternAggregator | `pattern_aggregator.rs` | 经验模式聚合 |
| SkillGenerator | `skill_generator.rs` | SKILL.md 生成 |
| WorkflowComposer | `workflow_composer.rs` | Pipeline YAML 组装 |
| QualityGate | `quality_gate.rs` | 质量门控验证 |
| EvolutionEngine | `evolution_engine.rs` | 中枢调度(触发+协调) |
| FeedbackCollector | `feedback_collector.rs` | 反馈信号收集与分析 |
需修改的现有文件:
| 文件 | 修改内容 |
|------|---------|
| `zclaw-runtime/src/growth.rs` | GrowthIntegration 增加新提取器和触发检查 |
| `zclaw-runtime/src/middleware/butler_router.rs` | 消费进化事件,呈现确认对话 |
| `zclaw-skills/src/registry.rs` | 增加用户技能目录扫描 |
| `zclaw-kernel/src/kernel/skills.rs` | 暴露进化相关 Tauri 命令 |
| `zclaw-kernel/src/kernel/mod.rs` | 注册 EvolutionEngine 到 Kernel |
## 10. 实施建议
### 10.1 分阶段实施
| 阶段 | 内容 | 依赖 |
|------|------|------|
| Phase 1: L1 增强 | ExperienceExtractor + ProfileUpdater + 合并提取 | 无外部依赖 |
| Phase 2: L2 核心 | PatternAggregator + SkillGenerator + QualityGate | Phase 1 |
| Phase 3: L2 集成 | 确认对话 UI + SkillRegistrar + ButlerRouter 集成 | Phase 2 |
| Phase 4: L3 核心 | TrajectoryAnalyzer + WorkflowComposer | Phase 1 |
| Phase 5: 反馈闭环 | FeedbackCollector + 优化循环 | Phase 2 + 3 |
### 10.2 风险和缓解
| 风险 | 缓解措施 |
|------|---------|
| LLM 提取质量不稳定 | 置信度阈值过滤 + 质量门控 + 用户确认 |
| 进化产物与内置技能冲突 | QualityGate 检查 triggers 冲突 |
| 用户技能目录膨胀 | 信任度衰减 + 长期不用自动归档 |
| 增加系统复杂度 | 所有进化逻辑集中在 zclaw-growth不侵入运行时主流程 |
| 隐私问题 | 经验/技能数据本地存储,用户可查看/删除 |