はじめに
「AI エージェント」を使おう、とよく聞きます。その中で、「Browser Use」がすごいという記事を見かけました。
AIが勝手にブラウザを操作していろいろやってくれちゃう BrowserUseが爆誕|shi3z
これを友人(@digital24s さん)と一緒に試してみました。
Browser Use を試してみた
Browser Use 0.1.45 および 0.4.4
Browser Use とは
Browse Use
は、ローカル環境のブラウザを LLM が操作できるようにする Python ライブラリです。2024 年 11 月に公開されています。
実行環境を用意する
ウェブブラウザを操作する機能なので、Google Colab のような環境は無理でしょう。Windows 、macOS 、Linux のデスクトップ環境で試してみました。
LLM は Gemini API のようなクラウドサービスを使うので、CPU のみの環境で OK です。
ただし Python は 3.11 以降が要求されています。
Browser Use を使う
Browser Use
をインストールして実行してみます。
まず、必要なライブラリをインストールします。
$ pip install browser-use
Browser Use
は、Microsoft Playwight
と LangChain
を使用しているようです。上記のコマンドで、関連するライブラリもインストールされます。↑
続いて、インストールされた Playwight
環境を初期化します。
$ playwright install
LLM は Gemini API
を使いたいと思います。API キーを取得して環境変数にセットしておきます。
GOOGLE_API_KEY=(予め取得した API キー)
BrowserUse
を使ってウェブブラウザを操作するコードです。↓
import langchain_google_genai
import browser_use
import asyncio
async def main():
# モデルを準備
llm = langchain_google_genai.ChatGoogleGenerativeAI(
model="gemini-2.0-flash",
)
# ブラウザを呼出する準備
browser = browser_use.Browser(
config=browser_use.BrowserConfig(
headless=False,
)
)
# クエリを準備
query = """テレビ番組表を見て、今日のアニメ番組は何があるか教えて下さい。"""
# エージェントを準備
agent = browser_use.Agent(
llm=llm,
task=query,
browser=browser,
)
# エージェントを実行
history = await agent.run()
# 結果を表示
result = history.final_result()
if result:
print(result)
else:
print("検索結果なし")
asyncio.run(main())
LangChain
を使った mcp-use
ライブラリを利用したときのコードに似ていますね。↑
playwright install が実行できなかった
上記の手順で特に難しいところはなさそうですが、幾つかハマりました。
playwright install
しないといけないのですが、実行エラーになりました。↓
'playwright' は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。
playwright
ライブラリは pip でインストールできているはずです。Python プログラムから呼出するのはこれで OK でした。
playwright
ライブラリがブラウザを呼出する準備するために、ライブラリと一緒に実行ファイル playwright
がインストールされていて、これを実行するようです。
Windows の場合、以下の場所に実行ファイルが置かれていました。
%USERPROFILE%\AppData\Roaming\Python\Python(バージョン番号)\Scripts\
上記にパスを通しておくか、以下のコマンドで実行します。
$ python -m playwright install
agent.run() でエラーになった
1 箇月ほど経ってから別の実行環境で、上記の手順とコードを実行したところ、以下のエラー発生しました。
agent = browser_use.Agent(
llm=llm,
"ChatGoogleGenerativeAI" object has no field "ainvoke"
エラー発生しない実行環境の borowser-use
を確認すると、バージョン 0.1.45 でした。エラー発生する実行環境は、バージョン 0.4.4 になっていました。
公式サイトのサンプルコードを見ると、以下が変更されていました。
import browser_use.llm
(中略)
llm = browser_use.llm.ChatGoogle(
model="gemini-2.0-flash"
)
(後略)
従来は langchain
の LLM ライブラリを使用していましたが、browser-use
ライブラリで置換しているようです。
headless モードで実行してみる
上記のコードは実行すると、Chrome
ブラウザが起動して、それが操作されている様子が見られます。これは分かりやすくていいのですが、起動しているブラウザをユーザが触ってしまうと、よろしくありません。そこで headless
モードで実行してみます。
(前略)
browser = browser_use.Browser(
config=browser_use.BrowserConfig(
headless=True, # ヘッドレスモードにしてみる
)
)
(後略)
出力形式を指定する
上記のコードは検索結果を文章で返してくれますが、プログラムで利用し易い形式で取得したいこともあります。そのための機能を browser-use
は用意してくれています。
(前略)
from pydantic import BaseModel
from typing import List
(中略)
class Result(BaseModel):
title: str
station: str
datetime: str
class Results(BaseModel):
results: List[Result]
controller = browser_use.Controller(
output_model=Results
)
query = """テレビ番組表を見て、今日のアニメ番組は何があるか教えて下さい。"""
agent = browser_use.Agent(
llm=llm,
task=query,
browser=browser,
controller=controller
)
history = await agent.run()
result = history.final_result()
if result:
parsed = Results.model_validate_json(result)
print(parsed.results)
(後略)
検索結果が空になった
上記のコードは既存のコードに controller
を指定しただけです。検索結果は同じになるはずですが、実行すると検索結果が空になりました。
Function Call
したときも同様ですが、プログラムの挙動は Python のコードやライブラリの実装でなく、LLM が制御しています。class Result
で指定したデータ構造を見て、ウェブサイトの検索結果から該当する情報を取得しようとして、できなかったようです。
項目名を変えてみます。↓
class Result(BaseModel):
program_title: str
broadcast_station: str
broadcast_datetime: str
結果が取得できるようになりました。
英語圏のテレビ番組表が検索された
実行してみると、以前より検索に時間が掛かりました。ブラウザの挙動を見ていると、英語圏のテレビ番組表を検索していました。これも、class Result
の指定が英語だからでしょうか。
クエリ文に「日本の」を加えておきます。↓
query = """日本のテレビ番組表を見て、今日のアニメ番組は何があるか教えて下さい。"""
日本のテレビ番組表を検索してくれました。