Auction ArenaでLLMエージェントの戦略的意思決定を探る

こんにちは！
株式会社Parksでインターンをしている乾と申します。
普段はデータサイエンスを学んでいる大学2年生です。
本記事では、大規模言語モデル（LLM）を用いたエージェントの戦略的意思決定能力を評価するためのシミュレーション環境である[auction-arena](https://github.com/jiangjiechen/auction-arena)を利用して、オークションエージェントの検証を行った様子を紹介します。

https://github.com/jiangjiechen/auction-arena
## Auction-arenaとは？
Auction Arena（オークションアリーナ）は、大規模言語モデル（LLM）を用いたエージェントの戦略的意思決定能力を評価するためのシミュレーション環境です。この環境では、複数のLLMエージェントが入札者として参加する英国式オークション（競売）を模擬し、限られた予算内で利益最大化を目指して戦略的に入札を行います。

エージェントの意思決定プロセスは、計画（Planning）、入札（Bidding）、信念更新（Belief Update）、再計画（Replanning）の4つのステップに分けられ、オークションの進行に合わせて自身の信念（Belief）、欲求（Desire）、意図（Intention）を更新し、適応的に戦略を立てていきます。

Auction Arenaの目的は、GPT-4やGPT-3.5などの異なるLLMを用いたエージェントの戦略的能力や適応性を定量的に比較・評価することであり、現実世界のオークションや交渉などへのLLMの応用可能性を探るためのベンチマーク環境としても機能します。

## リポジトリのコードを実行する
**本記事の実行環境**
・Mac OS
・Python 3.10.1
リポジトリをクローンし、モジュールのインストールを行います。
```
pip install -r requirements.txt
```
しかし、このまま`python3 app.py`コードを実行すると、
```
ImportError: cannot import name '_signature' from 'langchain_community.chat_models.baichuan'
```
```
pydantic.errors.PydanticUserError: A non-annotated attribute was detected: `openai_cost = 0`. All model fields require a type annotation; if `openai_cost` is not meant to be a field, you may be able to resolve this error by annotating it as a `ClassVar` or updating `model_config['ignored_types']`
```
に遭遇します。順番に説明します。
```
ImportError: cannot import name '_signature' from 'langchain_community.chat_models.baichuan'
```
は、`langchain_community.chat_models.baichuan`内の`_signature`がインポートできないということです。調査を行いましたが、適切な対処法が公開されている様子がなかったので、モジュール内の`_signature`を削除する対応を行いました。

そして、
```
pydantic.errors.PydanticUserError: A non-annotated attribute was detected: `openai_cost = 0`. All model fields require a type annotation; if `openai_cost` is not meant to be a field, you may be able to resolve this error by annotating it as a `ClassVar` or updating `model_config['ignored_types']`
```
はこのリポジトリで用いられているpydanticからの、Pythonの型アノテーションのエラーです。コード内に型定義のされていない変数が多くある為、例を参考に一つ一つ変更を行なって下さい。
```ruby:変更前
openai_cost = 0
```
```ruby:変更後
openai_cost: int = 0
```
特に、一部リストの型定義に関しては、
書き方によって動作に影響を及ぼす為注意してください。
```ruby:例
all_bidders_status: List[Dict[str, Any]] = []
```
**その他の変更点**
・Pythonのバージョンによって一部モジュールの更新を行う必要があります。
・`app.py`内でパスが通ってないjsonファイルがあるので修正して下さい。
```
python3 app.py
```
でデモを実行して下さい。
![スクリーンショット 2024-04-18 12.12.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768156/686fb599-c76f-9d66-072b-af25ea3a3fc7.png)
これでローカルでデモの実行ができます。

## デモを動かしてみる
Auction Arenaにはいくつかの設定可能なパラメータがあり、それらを設定することによって、エージェントの挙動を制御したりすることができます。以下に設定可能なパラメータとその意味を解説します。
・`Number of Bidders`: オークションに参加するエージェントの数を選択できます。
・`Items`: オークションで取引されるアイテムの情報を設定できます。
・`Bidders`: オークションに参加する各エージェントの設定を行えます。
・`Auction Settings`: オークションのルールに関連するパラメータを設定できます。例えば、入札額の最小増加割合、入札ラウンドの最大数などを指定できます。
・`Simulation Settings`: シミュレーションの実行に関連するパラメータを設定できます。
・`Objectives`: エージェントの目的を設定できます。デフォルトでは、エージェントは獲得利益の最大化を目指しますが、落札アイテム数の最大化など、他の目的を設定することも可能です。

## 詳細なパラメータを設定する
実験ではより詳細なパラメータを設定することが可能です。
`items_demo.jsonl`と`bidders_demo.jsonl`で設定が
以下に設定可能なパラメータとその意味を解説します。
・`num_bidders`: オークションに参加するエージェントの数を指定します。エージェント数が多いほど、オークションの競争が激しくなります。
・`num_items`: オークションで提示されるアイテムの数を指定します。アイテム数が多いほど、エージェントは長期的な戦略を立てる必要があります。
・`budget`: 各エージェントに割り当てられる初期予算を指定します。予算が多いほど、エージェントは高額な入札を行うことができます。
・`item_value_range`: アイテムの真の価値の範囲を指定します。この範囲内でランダムに各アイテムの真の価値が決定されます。範囲が広いほど、アイテム間の価値の差が大きくなります。
・`starting_price_factor`: アイテムの開始価格を決定する係数を指定します。真の価値にこの係数を掛けた値が開始価格になります。係数が小さいほど、開始価格が低くなります。
・`bidding_rounds`: 各アイテムに対する入札ラウンドの最大数を指定します。ラウンド数が多いほど、エージェントは入札戦略を調整する機会が増えます。
・`min_increment_percentage`: 入札額の最小増加割合を指定します。前回の最高入札額に対して、この割合以上の額でなければ入札できません。割合が大きいほど、入札額の上昇が激しくなります。
・`num_simulations`: シミュレーションの実行回数を指定します。複数回実行することで、結果の安定性を確認できます。
・`verbose`: シミュレーションの詳細なログを出力するかどうかを指定します。Trueに設定すると、各ラウンドの入札状況などが表示されます。
## デモと実験の実行
デモでは`API Key`を自身のAPIキーで埋め、`Start Bidding`でデモをスタートさせて下さい。画面下部にオークションの様子を見る事ができます。
実験では
```
export OPENAI_API_KEY=xxx
export ANTHROPIC_API_KEY=xxx
export GOOGLE_API_KEY=xxx
```
で自身のAPIキーを読み込んだ後、
```
python3 auction_workflow.py --input_dir data/example --repeat 1 --shuffle --threads 2
```
を実行して、実験を行う事ができます。
###### 実験の設定
モデル
・Bidder1,3 GPT-4
・Bidder2,4 GPT-3.5
アイテム数:5
Widget A: 開始値:＄1000 価値:$2000　

Gadget B: 開始値:＄1000 価値:$2000

Thingamajig 開始値:＄1000 価値:$2000

Doodad D: 開始値:＄1000 価値:$2000

Equipment E: 開始値:$5000  価値:＄10000
## 結果と考察
獲得アイテム数と利益
・Bidder 1（GPT-4）　アイテム数:3 利益:$1800
・Bidder 2（GPT-3.5） アイテム数:1 利益:$100
・Bidder 3（GPT-4） アイテム数:1 利益:$3500
・Bidder 4（GPT-3.5） アイテム数:0 利益:$0
Auction Arenaを用いて、GPT-4とGPT-3.5ベースのエージェントの戦略的意思決定を探るシミュレーション実験を行いました。各エージェントは、与えられた情報を基に独自の戦略を立て、オークションの進行に合わせて入札行動を適応させていきました。

実験の結果、GPT-4ベースのエージェントが最も高い利益を上げ、GPT-3.5ベースのエージェントを上回る戦略的意思決定能力を示しました。GPT-4エージェントは、アイテムの優先度を適切に設定し、状況に応じて柔軟に戦略を調整することで、効果的な資源配分を実現しました。一方、GPT-3.5エージェントは、過剰入札や早期撤退などの非合理的な行動が見られ、利益の最大化に至りませんでした。

LLMの性能が高いほど、戦略的意思決定に優れると読み取る事ができますが、同じGPT-3.5ベースのエージェント間でも戦略や結果に差が見られたことから、モデルの性能だけでなく、戦略の選択や実装方法も重要であることがわかりました。

また、本実験では、エージェントの戦略的意思決定における適応性の重要性が浮き彫りになりました。オークションの状況は刻一刻と変化するため、事前に立てた戦略を盲目的に実行するだけでは不十分です。GPT-4エージェントは、各ラウンド後に beliefs を更新し、残りのアイテムの優先度を適切に調整することで、状況の変化に柔軟に対応していました。この適応性が高い利益につながったと考えられます。

## まとめ
本記事では、大規模言語モデル（LLM）を用いたエージェントの戦略的意思決定能力を評価するため、Auction Arenaを用いたシミュレーションを行いました。GPT-4とGPT-3.5ベースのエージェントを比較した結果、GPT-4エージェントが優れた戦略的意思決定能力を示し、より高い利益を上げることができました。
本実験により、LLMの性能が高いほど、戦略的意思決定に優れることがわかりました。さらに、エージェントの適応性、すなわち状況の変化に応じて戦略を柔軟に調整する能力の重要性が明らかになりました。一方で、過剰入札のリスクや他のエージェントの行動予測の難しさなど、LLMエージェントの戦略的意思決定における課題も浮き彫りになりました。