开启左侧

揭秘 ManusAI:AI Agent 网页交互才能是如何完成的

[复制链接]
Manus 是尔平常最经常使用的通用 Agent,上篇文章介绍了 ManusAI破费 万万好金正在 AI Agent 高低文工程上的经历战经验(掀秘ManusAI:AI Agent 高低文工程经历分享)。原篇文章尔将介绍下通用 Agent 操纵浏览器截至页里浏览战举动是怎样完毕的(参照启源名目 OpenManus 的代码完毕)。
browser-use 是甚么

browser-use 是一个启源名目,旨正在让 AI Agent 能够轻快天会见战操纵网站,进而完毕收集任务的主动化。复杂 来讲,它便像一个跟尾 AI 战浏览器的桥梁,让您能够颠末天然语言指令去掌握浏览器完毕各类任务。
主要功用战特性:

    • 天然语言掌握:用户能够颠末简朴的天然语言(比方,“翻开忙鱼搜刮 iphone16”)去批示 AI Agent 施行浏览、搜刮、数据提炼等一系列操纵。• 主动化任务:它能够主动化各类正在线任务,比方商品价钱多仄台比力、多野公司联系方法盘问等。•强大 的手艺撑持:该名目鉴于 Python,并散成为了 Playwright 等浏览器主动化东西。 它撑持多种庞大语言模子(LLM),如 GPT-四、Claude 战 DeepSeek。• 可望化取接互:除颠末代码运行,browser-use  借供给了 Web UI 战桌里使用,便利用户截至尝试战接互。 它以至能够天生任务施行历程的 GIF 动图,让过程洞若观火。• 并止处置才气:取人类挨次性的事情方法差别,该名目的一年夜劣势是能够并止处置类似的任务,例仿佛时搜刮提炼 iphone、mac 商品疑息,极地面进步了服从。
事情道理

browser-use 的事情过程归纳综合:
    1.捕捉 浏览器形状:起首获得浏览器目前页里的及时形状。2. LLM 决议计划:将捕捉到的疑息调整后接由庞大语言模子(LLM)截至阐发战决议计划,鉴别下一步需要施行甚么操纵。3. 执举措做:按照 LLM 的决议计划,施行响应的浏览器操纵(如面打、输出等)。4. 轮回:重复以上步调,曲到完毕预设的终极任务。
使用 Demo

因为最新版原使用 Chrome 的 CDP 和谈,尔当地机械启用报错,改成使用旧版原:`0.1.40`。
import asyncio
import os

from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from browser_use import Agent

load_dotenv()
api_key = os.getenv('DEEPSEEK_API_KEY', '')

asyncdefrun_search():
    agent = Agent(
       task=(
          "1.翻开 https://www.goofish.com"
          "2. 正在搜刮框中搜刮 'iphone15promax' "
          "3.依据 价钱排序,列出前2页的商品称呼战价钱"
       ),
       llm=ChatOpenAI(
          base_url='https://api.deepseek.com/v1',
          model='deepseek-chat',
          api_key=api_key,
       ),
       use_vision=False,
    )

    await agent.run()

if __name__ == '__main__':
    asyncio.run(run_search())

提炼构造:
{
  "products":[
    {
      "name":"拍坐患上Nowgen2国止+箱道完整+戴充电线+功用残破+镜片完整 +99新(拍过多少弛|要崭新的自己来TB购)(彩虹违戴➕相纸另➕),识货的去,自提劣先。",
      "price":"¥660"
    },
    {
      "name":"【举动价】智格初级 紫色胡蝶腕戴,适宜苹因15pro、iPhone 14 Pro Max、13 Pro Max、12 Pro机型。色彩有羽纱紫色胡蝶、喷鼻芋紫褶皱丝巾腕戴、浅紫皮斜挎。女款设想,时髦百拆。数目无限,先到先患上!",
      "price":"¥15"
    },
    {
      "name":"苹因15Pm,卡揭9成新,4399,没有刀,需要的联系 感兴致的话面“尔念要”战尔公聊吧~",
      "price":"¥4399"
    }
    // ...
]
}
掀秘 ManusAI:AI Agent 网页接互才气是怎样完毕的w2.jpg

终极法式输出了忙鱼前二页搜成果的商品题目战价钱。如许咱们就能够把该输出文原接由后绝的 Agent中止 处置。
tips

假设 Playwright 正在 macOS 情况下启用 Chromium 浏览器时碰到 FileNotFoundError 报错,则暗示 Playwright 没法找到或者启用其下载的 Chromium 浏览器可施行文献。

从头装置 Playwright 浏览器启动

