Build latest book artifacts / build (push) Canceled after 0s
dependency resolution / resolve (3.11) (push) Canceled after 0s
dependency resolution / resolve (3.13) (push) Canceled after 0s
deploy-pages / build (push) Canceled after 0s
deploy-pages / deploy (push) Canceled after 0s
i18n consistency check / check (push) Canceled after 0s
provider adoption tests / test (chapter2/context-compression) (push) Canceled after 0s
provider adoption tests / test (chapter2/prompt-injection) (push) Canceled after 0s
provider adoption tests / test (chapter2/system-hint) (push) Canceled after 0s
provider adoption tests / test (chapter3/log-sanitization) (push) Canceled after 0s
web-search-agent tests / test (push) Canceled after 0s
web-search-agent tests / agentbook (push) Canceled after 0s
115 lines
7.3 KiB
Markdown
115 lines
7.3 KiB
Markdown
# 实验 9-5:从浏览器轨迹生成可验证工作流
|
||
|
||
本项目展示“把经验写成程序”的第一种形式:Agent 首次探索网页任务后,把动作轨迹参数化为工作流;但首次成功只产生 `candidate`(待验证工作流),不能直接进入能力库。待验证工作流必须在重置后的环境中完整重放,并通过每一步的状态谓词与最终状态谓词,才会成为 `validated`。页面变化导致谓词失败时,旧版本转为 `invalid`,系统退回完整 Agent 重新探索。
|
||
|
||
## 离线机制预检
|
||
|
||
```bash
|
||
python workflow_validation_demo.py
|
||
python -m unittest -v test_state_predicates.py
|
||
```
|
||
|
||
该命令只用于预检生命周期代码,不能作为正文的真实浏览器验收。它演示:
|
||
|
||
```text
|
||
首次轨迹 → candidate → 重置环境 → 完整回放通过 → validated → 能力库
|
||
│
|
||
页面或接口发生变化
|
||
↓
|
||
谓词失败 → invalid → 完整 Agent 重学
|
||
```
|
||
|
||
`WorkflowStep` 现在包含 `preconditions` 与 `postconditions`,`Workflow` 包含 `final_predicates`。内置谓词覆盖 URL 包含、元素可见、元素文本包含和页面状态值相等。`WorkflowReplayer` 在动作前后检查真实 Playwright 页面;任一谓词失败都会立即中止,返回明确原因与 `fallback_required=True`,不会把“动作执行过”误报为任务成功。
|
||
|
||
`KnowledgeBase` 将待验证区与正式能力库分开。`save_workflow` 拒绝未验证对象;`publish_validated` 只接收完整回放通过的版本;`invalidate_workflow` 会把失效版本移出检索,同时保留审计文件。
|
||
|
||
## 正文验收:真实模型、HTTP 站点与 Chromium
|
||
|
||
`run_experiment_9_5.py` 启动一个仅监听 `127.0.0.1` 的可重置消息站。页面通过真实 HTTP/JavaScript 写入服务端状态;真实模型在四个观察—决策—动作回合中选择控件,Playwright Chromium 执行动作。所有收件人和消息均为虚构数据,运行不会发送电子邮件或产生站外副作用。
|
||
|
||
```bash
|
||
pip install -r requirements.txt
|
||
playwright install chromium
|
||
python run_experiment_9_5.py \
|
||
--provider ark \
|
||
--model doubao-seed-1-6-flash-250615 \
|
||
--seed 8401
|
||
```
|
||
|
||
正式运行严格覆盖正文四阶段:
|
||
|
||
1. Agent 向 `test@example.com` 发送主题“测试邮件”的首条消息,逐步保存参数、URL、XPath、CSS、`id`、`name`、`role`、`aria-label`、`data-testid` 和页面状态,只生成 `candidate`。
|
||
2. 通过独立 HTTP `validation_reset` 清空服务端状态,再完整检查动作前、动作后和最终 `sent-list`;通过后才发布为 `validated`。无 reset 的负对照始终不可检索。
|
||
3. 对收件人、主题、正文均不同的任务匹配正式工作流并参数化回放,回放阶段不调用 LLM,也不复用首轮字面量。
|
||
4. 页面把 `#send` 改为 `#deliver-v2` 后,前置谓词在产生发送请求之前中止工作流;版本转为 `invalid`、移出检索,并返回 `fallback_required=True`。
|
||
|
||
同一工作流还在“正文为空”和“服务端接受但不持久化”两种故障下运行两遍:只数动作的基线报告 2/2 假成功,带状态验证的实验组报告 0/2 假成功。
|
||
|
||
2026-07-30 的证据为 `validation/real_20260729T171233Z/evidence.json`,SHA-256 为
|
||
`a673c657c670482c7d4bedc0dd340ee51586f3e8d6feb440bb7cc216edca426c`。
|
||
同目录还保存探索完成截图、待验证快照、无 reset 待验证版本和失效版本;`validation/latest.json` 保存同一证据。全部 13 项执行门槛和 5 项结果声明通过。
|
||
|
||
本次结果:探索 5.313 秒、4 次 LLM 调用;不同参数回放 4.447 秒、0 次 LLM 调用,实测加速 1.195 倍;匹配率、回放成功率、页面变化检出率均为 100%,回退重学计数为 1。该结果证明本次运行有加速,但没有声称复现 PreAct 论文的 8.5–13 倍。ARK 共返回 3,999 Token,未返回货币费用字段,故美元成本保持 `null`。
|
||
|
||
## 通用 browser-use 封装
|
||
|
||
`learning_agent/agent.py` 是对 browser-use 的封装。首次运行会捕获动作、提取参数和保守状态谓词,然后保存待验证版本。调用者还必须提供一个 `validation_reset` 回调,用于把测试站点、账号或沙盒恢复到独立初始状态;没有回调时,待验证版本只保留供审计,不会自动发布,以免通过重复发送邮件、重复下单等有副作用的方式“验证”。
|
||
|
||
```python
|
||
agent = LearningAgent(
|
||
task=task,
|
||
llm=llm,
|
||
knowledge_base_path="./knowledge_base",
|
||
validation_reset=reset_test_account,
|
||
)
|
||
result = agent.run_sync(max_steps=20)
|
||
```
|
||
|
||
`learning_agent/agent.py` 保留对 browser-use 的通用封装。上游 `browser-use/` 副本保持不变,本实验的生命周期与验证逻辑全部位于封装层。
|
||
真实浏览器演示仍可使用 `demo_email.py` 和 `demo_weather.py`,需要安装根目录 `ch8` 依赖、Chromium 与模型 API。
|
||
|
||
真实 LLM + 浏览器的最小冒烟测试如下;`--quick` 在这里不是 dry-run,它会实际调用模型并控制 Chromium:
|
||
|
||
```bash
|
||
# 从仓库根目录开始:使用共享的第 8 章环境
|
||
uv sync --locked --python 3.12 --extra ch8
|
||
# Apple Silicon macOS 需要 macOS 14+(锁文件中的 bitsandbytes wheel 要求);
|
||
# 更早的 macOS 请使用下方单项目兼容路径。
|
||
|
||
# 切换目录前先激活环境:
|
||
# macOS/Linux:
|
||
source .venv/bin/activate
|
||
# Windows PowerShell: .\.venv\Scripts\Activate.ps1
|
||
# Windows cmd: .venv\Scripts\activate.bat
|
||
|
||
# 未安装 uv 时可用 pip 兜底:
|
||
# python -m pip install -e ".[ch8]"
|
||
|
||
cd chapter8/browser-use-rpa
|
||
|
||
# 迁移期间仍支持单项目兼容路径(playwright-stealth 等历史可选依赖):
|
||
# python -m pip install -r requirements.txt
|
||
|
||
playwright install chromium
|
||
export OPENAI_API_KEY=your_api_key_here
|
||
python demo_email.py --quick --headless --model gpt-5.6
|
||
```
|
||
|
||
对于其他目标站点,调用者仍必须自行提供安全的 `validation_reset`。没有可重置环境时,真实 LLM 轨迹只能形成待验证版本,不应为了“验证”而在生产账号中重复发送邮件或提交订单。
|
||
|
||
## 文件说明
|
||
|
||
| 文件 | 作用 |
|
||
| --- | --- |
|
||
| `learning_agent/workflow.py` | 状态谓词、工作流结构与 candidate/validated/invalid 生命周期 |
|
||
| `learning_agent/replay.py` | 基于 Playwright 的动作执行和前置/后置/最终验证 |
|
||
| `learning_agent/knowledge_base.py` | 待验证版本审计、验证后发布、失效隔离 |
|
||
| `learning_agent/agent.py` | 首次探索、参数化、重置回放与失败回退 |
|
||
| `workflow_validation_demo.py` | 纯标准库的确定性状态机演示 |
|
||
| `test_state_predicates.py` | 生命周期、页面变化和序列化测试 |
|
||
| `local_mail_sandbox.py` | 可重置的本地 HTTP/JavaScript 消息站和服务端环境真值 |
|
||
| `run_experiment_9_5.py` | 正文四阶段真实模型 + Chromium 验收与原始证据保存 |
|
||
| `test_real_playwright_campaign.py` | 对真实 Chromium 的 reset、参数化、假成功与失效测试 |
|
||
|
||
该项目检验的是“轨迹能否编译成经过验证的可执行能力”,而不只是回放速度。真实系统还应为高风险动作加入权限检查、幂等键、沙盒账号和人工批准。
|