Playwright + AI 智能体混合架构(一):AI 和确定性脚本的分界线在哪里
并不是所有浏览器操作都适合 AI。导航、认证、重复抓取用脚本做更快更稳。结构变化适配、异常处理、罕见参数组合才需要 AI。分错了成本翻倍。
一个错误的默认假设
很多人启动一个 AI 浏览器自动化项目时,默认假设是:让 AI 智能体来完成所有操作。
这是一种成本极高的默认假设。大语言模型每处理一个网页的 DOM(3000-5000 token),成本约为 $0.0045-$0.0075。如果智能体需要 10 步才能完成一个任务,那就是 $0.045-$0.075。乘以每天 10,000 个任务,每天 $450-$750。每月超过一万美元。
对比同一个任务用确定性脚本实现:一次编写,无限次零成本执行(忽略基础设施成本)。
但脚本的问题是:一旦页面结构改变,脚本就失效了。AI 智能体可以适应结构变化——这是它的核心价值。
所以正确的分界线是:稳定路径用脚本,不稳定路径用 AI。
分界线一:哪些操作应该用脚本
导航
从一个 URL 到另一个 URL。这个过程没有决策空间,不需要 AI 参与。
# Bad: AI 做导航:每次消耗 token
# "打开 example.16yun.cn 的登录页面"
# → AI 推理 → 调用 page.goto → 消耗 ~500 token
# Good: 脚本做导航:零推理成本
page = await browser.new_page()
await page.goto("https://example.16yun.cn/login")认证(常规)
使用固定的用户名和密码登录固定的表单。如果表单结构不变化,脚本比 AI 快 3-5 倍。
# Good: 确定性登录
await page.fill("#username", "user@example.16yun.cn")
await page.fill("#password", "mypassword")
await page.click("#login-button")
await page.wait_for_selector("#dashboard")但如果表单结构可能变化(字段位置、名称、验证方式改变),或者需要处理 CAPTCHA,那就需要 AI 介入。
重复数据提取
如果目标页面的 CSS 选择器是稳定的,直接用脚本提取。
# Good: 稳定选择器的数据提取
prices = await page.eval_on_selector_all(
".product-price",
"elements => elements.map(e => e.textContent)"
)性能对比
| 操作类型 | 脚本耗时 | AI 耗时 | AI 成本(近似) |
|---|---|---|---|
| page.goto | 0.5-2s | 2-5s(含推理) | $0.003-0.007 |
| 表单填写(3 字段) | 0.3s | 5-15s(含推理) | $0.01-0.03 |
| 数据提取(10 字段) | 0.1s | 3-10s(含推理) | $0.005-0.02 |
| CAPTCHA 处理 | N/A(需外部服务) | 依赖模型能力 | 不确定 |
分界线二:哪些操作应该用 AI
结构变化的适应
电商网站在改版。旧的产品详情页 CSS 选择器全失效了。脚本返回空数据。AI 智能体可以理解页面变化并重新定位目标信息。
# AI 接管结构变化的场景
task = """
在 example.16yun.cn 的产品详情页上找到以下信息:
1. 产品名称
2. 价格
3. 库存状态
页面的结构可能发生了变化,请先识别内容的位置再提取。
"""
result = await agent.run(task)异常处理
脚本在操作步骤 5 失败了——"未找到元素"。原因可能是页面弹出了一个意外的隐私协议弹窗。AI 可以识别弹窗并关闭它。
# 脚本失败 → AI 接管异常处理
try:
await page.click("#checkout-button")
except Exception as e:
# 切换到 AI 处理异常
task = f"""
点击结算按钮时出现异常:{str(e)}
请检查页面状态,如果弹出了对话框或警告,处理它。
"""
await agent.run(task)罕见参数组合
一个表单有 20 个字段,每次需要不同的参数组合。脚本需要维护 20 个变量的模板。AI 可以直接理解自然语言描述的目标并填写。
# Good: AI 适合:参数组合不确定
task = """
在 example.16yun.cn/report 页面设置以下条件:
- 日期范围:2026 年第一季度
- 地区:华东区
- 产品线:消费电子
- 对比基准:去年同期
- 输出格式:PDF
"""
result = await agent.run(task)分界线三:如何设计切换机制
基线模式
最可落地的设计模式是:脚本执行 80% 的常规操作,当脚本检测到异常时,切换到 AI 处理。 AI 处理完成后,记录新的选择器,把增量更新应用到脚本中。
class HybridAutomator:
def __init__(self):
self.script_engine = ScriptEngine()
self.ai_agent = AIAgent()
self.selector_cache = {}
async def extract_price(self, url):
# 先用脚本尝试
try:
return await self.script_engine.extract_price(url)
except SelectorNotFoundError:
# 脚本失败,AI 接管
price = await self.ai_agent.extract_price(url)
# 记录新的选择器模式,下次脚本可直接使用
selector = await self.ai_agent.discover_selector(url, "price")
self.selector_cache[url] = selector
return price切换时机的评估
不是错误都值得切换 AI。以下指标可以帮助决策:
- 失败率:如果选择器的失败率低于 5%,继续用脚本
- 变化频率:如果页面每周改版超过一次,考虑长期使用 AI
- 操作成本:如果 AI 处理的单次成本低于脚本维护成本,切换
- 恢复难度:如果脚本操作不可逆(已提交的订单),切换到 AI 做决策前确认
总结
混合架构的关键不是让 AI 做所有事,而是让 AI 做它擅长的事:处理不确定性和异常。
脚本做它擅长的事:精确、快速、低成本地执行确定性操作。
分界线画错了,成本就会翻倍——无论是运行成本(都用 AI)还是维护成本(都用脚本)。
需要企业代理方案?
我们可根据目标站点、并发规模与稳定性目标提供定制方案。