TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

【論文】Voyager: An Open-Ended Embodied Agent with Large Language Models

GPT-4を使って、マインクラフトで初めてダイアモンドを獲得したLLMを利用したエージェントであるVoyagerの論文を読んだ際のメモ。

概要

  • LLM(GPT-4)を利用して、マインクラフトで「できるだけ多くの多様なものを発見し、できるだけ多くの多様なタスクを達成し、世界で最高の Minecraft プレイヤーになる」ことを達成する
  • 自動カリキュラム、スキルライブラリ、反復プロンプトの3つのコンポーネントで構成される
  • 自動カリキュラムは、探索を最大限に高めるカリキュラムを生成する
  • スキルライブラリは、複雑な動作を行う実行可能なコードを登録し、検索する
  • 反復プロンプトメカニズムは、スキルを実行した際の環境からのフィードバックと実行エラーを元に、コードを改善する


どのようにLLMを利用しているのか?

マインクラフトのインターフェースは、画像の出力とマウスによる入力のため、言語モデルでマインクラフトを操作するには隔たりがある。
この研究では、Mineflayerという、JavaScriptである程度高レベルな操作が行えるAPIを利用している。
例えば、

  • goto : 特定の位置(例:指定されたブロックの指定された範囲内)に移動する
  • equip : 指定された宛先にアイテムを装備する

というようなAPIがある。

また、プリミティブな目的を達成するAPIもあらかじめ実装している。
例えば、

  • exploreUntil : エージェントが maxTime の間、固定方向に探索する
  • craftItem : 近くの作業テーブルを使用してアイテムを作成する

など

マインクラフトを知識なしで強化学習で学習する場合、特定の位置に移動するだけでも難しいのだが、人間があらかじめ実装したスキルを利用しているため、タスクの難易度は下がっている。
それでも、言語モデルを使用してダイアモンドを獲得するのは容易ではない。

マインクラフトの知識

LLMは、マインクラフトについて知らないはずなので、どうして言語の指示で適切なコードが書けるのか?と疑問に思うかもしれない。
これは、気になった点であった。
実は、ChatGPTは、マインクラフトについて十分に知っているのである。

例えば、ChatGPT(3.5)に、「マインクラフトで、「ネザーに豚を連れてくる」にはどうすればよいですか?」と質問すると、

マインクラフトでネザーに豚を連れて行くには、以下の手順を実行する必要があります。

鉄を集める: 鉄を採掘して、鉄インゴットを作ります。鉄は地下で見つけることができます。

鉄インゴットでリードを作る: 作業台で鉄インゴットを使ってリードを作ります。リードは豚とプレイヤーをつなぐのに使用します。

豚を見つける: 豚を見つけ、飼いならす必要があります。飼いならすには、手に持った飼料(小麦、にんじん、じゃがいも)を右クリックして与えます。

豚にリードをつける: リードを手に持ち、豚を右クリックしてリードをつなげます。

ネザーポータルを作る: ネザーに移動するためには、ネザーポータルを作成する必要があります。オブシディアン(黒曜石)を採掘し、ポータルの枠を作ります。枠の内部に火をつけると、ポータルがアクティブ化されます。

豚をネザーポータルに連れて行く: 豚にリードをつけたまま、ネザーポータルに入ります。豚はリードを引きずってネザーに一緒に移動します。

注意点: ネザーは危険な場所であり、豚が攻撃されたり死んでしまう可能性があります。また、ネザーではリードを通じての移動が制限されるため、安全な場所に豚を連れて行くことが重要です。十分な装備や対策を講じてネザーに挑むことをおすすめします。

という回答が得られる。
ChatGPTは、マインクラフトについて十分に学習済みなのであった。
この研究では、それに加えて、Wikipediaから質問に近い文章もプロンプトに与えて、コンテキスト内学習も行っている。

自動カリキュラム

自動カリキュラムでは、全体的な目標を与えて、多様なタスクを達成するように指示する。
また、現在の状態(バイオーム、時間、近くの状況、アイテムの数、達成したタスク)を与えて、次のタスクを生成する。

