【ServiceNow】AgentLab を触ってみる

:::note
この記事は ServiceNow アドベントカレンダー 2024 の12月20日分（シリーズ２）の記事として執筆しています。
:::

https://qiita.com/advent-calendar/2024/servicenow

## はじめに

昨今の ServiceNow 社の生成AIに対する力の入れっぷり、すごいですよね。
今年初めのモーサテでも注目されていました[^1]。

[Now Assist for Code](https://www.servicenow.com/docs/ja-JP/bundle/vancouver-api-reference/page/script/now-assist-for-code/concept/now-assist-code-landing.html) や [Flow Assist](https://www.servicenow.com/docs/ja-JP/bundle/washingtondc-build-workflows/page/administer/flow-designer/concept/flow-assist.html) など、革新的な機能を次々とリリースしている ServiceNow 社。今後はどのような機能をリリースして社会に変革をもたらそうとしているのでしょうか？

今回は、ServiceNow 社が開発するオープンソースの Python パッケージ "AgentLab" を触ってみたいと思います。

https://github.com/ServiceNow/AgentLab

## とりあえず動かしてみる

以下の環境で動作確認済みです。また、OpenAI[^2] の API 鍵が別途必要です。

- MacBook Pro M1
- Python 3.11.7


### AgentLab のインストール

ディレクトリを作って移動します。
```
mkdir AgentLab
cd AgentLab
```

Pythonの仮想環境を作ってアクティベートします。
```
python -m venv venv
. venv/bin/activate
```

AgentLab および Playwright（Webアプリケーション向けテスト自動化フレームワーク）をインストールします。
```
pip install agentlab
playwright install
```

環境変数 `OPENAI_API_KEY` に OpenAI の API 鍵を登録します。
```
export OPENAI_API_KEY=<OpenAIのAPI鍵>
```

### 動かしてみる

`agentlab-assistant` コマンドを実行します。 `--start_url` オプションで初期ページ（デフォルトは `https://www.google.com`）を指定できます。

```
agentlab-assistant --start_url=https://www.amazon.co.jp/
```

指定した Web ページとチャット画面が表示されるので、チャット欄に何か入力してみましょう。

![agentlab-assistant.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632778/90f67cdd-cd20-6a38-7e5f-fb6b856fe975.gif)

デフォルトの `agentlab-assistant` コマンドは `click`（クリックする）、`dblclick`（ダブルクリックする）、`fill`（文字を入力する）などのブラウザを操作するアクションに特化しています（「画面上の内容を読み取って要約する」といったことはできません）。
こちらの入力したプロンプトに従って、的確に欲しい商品をカートに追加してくれていることがわかります。

## 結局 AgentLab って何なの？

AgentLab は、ServiceNow が開発する **Web エージェントの開発と評価を支援するためのフレームワーク**です。Web エージェントの開発者に向けて提供される機能群であり、**消費者向けの製品ではありません。**

## MiniWoB++ でベンチマークテストしてみる

具体的な利用例の一つとして、AgentLab で Web エージェントのベンチマークテストをしてみましょう。

MiniWoB++ は Web インターフェース上で強化学習エージェントの性能を評価するためのベンチマーク環境です。

Web エージェントの設計手法として強化学習によるアプローチが注目されてきましたが、強化学習ベースの Web エージェントには「膨大なデータと計算リソースが必要」「特定のタスクや環境に特化しやすく、汎用性が低い」といった課題がありました。
事前学習された大規模データを活用する LLM の登場により、**ゼロショットで多目的なタスクに対応できる Web エージェントをより容易に実現できる**ことが期待されます。

今回は GPT-4o mini を使用して、MiniWoB++ ベンチマークを実行します。

### MiniWoB++ のインストール

`browsergym-miniwob` をインストールします。

```
pip install browsergym-miniwob
```

GitHubの `miniwob-plusplus` リポジトリをローカルマシンにクローンします。

```
git clone git@github.com:Farama-Foundation/miniwob-plusplus.git
git -C "./miniwob-plusplus" reset --hard 7fd85d71a4b60325c6585396ec4f48377d049838
```

`Error: Permission denied (publickey)` のようなメッセージが出る場合は、下記の手順に従って GitHub アカウントに SSH 鍵が登録されていることを確認します。
- [新しい SSH キーを生成して ssh-agent に追加する](https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent)
- [GitHub アカウントへの新しい SSH キーの追加](https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account)

作業中のディレクトリに `miniwob-plusplus` というディレクトリが作成され、その配下の `miniwob/html/miniwob` ディレクトリにベンチマーク用の HTML ファイルが格納されるので、そちらのディレクトリを環境変数 `MINIWOB_URL` に登録します。

```
export MINIWOB_URL="file://$PWD/miniwob-plusplus/miniwob/html/miniwob/"
```

### ベンチマークの実行

以下の Python スクリプトを作成してベンチマークを実行します。

```python:study.py
from agentlab.agents.generic_agent import AGENT_4o_MINI,AGENT_4o
from agentlab.experiments.study import make_study

study = make_study(
    benchmark="miniwob",
    agent_args=[AGENT_4o_MINI],
    comment="My first study",
)

study.run(n_jobs=1)
```

5行目でベンチマークの種類を、6行目で使用する LLM モデルを指定できます。
利用できるベンチマークには MiniWoB++ のほか、ServiceNow の PDI 環境でベンチマークを実行する "WorkArena[^3]" や、より一般的な Web サイトを想定した "WebArena" などが指定できます。

![study.py](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632778/a0d254a5-9ddd-6374-e593-77c0a18ad497.png)

ベンチマークの進行状況は Web ブラウザで `http://127.0.0.1:8265` にアクセスして確認できます。全部で625個のベンチマークタスクが存在し、すべて完了するまでに２時間半ほどかかりました。

![Dashboard](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632778/b697a73f-42c8-23de-303b-8cc9eb99dc74.png)

ちなみに MiniWoB++ ベンチマークの実行にかかった費用ですが、 **GPT-4o mini の場合１ドル程度**でした。GPT-4o でも試してみましたが、クレジットがみるみる削られていったため強制停止しました。

### 実行結果の確認

実行結果は以下のコマンドを実行し、 Web ブラウザで `http://127.0.0.1:7860` にアクセスして確認できます。

```
agentlab-xray
```

"Select Experiment Directory" をクリックして、MiniWoB++ のベンチマーク結果を選択します。

![agentlab-xray](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632778/1a97b261-3c56-48da-edc6-e60581e2aa66.png)

ディレクトリ名の隣に `avg-reward: xx.x% - completed: xxx/625 - errors: x` といった形式で実行結果の概要が表示されます。

個々のタスクの結果を確認するには "Select Task and Seed" タブを参照します。
こちらは試行回数：５回中すべて成功したタスク。Web メールを模した画面から指定した送信者のメールを探して返信せよ、というもの。

![miniwob.email-inbox-reply](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632778/da39c79e-5939-d46b-fafc-4c4b9652b0cc.png)

こちらは５回すべて失敗した、航空便予約システムのタスク。
GPT-4o mini の場合、カレンダーの日付をクリックするといったピンポイントのクリック作業が苦手なようです。

![miniwob.book-flight](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632778/8b5e97d9-6846-f048-11bf-00cdf60a4c70.png)

## まとめ

ServiceNow社は「責任あるAI」の取り組みに力を入れており、**透明性と説明責任を重視したAIの開発**を推進しています[^4][^5]。その一環として、LLM ベースの Web エージェント開発を促進する機能もオープンソースで公開しているのではないかと思われます。

近い将来、問い合わせユーザーからの質問に対して自律型の AI エージェントが ServiceNow を自動制御し、解決まで導いてくれるような未来が訪れるのかもしれませんね。

## 参考

https://www.marktechpost.com/2024/12/04/servicenow-releases-agentlab-a-new-open-source-python-package-for-developing-and-evaluating-web-agents/

[^1]: https://x.com/kame_taro_kabu1/status/1754706650576171019
[^2]: その他 Azure, OpenRouter の APIも利用可能とのこと
[^3]: https://www.servicenow.com/blogs/2024/introducing-workarena-benchmark
[^4]: https://huggingface.co/bigcode
[^5]: https://arxiv.org/pdf/2305.06161