支持私有云部署
AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


4天开发,1700万美元融资:开源的Browser Use为啥这么火?

发布日期:2025-04-03 22:12:19 浏览次数: 1539 作者:字节笔记本
推荐语

Browser Use,4天开发的开源项目,何以在AI自动化赛道上迅速崛起?

核心内容:
1. Browser Use的核心理念与AI自动化能力
2. 技术架构与市场潜力的深度解析
3. 开源策略如何助力Browser Use火速融资1700万美元

杨芳贤
53A创始人/腾讯云(TVP)最具价值专家

互联网的本质是什么?

有人说是信息流动,有人说是连接一切。

但如果让我给个答案,我会说:高效获取信息,自动化重复场景

Browser Use,4天开发,1700万美元融资,生动诠释了这个第一性原理。

fb080223-07ce-463c-b48a-0804e6fe0b68.png

Browser Use由苏黎世联邦理工学院校友Magnus Müller和Gregor Zunic联手打造的开源项目,几乎是“速成”的代名词。

几个月内,GitHub星标突破5万,接着Manus的东风,风投圈争相下注,AI+浏览器自动化的Agent火爆一时。

Browser Use的核心其实很简单:让AI像人一样用浏览器。

市面也有很多自动化工具,但是还停留在机械地模拟点击或填写表单,而Browser Use却能让AI“看懂”网页,然后像真人一样思考和操作

举个例子,你扔给它一句“帮我找三家云南大理最具性价比的酒店”,传统AI顶多丢给你个链接,敷衍了事。

但Browser Use会直接打开booking.com,翻页筛选,比较评分和价格,最后奉上一份详细报告。这种从“指令接收”到“任务执行”的闭环能力,精准击中了AI落地的痛点。

更夸张的是,它的价格和开放性。开源,MIT协议随便改随便用,还支持Claude、GPT、Gemini等多模型切换,不绑死任何一家供应商。闭源竞品OpenAI Operator要200美元!

火出圈的必备三大杀招——开源、多模型、低成本,直接让它在自动化赛道无人能及。

Browser Use的技术架构并不复杂,却聪明得让人叹服。整个系统靠四层架构撑起,从网页感知到操作执行,每一层都直戳Web自动化的核心难题。

656f7fef-ca7d-47e7-8a13-f83fe7d6fc6c.png

DOM层,这是AI的眼睛。AI识别网页上的按钮和文本,智能判断“这个按钮现在能不能点”“这个元素是不是被遮住了”。

透过源码我们能看到,它用了一个扁平化的哈希映射,而不是传统的树形结构,序列化和查找效率直接拉满。

Browser层负责动手的。本质基于Playwright库。

Controller层是“翻译官”,把AI的决策变成具体动作。它的装饰器模式设计优雅到不行,想加个新功能,比如截图,只需三行代码搞定,扩展性拉满。

最后是Agent层,经典的“观察-思考-行动”循环,调用语言模型做判断,执行动作后还能根据结果调整策略。

四层环环相扣,解决了从感知到执行的全链路问题。难怪有人说,Browser Use是“用最少的代码,干了最多的事”。

当然风投从不只为技术买单,他们买的还是是市场潜力。

Browser Use的1700万美元融资,背后是对一个万亿级市场的押注。

全球6亿知识工作者,每周25%-40%的时间在重复性任务上,其中一半跟网页操作有关。如果每周能省5小时,按时薪25美元算,这是个7500亿美元/年的超级市场。

更别提企业级场景:销售线索自动抓取、竞品价格实时监控、媒体舆情跟踪、招聘简历筛选……个个都是刚需。

开源策略更是妙棋。

5万GitHub星标只是起点,随着开发者社区的涌入,代码贡献和功能迭代会指数级增长,形成技术护城河。

相比之下,闭源竞品想追赶,难度可想而知。风投看中的,正是这种“低成本起飞,高壁垒落地”的打法。

Browser Use的核心逻辑简单到可以用100行代码复现。

我参照源码准备了一个极简版。基于Playwright和OpenAI,核心是个“观察-思考-行动”循环。启动后,它会打开浏览器,抓取页面状态,交给AI决策下一步。

import asyncio
from playwright.async_api import async_playwright
from openai import OpenAI
import json

client = OpenAI()  # 替换为你的AI模型客户端

