课程首页 › Module 7 · 框架与场景:MAF / CUA / 本地 Agent › L17

L17 浏览器 Agent(CUA):让 Agent 像人一样"上网"

课程目标:理解 Computer Use Agent(CUA)的原理与架构,掌握 Browser-Use + Playwright 的混合模式,能构建一个能在真实网站上操作的浏览器 Agent。


一、99% 的网站没有 API#

老王想做一个"价格监控 Agent"——自动监控 Airbnb 上斯德哥尔摩的酒店价格波动。

他打开 Airbnb 官网一看——没 API。

老王崩溃:"那我只能手动刷新页面吗?"

不是——你需要 Computer Use Agent(CUA):让 Agent 像人一样打开浏览器、点击按钮、提取信息。

Building Computer Use Agents 就是教这个:

当 API 不可用时,让 Agent 直接操作浏览器——打开网页、识别元素、模拟点击、提取数据。


二、用一个比喻:CUA = 机器人实习生#

把 CUA 比作一位机器人实习生:

实习生CUA
看到屏幕上的内容截图 + OCR + 视觉理解
决定下一步点哪里LLM 推理
用鼠标点击Playwright/Selenium 驱动浏览器
阅读屏幕上的文字网页 DOM 解析
按 Enter 提交表单Playwright keyboard.press("Enter")

好处:实习生能做任何"人在浏览器前能做"的事——这是通用性最高的自动化方式。

坏处:实习生很慢(每一步都要"看屏幕")、很贵(视觉模型调用)、容易出错(页面变了就崩)。


三、CUA 的技术栈#

Building Computer Use Agents 推荐了四个核心组件:

组件职责
Browser-UseAI 驱动的导航库(自然语言→浏览器动作)
Playwright浏览器自动化(精确控制)
CDP(Chrome DevTools Protocol)直接控制 Chrome
Azure OpenAI(视觉模型)理解屏幕上的内容
# 安装
pip install browser_use playwright python-dotenv
playwright install chromium

四、动手:监控 Airbnb 价格的 CUA#

Building Computer Use Agents 给出了一个完整的 notebook 案例——搜斯德哥尔摩的 Airbnb 房源,提取价格,找到最便宜的。

4.1 启动 Chrome with CDP#

import subprocess
import time

# 用 CDP 模式启动 Chrome(这样 Browser-Use 和 Playwright 能共享同一个 session)
chrome_process = subprocess.Popen(
    [
        "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
        "--remote-debugging-port=9222",
        "--user-data-dir=/tmp/chrome-cua",
    ]
)
time.sleep(2)  # 等 Chrome 启动

4.2 用 Browser-Use 做开放性导航#

from browser_use import Agent as BrowserAgent
from langchain_openai import AzureChatOpenAI

llm = AzureChatOpenAI(
    azure_deployment="gpt-5-mini",  # 视觉模型
    azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT"],
    api_version="2024-12-01-preview"
)

agent = BrowserAgent(
    task="""Go to airbnb.com and search for stays in Stockholm for next week.
    Then close any popups that appear.""",
    llm=llm,
)

await agent.run()

4.3 用 Playwright 做精确提取#

from playwright.async_api import async_playwright
from pydantic import BaseModel

class Listing(BaseModel):
    title: str
    price_per_night: float
    rating: float
    url: str

async def extract_listings():
    async with async_playwright() as p:
        # 连接已经启动的 Chrome
        browser = await p.chromium.connect_over_cdp("http://localhost:9222")

        # 找到 Airbnb 的 tab
        for context in browser.contexts:
            for page in context.pages:
                if "airbnb" in page.url:
                    airbnb_page = page

        # 提取结构化数据
        listings = await airbnb_page.evaluate("""() => {
            return Array.from(document.querySelectorAll('[itemprop="itemListElement"]')).map(el => ({
                title: el.querySelector('[itemprop="name"]')?.innerText,
                price: parseFloat(el.querySelector('[data-testid="price"]')?.innerText.replace(/[^0-9.]/g, '')),
                rating: parseFloat(el.querySelector('[aria-label*="rating"]')?.getAttribute('aria-label'))
            }));
        }""")

        return [Listing(**l) for l in listings if l["price"]]

4.4 比较价格#

listings = await extract_listings()
cheapest = min(listings, key=lambda x: x.price_per_night)

print(f"最便宜的:{cheapest.title} - {cheapest.price_per_night}元/晚")
print(f"链接:{cheapest.url}")

