本文针对AWorld项目的 examples/browser_use
目录,系统解析其在 AWorld 框架中的角色、关键设计模式、消息与策略流、可扩展点与工程权衡,帮助读者快速理解“浏览器智能体”如何嵌入通用多智能体自改进运行时。
1. 目标定位与整体角色
Browser Use 示例展示了:
- 如何将“复杂交互环境”(真实 Web 浏览器状态:DOM、截图、可点击节点、滚动信息)抽象为可被 LLM 驱动的可迭代状态机。
- 通过严格的 JSON 输出协议 + 行为原语(Action)集合,限制 LLM 决策空间,使其在“规划 → 执行 → 观察 → 修正”闭环中 可控、可追踪、可回放。
- 集成视觉(可选截图)、多步工具调用(浏览器动作)、历史轨迹与中间“思维/记忆”字段 (AgentBrain),为后续经验抽取 / 评估 / 训练数据合成提供结构化基础。
2. 目录组件速览
| 文件 | 作用概述 |
|------|----------|
| agent.py
| 核心 BrowserAgent,继承通用 Agent
,重写 policy
与消息构建逻辑,执行浏览器动作决策循环。 |
| config.py
| BrowserAgentConfig
扩展 AgentConfig
,增加浏览器特定参数(重试、截图、JSON 重试、tool 调用模式等)。 |
| common.py
| 定义策略元数据(PolicyMetadata)、智能体思维状态(AgentBrain)、单步历史(AgentHistory / AgentHistoryList)、运行期状态(AgentState)。 |
| prompts.py
| 系统提示模板:强约束 JSON 输出结构、动作规则、环境观察格式、完成条件;含生成状态消息的辅助类。 |
| utils.py
| 工具函数:模型输出 JSON 提取、消息格式转换(兼容非函数调用模型)、消息 token 粗估、会话保存。 |
| run.py
| 演示脚本:组装 LLM/工具配置、创建 Task 并运行完整浏览任务。 |
| README.md
| 简短说明(当前极简,可与本文档互补)。 |
3. 与通用 Agent 框架的耦合与差异
BrowserAgent 重用通用 Agent
的:
- LLM 调用 / 工具函数调用协议(ActionModel / Observation)
- 事件 & 输出结构(继承后仍可发出标准消息)
- 记忆与上下文基础设施
但它自行管理:
- 底层浏览器动作集合(
BrowserAction
,在 examples.common.tools
中定义)
- 自定义消息构造(构造更复杂的 System + Human + AI + ToolMessage 序列)
- JSON 输出多重重试逻辑(模型健壮性保障)
- 步数计数、结束条件、自行轨迹历史(Trajectory + AgentHistoryList)
这一“半内聚”策略体现了:通用平台负责基础协议 & 生命周期,特殊高复杂场景(浏览器)可在 policy
内部替换默认 Prompt/消息管线,以保证对环境的精细控制。
4. 策略循环(Policy Loop)解剖
核心方法:BrowserAgent.policy()
流程:
- 初始化 / 重置:首次调用时建立状态、清空轨迹。
- 构建输入消息:
build_messages_from_trajectory_and_observation()
- SystemPrompt(含完整规则 + max_actions)
- 任务上下文 / 示例 tool_call(few-shot)
- 历史执行轨迹回放(逐步还原上轮 Action → Tool 结果 → AI 决策)
- 当前页面 Observation(DOM/截图/滚动窗口信息)
- 最后一步提醒(若 nearing max_steps)
- Token 估算:
_estimate_tokens_for_messages
(控制成本 & 监控)
- LLM 推理:
_do_policy()
- 兼容 deepseek reasoner 特殊格式(去 <think> 标签)
- JSON 提取与多次重试(强制结构正确)
- 解析
current_state
→ AgentBrain;action
数组 → ActionModel 列表
- 轨迹记录:Trajectory + AgentHistory(用于回放 & 经验抽取)
- 检查终止:若动作含
done
或步数达到阈值 → _finished = True
结构化决策关键:SystemPrompt 的严苛 JSON schema + 示例 tool_call + 明确动作原则,极大减少无效/幻觉输出。
5. 消息建造器设计思想
build_messages_from_trajectory_and_observation
将复杂时序抽象为“再现对话上下文”的函数,保证:
- 历史真实回放:每步 AI 决策→tool result→AI 决策… 链式可重放
- 可追责:出现错误(ActionResult.error) 时注入额外 HumanMessage,使模型明确失败上下文
- 动作与结果对齐:通过
previous_action_entries
校验 actions ↔ results 数量匹配(异常时警告)
- 示例驱动:前置“示范输出 + 示例 tool_call”用于教模型格式
- 视觉融合:若截图存在,以多模态消息(text + image_url base64)注入
该方法属于“自定义长上下文记忆压缩”的一种:它不直接裁剪,而是“结构化再构建”——只保留必要抽象(动作条目 + 结果 + DOM 抽象字符串),避免原始全量日志噪音。
6. JSON 输出稳健性策略
问题:LLM 偶发输出非 JSON / 多余解释文本。
设计:
extract_json_from_model_output
允许 ```json 代码块包装或纯文本。
- 多轮重试:失败(JSONDecodeError)→ 注入提醒 HumanMessage 强调格式 → 再调用 llm。
- 失败上限:
max_llm_json_retries
超限抛出异常;上层捕获构造错误 AgentResult。
- 特殊清洗:深度思考模型使用
<think>
标签,推理后移除,减少结构干扰。
收益:在无需引入外部 AST 校正代理的前提下,大幅提升浏览代理可执行性与鲁棒性。
7. 动作系统 (Action Space)
动作枚举集中在 BrowserAction
(外部引用),BrowserAgent:
- 生成可用动作描述字符串
available_actions
注入 Prompt(当 tool_calling_method = raw
)。
- 支持多动作序列(链式执行直到状态改变),减少冗余 LLM 循环。
- Special 动作:
done
用于显式终止 + 报告成功/失败 + 汇总信息。
动作结构解析:
{"action": [
{"click_element": {"index": 3}},
{"input_text": {"index": 5, "text": "abc"}},
{"done": {"success": true, "text": "Final summary..."}}
]}
多动作序列的存在使得:模型可以在“页内无显著状态变化”的情况下批处理操作 → 降低 token & 延迟成本。
8. 状态封装与轨迹记录
| 结构 | 作用 |
|------|------|
| AgentState | 运行期计数(步数/失败/暂停/停止)+ 历史引用 + 最近结果引用。 |
| AgentBrain | 模型自陈“评估上一目标/记忆/思考/下一目标” → 形成半结构化链路思维。 |
| PolicyMetadata | 每步时延 & token 计数 → 日志/性能分析。 |
| AgentHistory / List | 序列化步骤(含模型输出 + 结果 + 截图/DOM)→ 可回放 + 经验抽取基料。 |
| Trajectory | 更轻量的 (输入消息, Observation, info, 输出消息, AgentResult)
原始对话重放容器。 |
这套双层(Trajectory + AgentHistoryList)设计:
- Trajectory 强调“LLM 真实 IO 序列”便于重现
- AgentHistoryList 强调“浓缩后的动作语义 + 元数据”便于分析 / 统计 / 训练数据加工
9. Token 与成本估计
utils.py
提供基于字符数 / 常数估算:
estimate_messages_tokens
逐消息:文本长度 / 3 + 图片固定加权(默认 800)
- 用途:
1) 预警超长(可在未来接入截断或压缩策略)
2) 评估一次任务成本(结合 PolicyMetadata.duration_seconds)
10. 深度兼容不同模型能力
| 场景 | 处理逻辑 |
|------|----------|
| 支持 function calling | 直接用 AIMessage.tool_calls(标准) |
| 不支持(如 deepseek-reasoner) | convert_input_messages
将 ToolMessage 转换成 Human 文本;合并连续同类消息;将 tool_calls 序列化为纯字符串 JSON |
| 复杂思维标签 | 去 <think>
避免污染 JSON 结构 |
通过“适配层”隔离差异,保持 BrowserAgent 主体逻辑稳定。
11. 结束条件与容错
终止:
容错:
- JSON 解析失败重试
- 动作与结果不匹配 → 记录警告(可扩展为硬失败)
- LLM 空响应:回退生成
stop
动作
- 未解析到 action:自动生成
done
或 stop
(设 _finished=True
)
改进潜力:可加入“失败次数上限 → 回退计划 / 重新加载页面 / 切换策略模型”。
12. 与自我改进闭环的衔接点
结构化数据为“Offline / RL / SFT”提供:
| 数据类型 | 生成位置 | 用于训练的意义 |
|----------|----------|----------------|
| 输入消息序列 | Trajectory | 上下文还原 / 模拟对话生成 |
| JSON 动作序列 | AgentResult.actions | 行为标签 / 序列决策监督 |
| AgentBrain 思维字段 | parsed JSON.current_state | 反思/计划数据(chain-of-thought 替代)|
| DOM 抽象 / 截图 | Observation | 感知输入(可训练视觉-动作联合策略)|
| ActionResult 成败/错误 | Observation.action_result | 奖励信号 / 失败纠正 |
| PolicyMetadata | policy() finally | 性能分析 / Curriculum 设计 |
13. 可扩展点清单
| 方向 | 扩展方式 | 建议 |
|------|----------|------|
| 动作集合 | 扩充 BrowserAction 枚举 + Prompt 说明 | 保持语义原子性,避免过度巨型动作 |
| DOM 抽象 | 增加结构过滤/聚类 | 提升长页面可读性与 token 经济性 |
| 记忆集成 | 将 AgentBrain.memory 写入全局 MemoryFactory | 形成跨任务复用知识 |
| 经验抽取 | 对 Trajectory 转为 high-level “技能片段” | 与长记忆提取协同 |
| 多智能体协作 | 外挂 Planner / Critic 代理组成 TeamSwarm | 分离“规划/执行/验证”角色 |
| 视觉策略 | 增加截图区域裁剪 / OCR 混合 | 降低图片 token 成本 |
| 执行稳健性 | 浏览器动作重放 + 幂等检测 | 提升失败恢复能力 |
| 压缩策略 | 接入 AWorld PromptProcessor | 统一 token 预算管理 |
14. 工程权衡与设计优点
| 设计 | 优点 | 代价 |
|------|------|------|
| 强 JSON 协议 | 可解析/监督/回放 | 初次调试模型需要格式调优 |
| 历史“再构建”而非简单拼接 | 控制语义密度 + 避免噪声 | 代码复杂度提升 |
| 双层轨迹存储(Trajectory + AgentHistory) | 兼顾原始还原与结构化分析 | 冗余一定内存 |
| 多动作序列 | 减少回合/延迟 | 增加错误动作链风险 |
| 模型适配层 | 抽象差异,降低上层侵入性 | 需维护多模型分支 |
15. 最小运行路径
- 设置环境变量:
LLM_MODEL_NAME / LLM_API_KEY / LLM_BASE_URL
(或本地兼容模型服务)。
- 安装浏览器依赖(参见上级 examples/common/tools 对应 README,需具备浏览器驱动 / Playwright / Selenium 等)。
- 运行:
python examples/browser_use/run.py
- 观察输出:
- 控制台动作决策日志
- 生成的历史文件
browser_agent_history.json
16. 推荐进一步实验
| 实验 | 目的 |
|------|------|
| 替换模型(支持/不支持 function calling) | 验证适配层健壮性 |
| 加入 Planner Agent(TeamSwarm) | 分离规划与执行,提高长任务鲁棒性 |
| 引入 MemoryFactory 长期记忆 | 跨会话复用站点模式 / 登录流程 |
| 动作奖励打分器 | 为后续 RL 数据构建 reward |
| DOM 压缩(只保留可交互 + 上下文窗口) | 降低 token |
| 经验抽取(链路→技能模式) | 构建 SFT 数据集 |
17. 总结
Browser Use 示例是 AWorld 在“高交互 + 多模态 + 严结构输出”场景下的一个参照实现:
- 通过 Prompt 工程 + 多轮重试确保决策格式可靠
- 用结构化轨迹与思维字段沉淀可训练数据
- 自定义消息构造器平衡上下文长度与表达充分度
- 适配多模型差异,提升可移植性
它展示了一条通往“浏览任务可监督化 / 可回放化 / 可增量训练化”的工程路径,为后续多智能体协作、策略学习与自我改进提供坚实基础。