请正在您的末端中运行如下号令,保证统统 Playwright 撑持的浏览器皆已经准确装置:
playwright install --with-deps
那个号令会装置统统浏览器及其依靠项。假设以前装置过,它也会测验考试建设或者革新。
OpenManus 中使用

正在 OpenManus 中,browser-use 被定位为一个中心的东西,特地用于处置取浏览器相干的操纵。颠末 browser-use,OpenManus 中的 Agent 能够完毕如下枢纽功用:
    1. 网页导航:会见指定的 URL,完毕页里跳转。2. 元故旧互:面打按钮、输出文原、挑选下推菜单项等,模仿用户正在网页上的操纵。3. 疑息提炼:获得目前页里的实质、提炼一定元艳的属性,进而理解网页上的疑息。4. 会话办理:办理浏览器会话,包罗翻开新标签页、封闭标签页、封闭浏览器等,以适应庞大任务的需要。5.形状 感知:获得浏览器目前形状的快照,包罗目前 URL、翻开的标签页、和页里上可接互元艳的具体疑息,那关于 Agent 的决议计划相当主要。

这类散成方法使患上 Agent 能够将庞大的网页操纵抽象为一系列可施行的东西挪用,进而将肉体集合正在更下条理的决议计划战计划上,而没有是下层的浏览器操纵细节。
Prompt

先瞅下 OpenManus 的 Browser 的 Prompt,地点:https://github.com/FoundationAgents/OpenManus/blob/main/app/prompt/browser.py

枢纽构成部门:
1. Agent 脚色界说

提醒词汇起首大白了 Agent 的身份战目标:
You are an AI agent designed to automate browser tasks. Your goal is to accomplish the ultimate task following the instructions below.
那为 Agent 设定了明了的高低文,使其明白自己是一个特地用于浏览器主动化的 AI,而且其中心目标是完毕用户给定的终极任务。
2.输出 格局 (Input Format)

为了让 Agent 能够理解目前的浏览器形状战任务平息,提醒词汇界说了具体的输出格局,包罗:
    • Task:Agent 需要完毕的终极任务描绘。• Previous steps:Agent已经 完毕的步调,那有帮于 Agent坚持 任务的毗连性。• Current URL:目前浏览器页里的 URL,供给高低文疑息。• Open Tabs:目前翻开的统统标签页列表,让 Agent理解 多标签页的情况。• Interactive Elements:那是最枢纽的部门,它以构造化的方法列出了目前页里上统统可接互的元艳。每一个元艳皆包罗 index(用于接互的唯一标记符)、type(HTML 元艳范例,如 button、input 等)战 text(元艳的描绘或者看来文原)。

比方:[33]<button>Submit Form</button>,这类格局使患上 Agent 能够明了天识别页里上的可操纵项,并按照其索引截至精确操纵。提醒词汇借夸大,只需戴无数字索引的元艳才是可接互的,不索引的元艳仅供给高低文疑息。
3.照应 划定规矩 (Response Rules)

提醒词汇严峻划定了 Agent 的照应格局,请求必需是有用的 JSON 格局,包罗 current_state 战 action 二个主要字段:
    • current_state:
      • evaluation_previous_goal:对于上一个目标的评介成果(Success、Failed 或者 Unknown),用于自尔改正战进修。• memory:Agent 的影象,用于描绘已经完毕的事情战需要记着的疑息,并夸大要十分具体,以至记载测验考试次数。• next_goal:Agent 的下一个立即目标,那是 Agent 计划下一步举措的枢纽。
    • action:一个包罗一个或者多个行动的列表。固然提醒词汇许可指定多个行动,但是出格夸大 “always specify only one action at a time”(屡屡只指定一个行动),那可以是为了简化 LLM 的拉理庞大性或者保证操纵的本子性。
4. 经常使用行动 (Co妹妹on action sequences)

提醒词汇枚举了 Agent 能够施行的经常使用浏览器操纵,并分析了每一个行动所需的参数:
    • click:面打元艳(index)。• type:正在输出框中输出文原(index, text)。• goto:导航到指定 URL(url)。• scroll:转动页里(direction,"up" 或者 "down")。• evaluate:施行 JavaScript 代码(code)。• screenshot:截与屏幕截图(path)。• finish:暗示任务完毕(result)。

大白的行动界说战参数请求,使患上 LLM 能够天生契合预期的、可施行的浏览器操纵指令。提醒词汇中借包罗了一个具体的示例,展示了输出战输出的残破过程,那关于 LLM理解 任务战天生准确照应相当主要。
BrowserAgent中心 逻辑