async def main():
    # 初始化浏览器
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=False)
        page = await browser.new_page()
        
        # 导航到目标网站
        await page.goto("https://example.com")
        
        # 主循环
        for step in range(5):  # 最多执行5步
            # 1. 观察:获取页面状态
            state = await get_page_state(page)
            
            # 2. 思考:让AI决策下一步
            next_action = await get_ai_decision(state)
            print(f"AI决定: {next_action}")
            
            # 如果AI决定完成任务,退出循环
            if next_action["action"] == "done":
                print(f"任务完成: {next_action.get('reason', '')}")
                break
                
            # 3. 行动:执行AI决策
            await execute_action(page, next_action)
            await page.wait_for_load_state("networkidle")
        
        await browser.close()

async def get_page_state(page):
    """获取当前页面状态"""
    # 获取页面基本信息
    url = page.url
    title = await page.title()
    
    # 获取可交互元素
    elements = await page.evaluate("""() => {
        const results = [];
        const all = document.querySelectorAll('a, button, input, select, textarea');
        
        all.forEach((el, index) => {
            const rect = el.getBoundingClientRect();
            // 只收集可见元素
            if (rect.width > 0 && rect.height > 0) {
                results.push({
                    index: index,
                    tag: el.tagName.toLowerCase(),
                    text: el.innerText || el.value || '',
                    type: el.type || '',
                    id: el.id || '',
                    name: el.name || '',
                    className: el.className || ''
                });
            }
        });
        
        return results;
    }""")
    
    # 将元素列表格式化为易读形式
    elements_text = ""
    for el in elements:
        elements_text += f"[{el['index']}] <{el['tag']}> {el['text']} {el['id']}\n"
    
    return {
        "url": url,
        "title": title,
        "elements": elements,
        "elements_text": elements_text
    }

async def get_ai_decision(state):
    """使用AI决定下一步行动"""
    prompt = f"""
    你是一个浏览器自动化助手。根据当前页面状态,决定下一步操作。
    
    当前URL: {state['url']}
    页面标题: {state['title']}
    
    可交互元素:
    {state['elements_text']}
    
    请从以下选择一个动作:
    1. click - 点击元素,参数: index (整数)
    2. input - 输入文本,参数: index (整数), text (字符串)
    3. goto - 导航到URL,参数: url (字符串)
    4. done - 完成任务,参数: reason (字符串)
    
    以JSON格式返回决策,例如: {"action": "click", "index": 2}
    """
    
    response = client.chat.completions.create(
        model="gpt-4",
        messages=[{"role": "user", "content": prompt}],
        response_format={"type": "json_object"}
    )
    
    # 解析AI响应
    try:
        return json.loads(response.choices[0].message.content)
    except:
        # 解析失败时的后备策略
        return {"action": "done", "reason": "无法解析AI响应"}

async def execute_action(page, action):
    """执行AI决定的动作"""
    if action["action"] == "click":
        # 获取元素并点击
        elements = await page.evaluate("""() => {
            const results = [];
            const all = document.querySelectorAll('a, button, input, select, textarea');
            
            all.forEach((el, index) => {
                const rect = el.getBoundingClientRect();
                if (rect.width > 0 && rect.height > 0) {
                    results.push({
                        index: index,
                        rect: {x: rect.x, y: rect.y, width: rect.width, height: rect.height}
                    });
                }
            });
            
            return results;
        }""")
        
        for el in elements:
            if el["index"] == action["index"]:
                # 点击元素中心
                x = el["rect"]["x"] + el["rect"]["width"] / 2
                y = el["rect"]["y"] + el["rect"]["height"] / 2
                await page.mouse.click(x, y)
                return
    
    elif action["action"] == "input":
        # 先点击输入框,再输入文本
        await execute_action(page, {"action": "click", "index": action["index"]})
        await page.keyboard.type(action["text"])
    
    elif action["action"] == "goto":
        # 导航到指定URL
        await page.goto(action["url"])

if __name__ == "__main__":
    asyncio.run(main())

当然,以上都只是术,在AI时代,真正的创新未必是造出新轮子,而是把现有技术拼装成解决痛点的利器,解决需求解决问题才是真正的道。

Browser Use也用4天证明:只要找准场景,简单技术也能撬动亿万市场。

或许,

下一个改变游戏规则的AI应用,就藏在你我的灵感里。等着被4天写出来。



53AI,企业落地大模型首选服务商

产品:场景落地咨询+大模型应用平台+行业解决方案

承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询