最近有个非常火的项目,利用大模型Agent驱动浏览器完成各种操作,如网页搜索、爬虫分析、机票酒店预定、股票监控等,号称全面替代所有在浏览器上的操作,试用方式还是比较简单的,以下将进行简单介绍。
快速开始
通过pip安装:
pip install browser-use
安装web自动化框架:
playwright install
Playwright微软开源的一个浏览器自动化框架,主要用于浏览器自动化执行web测试,提供强大的 API 集,适用于所有现代浏览器。
设置好大模型API KEY,填入.env文件:
OPENAI_API_KEY=
创建智能体,指定命令:
from langchain_openai import ChatOpenAI
from browser_use import Agent
import asyncio
from dotenv import load_dotenv
load_dotenv()
async def main():
agent = Agent(
task="Go to Reddit, search for 'browser-use', click on the first post and return the first comment.",
llm=ChatOpenAI(model="gpt-4o"),
)
result = await agent.run()
print(result)
asyncio.run(main())
模型支持
API
所有适配LangChain chat接口并且支持工具调用的模型理论上都支持,但小模型在解析过程中错误率不可忽视。GPT-4o和DeepSeek-V3这类模型比较合适,推荐DeepSeek-V3,价格更加便宜。
from langchain_openai import ChatOpenAI
from browser_use import Agent
from pydantic import SecretStr
# Initialize the model
llm=ChatOpenAI(base_url='https://api.deepseek.com/v1', model='deepseek-chat', api_key=SecretStr(api_key))
# Create agent with the model
agent = Agent(
task="Your task here",
llm=llm,
use_vision=False
)
本地模型
本地大模型可以使用Ollama,需要从Ollama官网选择支持工具调用的大模型。
调用方式同样非常简单,使用langchain_ollama加载模型即可:
from langchain_ollama import ChatOllama
from browser_use import Agent
from pydantic import SecretStr
# Initialize the model
llm=ChatOllama(model="qwen2.5", num_ctx=32000)
# Create agent with the model
agent = Agent(
task="Your task here",
llm=llm
)
设置
Agent设置
Agent支持如下参数:
● task:需要大模型完成的基本指令
● llm:大模型,需要支持工具调用,并且适配langchain_chat相关的接口
● controller:大模型可选的工具集
● use_vision:是否开启视觉检测
● save_conversation_path:log的存放路径,用于保存模型每次交互的产生的对话
浏览器设置
browser支持如下参数:
● headless:是否打开浏览器tab并显示
● disable_security : 浏览器安全设置,比如跨域等
● proxy :设置代理
from browser_use import BrowserConfig
# Basic configuration
config = BrowserConfig(
headless=False,
disable_security=True
)
本地浏览器
除了用Playwright启动Chromium之外,也支持使用用户实际的浏览器,如:chrome。这样的话agent可以实际操作用户需要登陆账户的一些网站。
# 需要设置app的路径
from browser_use import Agent, Browser, BrowserConfig
from langchain_openai import ChatOpenAI
import asyncio
# Configure the browser to connect to your Chrome instance
browser = Browser(
config=BrowserConfig(
# Specify the path to your Chrome executable
chrome_instance_path='/Applications/Google Chrome.app/Contents/MacOS/Google Chrome', # macOS path
# For Windows, typically: 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe'
# For Linux, typically: '/usr/bin/google-chrome'
)
)
# Create the agent with your configured browser
agent = Agent(
task="Your task here",
llm=ChatOpenAI(model='gpt-4o'),
browser=browser,
)
async def main():
await agent.run()
input('Press Enter to close the browser...')
await browser.close()
if __name__ == '__main__':
asyncio.run(main())
自定义输出格式
agent默认的输出结果是文本,同时也支持自定义输出格式,实现结构化输出。
from pydantic import BaseModel
# Define the output format as a Pydantic model
class Post(BaseModel):
post_title: str
post_url: str
num_comments: int
hours_since_post: int
class Posts(BaseModel):
posts: List[Post]
controller = Controller(output_model=Posts)
async def main():
task = 'Go to hackernews show hn and give me the first 5 posts'
model = ChatOpenAI(model='gpt-4o')
agent = Agent(task=task, llm=model, controller=controller)
history = await agent.run()
result = history.final_result()
if result:
parsed: Posts = Posts.model_validate_json(result)
for post in parsed.posts:
print('\n--------------------------------')
print(f'Title: {post.post_title}')
print(f'URL: {post.post_url}')
print(f'Comments: {post.num_comments}')
print(f'Hours since post: {post.hours_since_post}')
else:
print('No result')
if __name__ == '__main__':
asyncio.run(main())
系统提示词
与普通调用大模型情况类似,agent也支持系统提示词,用于给大模型设置好一些基本要求。
系统提示词会显示影响agent的准确率和性能,需要选择性使用
from browser_use import Agent, SystemPrompt
class MySystemPrompt(SystemPrompt):
def important_rules(self) -> str:
# Get existing rules from parent class
existing_rules = super().important_rules()
# Add your custom rules
new_rules = """
9. MOST IMPORTANT RULE:
- ALWAYS open first a new tab and go to wikipedia.com no matter the task!!!
"""
# Make sure to use this pattern otherwise the exiting rules will be lost
return f'{existing_rules}\n{new_rules}'
from langchain_openai import ChatOpenAI
# Initialize the model
model = ChatOpenAI(model='gpt-4o')
# Create agent with custom system prompt
agent = Agent(
task="Your task here",
llm=model,
system_prompt_class=MySystemPrompt
)
敏感信息隐藏
通过sensitive_data参数可以进行敏感信息隐藏,这样在调用大模型API的时候不会把用户隐私暴露出去。大模型只会收集到设置好的参数名,具体的参数内容由本地进行字符串替换。
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from browser_use import Agent
load_dotenv()
# Initialize the model
llm = ChatOpenAI(
model='gpt-4o',
temperature=0.0,
)
# Define sensitive data
# The model will only see the keys (x_name, x_password) but never the actual values
sensitive_data = {'x_name': 'magnus', 'x_password': '12345678'}
# Use the placeholder names in your task description
task = 'go to x.com and login with x_name and x_password then write a post about the meaning of life'
# Pass the sensitive data to the agent
agent = Agent(task=task, llm=llm, sensitive_data=sensitive_data)
async def main():
await agent.run()
if __name__ == '__main__':
asyncio.run(main())
如果开启了视觉检测,则页面中的隐私内容有可能会被识别到
基本操作
定义了一些模型的基本动作,如谷歌搜索、打开url、组件点击等,用于对浏览器或者web进行操作。
# Action Input Models
class SearchGoogleAction(BaseModel):
query: str
class GoToUrlAction(BaseModel):
url: str
class ClickElementAction(BaseModel):
index: int
xpath: Optional[str] = None
class InputTextAction(BaseModel):
index: int
text: str
xpath: Optional[str] = None
class DoneAction(BaseModel):
text: str
class SwitchTabAction(BaseModel):
page_id: int
class OpenTabAction(BaseModel):
url: str
class ScrollAction(BaseModel):
amount: Optional[int] = None # The number of pixels to scroll. If None, scroll down/up one page
class SendKeysAction(BaseModel):
keys: str
class ExtractPageContentAction(BaseModel):
value: str
最后
整个项目实际测试下来实用性不是很强,甚至连完成简单的谷歌搜索都得好一会儿,从后端的日志看应该是模型一些思考过程太多、步骤太冗余导致的。不过页面的html结构识别还比较完善,这对于精确触发一些页面事件应该是个好事。
目前看来比较实用的agent就是Deep Research这类项目,利用推理模型的推理能力+联网搜索整合出完善的研究报告。随着越来越多强大的推理模型的诞生,2025年应该会有更多类似的大模型agent应用爆发出来,希望不再局限于网页搜索和爬虫这类toy项目。