🤖

「Auto-GPTとAgentGPTは別物です」という話

2023/04/16に公開

ChatGPTを皮切りとしたAIブーム。流石にちょっと過熱気味になってきた印象があります。

中でも気になるのは「AutoGPT」の話題。Twitter上だと、

https://twitter.com/kajikent/status/1646517019414777857

https://twitter.com/HChishiro/status/1646504072491732993

他にも、AgentGPTを使って「AutoGPTすごい!AGIだ!」としている投稿を多く見かけました。

ですが、「AgentGPTはAuto-GPTのブラウザ版」ではありません(少なくとも2023年4月15日時点は)。

両者とも似たアプローチはとっていますが、Auto-GPTは 「GPT-4に情報探索・処理や長期記憶の手段を持たせている」 という点が大きく異なります。

AgentGPTは、

  • ユーザーが設定したゴールをAIにいくつかの問い(タスク)に分解させる
  • それぞれの問いに回答を出させ、その結果を踏まえて追加で必要な問いを考えさせてタスクリストに追加する

という自問自答のループを回すことで思考を深めています。

一方、Auto-GPTでも似たようなループを回す点は同じですが、さらに実験的なことをしています。

  • Google検索
  • ウェブページの閲覧
  • ファイルの読み書き
  • Pinecone(ベクトルDB)の利用
  • PythonやShellスクリプトの実行
  • GPT-3.5へのプロンプト入力(コスト低減のため)

といった処理を行えるコマンドをGPT-4に使わせることで、情報の探索と処理を行いながら長期記憶も駆使して思考プロセスを進めるようにしています。

Auto-GPTの実行環境は、GPT-4からのコマンドに応じて処理を行い、結果をGPT-4に返却します。つまり、自分のPCをコマンドラインツールとしてGPT-4に与えるようなものです。

AgentGPTの仕組み

AgentGPTの方がやっていることはシンプルなのでまずはこちらを説明します。

リポジトリはこちら。

https://github.com/reworkd/AgentGPT

(READMEでは一言も「Auto-GPT」とは書いてないですが、タグに autogpt と入れているあたり、Auto-GPTだと誤認させることを意図しているようにも見えます。。)

3種類のプロンプト

AgentGPTでは3種類のプロンプトを組み合わせることで、探索的な思考を実現しています

  • startGoalPrompt(セットアップ・ゴール設定・タスク作成)
  • executeTaskPrompt(タスク実行)
  • createTaskPrompt(追加タスクの作成)

startGoalPrompt

https://github.com/reworkd/AgentGPT/blob/c7e6156a37b165a9987c8e10ea1341bdfe029261/src/utils/chain.ts#L20-L24

あなたはAgentGPTと呼ばれる自律型タスク作成AIです。あなたは次のような目的{goal}を持っています。あなたのAIシステムが、目標により近く、あるいは完全に到達できるように、0~3個のタスクのリストを作成し、それを完了させてください。レスポンスをJSON.parse()で使用できる文字列の配列として返す。

executeTaskPrompt

https://github.com/reworkd/AgentGPT/blob/c7e6156a37b165a9987c8e10ea1341bdfe029261/src/utils/chain.ts#L34-L38

あなたはAgentGPTと呼ばれる自律型タスク実行AIです。あなたは次のような目的{goal}を持っています。あなたは次のようなタスク {task} を持っている。タスクを実行し、その応答を文字列として返す。

createTaskPrompt

https://github.com/reworkd/AgentGPT/blob/c7e6156a37b165a9987c8e10ea1341bdfe029261/src/utils/chain.ts#L50-L54

あなたはAIタスク作成エージェントである。あなたは以下の目的{goal}を持っています。あなたは以下の未完了タスク {tasks} を持っており、以下のタスク {lastTask} を実行し、以下の結果 {result} を受け取ったところである。これに基づいて、AIシステムが必要な場合のみ、目標により近く、あるいは完全に到達するような新しいタスクを作成する。レスポンスをJSON.parse()で使用可能な文字列の配列として返し、それ以外のものは返さない。

AutonomousAgentクラス

実際の思考のプロセスはこのクラスの中で行われます。

https://github.com/reworkd/AgentGPT/blob/c7e6156a37b165a9987c8e10ea1341bdfe029261/src/components/AutonomousAgent.ts#L39-L124

ざっくりいうと、

  1. 初期化処理としてゴール設定・タスク作成のプロンプトをAIに渡して、作成してもらったタスクリストを保持する
  2. タスクを解くようにAIに指示し、その結果を受け取る
  3. AIにゴール・直前に解いたタスクの内容・タスクの結果を渡しつつ、新しいタスクを考えて配列で返すように指示する。受け取った新しいタスクの配列をタスクリストに追加する
  4. 2-3を、25回ループするかタスクリストが空になるまで実行する

以上がAgentGPTの大まかな思考プロセスです。