プロンプトの一部
あなたは、Minecraft で次に実行すべき当面のタスクを決定するために質問をしてくれる、親切なアシスタントです。 私の最終的な目標は、できるだけ多くのことを発見し、できるだけ多くのタスクを達成し、世界で最高の Minecraft プレイヤーになることです。
次の情報を提供します: バイオーム: ...
・・・
コンテキスト (利用可能で役に立つ場合のみ) と Minecraft に関するあなた自身の知識に基づいて質問に答えます。
1) 回答は「回答: 」で始めてください。
2) 答えがわからない場合は「答え:不明」と答えてください。

スキルライブラリ

スキルライブラリでは、自動カリキュラムで生成したタスクの説明文から、GPT4で実行可能なコードを生成する。
その際、プリミティブAPIとスキルライブラリから検索した関連スキルがプロンプトに提示される。
スキルの検索は、自動カリキュラムで生成したタスクの説明文を埋め込みにして検索する。
また、後述の反復プロンプトメカニズムでタスクが成功した場合、改善したコードの説明文を生成し、その埋め込みをキーとして、スキルライブラリに登録する。
コードの説明文の生成は、コストを抑えるためにChatGPT3.5を利用している。

反復プロンプトメカニズム

反復プロンプトメカニズムでは、生成したコードを実行した結果、環境からのフィードバックと実行エラーを元に、コードを改善し、タスクが成功するまで繰り返す。
タスクが成功した場合、スキルライブラリに追加する。

プロンプトの一部
あなたは、私の Minecraft のプレイの進歩を評価し、役立つガイダンスを提供してくれるアシスタントです。
私がタスクの要件を満たしているかどうかを評価する必要があります。
タスクの要件を上回った場合も成功とみなされますが、要件を満たしていない場合は、改善を助けるために批評を提供する必要があります。
次の情報をお知らせします。
バイオーム: タスク実行後のバイオーム
・・・
タスク: 達成する必要がある目標。 コンテキスト: タスクのコンテキスト。
以下で説明するように、JSON 形式でのみ応答する必要があります。
{
"推論": "推論"、
"成功": ブール値、
"批評": "批評",
}
応答が Python の「json.loads」で解析できることを確認します (例: 末尾のカンマや一重引用符など)。
ここではいくつかの例を示します。
・・・

このプロンプトでは、思考連鎖プロンプトやfew-shotラーニングというプロンプトエンジニアリングの手法が使用されている。


コーディングの能力は、GPT-4によるところが、大きく、GPT3.5やオープンソースのLLMでは達成できなかったと報告している。

所感

LLMを利用してマインクラフトを操作するというのがイメージがわかなかったが、プリミティブな目的ごとの操作のコードがあらかじめ用意されており、それらを使って新たなコードを生成するという方法で実現されていた。
それでも、オープンで目的を持たないマインクラフトというゲームで、多様なタスクを達成せよという目標だけで、ダイアモンドを獲得できているのは想像以上の成果である。
今後、マルチモーダルのモデルを使うことで、画像からの世界理解もできるようになるだろうと述べられている。
マインクラフトは、ChatGPT自体が豊富な知識を持っているでうまくっている面もあるので、ChatGPTが知らないゲームの場合でもうまくいくのかは興味がある。

まとめ

GPT-4を使って、マインクラフトで初めてダイアモンドを獲得したLLMを利用したエージェントであるVoyagerの論文を読んだ際に理解した内容を記述した。
LLMを利用してマインクラフトを操作するイメージが湧かなかったが、APIを利用してコードを生成して、それをLLMで改善していることが理解できた。

現在の強化学習のエージェントでは、長期的な目標を達成することに課題があるが、LLMを活用することで目標を立てて、行動を改善しながら達成するということが多くのタスクで可能になってきそうである。


"二つの道が森の中で分かれていて、私は—
あまり旅されない道を選んだ、
それが全てを変えたのだ。"

ロバート・フロスト, "The Road Not Taken"(『分岐した道』)