AI Agent 需要操作网页,但浏览器自动化总掉链子?Notte 用混合架构让 Agent 可靠又省钱
AI 编码 Agent 越来越强,但一碰到需要操作网页的场景——登录后台、抓取数据、填写表单——就开始掉链子。不是速度慢,就是点错按钮,或者 AI 花几十步思考一个简单的三步骤流程。
Notte 是一个 Python 浏览器 Agent 框架(源码可用,SSPL-1.0 许可证),核心思路很简单:用确定性脚本处理你能写得出来的步骤,把 AI 留给需要推理的部分。这个「混合架构」让 Agent 的可靠性大幅提升,成本还降了一半。
不是所有步骤都需要 AI
大多数浏览器 Agent 框架的问题在于——它们让 LLM 决定每一步。从打开页面到输入搜索词到点击结果,全部交给模型推理。这不仅慢(Browser-Use 平均每任务 113 秒),还容易出错(Task Reliability 83.3%)。
Notte 的做法是区分两种场景:
- 确定性步骤:打开 URL、填充输入框、滚动页面——这些用 Playwright 脚本直接执行,零推理成本
- 推理步骤:判断搜索结果的正确性、提取特定格式的数据、处理登录失败等异常情况——交给 LLM
这种分工在 Notte 的基准测试中效果显著:Task Reliability 96.6%,平均每任务仅 47 秒,LLM Evaluation 评分 79%。
五分钟上手
安装只需两行:
pip install notte patchright install --with-deps chromium
本地模式直接跑一个 Agent:
import notte
from dotenv import load_dotenv
load_dotenv()
with notte.Session(headless=False) as session:
agent = notte.Agent(
session=session,
reasoning_model='gemini/gemini-2.5-flash',
max_steps=30
)
response = agent.run(task="在 Google 图片上搜「AI agent 架构图」")
如果想要更高级的功能(隐身浏览器、CAPTCHA 自动解决、代理 IP),可以注册 Notte Console 获取免费 API Key,然后改用 SDK 模式:
from notte_sdk import NotteClient
import os
client = NotteClient(api_key=os.getenv("NOTTE_API_KEY"))
with client.Session(open_viewer=True) as session:
agent = client.Agent(
session=session,
reasoning_model='gemini/gemini-2.5-flash',
max_steps=30
)
response = agent.run(
task="doom scroll cat memes on google images"
)
结构化输出:让 Agent 返回你想要的数据
Notte 支持用 Pydantic 模型定义返回格式——Agent 爬完数据后直接给你结构化的对象,不用自己解析 HTML:
from notte_sdk import NotteClient
from pydantic import BaseModel
class HackerNewsPost(BaseModel):
title: str
url: str
points: int
author: str
comments_count: int
class TopPosts(BaseModel):
posts: list[HackerNewsPost]
client = NotteClient()
with client.Session(open_viewer=True) as session:
agent = client.Agent(
session=session,
reasoning_model='gemini/gemini-2.5-flash',
max_steps=15
)
response = agent.run(
task="打开 Hacker News,提取前 5 条帖子的标题、链接、分数、作者和评论数",
response_format=TopPosts,
)
print(response.answer)
混合工作流:脚本 + Agent 的最佳实践
Notte 最实用的功能是混合工作流——把确定性步骤用 Playwright 原语执行,只在需要权衡的地方用 Agent:
from notte_sdk import NotteClient
client = NotteClient()
with client.Session(open_viewer=True) as session:
# 第一步:确定性导航
session.execute(type="goto", url="https://duckduckgo.com/")
session.execute(
type="fill",
selector='internal:role=combobox[name="Search with DuckDuckGo"]',
value="nottelabs"
)
# 第二步:让 Agent 推理接下来的操作
agent = client.Agent(session=session, max_steps=3)
agent.run(task="打开 nottelabs 的 GitHub 仓库")
# 第三步:用 scraping 端点提取数据
data = session.scrape(instructions="提取该仓库的 star 数量")
这种模式的实际效果:一个需要在多个页面间跳转、判断链接正确性、提取数据的任务,如果用纯 Agent 可能需要 15 步 + 2 分钟,用混合工作流只需要 3 步 Agent + 3 步脚本,总耗时 30 秒,LLM 调用成本减少 70%。
进阶功能一览
Agent Vault(凭据管理)
Agent 需要登录网站时,Vault 可以安全存储用户名密码,Agent 在需要时自动调用:
with client.Vault() as vault, client.Session() as session:
vault.add_credentials(
url="https://x.com",
username="your-email",
password="your-password",
)
agent = client.Agent(session=session, vault=vault, max_steps=10)
response = agent.run(task="登录 Twitter 查看我的私信")
Agent Persona(数字身份)
需要注册账号的场景,Persona 提供自动生成的身份信息(邮箱、电话),自动处理 2FA:
with client.Persona() as persona:
with client.Session() as session:
agent = client.Agent(
session=session,
persona=persona,
max_steps=15
)
response = agent.run(
task="打开 Google 表单并填写 RSVP",
url="https://forms.google.com/your-form-url",
)
隐身浏览器与反检测
内置 CAPTCHA 自动解决、代理 IP、浏览器指纹伪装——所有特性通过 Session 参数开关:
with client.Session(
solve_captchas=True,
proxies=True,
browser_type="chrome",
open_viewer=True
) as session:
agent = client.Agent(session=session, max_steps=5)
response = agent.run(
task="尝试解决 CAPTCHA",
url="https://www.google.com/recaptcha/api2/demo"
)
总结
Notte 的混合架构是一种务实的思路:不是让 AI 去做所有事,而是把不需要推理的部分剥离出来用脚本执行。这种分层方式让浏览器 Agent 的可靠性从 83% 提升到 96%,成本下降 50% 以上。
对于需要在工作流中加入网页操作的 AI 编码 Agent,Notte 提供了一个现成的替代方案——你可以在本地跑开源版,也可以在需要隐身、CAPTCHA 解决等功能时切换到 SDK 付费版。
唯一需要注意的是许可证差异:开源核心使用 SSPL-1.0(服务端公共许可证,非 OSI 批准的开源许可证),SDK 按量计费。如果用在商业项目中,建议先了解 SSPL 的合规要求。
相关链接