Auto-GPTの仕組み

一方のAuto-GPTのリポジトリはこちら。
https://github.com/Significant-Gravitas/Auto-GPT

概要は冒頭で説明したとおりですが、そのコンセプトが分かりやすいプロンプトを紹介します。

最新のコードだと分散していて把握しにくいので、ちょっと古いのですがこちらのプロンプトを訳しました(機械翻訳のため一部誤訳があるかもしれません)。

制約:

1. 短期記憶には4000語の制限があります。短期記憶は短いので、重要な情報はすぐにファイルに保存してください
2. 以前どのように行動したのかわからないときや、過去の出来事を思い出したいときは、似たような出来事を考えることで思い出すことができます
3. ユーザー補助なし
4. 二重引用符で囲まれたコマンド(例:"コマンド名")のみを使用する

コマンド:

1. Googleで検索します: "google", args: "input": "<search>"
5. ウェブサイトを閲覧する: "browse_website", args: "url": "<url>", "question": "<ウェブサイト上で何を見つけたいのか>"
6. GPTエージェントを起動します: "start_agent", args: "name": "<name>", "task": "<short_task_desc>", "prompt": "<prompt>"
7. GPTエージェントにメッセージを送ります: "message_agent", args: "key": "<キー>", "メッセージ": "<message>"
8. GPTエージェントをリストアップします: "list_agents", args: ""
9. GPTエージェントを削除する: "delete_agent", args: "key": "<キー>"
10. ファイルに書き込む: "write_to_file", args: "file": "<file>", "text": "<テキスト>"
11. ファイルを読み込む: "read_file", args: "file": "<ファイル>"
12. ファイルに追加する: "append_to_file", args: "file": "<file>", "text": "<テキスト>"
13. ファイルを削除する: "delete_file", args: "file": "<ファイル>"
14. ファイルを検索する: "search_files", args: "directory": "<directory>"
15. コードを評価する: "evaluate_code", args: "code": "<full_code_string>"
16. 改善されたコードを取得する: "improve_code", args: "suggestions": "<list_of_suggestions>", "code": "<full_code_string>"
17. テストを書く: "write_tests", args: "code": "<full_code_string>", "focus": "<list_of_focus_areas>"
18. Pythonファイルの実行: "execute_python_file", args: "file": "<ファイル>"
19. タスク完了(シャットダウン): "task_complete", args: "reason": "<理由>"
20. 画像を生成する: "generate_image", args: "prompt": "<prompt>"
21. 何もしない:"do_nothing", args:""

リソース:

1. 検索や情報収集のためのインターネットアクセス
2. 長期記憶管理
3. 単純作業を委任するためのGPT-3.5によるエージェント
4. ファイル出力

性能評価:

1. 自分の行動を継続的に見直し、分析することで、自分の能力を最大限に発揮できるようにする。
2. 常に大局的な行動を建設的に自己批判する。
3. 3.過去の決断や戦略を振り返り、自分のアプローチを洗練させる。
4. すべてのコマンドにはコストがかかるので、スマートで効率的であること。最小限のステップ数でタスクを完了することを目指します。

以下のようなJSON形式での回答のみとすること。

応答形式:
{
    "thoughts":
    {
        "text": "thought",
        "reasoning": "reasoning",
        "plan": "- short bulleted\n- list that conveys\n- long-term plan",
        "criticism": "constructive self-criticism",
        "speak": "thoughts summary to say to user"
    },
    "command": {
        "name": "command name",
        "args":{
            "arg name": "value"
        }
    }
}

Python json.loadsでレスポンスが解析できるようにする。

このプロンプトをもとに、GPT-4がコマンドを駆使しながらゴール達成に向けて思考を進めてくれるというものです。

「GPT-4がAuto-GPTの実行環境にコマンドを実行させ、結果を確認し、思考を整理する」というループを、ユーザーが設定した上限に達するか、ユーザーが手動で打ち切るかするまで繰り返します。

また、デフォルトではコマンドのたびに実行していいかどうかをユーザーが承認するステップが入ります。わりかし安全には配慮されているのかなと(何もわからずに承認しまくったら意味ないですが)。

余談

Auto-GPTの実装を見たときは率直に「面白い実験だなあ」と思いましたが、Auto-GPTのようなアイディアはOpenAIでは1年ぐらい前から話されていたそう。

https://twitter.com/shanegJP/status/1646757162109263874

「Language Model Cascades」。気になるので論文見てみよう。。

ちなみに筆者はまだGPT-4を利用できないため、GPT-3.5で試してみました。

自分のPCの上で直接動かすのは怖かったのでDockerコンテナ内で動かしましたが、色々つまづいたので詳しい手順や感想はそのうち記事にしようと思います。

【追記:記事にしました】

https://zenn.dev/kecy/articles/b019e91d5698fc

Discussion