|
| 1 | +# 浏览器 Self-Update 功能介绍 |
| 2 | + |
| 3 | +本文档详细介绍了 Shipyard Neo 中的浏览器 Self-Update(自更新/自进化)机制。该机制允许系统通过观察和评估 Agent 的浏览器操作,自动提取、评分并沉淀高质量的操作模式为可重用的技能(Skill),从而实现系统的持续进化。 |
| 4 | + |
| 5 | +## 1. 概述 |
| 6 | + |
| 7 | +### 1.1 功能简介 |
| 8 | +浏览器 Self-Update 是 Shipyard Neo 的一项核心自进化能力。它通过闭环反馈机制,自动从 Agent 的日常执行中学习。当 Agent 执行浏览器任务时,系统会记录完整的执行链路(Trace),并在后台通过智能调度器对这些执行记录进行分析、评分和提炼。达到质量阈值的操作序列将被自动转化为新的技能候选(Skill Candidate),经过 Canary 金丝雀发布验证后,最终晋升为稳定技能供全系统使用。 |
| 9 | + |
| 10 | +### 1.2 设计理念 |
| 11 | +- **被动学习(Passive Learning)**:不需要 Agent 显式地"教学",而是通过观察 Agent 的自然执行过程进行学习。 |
| 12 | +- **闭环验证(Closed-Loop Verification)**:所有学习到的技能必须经过回放验证(Replay)和金丝雀阶段(Canary)的实战检验。 |
| 13 | +- **零干扰(Zero Interference)**:学习过程在后台异步进行,不阻塞 Agent 的正常任务执行。 |
| 14 | +- **安全优先(Safety First)**:内置严格的自动回滚机制,确保新学习的技能不会破坏现有系统的稳定性。 |
| 15 | + |
| 16 | +### 1.3 核心价值 |
| 17 | +- **效率提升**:自动沉淀常用操作,减少 Agent 重复推理和规划的开销。 |
| 18 | +- **质量保证**:通过标准化的高分技能替代不确定的临场操作,提高执行成功率。 |
| 19 | +- **知识积累**:将隐性的操作知识显性化为系统资产,实现系统能力的持续积累。 |
| 20 | + |
| 21 | +## 2. 架构设计 |
| 22 | + |
| 23 | +Shipyard Neo 的 Self-Update 机制跨越了控制面(Bay)、执行面(Ship/Gull)和存储层。 |
| 24 | + |
| 25 | +```mermaid |
| 26 | +graph TD |
| 27 | + subgraph "Agent Layer" |
| 28 | + Agent[Agent / User] |
| 29 | + end |
| 30 | +
|
| 31 | + subgraph "Bay Control Plane" |
| 32 | + API[Capabilities API] |
| 33 | + History[History API] |
| 34 | + SkillMgr[Skills API] |
| 35 | + Scheduler[Browser Learning Scheduler] |
| 36 | + end |
| 37 | +
|
| 38 | + subgraph "Data Storage" |
| 39 | + DB[(PostgreSQL)] |
| 40 | + Blob[Artifact Storage] |
| 41 | + end |
| 42 | +
|
| 43 | + subgraph "Runtime Environment" |
| 44 | + Ship[Ship (Code Execution)] |
| 45 | + Gull[Gull (Browser Runtime)] |
| 46 | + end |
| 47 | +
|
| 48 | + Agent -->|POST /browser/exec| API |
| 49 | + API -->|Execute Cmd| Gull |
| 50 | + Gull -->|Result & Trace| API |
| 51 | + API -->|Save History| DB |
| 52 | + |
| 53 | + Scheduler -->|Poll Pending| DB |
| 54 | + Scheduler -->|Analyze & Extract| DB |
| 55 | + Scheduler -->|Replay & Verify| Gull |
| 56 | + Scheduler -->|Promote| SkillMgr |
| 57 | + SkillMgr -->|Update Spec| DB |
| 58 | +``` |
| 59 | + |
| 60 | +### 核心组件说明 |
| 61 | +- **Agent Layer**:任务的发起者,负责生成浏览器操作指令。 |
| 62 | +- **Bay Control Plane**: |
| 63 | + - **Capabilities API**:接收执行请求,协调运行时。 |
| 64 | + - **Browser Learning Scheduler**:后台核心调度器,负责从历史记录中挖掘技能。 |
| 65 | +- **Runtime Environment**: |
| 66 | + - **Gull**:浏览器运行时,负责执行实际的 CDP (Chrome DevTools Protocol) 指令并生成 Trace。 |
| 67 | +- **Data Storage**:存储执行历史、技能候选、发布状态及工件数据。 |
| 68 | + |
| 69 | +## 3. 工作原理 |
| 70 | + |
| 71 | +### 3.1 Self-Update 闭环流程 |
| 72 | + |
| 73 | +整个流程从 Agent 的执行开始,经过后台的异步处理,最终形成新的技能。 |
| 74 | + |
| 75 | +```mermaid |
| 76 | +sequenceDiagram |
| 77 | + participant Agent |
| 78 | + participant Bay API |
| 79 | + participant DB |
| 80 | + participant Scheduler |
| 81 | + participant Gull |
| 82 | + |
| 83 | + %% Execution Phase |
| 84 | + Agent->>Bay API: POST /browser/exec (learn=true) |
| 85 | + Bay API->>Gull: Execute Commands |
| 86 | + Gull-->>Bay API: Result + Trace |
| 87 | + Bay API->>DB: Create ExecutionHistory (PENDING) |
| 88 | + Bay API-->>Agent: Response |
| 89 | + |
| 90 | + %% Learning Phase (Async) |
| 91 | + loop Every 300s |
| 92 | + Scheduler->>DB: Poll PENDING History |
| 93 | + DB-->>Scheduler: Execution Records |
| 94 | + |
| 95 | + Scheduler->>Scheduler: Extract Action Segments |
| 96 | + Scheduler->>Scheduler: Filter Read-Only Cmds |
| 97 | + |
| 98 | + opt Score > Threshold |
| 99 | + Scheduler->>DB: Create SkillCandidate |
| 100 | + Scheduler->>Gull: Replay Verification |
| 101 | + Gull-->>Scheduler: Replay Result |
| 102 | + |
| 103 | + alt Replay Success |
| 104 | + Scheduler->>DB: Promote to CANARY |
| 105 | + else Replay Failed |
| 106 | + Scheduler->>DB: Mark REJECTED |
| 107 | + end |
| 108 | + end |
| 109 | + end |
| 110 | +``` |
| 111 | + |
| 112 | +### 3.2 学习处理流程 |
| 113 | + |
| 114 | +调度器内部的处理逻辑如下: |
| 115 | + |
| 116 | +```mermaid |
| 117 | +flowchart TD |
| 118 | + Start[Start Learning Cycle] --> Fetch[Fetch PENDING History] |
| 119 | + Fetch --> Check{Records Found?} |
| 120 | + Check -->|No| Sleep[Sleep interval] |
| 121 | + Check -->|Yes| Iterate[Iterate Record] |
| 122 | + |
| 123 | + Iterate --> Extract[Extract Segments] |
| 124 | + Extract --> Filter[Filter Read-Only Cmds] |
| 125 | + Filter --> Score[Calculate Score] |
| 126 | + |
| 127 | + Score --> Threshold{Score >= 0.85?} |
| 128 | + Threshold -->|No| Discard[Discard] |
| 129 | + Threshold -->|Yes| Create[Create SkillCandidate] |
| 130 | + |
| 131 | + Create --> AutoRelease{Auto Release Enabled?} |
| 132 | + AutoRelease -->|No| Manual[Wait Manual Review] |
| 133 | + AutoRelease -->|Yes| Promote[Promote to CANARY] |
| 134 | + |
| 135 | + Promote --> Next[Next Record] |
| 136 | +``` |
| 137 | + |
| 138 | +### 3.3 Canary 生命周期管理 |
| 139 | + |
| 140 | +技能发布后进入生命周期管理,系统持续监控其表现。 |
| 141 | + |
| 142 | +```mermaid |
| 143 | +stateDiagram-v2 |
| 144 | + [*] --> PENDING |
| 145 | + PENDING --> CANARY: Auto/Manual Promote |
| 146 | + |
| 147 | + state CANARY { |
| 148 | + [*] --> Monitoring |
| 149 | + Monitoring --> Healthy: Window Complete & Success Rate Stable |
| 150 | + Monitoring --> Rollback: Success Drop > 3% OR Error Rate > 2x |
| 151 | + } |
| 152 | + |
| 153 | + Healthy --> STABLE: Promote |
| 154 | + Rollback --> DEPRECATED: Auto Rollback |
| 155 | + |
| 156 | + STABLE --> [*] |
| 157 | + DEPRECATED --> [*] |
| 158 | +``` |
| 159 | + |
| 160 | +## 4. 核心概念 |
| 161 | + |
| 162 | +| 概念 | 说明 | 对应实体 | |
| 163 | +|------|------|----------| |
| 164 | +| **ExecutionHistory** | 浏览器操作的原始执行记录,包含输入命令、输出结果和详细的 Trace 信息。 | `ExecutionHistory` | |
| 165 | +| **ArtifactBlob** | 存储具体的技能工件数据(如代码、配置),是技能的物理载体。 | `ArtifactBlob` | |
| 166 | +| **SkillCandidate** | 从执行历史中提取出的潜在技能雏形,包含评分和元数据,等待审核或验证。 | `SkillCandidate` | |
| 167 | +| **SkillRelease** | 技能的正式发布版本,具有明确的版本号和发布阶段(CANARY/STABLE)。 | `SkillRelease` | |
| 168 | +| **SkillEvaluation** | 对技能表现的量化评估,包括成功率、耗时、错误率等指标。 | `SkillEvaluation` | |
| 169 | + |
| 170 | +## 5. 数据模型 |
| 171 | + |
| 172 | +### 5.1 关键枚举状态 |
| 173 | + |
| 174 | +#### LearnStatus (学习状态) |
| 175 | +用于标记 `ExecutionHistory` 的处理状态。 |
| 176 | +- `PENDING`: 等待学习处理 |
| 177 | +- `PROCESSING`: 正在处理中 |
| 178 | +- `COMPLETED`: 处理完成(已提取或忽略) |
| 179 | +- `FAILED`: 处理失败 |
| 180 | +- `SKIPPED`: 跳过(如明确标记不学习) |
| 181 | + |
| 182 | +#### SkillReleaseStage (发布阶段) |
| 183 | +用于标记 `SkillRelease` 的生命周期阶段。 |
| 184 | +- `ALPHA`: 内部测试阶段 |
| 185 | +- `CANARY`: 金丝雀发布(灰度验证) |
| 186 | +- `STABLE`: 稳定版本 |
| 187 | +- `DEPRECATED`: 已弃用 |
| 188 | +- `ROLLED_BACK`: 已回滚 |
| 189 | + |
| 190 | +#### SkillType (技能类型) |
| 191 | +- `BROWSER_MACRO`: 浏览器宏(一系列浏览器操作的组合) |
| 192 | +- `PYTHON_SCRIPT`: Python 脚本 |
| 193 | +- `SHELL_SCRIPT`: Shell 脚本 |
| 194 | + |
| 195 | +## 6. 技术细节 |
| 196 | + |
| 197 | +### 6.1 只读命令过滤 |
| 198 | +为了保证提取的技能具有实际的操作意义,系统会自动过滤掉纯观察类的只读命令。这些命令通常用于 Agent 获取上下文,但不构成技能的核心动作。 |
| 199 | + |
| 200 | +**被过滤的命令包括**: |
| 201 | +- `snapshot` (页面快照) |
| 202 | +- `get` (获取元素属性) |
| 203 | +- `is` (状态判断) |
| 204 | +- `wait` (等待) |
| 205 | +- `cookies`, `storage` (状态查看) |
| 206 | +- `network requests` (网络请求查看) |
| 207 | +- `tab`, `frame`, `dialog` (上下文切换/查看) |
| 208 | + |
| 209 | +### 6.2 自动评分逻辑 |
| 210 | +系统使用以下公式对提取的操作片段进行评分: |
| 211 | + |
| 212 | +```python |
| 213 | +# 评分公式 |
| 214 | +score = min(0.99, 0.75 + 0.08 * steps) |
| 215 | + |
| 216 | +# 示例 |
| 217 | +# 1步操作: 0.75 + 0.08 = 0.83 (低于默认阈值 0.85) |
| 218 | +# 2步操作: 0.75 + 0.16 = 0.91 (合格) |
| 219 | +# 3步操作: 0.75 + 0.24 = 0.99 (满分) |
| 220 | +``` |
| 221 | +> **注**:默认配置下(阈值 0.85),至少包含 2 个有效动作步骤的片段才会被提取为技能。 |
| 222 | +
|
| 223 | +### 6.3 自动回滚触发条件 |
| 224 | +在 CANARY 阶段,系统会持续监控技能的健康状况。触发回滚的条件如下: |
| 225 | + |
| 226 | +1. **成功率显著下降**: |
| 227 | + `Current Success Rate < (Baseline - 0.03)` |
| 228 | + *例如:基准成功率 95%,如果当前成功率跌破 92%,则触发回滚。* |
| 229 | + |
| 230 | +2. **错误率倍增**: |
| 231 | + `Current Error Rate > (Baseline * 2.0)` |
| 232 | + *例如:基准错误率 1%,如果当前错误率超过 2%,则触发回滚。* |
| 233 | + |
| 234 | +### 6.4 Trace Payload 结构 |
| 235 | +浏览器执行的 Trace 包含详细的步骤信息,用于回放和分析。 |
| 236 | + |
| 237 | +```json |
| 238 | +{ |
| 239 | + "kind": "browser_batch_trace", |
| 240 | + "steps": [ |
| 241 | + { |
| 242 | + "kind": "individual_action", |
| 243 | + "cmd": "open https://example.com", // 执行的命令 |
| 244 | + "stdout": "...", // 标准输出 |
| 245 | + "step_index": 0, // 步骤索引 |
| 246 | + "duration_ms": 1200 // 执行耗时 |
| 247 | + } |
| 248 | + // ... 更多步骤 |
| 249 | + ], |
| 250 | + "success": true, |
| 251 | + "duration_ms": 1400 |
| 252 | +} |
| 253 | +``` |
| 254 | + |
| 255 | +## 7. 相关文档链接 |
| 256 | + |
| 257 | +- [`doc/browser_self_update_usage_zh.md`](doc/browser_self_update_usage_zh.md): 浏览器 Self-Update 功能使用文档 |
| 258 | +- [`doc/gull_browser_runtime.md`](doc/gull_browser_runtime.md): Gull 浏览器运行时详细说明 |
| 259 | +- [`doc/agent_browser_guide.md`](doc/agent_browser_guide.md): Agent 浏览器操作指南 |
| 260 | +- [`doc/bay_api_v1.md`](doc/bay_api_v1.md): Bay API 接口文档 |
0 commit comments