跳转到内容

上下文管理 — DOM 截断、URL 缩短与消息压缩

学习目标

  • 理解 Browser Use 如何处理多轮浏览器交互中的上下文膨胀
  • 掌握 URL 缩短与恢复机制的设计
  • 了解消息压缩和 Prompt Caching 的实践

前置知识

下文假设你已理解上下文管理的通用原理,直接聚焦 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:

缩短规则

  1. 分离 base URL 和 query/fragment 部分
  2. 如果 after_path 超过 25 字符,截断并附加 MD5 哈希前 7 位
  3. 维护 shortened_url → original_url 映射
  4. 只在缩短后确实变短时才使用

恢复机制: 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 每步变化

缓存边界设计

  1. 系统提示(最稳定)→ 缓存
  2. 历史动作结果 → 缓存(除非压缩)
  3. 当前浏览器状态 → 缓存(但内容每步不同,缓存 miss)
  4. 步骤信息(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 采用了三种策略的组合,根据上下文压力自动选择。


参考来源