Skyvern:AI视觉驱动浏览器自动化,告别传统DOM定位

发布时间:2026/7/10 3:42:50
Skyvern:AI视觉驱动浏览器自动化,告别传统DOM定位 1. 项目概述当浏览器自动化遇上AI视觉最近在折腾自动化流程时发现了一个挺有意思的开源项目叫Skyvern。简单来说它试图解决一个老生常谈但又一直没被完美解决的问题如何让程序像人一样在浏览器里完成那些需要“看”和“理解”网页的任务。传统的浏览器自动化工具比如我们熟知的Selenium、Playwright或者Puppeteer本质上都是基于代码指令去操作DOM元素。你得告诉它“点击这个ID为‘submit’的按钮”、“在这个class是‘search-input’的输入框里填入‘XXX’”。这种方式很强大但前提是你得对网页结构了如指掌并且网页结构不能有大的变动。Skyvern的思路则完全不同。它引入了AI和计算机视觉让自动化脚本不再依赖于脆弱的CSS选择器或XPath路径。你可以用自然语言告诉它“帮我在这个电商网站上找到最便宜的无线鼠标并加入购物车”或者“登录这个系统下载上个月的所有报表”。它通过“看”网页截图结合大语言模型LLM的理解来决策下一步该做什么操作。这听起来有点像给浏览器自动化装上了“眼睛”和“大脑”。对于需要处理大量结构多变、甚至带有验证码或动态内容的网页任务来说这种视觉驱动的方式可能是一个游戏规则的改变者。无论是做数据抓取、日常办公流程自动化还是软件测试它都提供了一个全新的视角。2. 核心设计思路与技术架构拆解2.1 从“代码驱动”到“视觉驱动”的范式转变要理解Skyvern的价值得先看看传统方法的痛点。基于DOM的自动化其核心是“寻址”。开发者编写脚本本质上是为浏览器提供一套精确的“地图坐标”选择器告诉它目标在页面的哪个位置。这套方法的瓶颈非常明显脆弱性前端工程师改个class名、调整下HTML结构你的自动化脚本就可能立刻失效。维护成本随着网站迭代频率直线上升。复杂性对于大量使用JavaScript动态渲染内容的现代单页应用SPA元素可能不会立即出现在DOM中需要复杂的等待、重试逻辑。处理iframe、阴影DOMShadow DOM更是让人头疼。认知门槛编写脚本的人必须理解目标网页的HTML/CSS结构这本身就是一个额外的学习成本。对于非技术背景的业务人员来说几乎不可逾越。Skyvern的“视觉驱动”范式试图绕过这些痛点。它的核心思想是模仿人类与网页交互的方式我们并不关心按钮的HTML代码是什么我们只关心它在屏幕上看起来是什么样子、在什么位置、旁边有什么文字。因此Skyvern的工作流可以概括为截图 - 理解 - 决策 - 执行。2.2 Skyvern的核心技术组件与工作流根据其开源文档和设计Skyvern的架构大致包含以下几个关键组件它们协同工作完成一次自动化任务浏览器控制层底层仍然需要一个可靠的浏览器操控工具。Skyvern通常基于Playwright或Puppeteer这类现代浏览器自动化库。这一层负责最基础的操作启动浏览器、导航到指定URL、执行鼠标点击、键盘输入、页面截图等。它是Skyvern的“手”和“脚”。视觉感知与理解层这是Skyvern的“眼睛”和“大脑”所在也是最核心的部分。页面截图浏览器控制层捕获当前页面的完整截图或视口截图。视觉元素检测使用计算机视觉模型例如基于深度学习的对象检测模型来分析截图识别出所有可能的交互元素如按钮、输入框、链接、下拉菜单等。每个被检测到的元素都会附带其在屏幕上的坐标边界框Bounding Box。上下文理解仅仅找到元素还不够还需要理解它们的含义和状态。这里大语言模型LLM登场了。系统会将截图、检测到的元素信息位置、视觉特征以及任务指令用户用自然语言描述的目标一起发送给LLM例如GPT-4V、Claude 3等支持视觉输入的模型或通过OCR将截图转为文本后发送给纯文本LLM。LLM的任务是“阅读理解”整个场景这是什么页面当前状态如何为了完成用户指令下一步应该操作哪个元素具体怎么操作点击、输入、滚动决策与执行层动作生成LLM基于理解输出一个结构化的动作指令例如{“action”: “click”, “coordinates”: [x, y]}或{“action”: “type”, “text”: “hello world”, “coordinates”: [x, y]}。这里的坐标通常来自视觉元素检测的边界框中心点。动作执行浏览器控制层接收这个指令并模拟人类操作将鼠标移动到指定坐标执行点击或输入。循环与状态判断执行一个动作后页面状态发生变化。系统会再次截图进入下一轮“感知-理解-决策-执行”循环直到LLM判断任务已经完成例如输出“任务完成已成功提交表单”或“已找到目标数据”。编排与状态管理层负责管理整个任务的流程处理异常如弹窗、网络错误记录操作日志可能还包括管理浏览器实例、处理Cookies和会话等。注意这种“视觉驱动”的方式对计算资源尤其是调用视觉大模型VLMs的API成本有较高要求。每一轮决策都可能需要调用一次价格不菲的API。因此Skyvern的实用化需要在“智能度”和“成本/效率”之间做出精细的权衡。2.3 与RPA和传统自动化的对比Skyvern很容易让人联想到机器人流程自动化RPA。确实它们在目标上高度一致自动化重复的、基于规则的数字工作。但技术路径不同传统RPA如UiPath, Blue Prism早期也多基于图像识别和坐标定位但智能化程度有限需要大量录制和手动配置规则应对变化的能力较弱。现代RPA也集成了AI能力但通常作为插件存在。Skyvern从设计之初就深度集成AI将视觉理解和逻辑决策完全交给LLM追求更高的通用性和适应性。它更像是一个“单次设置自主完成”的智能体AI Agent而非需要精细编排的“流水线”。3. 核心细节解析与实操要点3.1 任务指令的编写艺术用自然语言给Skyvern下指令看似简单实则暗含技巧。指令的清晰度直接决定了任务的成败和效率。好的指令“访问example.com在顶部搜索框输入‘无线蓝牙耳机’点击搜索按钮在结果列表中找到第一个价格低于500元的产品点击进入其详情页。”优点目标明确步骤清晰有关键条件“价格低于500元”。LLM容易理解并分解为原子操作。模糊的指令“帮我看看example.com上有什么好的耳机。”问题“看看”是什么操作滚动浏览点击分类“好的”标准是什么这种指令会让LLM无所适从可能导致它在网站上漫无目的地浏览消耗大量API调用却无法完成任务。实操心得在编写指令时要像给一个细心但缺乏常识的新人同事写操作手册。尽量使用具体名词、明确动词和可量化的条件。将复杂任务拆解成多个子任务指令依次执行往往比一个庞杂的指令更有效。3.2 模型选择与成本控制Skyvern的性能天花板很大程度上取决于所用的LLM/VLM的能力。视觉大模型VLM如GPT-4V、Claude 3 Opus。它们能直接“看懂”图片理解复杂的UI布局、图标含义甚至部分验证码能力最强但API成本也最高。纯文本LLM OCR方案是先用Tesseract、PaddleOCR等工具将截图中的文字提取出来连同元素坐标信息一起发送给GPT-4、Claude等纯文本模型。成本较低但会丢失纯视觉信息如图标、颜色、非文本布局对于图形化按钮密集的页面处理能力下降。混合模式这是比较实用的策略。对于大多数以文本为主的表单、列表页使用“LLMOCR”模式以控制成本当遇到图形验证码、图表分析等复杂视觉场景时切换到VLM模式处理关键步骤。成本估算示例假设一个任务需要10轮决策完成每轮调用一次GPT-4V API。以OpenAI定价为例一张低清截图输入可能花费约0.01美元。完成一个简单任务成本约0.1美元。如果每天运行数千次成本不容忽视。因此在项目规划初期就必须将模型调用成本纳入考量。3.3 元素定位的精度与鲁棒性挑战即使有了AI精准定位点击位置依然是个挑战。视觉模型检测出的边界框可能存在几个像素的偏差对于很小的复选框或链接点击可能失败。坐标修正策略不要直接点击边界框的中心。对于已知是按钮的元素可以尝试点击其中心偏上的位置更符合人类点击习惯。对于输入框应先点击确保焦点落入框内再输入文字。重试与降级机制当一次点击未达到预期效果例如页面未跳转、输入框未激活系统应能触发重试逻辑。重试时可以稍微偏移点击坐标或者滚动页面让元素更居中后再尝试。如果多次视觉驱动操作失败可以考虑降级到备用方案比如回退到Playwright的DOM选择器如果已知。处理动态内容与等待和传统自动化一样需要智能等待。Skyvern的优势在于它可以利用LLM判断页面是否“稳定”或“加载完成”例如当截图中的“加载中”旋转图标消失并且关键目标元素出现时才进行下一步。这比固定的sleep或等待某个DOM元素出现更加灵活和可靠。4. 实操过程与核心环节实现下面以一个模拟场景为例展示如何使用Skyvern或其理念构建一个自动化任务。假设我们使用一个基于Skyvern架构的自建系统。4.1 环境准备与基础配置首先需要搭建一个包含以下组件的基础环境浏览器自动化基础安装Node.js或Python环境以及Playwright。# 以Python为例 pip install playwright playwright install chromium视觉与AI服务这里我们选择“纯文本LLM OCR”的性价比方案。需要安装OCR工具和配置LLM API。pip install paddlepaddle paddleocr openai配置OpenAI API密钥到环境变量。任务编排框架可以自己编写一个简单的状态机或者使用Celery、Airflow等工具管理任务队列。这里为了简化我们写一个直接的Python脚本。4.2 核心自动化循环代码解析以下是一个高度简化的核心循环代码逻辑用于阐述原理import asyncio from playwright.async_api import async_playwright import paddleocr from openai import OpenAI import cv2 class VisualAIAgent: def __init__(self): self.ocr paddleocr.PaddleOCR(use_angle_clsTrue, langch) self.llm_client OpenAI(api_keyos.getenv(OPENAI_API_KEY)) self.browser None self.page None async def initialize(self): playwright await async_playwright().start() self.browser await playwright.chromium.launch(headlessFalse) # 调试时可设为False self.page await self.browser.new_page() async def perform_task(self, task_instruction: str, start_url: str): await self.page.goto(start_url) max_steps 20 for step in range(max_steps): # 1. 截图 screenshot_path fstep_{step}.png await self.page.screenshot(pathscreenshot_path, full_pageTrue) screenshot_img cv2.imread(screenshot_path) # 2. OCR提取文本和元素简化版实际应用需用目标检测模型 ocr_result self.ocr.ocr(screenshot_img, clsTrue) # 将OCR结果格式化为文本描述和坐标列表 page_text .join([line[1][0] for line in ocr_result[0]]) elements [] for line in ocr_result[0]: box, (text, confidence) line x_center (box[0][0] box[2][0]) / 2 y_center (box[0][1] box[2][1]) / 2 elements.append({text: text, x: x_center, y: y_center}) # 3. 构造Prompt调用LLM决策 prompt f 你是一个控制网页浏览器的AI助手。当前任务是{task_instruction} 当前页面文本内容如下 {page_text} 页面上检测到的可交互元素文本及其中点坐标如下 {elements} 请根据当前页面状态和任务决定下一步操作。你只能选择以下一种操作 A. 点击输出格式 CLICK|{x}|{y} B. 输入输出格式 TYPE|{text}|{x}|{y} C. 滚动输出格式 SCROLL|down 或 SCROLL|up D. 任务完成输出格式 DONE|任务结果摘要 如果任务无法完成输出 FAIL|原因 请直接输出操作指令不要有其他内容。 response self.llm_client.chat.completions.create( modelgpt-4, messages[{role: user, content: prompt}] ) action response.choices[0].message.content.strip() # 4. 解析并执行动作 if action.startswith(CLICK): _, x, y action.split(|) await self.page.mouse.click(float(x), float(y)) await self.page.wait_for_timeout(1000) # 简单等待 elif action.startswith(TYPE): _, text, x, y action.split(|) await self.page.mouse.click(float(x), float(y)) await self.page.keyboard.type(text) await self.page.wait_for_timeout(500) elif action.startswith(SCROLL): _, direction action.split(|) if direction down: await self.page.mouse.wheel(0, 300) else: await self.page.mouse.wheel(0, -300) await self.page.wait_for_timeout(1000) elif action.startswith(DONE): print(f任务成功完成{action}) break elif action.startswith(FAIL): print(f任务失败{action}) break else: print(f无法解析的指令{action}) break await self.browser.close() # 使用示例 async def main(): agent VisualAIAgent() await agent.initialize() await agent.perform_task( task_instruction在百度首页的搜索框里输入‘人工智能’并点击搜索按钮, start_urlhttps://www.baidu.com ) if __name__ __main__: asyncio.run(main())代码关键点解析循环控制设置max_steps防止任务无限循环。信息提取本例用OCR替代了完整的视觉元素检测只提取了文本和其位置。在实际的Skyvern中会使用目标检测模型识别按钮、输入框等各类元素并提供更丰富的视觉特征。Prompt工程这是连接LLM与任务的核心。Prompt必须清晰定义任务、当前状态、可用操作和输出格式。严格的输出格式便于程序解析。动作执行根据LLM的指令调用Playwright执行相应的鼠标、键盘操作。4.3 高级功能上下文记忆与多步骤任务简单的循环只能处理线性任务。对于需要登录、多页面跳转的复杂任务AI需要“记住”之前做了什么。会话上下文将每一轮的截图、操作、LLM的思考过程都存入一个上下文列表在下一轮提问时一并发送给LLM。这能让LLM知道整个任务的历史避免重复操作或陷入循环。子任务分解对于非常复杂的指令可以先让一个“规划器”LLM将总任务分解为一系列顺序执行的子任务指令再由上述的“执行器”Agent逐个完成。这符合AI Agent的常见架构Planner Executor。5. 常见问题与排查技巧实录在实际使用或构建类似Skyvern的系统时一定会遇到各种问题。以下是一些典型问题及解决思路5.1 AI决策错误或循环现象LLM反复执行相同操作或在几个无关操作间来回切换无法推进任务。排查检查PromptPrompt是否清晰定义了任务边界和终止条件是否提供了足够的页面上下文尝试在Prompt中加入“避免重复点击同一区域”的约束。检查页面状态反馈LLM是否准确感知到了操作后的页面变化有时网络延迟或前端动画会导致截图时页面未更新。可以增加操作后的固定等待时间或实现基于视觉的“等待直到页面变化”逻辑。简化任务任务是否过于复杂尝试将其拆解为更小的、原子性的子任务逐个击破。更换模型/调整参数如果使用低成本模型尝试换用更强大的模型如从gpt-3.5-turbo切换到gpt-4。也可以调整LLM的temperature参数降低以增加确定性。5.2 元素定位不准导致操作失败现象LLM决定点击某个按钮但实际点击位置偏移操作无效。排查与解决视觉检测校准确保用于元素检测的模型在目标网站UI元素上有较好的精度。可能需要收集特定网站的数据进行微调。坐标后处理不要直接使用检测框的中心。对于按钮可以计算其底部中心偏上的坐标对于输入框可以点击框内左侧区域。引入重试机制操作失败后可通过判断页面URL未变、关键元素未出现等自动重试1-2次每次轻微随机偏移坐标。混合定位策略对于已知的、稳定的重要元素如登录按钮可以配置一个备用的CSS选择器。当视觉驱动连续失败时回退到传统的DOM定位方式。5.3 处理弹窗、验证码与异常状态弹窗LLM需要能识别弹窗并做出正确响应。可以在Prompt中专门描述常见弹窗的特征如蒙层、居中对话框。一旦检测到类似特征优先让LLM处理弹窗点击确定、取消或关闭。验证码简单文本验证码OCR可能识别可连同图片一起发送给VLM识别。复杂验证码滑块、点选目前仍是难题。实用方案是触发验证码时暂停任务发出人工干预警报或者集成专业的第三方验证码解决服务。最佳实践在可能的情况下通过自动化流程设计如控制请求频率、使用会话保持尽量避免触发验证码。网络错误与页面崩溃在自动化循环中加入异常捕获。如果页面崩溃或导航错误自动重启浏览器会话并根据上下文尝试从失败步骤恢复或重新开始任务。5.4 性能优化与成本控制缓存与记忆对于同一网站重复执行的任务可以将成功路径截图序列与操作序列缓存下来。下次执行相同任务时可以先尝试匹配当前截图与缓存中的历史截图如果匹配度高则直接复用后续操作减少LLM调用。截图优化不一定每次都需要全屏高清截图。可以只截取视口区域或者通过DOM分析预判感兴趣区域再进行截图减少传输给AI模型的数据量。模型分级调用定义决策的“难度”。简单决策如“点击明显的下一步按钮”可以使用更小、更便宜的本地模型或规则判断只有复杂决策才调用强大的VLM。6. 应用场景与未来展望Skyvern所代表的视觉驱动自动化其应用场景非常广泛复杂数据抓取抓取需要登录、有复杂交互如下拉筛选、翻页、悬停显示的网站数据传统爬虫难以编写和维护。企业级RPA自动化那些没有API接口、只能通过网页操作的内部老旧系统如ERP、CRM的流程如数据录入、报表生成。自动化测试尤其是面向用户体验UX的测试。可以编写如“验证新用户从注册到完成首单的流程是否顺畅”这类高层次测试用例而无需关心具体元素定位。个人效率工具自动完成日常的网页操作如监控价格、预约服务、填写重复性表格等。从我个人的实验和观察来看这项技术目前仍处于早期阶段更像一个“炫技”的Demo或特定场景的解决方案离大规模稳定生产应用还有距离。主要的挑战在于成本、速度和可靠性的平衡。每一次AI决策都有延迟和金钱成本而可靠性尚无法达到100%需要人工兜底。然而它的方向无疑是正确的。随着多模态AI模型能力的持续提升和成本的下降以及专门针对UI理解和交互进行优化的模型出现视觉驱动自动化的实用价值会越来越高。一个可能的未来是我们不再需要编写精细的自动化脚本而是通过自然语言描述和少量示例就能训练出一个能稳定处理特定网页任务的“数字员工”。对于开发者和测试人员来说这意味着可以从繁琐的定位器和脚本维护中解放出来更专注于业务逻辑和用户体验设计。这条路还很长但Skyvern已经点亮了一个值得探索的路径。