上下文管理 — DOM 截断、URL 缩短与消息压缩
学习目标
- 理解 Browser Use 如何处理多轮浏览器交互中的上下文膨胀
- 掌握 URL 缩短与恢复机制的设计
- 了解消息压缩和 Prompt Caching 的实践
前置知识
- 上下文压缩与 Token 优化 — 截断策略、压缩算法、Tail 保留
下文假设你已理解上下文管理的通用原理,直接聚焦 Browser Use 的具体实现。
项目实践
DOM 文本截断
浏览器页面的 DOM 树文本表示是上下文中最大的部分。Browser Use 通过 max_clickable_elements_length=40000 字符限制:
elements_text = browser_state_summary.dom_state.llm_representation( include_attributes=self.include_attributes)
if len(elements_text) > self.max_clickable_elements_length: elements_text = elements_text[:self.max_clickable_elements_length] truncated_text = f' (truncated to {self.max_clickable_elements_length} characters)'配合页面统计:即使 DOM 被截断,LLM 仍然通过 <page_stats> 知道页面全貌:
<page_stats>142 links, 87 interactive, 3 iframes, 2 shadow(open), 15 images, 523 total elements</page_stats>URL 缩短与双向恢复
当 Agent 浏览多个页面时,URL 历史会消耗大量 Token。Browser Use 自动缩短长 URL:
缩短规则:
- 分离 base URL 和 query/fragment 部分
- 如果 after_path 超过 25 字符,截断并附加 MD5 哈希前 7 位
- 维护
shortened_url → original_url映射 - 只在缩短后确实变短时才使用
恢复机制: LLM 回复时,递归遍历 Pydantic 模型中的所有字符串字段,将缩短的 URL 恢复为原始 URL:
# 处理嵌套结构- BaseModel.__dict__ 中的字符串- 嵌套 BaseModel 对象- dict 值- list/tuple 元素消息压缩(Compaction)
Browser Use 支持可选的 LLM 驱动消息压缩:
settings = MessageCompactionSettings( enabled=True, compaction_llm=smaller_llm, # 可选:用便宜模型压缩 max_tokens=..., # 压缩触发阈值)压缩触发:在 step() 方法中调用 await self._maybe_compact_messages(step_info)
Prompt Caching
Browser Use 的系统提示和用户消息都标记了 cache=True:
- 系统提示:始终相同,完美缓存命中
- 用户消息:包含历史状态和浏览器状态,只有末尾的 step_info 每步变化
缓存边界设计:
- 系统提示(最稳定)→ 缓存
- 历史动作结果 → 缓存(除非压缩)
- 当前浏览器状态 → 缓存(但内容每步不同,缓存 miss)
- 步骤信息(step counter、日期)→ 缓存(每步变化)
历史步骤数限制
通过 max_history_items 参数限制保留的历史步骤数:
- 只保留最近的 N 个步骤在上下文中
- 更早的步骤被裁剪(但不会被压缩为摘要)
问题与规避
截断丢失关键信息
问题:DOM 截断可能在关键元素处切断。
对策:
- 配合
<page_stats>让 LLM 知道页面全貌 max_clickable_elements_length默认 40000 字符足够覆盖大多数页面的交互元素- 可通过参数调高上限
URL 恢复失败
问题:LLM 可能返回未恢复的缩短 URL。
对策:
- 恢复是 Agent 端自动处理的,不依赖 LLM 行为
- 递归处理所有嵌套结构,确保没有遗漏
- 如果 LLM 生成了全新的缩短 URL(不在映射中),保留原样
设计取舍
截断 vs 压缩 vs 历史裁剪
| 方案 | 应用场景 | Browser Use 中的状态 |
|---|---|---|
| 截断 | DOM 文本过长 | 已实现(max_clickable_elements_length) |
| LLM 压缩 | 对话历史摘要化 | 已实现(MessageCompactionSettings) |
| 历史裁剪 | 限制步骤数 | 已实现(max_history_items) |
Browser Use 采用了三种策略的组合,根据上下文压力自动选择。