OpenManus 正在 app/agent/browser.py 中完毕了 BrowserAgent,它是担当施行浏览器任务的中心 Agent。BrowserAgent承袭 自 ToolCallAgent,暗示它是一个能够挪用内部东西去完毕任务的 Agent。其中心逻辑环绕着 BrowserContextHelper 战 run办法 睁开。
1. BrowserContextHelper:浏览器形状的感知器

BrowserContextHelper 是 BrowserAgent 的一个内部帮助类,它担当取下层的 BrowserUseTool中止 接互,以获得目前的浏览器形状。其主要功用体现在 get_browser_state办法 中:
class BrowserContextHelper:
    # ...
    @model_validator(mode="after")
    def get_browser_state(self) -> Optional[dict]:
        browser_tool = self.agent.available_tools.get_tool(BrowserUseTool.name)
        # ...
        try:
            state = browser_tool.get_current_state()
            self.current_base64_image = state.get("screenshot")
            return state
        # ...
那个办法颠末挪用 BrowserUseTool 的 get_current_state()办法 去获得浏览器目前的具体形状,包罗目前 URL、DOM构造 (颠末 Interactive Elements出现 )、和可选的屏幕截图(screenshot)。current_base64_image 字段用于保存页里的 Base64 编码截图,那使患上 Agent 能够截至望觉感知,进而更佳天理解页里计划战实质。BrowserContextHelper 保证了 BrowserAgent不断 能够获得到最新的、全面的浏览器情况疑息,那是其截至有用决议计划的根底。
2. BrowserAgent 的 run办法 取提醒词汇散成

BrowserAgent 的 run办法 是其施行任务的进口。正在屡屡施行任务时,它起首会挪用 self.context_helper.get_browser_state() 去革新对于浏览器形状的感知。而后,它会使用 ToolCallAgent 的才气,将那些形状疑息取任务描绘分离,天生一个残破的提醒词汇,收收给 LLM中止 拉理。LLM依据 提醒词汇天生下一步的举措方案,BrowserAgent 再将那些举措指令通报给 BrowserUseTool 去施行。
class BrowserAgent(ToolCallAgent):
    # ...
    def__init__(self, **data):
        super().__init__(**data)
        self.context_helper = BrowserContextHelper(self)

    async defrun(self, message: Message) -> Message:
        self.context_helper.get_browser_state() # 获得最新浏览器形状
        returnawaitsuper().run(message) # 将形状战任务通报给 LLM 并施行

    def get_prompt_template(self) -> str:
        return SYSTEM_PROMPT # 前去体系提醒词汇模板

    def get_next_step_prompt_template(self) -> str:
        return NEXT_STEP_PROMPT # 前去下一步提醒词汇模板

    def get_tools(self) -> ToolCollection:
        return ToolCollection([BrowserUseTool, Terminate]) # 备案可用的东西

    def get_tool_choice(self) -> ToolChoice:
        return ToolChoice(type="tool", function=BrowserUseTool.name) # 默认挑选 BrowserUseTool

    def get_image(self) -> Optional[str]:
        return self.context_helper.current_base64_image # 供给目前页里的截图
BrowserAgent 颠末 get_prompt_template 战 get_next_step_prompt_template办法 ,将预约义的 SYSTEM_PROMPT 战 NEXT_STEP_PROMPT(正在 app/prompt/browser.py 中界说)供给给 LLM。那些提醒词汇包罗了 Agent 的脚色、输出格局、照应划定规矩战可执举措做的具体分析,保证 LLM 能够天生契合预期的、可施行的浏览器操纵指令。
东西启拆:BrowserUseTool 的功用完毕

OpenManus 正在 app/tool/browser_use_tool.py 中对于 browser-use 库截至了启拆,创立了 BrowserUseTool。那个东西是 BrowserAgent 取理论浏览器操纵之间的桥梁。它将 LLM 天生的抽象行动指令,转移为 browser-use 库的具体 API 挪用。
1. BrowserUseTool 的初初化取性命周期办理

BrowserUseTool 是一个单例情势的东西,保证只需一个浏览器真例正在运行。它正在初初化时会创立 BrowserUseBrowser 战 BrowserContext 真例:
class BrowserUseTool(BaseTool, Generic[T]):
    # ...
    _browser: Optional[BrowserUseBrowser] = None
    _context: Optional[BrowserContext] = None

    @model_validator(mode="after")
    def init_browser(self, info: ValidationInfo) -> "BrowserUseTool":
        if BrowserUseTool._browser is None:
            BrowserUseTool._browser = BrowserUseBrowser(
                config=BrowserConfig(headless=config.browser_headless)
            )

        if BrowserUseTool._context is None:
            BrowserUseTool._context = BrowserContext(
                browser=BrowserUseTool._browser,
                config=BrowserContextConfig(
                    dom_service=DomService(llm=LLM.get_instance())
                ),
            )
        return self
    # ...