五、Agent 模式 vs Actor 模式#

Building Computer Use Agents 给出了一个关键决策表:

场景用 Agent用 Actor(直接 Playwright)
动态布局✓ AI 适应页面变化✗ 选择器脆弱
已知结构✗ 比直接控制慢✓ 快速精确
找元素✓ 自然语言✗ 需要精确选择器
时间控制✗ 不可预测✓ 完全可控
复杂流程✓ 处理意外 UI 状态✗ 需要显式分支

最佳实践:先用 Agent 做探索性导航,遇到稳定结构后切换到 Actor 做精确控制。


六、CUA 的七大安全护栏#

CUA 操作真实网站——必须有严格的边界:

  1. 限定浏览范围:用专用 browser profile/sandbox,限制可访问域名

  2. 分离观察与行动:让 Agent 先搜索、读取、提取;提交表单、付款、改账户前必须人工审批

  3. 不在 prompt/trace 里写密钥:密码、支付信息、session cookie、个人数据不进 LLM context

  4. 把页面内容视为不可信输入:网站可能有针对 Agent 的 prompt injection

  5. 危险步骤前做确定性检查:校验 URL、页面标题、选中项、价格、收件人

  6. 设置预算与停止条件:限制操作次数、重试次数、tab 数、运行时长

  7. 只记录有用证据:保留操作摘要、时间戳、URL、截图引用

Building Computer Use Agents 强调:

在 Airbnb 案例中,安全默认值是只搜索+提取价格;登录、联系房东、完成预订必须是用户单独批准的操作。


七、真实世界案例:微软 Project Opal#

Building Computer Use Agents 提到了微软的企业级产品——Project Opal:

课程概念Project Opal 应用
HITL(L9)Opal 在登录凭证、敏感数据、模糊指令前暂停,绝不输入密码或提交表单
可信赖 + 安全 Agent(L13 + L15)在隔离的 Windows 365 Cloud PC 中运行、默认仅浏览器、用你的身份、记录每个动作
规划 + 元认知(L8 + L9)Opal 先生成作业计划,然后监督每一步推理
可复用 Skills/Tools(L4)Skills 让你为可重复的工作写指令,跨对话复用

Opal 已经在 Microsoft 365 Copilot 的 Frontier 早期访问中可用。


八、CUA 的局限性与未来#

8.1 当前局限#

8.2 未来方向#


九、关键要点回顾#

工具职责
Browser-UseAI 驱动的开放性导航
Playwright精确的浏览器控制
CDP直接驱动 Chrome
Pydantic结构化数据提取

最佳模式:Agent 做探索 + Actor 做精确控制。

核心安全:观察和行动分离——搜索可以自动,付款必须人工。


十、参考资源#


十一、下一课预告#

L19-L20 生产部署——从 demo 到生产的"最后一公里":版本控制、可观测性、CI/CD、模型路由、缓存、人审、灰度发布。

为什么重要:99% 的 Agent 死在"看起来跑通了"——部署到生产后才发现没监控、没回滚、没测试。

自测 · 检验是否真的掌握了

1. 在 CUA 中结合 Browser-Use 与 Playwright 的最佳实践是什么?

最佳实践是先用智能体模式做开放性导航,它能应对动态布局和意外弹窗;一旦页面结构稳定,就切换到脚本模式用选择器精确提取数据。全程用自然语言导航慢且贵,全程用固定选择器则因选择器脆弱而在页面改版时失效。两者共享同一个 CDP 会话,可以在同一次浏览器会话中无缝切换。

2. CUA 安全护栏中「分离观察与行动」要求怎样划分自动化边界?

观察与行动分离指的是把只读、可逆的动作(搜索、浏览、提取价格)自动化,而把有外部影响的动作(下单、付款、改账户)留给人工审批。全部人工批准会让 Agent 失去自动化价值;把网页内容当成可信来源或把密钥写进上下文,则会引入注入风险和信息泄露。网页内容必须被视为不可信输入。

3. CUA 相比直接调用 API 显得又慢又贵的根本原因是什么?

CUA 每前进一步都要把当前屏幕交给视觉模型理解,再由模型决定下一步点击哪里,一次任务往往要几十轮模型调用,成本和延迟自然远高于一次 API 调用。它的脆则来自页面改版会让选择器和布局假设失效。未来方向是更小的视觉模型以及 DOM 与视觉融合的识别方式。