昨天flowith刚发布了他们的浏览器Agent,这个方向已经出了好几款产品了,Dia、Comet、atlas等。今年早些时候也在研究这块,今天在这里分享一下这类Agent的底层实现原理。

一、核心原理
传统自动化的问题: CSS选择器脆弱,前端一改就失效。
核心解决方案:
- 用Playwright扫描页面 → 找出所有可交互元素(按钮、输入框等)
- 给元素编号+画红框 → 生成带标注的截图
- 发给多模态AI → 同时给它三样东西:用户指令 + 元素JSON数据 + 标注截图
- AI返回决策 → 告诉你要操作哪个元素(通过编号)
- Playwright执行 → 直接用之前保存的
ElementHandle操作,不重新查询
为什么有效:
- AI能"看懂"页面(像人一样),不依赖固定选择器
- Playwright提供精确的底层控制能力
- 两者结合 = 智能决策 + 稳定执行
人类说:"帮我点击登录按钮" ↓AI看截图:"哦,是那个红框标着#5的蓝色按钮" ↓Playwright:直接操作元素#5的ElementHandle
不需要写 page.click('.login-btn-class-v2-new') 这种会过期的代码。
核心思路是:把Playwright的浏览器控制能力和多模态AI的视觉理解能力结合起来。整个工作流程可以总结为SPADE(扫描、探测、标注、决策、执行)。下面直接上代码,看看怎么实现。
不过如果纯Agent也有一些问题,针对现在的场景话:
- 对于偶尔操作:AI的“思考延迟”远高于手动,确实不如自己点点点快。
- 对于高频、固定流程:传统的RPA脚本更快、更稳定、成本更低。
这项技术的真正价值在于 “混合驱动” 模式:
用高效的传统脚本处理90%的确定性流程,仅在最关键、最易变、需要做决策的10%的节点上,调用AI来处理不确定性。
这种方法能打造出 既快(脚本保障)又稳(AI兜底) 的自动化方案,实现了速度与智能的最佳结合。
比如自动发小红书的操作截图:
二、从"指令式"到"意图式"
传统做法:page.click('#submit-btn') ← 必须知道准确的选择器 我们的目标:帮我提交这个表单 ← 只需要说清楚意图
要实现这个转变,Agent需要:
- 识别页面上有哪些可交互元素
- 理解每个元素的作用
- 把用户意图和具体元素对应起来
- 执行操作
三、系统架构
用户指令 ↓Agent调度器 ↓Playwright扫描页面 + 标注元素 ↓AI看截图 + 读数据 → 做决策 ↓Playwright执行操作 ↓循环或结束
三个核心模块:
- Playwright控制器:相当于Agent的"手"和"眼睛",负责操作浏览器、提取DOM信息、截图
- 多模态AI:相当于Agent的"大脑",理解用户意图,分析页面内容,做决策
- 调度器:协调上面两者,编排整个流程
四、SPADE流程详解
环境准备:
npm init -ynpm install playwrightnpx playwright install
1. Scan & Probe(扫描+探测)
找出所有可交互元素,为每个元素建立"档案"。
import { chromium, Page, ElementHandle } from 'playwright';interface InteractiveElement { id: number; dom: { tag: string; attributes: { [key: string]: string }; }; text: string; boundingBox: { x: number; y: number; width: number; height: number; }; elementHandle: ElementHandle;}async function scanAndProbe(page: Page): Promise<InteractiveElement[]> { const interactiveSelector = [ 'a', 'button', 'input:not([type="hidden"])', 'textarea', 'select', '[role="button"]', '[role="link"]', '[onclick]' ].join(', '); const elements = await page.locator(interactiveSelector).elementHandles(); const elementInfos: InteractiveElement[] = []; let counter = 1; for (const el of elements) { if (!(await el.isVisible())) continue; const box = await el.boundingBox(); if (!box) continue; const tag = await el.evaluate(node => node.tagName.toLowerCase()); const text = await el.innerText(); const attributes = await el.evaluate(node => { const attrs: { [key: string]: string } = {}; for (const attr of node.attributes) { attrs[attr.name] = attr.value; } return attrs; }); elementInfos.push({ id: counter++, dom: { tag, attributes }, text: text.trim().substring(0, 100), boundingBox: box, elementHandle: el, }); } return elementInfos;}
关键点:
- 用一个宽泛的选择器覆盖大部分可交互元素
- 过滤掉不可见元素
- 保存
ElementHandle引用,后续直接操作,不用重新查询
2. Annotate(标注)
在页面上给每个元素画红框+编号,让AI能看清楚。
async function annotatePage(page: Page, elements: InteractiveElement[]): Promise<void> { const annotations = elements.map(el => ({ id: el.id, box: el.boundingBox, })); await page.evaluate((annotations) => { const oldOverlay = document.getElementById('spade-overlay'); if (oldOverlay) oldOverlay.remove(); const overlay = document.createElement('div'); overlay.id = 'spade-overlay'; overlay.style.cssText = ` position: absolute; top: 0; left: 0; width: 100%; height: ${document.body.scrollHeight}px; z-index: 2147483647; pointer-events: none; `; for (const ann of annotations) { const box = document.createElement('div'); box.style.cssText = ` position: absolute; left: ${ann.box.x}px; top: ${ann.box.y}px; width: ${ann.box.width}px; height: ${ann.box.height}px; border: 2px solid red; box-sizing: border-box; `; const label = document.createElement('div'); label.innerText = String(ann.id); label.style.cssText = ` position: absolute; top: -20px; left: 0; background: red; color: white; padding: 2px 4px; font-size: 14px; border-radius: 3px; `; box.appendChild(label); overlay.appendChild(box); } document.body.appendChild(overlay); }, annotations);}
pointer-events: none 很重要,保证标注层不会干扰页面交互。
3. Decide(决策)
把截图+元素数据发给AI,让它决策要操作哪个元素。
async function askAIForDecision( task: string, annotatedScreenshot: Buffer, elements: InteractiveElement[]): Promise<{ action: 'click' | 'fill' | 'select', elementId: number, value?: string }> { const prompt = `你是Web自动化Agent。根据用户指令,从截图中选择一个元素并决定操作类型。用户指令: "${task}"可交互元素信息:${JSON.stringify(elements.map(el => ({ id: el.id, tag: el.dom.tag, text: el.text, attributes: el.dom.attributes })), null, 2)}截图中红框和数字标出了每个元素的位置。返回JSON格式:- "action": "click", "fill", 或 "select"- "elementId": 元素ID- "value": 如果是fill操作,这里是输入内容示例: { "action": "fill", "elementId": 5, "value": "playwright" } `; const screenshotBase64 = annotatedScreenshot.toString('base64'); // 实际调用OpenAI GPT-4V或其他多模态模型 // const response = await fetch('https://api.openai.com/v1/chat/completions', { // method: 'POST', // headers: { // 'Content-Type': 'application/json', // 'Authorization': `Bearer ${process.env.OPENAI_API_KEY}` // }, // body: JSON.stringify({ // model: "gpt-4-vision-preview", // messages: [{ // role: "user", // content: [ // { type: "text", text: prompt }, // { type: "image_url", image_url: { url: `data:image/png;base64,${screenshotBase64}` }} // ] // }] // }) // }); // 模拟AI返回(实际项目中替换为真实API调用) if (task.includes("输入")) { const input = elements.find(el => el.dom.tag === 'input'); if (input) return { action: 'fill', elementId: input.id, value: 'Playwright' }; } if (task.includes("点击")) { const button = elements.find(el => el.dom.tag === 'button' || el.text.includes('搜索')); if (button) return { action: 'click', elementId: button.id }; } throw new Error("无法决策");}
关键:
- 同时给AI文本指令、结构化数据(JSON)和视觉信息(截图)
- Prompt要清晰定义输入输出格式
- 实际项目中接入GPT-4V或Gemini等多模态模型
4. Execute(执行)
根据AI决策执行操作。
async function executeDecision( decision: { action: 'click' | 'fill' | 'select', elementId: number, value?: string }, elements: InteractiveElement[]): Promise<void> { const target = elements.find(el => el.id === decision.elementId); if (!target) throw new Error(`找不到元素 #${decision.elementId}`); const handle = target.elementHandle; console.log(`执行: ${decision.action} on #${decision.elementId}`); switch (decision.action) { case 'click': await handle.click(); break; case 'fill': if (!decision.value) throw new Error('fill操作需要value'); await handle.fill(decision.value); break; case 'select': // await handle.selectOption({ label: decision.value }); break; }}
直接用之前保存的ElementHandle操作,比坐标点击快且稳定。
5. 完整流程
async function runAgentTask(page: Page, task: string) { console.log(`\n开始任务: "${task}"`); const elements = await scanAndProbe(page); await annotatePage(page, elements); const screenshot = await page.screenshot(); await page.evaluate(() => document.getElementById('spade-overlay')?.remove()); const decision = await askAIForDecision(task, screenshot, elements); await executeDecision(decision, elements); console.log(`任务完成`);}(async () => { const browser = await chromium.launch({ headless: false }); const page = await browser.newPage(); await page.goto('https://www.google.com'); await runAgentTask(page, "在搜索框输入Playwright"); await page.waitForTimeout(1000); await runAgentTask(page, "点击搜索按钮"); await page.waitForTimeout(3000); await browser.close();})();
五、小结
Web自动化正在从"写死的脚本"转向"会思考的Agent"。
- Playwright提供了稳定的底层能力
- 多模态AI提供了理解和决策能力
两者结合就能构建出真正智能的自动化系统。OpenAI也下场做Altas这类产品的出现说明这个方向已经开始落地了… 上面这套SPADE流程是个人觉得比较靠谱的实现方案,希望对你有帮助。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线科技企业深耕十二载,见证过太多因技术卡位而跃迁的案例。那些率先拥抱 AI 的同事,早已在效率与薪资上形成代际优势,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在大模型的学习中的很多困惑。我们整理出这套 AI 大模型突围资料包:
- ✅ 从零到一的 AI 学习路径图
- ✅ 大模型调优实战手册(附医疗/金融等大厂真实案例)
- ✅ 百度/阿里专家闭门录播课
- ✅ 大模型当下最新行业报告
- ✅ 真实大厂面试真题
- ✅ 2025 最新岗位需求图谱
所有资料 ⚡️ ,朋友们如果有需要 《AI大模型入门+进阶学习资源包》,下方扫码获取~

① 全套AI大模型应用开发视频教程
(包含提示工程、RAG、LangChain、Agent、模型微调与部署、DeepSeek等技术点)

② 大模型系统化学习路线
作为学习AI大模型技术的新手,方向至关重要。 正确的学习路线可以为你节省时间,少走弯路;方向不对,努力白费。这里我给大家准备了一份最科学最系统的学习成长路线图和学习规划,带你从零基础入门到精通!

③ 大模型学习书籍&文档
学习AI大模型离不开书籍文档,我精选了一系列大模型技术的书籍和学习文档(电子版),它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础。

④ AI大模型最新行业报告
2025最新行业报告,针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。

⑤ 大模型项目实战&配套源码
学以致用,在项目实战中检验和巩固你所学到的知识,同时为你找工作就业和职业发展打下坚实的基础。

⑥ 大模型大厂面试真题
面试不仅是技术的较量,更需要充分的准备。在你已经掌握了大模型技术之后,就需要开始准备面试,我精心整理了一份大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。

以上资料如何领取?

为什么大家都在学大模型?
最近科技巨头英特尔宣布裁员2万人,传统岗位不断缩减,但AI相关技术岗疯狂扩招,有3-5年经验,大厂薪资就能给到50K*20薪!

不出1年,“有AI项目经验”将成为投递简历的门槛。
风口之下,与其像“温水煮青蛙”一样坐等被行业淘汰,不如先人一步,掌握AI大模型原理+应用技术+项目实操经验,“顺风”翻盘!


这些资料真的有用吗?
这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理,现任上海殷泊信息科技CEO,其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证,服务航天科工、国家电网等1000+企业,以第一作者在IEEE Transactions发表论文50+篇,获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。
资料内容涵盖了从入门到进阶的各类视频教程和实战项目,无论你是小白还是有些技术基础的技术人员,这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。


以上全套大模型资料如何领取?


被折叠的 条评论
为什么被折叠?