那里值患上留神的是,BrowserConfig 中的 headless 参数能够颠末 config.browser_headless中止 设置,那表示着用户能够挑选可否正在无头情势下运行浏览器(即可否显现浏览器界里)。BrowserContextConfig 中借散成为了 DomService,而且 DomService内部 使用了 LLM.get_instance(),那表白 browser-use 库自己也可以使用 LLM 去帮助处置 DOM 相干的任务,比方剖析庞大的 DOM构造 或者识别接互元艳。
2. _run办法 :行动的调理中间

BrowserUseTool 的中心功用体现在其同步的 _run办法 中。那个办法领受 LLM 天生的 action 参数,并按照 action 的值挪用 browser-use 库中对于应的浏览器操纵办法:
    async def _run(self, **kwargs) -> ToolResult:
        action = kwargs.pop("action")

        if action == "goto":
            url = kwargs.get("url")
            # ...
            await BrowserUseTool._context.goto(url)
            # ...
        elif action == "click":
            index = kwargs.get("index")
            # ...
            await BrowserUseTool._context.click(index)
            # ...
        # ... 其余行动的完毕 ...
        elif action == "get_current_state":
            state = await BrowserUseTool._context.get_current_state()
            return ToolResult(success=True, message="Current browser state retrieved", content=state)
        # ...
        elif action == "web_search":
            query = kwargs.get("query")
            # ...
            search_tool = WebSearch()
            search_result = await search_tool.run(query=query)
            return ToolResult(success=True, message="Web search performed", content=search_result.content)
        # ...
_run办法 笼盖了提醒词汇中界说的统统经常使用行动,包罗 goto、click、type、scroll、get_current_state、get_page_content、get_element_attributes、take_screenshot、new_tab、close_tab、close_browser。出格值患上留神的是,BrowserUseTool 借启拆了 WebSearch 东西,那表示着 BrowserAgent 不但能够间接操纵浏览器,借能够施行网页搜刮,那退一步增强了其疑息获得才气。
3. get_current_state办法 :共步形状获得

BrowserUseTool 借供给了一个共步的 get_current_state办法 ,供 BrowserContextHelper 挪用。固然 browser-use 的中心操纵是同步的,但是为了适应 Agent 框架中可以存留的共步形状获得需要,那里使用了 asyncio.run 去共步施行同步的 get_current_state 挪用:
    def get_current_state(self) -> Optional[dict]:
        if BrowserUseTool._context:
            # This is a synchronous call for the agent to get the current state
            # In a real async environment, this might need to be handled differently
            return asyncio.run(BrowserUseTool._context.get_current_state())
        return None
这类设想保证了 Agent即使 正在共步高低文中也能获得到最新的浏览器形状,固然正在杂同步情况中可以需要更文雅的处置方法。
归纳取瞻望

OpenManus 对于 browser-use 的散成是一个典范的 Agent 框架怎样使用内部东西扩大自己才气的案例。颠末经心设想的提醒词汇、模块化的 Agent 完毕战功用丰硕的东西启拆,付与 Agent强大 的网页接互才气。

便体会上来道,OpenManus 对于 browser-use 的使用借能够退一步劣化:
    • 更智能的 DOM 剖析:使用更先辈的望觉语言模子(VLM)间接从屏幕截图理解页里,削减对于构造化 Interactive Elements 的依靠。• 任务计划取合成:增强 Agent 主动将庞大任务合成为更小、更容易办理的子任务的才气。• 毛病规复取自愈:当碰到浏览器操纵失利时,Agent 能够更智能天诊疗成就并测验考试差别的战略截至规复。
参照文件

    • browser-use: https://github.com/browser-use/browser-use• OpenManus: https://github.com/FoundationAgents/OpenManus

朝期文章:
    • 掀秘ManusAI:AI Agent 高低文工程经历分享• Agent开辟必读:消耗级Agent的12个中心绳尺• Context Engineering(高低文工程)是 AI Agent 胜利的枢纽吗?
您需要登录后才可以回帖 登录 | 立即注册 qq_login

本版积分规则

发布主题
阅读排行更多+
用专业创造成效
400-778-7781
周一至周五 9:00-18:00
意见反馈:server@mailiao.group
紧急联系:181-67184787
ftqrcode

扫一扫关注我们

Powered by 职贝云数A新零售门户 X3.5© 2004-2025 职贝云数 Inc.( 蜀ICP备2024104722号 )