マイクラで学ぶAIエージェントの作り方（二重過程理論によるアーキテクチャ解説編）

# 本記事の概要

昨今、生成AIの産業応用において[AIエージェント](https://arxiv.org/abs/2308.11432)への期待が高まってきています。
本記事では、高度なAIエージェントを実現するための仕組み（アーキテクチャ）について、二重過程理論（システム1／システム2）の概念を参考にしつつ、マインクラフト用AIエージェントを具体的な題材に用いて、解説します。

[マインクラフト](https://www.minecraft.net/ja-jp/about-minecraft)（以下、マイクラ）はゲームではありますが、実世界と同様に、リアルタイムに状況が変化する中での環境との様々な相互作用を伴う、複雑性の高い問題になっています。したがって、マイクラという題材は、マイクラ用に限らず一般のAIエージェントのアーキテクチャを考案する際に役立つ実験フィールドになっています。

- 例に用いるマイクラ用AIエージェントの動画：プレイヤーから誘われて、近くに来て釣りをするといったことができる思考力と行動力を備えています。
  [![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26062/dacf0f0e-458b-0247-6d76-12f813215640.png)](https://youtu.be/PgIKDjIai84)


# AIエージェントとは

昨今、[AIエージェント](https://arxiv.org/abs/2308.11432)（自律エージェント、生成AIエージェント、LLMエージェント）への注目が急速に高まっています。その理由は、AIエージェントが産業界に大きなインパクトをもたらす可能性を秘めているからです。

AIエージェントの最大の特徴は「自律性」にあります。自律性とは主に次の3つの能力によって構成されます。

1. 与えられた目標を達成するための段階的なステップに作業を分解する計画能力
1. 各ステップを実行する作業能力（より具体的には道具を使う能力）
1. 環境状態や実行結果を解釈し、必要に応じて計画修正を行う知覚・調整能力

これらのAIエージェントの能力により、状況に応じた柔軟かつ効率的なタスクの自動実行が実現します。製造業からサービス業まで幅広い産業分野における、これまで人間にしか解決できなかった複雑な問題を、最小限の人間の介入で自動化することが可能になり、抜本的な効率化や新たな価値創造に役立つと期待されています。

本記事では、このAIエージェントの実現方法を深く理解するために、マインクラフトのゲーム環境下で自律動作するエージェントを題材に取り上げます。ゲームという直感的で分かりやすいフィールドを使って、AIエージェントを実現するための仕組みについて理解していきましょう。


# マインクラフトがAIエージェントの研究に多く利用されている理由

[マインクラフト](https://www.minecraft.net/ja-jp/about-minecraft)はAIエージェントを含むAIの研究に数多く利用されています。

- 研究の例：https://arxiv.org/search/?query=minecraft&searchtype=all&source=header

マイクラは、以下のような特徴を備えており、AIエージェントのアーキテクチャを研究開発するにおいて適した題材になっています。

1. **広大でオープンな仮想環境**
マイクラの世界は無限に広がるランダム生成された様々な環境を持ち、複雑な地形やオブジェクト（生物やアイテムなど）が存在します。プレイヤーやエージェント同士で会話（チャット）することもできます。この多様な環境は、エージェントが探索し、適応しながら問題を解決する能力をテストするために理想的です。

2. **様々な目標設定が可能**
エージェントに対して、アイテムの収集、建物の建築、装備を整えてボスを倒すなど、単純なものから複雑なものまで様々な目標を与えることが可能です。これにより、目標達成のための計画立案や実行スキルをテストすることができます。

3. **シンプルながら深いシステム**
実世界よりはシンプルですが、マイクラには物理法則や資源管理、アイテムのクラフトなどのシステム（仕組み）が備わっており、それらを活用する基本スキルを組み合わせることで複雑なタスクに挑むことができます。この特徴により、エージェントが基本スキルをベースにして、複雑な課題に取り組むことで高度なスキルを身につけるという学習能力をテストすることができます。

これらの特徴により、マイクラはAIエージェントのアーキテクチャ設計や性能評価を行うためのプラットフォームとして適しており、現実世界の複雑な課題への応用に向けた基盤を構築するのに役立っています。

（あと、試行錯誤していても楽しいし）


# AIエージェントのアーキテクチャ解説

ここからは具体的なコードも参照しながら、AIエージェントのアーキテクチャについて解説していきます。
最初にも述べましたが、マイクラに限らず、一般のAIエージェントを設計する上で役立つ気付きが得られるものになっています。

なお、今回、マイクラ用AIエージェント [MinePal](https://github.com/sonoisa/MinePal/tree/main)を題材に用います。
マイクラとOpenAI APIキーを用意すれば、[MinePal](https://github.com/sonoisa/MinePal/tree/main)を実際に試すことができます。
試し方についてはリポジトリの説明をご参照ください。

* プレイヤーからの指示を受けて、プレイヤーの近くに移動して魚釣りをするエージェント：
  [![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26062/dacf0f0e-458b-0247-6d76-12f813215640.png)](https://youtu.be/PgIKDjIai84)


## 補足：MinePalの機能概要

[MinePal](https://github.com/sonoisa/MinePal/tree/main)は、生成AIの頭脳を持ったマイクラ用AIエージェントです。プレイヤーがチャットで指示を出すと行動をし、状況をこちらに報告してくれます。また、モンスターが襲ってきたら反撃するなど、環境変化に応じて自主的に行動する能力も持ちます。

エージェントが行える行動（コマンド）をカテゴライズすると次のようになります。自己や他者、環境に作用する一通りの能力を備えています。

1. **移動**：プレーヤーの元や特定の場所に移動する
2. **ブロックを対象としたアクション**：特定のブロックを壊して集めたり、設置したり、操作したりする
3. **エンティティを対象としたアクション**：エンティティ（モンスターなど）に攻撃したり、アイテムを使ったり、乗り降りしたりする
4. **インベントリやチェストやクラフト台などを対象としたアクション**：持ち物を閉まったり、引き出したり、アイテムをクラフトしたりする
5. **自身を対象としたアクション**：アイテムを装備したり、食べ物を食べたり、釣りをしたり、アクションをやめたりする
6. **記憶**：場所情報を記憶する
7. **コミュニケーション**：チャットによりプレイヤーと対話する

チャットによってプレイヤーから与えられた指示に対して、これらの行動を順序立てて選択実行することで、目標を達成しようとします。

プレイヤーから指示を受けずとも、環境変化などに応じて自主的に実行する行動として次のものがあります。

1. **危険回避**：溺れたり、火傷したり、敵から襲われたりした時、それらから回避する
1. **反撃**：近くの敵に対して反撃する
1. **狩り**：近くの動物を狩る
1. **釣り**：釣りを行う（止めるまで継続する）
1. **アイテムを拾う**：近くにあるアイテムを拾う
1. **報告**：アイテムを拾ったら定期的に報告する
1. **松明設置**：暗い場所に松明を設置する
1. **観察**：暇になったら周囲を観察する（現状、目線を送るまで）
1. **追跡**：プレイヤーの後を追跡する（止めるまで継続する）

これらの自主的行動は、プレイヤーと協力して世界を探索していくためにも、環境変化に適応して生き残るためにも欠かせません。


## 二重過程理論によるアーキテクチャの整理

マイクラ用AIエージェント[MinePal](https://github.com/sonoisa/MinePal/tree/main)の（現時点実装されている）行動を、そのトリガーを元に分類すると次の3種類になります。

1. 目標設定をトリガーとした行動
1. 環境変化をトリガーとした自主的行動
1. 習慣的行動（タイマーをトリガーとした定期的な自主的行動）

この分類軸は、マイクラに限らず、一般のAIエージェントについても言えるものになっていますので、新たにエージェントを開発する際に、機能を漏れなくをあぶり出して整理することに役立つでしょう。

また、これらの行動は、多くの場合、それぞれ非同期的に並列処理されるものであるため、処理間に競合が発生する可能性を考えておく必要があります。全体として整合性を保つように行動を調整する必要があることを、エージェントのアーキテクチャを設計する際に最初から考えておくことが重要です。

これらの行動を実現するアーキテクチャを設計するにおいて、人間の知性に関する[二重過程理論](https://ja.wikipedia.org/wiki/二重過程理論#システム)のシステム1とシステム2（や[記号創発システム論](https://www.shin-yo-sha.co.jp/book/b650985.html)のシステム0〜3）の考え方が参考になります。
システム1と2は、ともに知覚システムから渡ってきた知覚情報を用いて適する行動を選択し、運動システムを用いて環境に作用するという点では同じですが、下図のように異なる特性を持ち、異なる役割を担っている並列分散コンポーネントであるとされています。

* システム1と2の位置付け：
    ```mermaid
    graph TB        
        知覚系((知覚システム)) -->|知覚情報| システム2[システム2<br>熟考・言語的・意識的・低速]
        システム2 -->|選択された行動| 運動系((運動システム))
        知覚系 -->|知覚情報| システム1[システム1<br>直感・非言語的・無意識的・高速]
        システム1 -->|選択された行動| 運動系
        環境 -->|環境情報| 知覚系
        運動系 -->|作用| 環境
    ```

AIエージェントは究極的には人間のように賢く行動できることを目指す存在であるため、[二重過程理論](https://ja.wikipedia.org/wiki/二重過程理論#システム)の考えを参考にしてアーキテクチャを整理・設計することは自然なことでしょう。


### 二重過程理論によるAIエージェントの構成要素の整理

[システム1・システム2](https://ja.wikipedia.org/wiki/二重過程理論#システム)の概念と、[短期記憶・長期記憶](https://ja.wikipedia.org/wiki/記憶)の諸概念を参考にして、AIエージェントの構成要素を整理した結果を以下に示します。
そのままでは抽象的であるため、より具体的な実践的な知識が得られるように、マイクラ用AIエージェントMinePalの場合の実装コードをリンクしつつポイントを解説します。今回はアーキテクチャの理想形を探索することが目的であるため、[MinePal](https://github.com/sonoisa/MinePal/tree/main)では現時点、未実装の構成要素もあります。

#### システム2の構成要素

1. **システム2の認知システム**：言語を用いて対話、思考し、知識（後述する短期記憶・長期記憶）に基づいて行動の計画を立てます。主に、人間から目標が与えられると、それをトリガーにしてこのシステムが動き始めます。
    * 実装例：下記のフローチャートのように、[プレイヤーからの指示を受けて行動（コマンド）を決定し、その実行結果を言語化して返答したり、必要なら次の行動を考えて実行したりします](https://github.com/sonoisa/MinePal/blob/v0.4.0/src/agent/agent.js#L251)。
MinePalでは、実行できる行動（コマンド）をあらかじめ定義しておき、その中から行動を選択するという方式をとっています。行動を選択するのではなく、行動を行うためのプログラムを毎回生成して、それを実行するという方式（例えば、[Voyager](https://voyager.minedojo.org)）もありますが、セキュリティ（危険なプログラムが生成される可能性）と確実性（バグのあるプログラムが生成される可能性）の面で、あらかじめ行動（コマンド）を定義しておく方法が現状、実用性が高い方法になっています。MinePalにもプログラムを生成して実行する方式が実装されていますが、上記の理由でデフォルトでは無効化されています。
また、下記のフローチャートのようにループを用いる方法にすることで、1回の指示に対して1回だけ行動を行う一問一答のような方法に比べて、多段階のステップで目標を達成する複雑なタスクもこなせるようになるというメリットがあります。例えば、「僕のところに来て釣りをして」と指示を出すと、まずプレイヤーの元に移動する行動（!goToPlayerコマンド）を行った後に続けて、釣りを開始する行動（!startFishingコマンド）を行うという振る舞いをしてくれます。
        ```mermaid
        flowchart TD
            START([開始：プレイヤーからのチャット])
            START --> メッセージ構築[messages := 対話履歴 + チャットメッセージ]
            メッセージ構築 --> LOOP_START[/ループ開始\]
            LOOP_START --> 環境情報付与[messages := messages + 環境情報]
            環境情報付与 --> コマンド特定[["chat_message, command := ChatGPTを用いた応答メッセージ生成とコマンド特定(messages)"]]
            コマンド特定 --> コマンド有無判定{コマンド<br>有無判定}
            コマンド有無判定 -->|"有り<br>（プレイヤーの指示や、前のコマンド実行結果を受けて、実行すべきコマンドがあった場合）"| メッセージ応答1[/"プレイヤーにメッセージ送信(chat_message)"/]
            メッセージ応答1 --> コマンド実行[["コマンド実行(command)"]]
            コマンド実行 --> 実行結果付与[messages := messages + コマンド実行結果]
            実行結果付与 --> LOOP_END[\ループ終了/]
            LOOP_END --> LOOP_START
            END([終了])
            コマンド有無判定 -->|"無し<br>（実行すべきコマンドがない、雑談への応答やコマンド実行結果の報告）"| メッセージ応答2[/"プレイヤーにメッセージ送信(chat_message)"/]
            メッセージ応答2 --> END
        ```

2. **記憶能力**：
    - **短期記憶／ワーキングメモリ**
        1. **エピソードバッファ**：直近に経験した出来事に関する記憶。出来事そのものに加えて、その時の周辺や自身の状況などのコンテキストも伴います。
            * 実装例：[プレイヤーとの直近の対話履歴（実行したコマンドと実行結果、知覚した環境情報、自己の身体的状態の情報も含んでいます）](https://github.com/sonoisa/MinePal/blob/v0.4.0/src/agent/history.js)。行動（コマンド）の決定を行うときに利用する情報です。
[履歴が長くなったら過去の履歴を圧縮（要約）することでプロンプトが長くなりすぎる事態を回避します](https://github.com/sonoisa/MinePal/blob/v0.4.0/src/agent/history.js#L79)。
対話履歴に更に他者の身体的・心理的状態（意図や個性）などの情報も含めることにより、より賢い行動を取れるようになる可能性があります。
        2. **内言**：深い思考を行ったり、段階的に行動を進めたりする際の言語的なワーキングメモリ
            * 実装例：上のフローチャートにも現れているように、[行動（コマンド）の実行結果をプレイヤーには見えない形（心の中）で自己に対して呟きます](https://github.com/sonoisa/MinePal/blob/v0.4.0/src/agent/agent.js#L318)。これは次の行動や発言を決定するときの参考情報として利用されます。実装上は、ChatGPTのsystemメッセージという形で対話履歴の一部に含めておくという、天の声のような扱いにしています。例えば、釣りを開始しようとしたものの、釣竿がないため開始できなった場合、「No fishing rod.」という内言をします。
    - **長期記憶のうち陳述記憶**
        1. **意味知識（事実、概念、言葉の意味）**：行動の選択や状況判断などの思考に用いられる言語的知識。対象ドメインの言葉や概念などの専門知識。
            * 実装例：[エージェント自身が行うことのできる行動（コマンド）の一覧](https://github.com/sonoisa/MinePal/blob/v0.4.0/src/agent/commands/actions.js)。取るべき行動をChatGPTに考えさせるときのプロンプトの[一部](https://github.com/sonoisa/MinePal/blob/main/src/agent/prompter.js#L71)にこの知識（コマンド一覧）が埋め込まれ利用されます。
ChatGPTは最初からマイクラについてよく知っているため、今回は例外的に専門用語について何も知識を与える必要はありませんでしたが、多くの場合においては、専門用語の定義情報を与える必要があるでしょう。
        2. **エピソード記憶**：再利用性の高い、典型的な出来事に関する記憶。出来事そのものに加えて、その時の周辺や自身の状況などのコンテキストも伴います。
この記憶を充実することで、より適切な行動を選択できるようになることが期待されます。エピソードバッファの中から、良い結果に至ったなど、模範となりそうなエピソードをエピソード記憶に昇格させる仕組みを用意することで、使えば使うほど賢くなるエージェントになるでしょう（定期的な棚卸しでもいいかもしれません）。
            * 実装例：[模範となる対話と行動のパターン事例](https://github.com/sonoisa/MinePal/blob/v0.4.0/ethan.json#L28)（≒一種の処理方法の言語的定義）。エピソード記憶の数が多い場合にも対応できるよう、[いわゆるDynamic Few-Shot Promptingを用いて、いまの対話の流れに似たエピソード記憶だけに対象を絞り込んで利用しています](https://github.com/sonoisa/MinePal/blob/v0.4.0/src/agent/prompter.js#L75)。[対象の絞り込み（連想記憶）には、直近の対話履歴に近いエピソードをベクトル検索で探す方法（トピックが近いエピソードを探す方法）を用いています](https://github.com/sonoisa/MinePal/blob/main/src/utils/examples.js#L62)が、次に述べる世界モデルを用いる方法も考えられるでしょう。
        3. **高次の世界モデル（法則、一般知識）**：未来の状況を予測するモデル（言語的に表現できるルールやメカニズムなどの環境や自他の振る舞いに関する知識、意味記憶の一種）。
行動の計画を立案する際に、この予測モデルを用いて、時間経過による状況変化や、自身の行動によって生み出される状況変化の予測を行うことで、より賢い計画になることが期待されます。また、このモデルは、予測と実際の結果のずれ（予測誤差）から新たな学びを得る仕組みの開発や、情報が限られた状況でも柔軟に対応する能力を高めることに役立つ可能性があります。これらは、自由エネルギー原理において主張されている、予測誤差の最小化を通じた学習と環境適応の促進の一種と見ることができます。
            * 実装例：MinePalでは、現状、明示的には未来の状況を予測することはしていません。おそらくChatGPT内にあるマイクラ知識を用いて一定の予測はできるだろうと想像します。

#### システム1（知覚システムと運動システムも含む）の構成要素

1. **知覚システム**：身体システムから得られた生のセンサーデータを、認知システムにおける思考に利用しやすい粒度の情報にまとめ上げます。
    * 実装例：[生のセンサーデータから解釈可能な情報へのまとめ上げたり、目にみえる近い水辺の場所を特定したり](https://github.com/sonoisa/MinePal/blob/v0.4.0/src/agent/library/world.js)、[自己の状態や環境の状況を言語的に表現](https://github.com/sonoisa/MinePal/blob/v0.4.0/src/agent/agent.js#L121)したりします。例えばMinePalでは、行動（コマンド）を決定するときに、次の情報を言語化したものをプロンプトの一部に入れて判断材料にしています。

        * HUD情報（heads up display情報）
            1. 自分がいる座標
            2. ゲームモード（survivalモードであるかなど）
            3. 体力
            4. 空腹度
            5. 今いるバイオームの名前
            6. 天気
            7. 時刻
            8. 他のプレイヤーの名前
        * 持ち物（インベントリの中身）
            * バックパック、ホットバー、オフハンド、装備
        * 周辺にあるブロックの種類（数や場所の情報はない）
        * 周辺にいるエンティティ（生き物など）の種類（同上）
        * 対話履歴

        言語的な情報だけでなく、画像情報（視覚情報）も扱えるように拡張（マルチモーダル化）することで、より賢く自然な判断が行えるようになる可能性があります。
2. **運動システム**：意図した行動を実行するために、身体動作のシーケンスに詳細化して身体をコントロールします。
    * 実装例：[行動（コマンド）を実行するために用いられる基本的なスキル（身体動作のシーケンス）](https://github.com/sonoisa/MinePal/blob/v0.4.0/src/agent/library/skills.js)
3. **システム1の認知システム**：システム2を介さずに、環境変化に応じた即時的な行動の選択や定期的な行動（習慣的行動）を行います。AIエージェントの環境適応力を高め、いちいち人間が指示せずとも適切な行動をとるという賢さを実現するために有効な方法です。
    * 実装例：[1秒に1回、定期実行](https://github.com/sonoisa/MinePal/blob/v0.4.0/src/agent/agent.js#L422)する[習慣的行動（モード）](https://github.com/sonoisa/MinePal/blob/v0.4.0/src/agent/modes.js)を用いて実現しています。毎秒、危険な状態に陥ったなどの重大な環境変化の有無をチェックし、必要に応じて回避行動をとるなどの自動的な行動選択を行います。
4. **記憶能力**：システム1を動かすロジックとなる「記憶」は、長期記憶のうちの非陳述記憶に分類されます。
    * **手続き（知覚技能）**：知覚システムそのもの、知覚パターン
    * **手続き（運動技能）**：運動システムそのもの、身体動作のパターン
    * **手続き（認知技能や習慣）**：システム1の認知システムで説明した即応的行動や習慣的行動のパターン
    * **感性**：システム1や2の認知システムに少なからず影響を与える思考の傾向。実装例：[エージェントの個性の定義](https://github.com/sonoisa/MinePal/blob/main/ethan.json#L6)
    * **低次の世界モデル**：未来の状況を予測するモデル（言語的に表現できない環境などの振る舞いに関する知識（暗黙知、直観、古典的条件付け））

* 実装例：現状、システム1のどのシステムもハードコーディングされており、後天的に獲得したり修正したりする能力（可塑性）を備えていません。一方で、実用の観点では、（バグがなければ）確実に動作する意味ではよいとも言えます。
実用性を高めようとするほど、システム2よりも（地味な）システム1の方の実装量が多くなっていき、コードの複雑性も高くなりやすい傾向があります。

#### その他の構成要素

1. **システム1とシステム2の競合解消**：システム1とシステム2は非同期的に並列動作しますが、一方で身体は1つのみであるため、行動が競合してしまわないよう、何らかの競合解消の仕組みが必要となります。
例えば、システム1において緊急度の高いイベント（危機的状況発生など）が発生したら、システム2で行なっている行動を即時中止してシステム1の行動を優先的に行うといったことです。木を伐採している最中にゾンビに襲われたら伐採を中止して逃げるなどしなければ生存できません。
他にも、システム2の特定の行動を行なっている場合はシステム1の定期的な行動を行わないといった調整もあるでしょう。システム1の行動同士や、システム2の行動同士についても同様です。
    * 実装例：[定期的な行動を他の行動に割り込んで行うかどうかをルール判定](https://github.com/sonoisa/MinePal/blob/v0.4.0/src/agent/modes.js#L445)をしたり、[特定の行動を行うときに、競合する他の行動（定期的な行動）を一時停止](https://github.com/sonoisa/MinePal/blob/v0.4.0/src/agent/library/skills.js#L379)します。
競合の解消には、非同期システム特有の人知を越えるややこしさがあるため、世界モデルを用いて競合を自動解決するといった仕掛けがほしくなります。
2. **身体システム（システム0）とシステム1の橋渡し**：ロボティックなエージェントの場合、身体システムと頭脳であるシステム1／システム2を繋ぐ仕組みも地味ながら重要な構成要素になります。
    * 実装例：エージェントの身体があるマイクラ・サーバーと通
信して身体システム（ボット）を操作するためのライブラリとして[Mineflayerライブラリ](https://github.com/PrismarineJS/mineflayer)を使用しています。このライブラリは知覚システムや運動システムを実装するためにも利用しています。
3. **システム3（集合知、社会システム）**：以上は、エージェントが1体のときの話でしたが、マルチエージェント（複数体のエージェントが同時に存在して相互にコミュニケーションを取りながら連携して行動するシステム）の場合には、それらが生み出す集合知やルールなどが登場します。今回は省略します。


AIエージェント開発用フレームワークとして[LangChain](https://www.langchain.com)などがありますが、上記の分析から見ると、サポートされている範囲は、現時点、一部に留まります。



### 参考：マイクラ用AIエージェントのシステム構成

前節で例示したMinePalの構成要素の関係性を図で表現すると下図のようになります。
前節で整理した二重過程理論の形に一部綺麗には当てはまっておらず、見通しや拡張性の観点でリファクタリングする余地があることが分かります。綺麗な形になるようにアーキテクチャから作り直してみようかと思っております。

```mermaid
graph TD
	Player((Player))
	
	subgraph Client PC
		
		subgraph Minecraft
			Player_Character[Player Character]
			MinePal_Bot[MinePal Bot]
		end
		
		subgraph MinePal Electron App
			GUI[GUI]
			Local_Server[Local Backend Server]
			subgraph Subprocess
				subgraph Agent
					subgraph System 1
					  Mineflayer
					  mode[システム1の認知システム<br>（mode）]
					  skills[運動システム<br>（skills）]
					  world[知覚システム<br>（world）]
					  Timer((Timer))
					end
					subgraph System 2
						Agent_[システム2の認知システム<br>（Agent）]
						actions[行動（コマンド）<br>（actions）]
					end
				end
			end
		end
	end
	
	subgraph Remote Servers
		OpenAI_API[OpenAI API]
	end
	
	Player -->|操作| Player_Character
	Player -->|設定やボット起動・停止| GUI
 	GUI -..->|設定の参照・変更<br>ボットの起動・停止| Local_Server
 	GUI -.......->|APIキーの有効性確認| OpenAI_API
 	Local_Server -->|ボットの起動や指示| Agent
 	Mineflayer -->|イベント通知<br>（チャットや状況変化）| Agent_
 	Agent_ --->|コマンド実行| actions
 	actions --->|スキル実行| skills
 	skills --->|Bot操作| Mineflayer
 	Mineflayer -..->|Bot操作| MinePal_Bot
 	skills --->|環境情報取得| world
 	world --->|環境情報取得| Mineflayer
 	Mineflayer -..->|環境情報取得| Minecraft
 	MinePal_Bot -...->|イベント通知<br>（チャット）| Mineflayer
 	Minecraft -..->|イベント通知<br>（状況変化）| Mineflayer
 	Player_Character -->|チャット（指示）| MinePal_Bot
 	Agent_ -.......->|発話意図解析や応答生成| OpenAI_API
 	Timer -->|1秒おきに実行| mode
 	mode -->|モードに応じて<br>動作を実行| skills
 	mode -->|環境情報取得| world
```

# まとめ

二重過程理論の概念と記憶の諸概念を参考に、AIエージェントを作るためのアーキテクチャと構成要素について整理し、マイクラ用AIエージェントMinePalの実装を例題にして具体的なイメージアップを試みました。

今回、理論と実例をぶつけ合ってアーキテクチャを分析するによって、一方を見るだけでは気付きにくい事項について発見できました。
具体的な題材なしに二重過程理論のみを用いて描いた理想のAIエージェント・アーキテクチャでは、現実味が乏しくなりがちで、実際にAIエージェントを作ろうとすると、見落としていた課題が現れてきて手が止まりやすいでしょう。
その反対に、整理の視点を与えてくれる理論なしに実装を眺めるだけでは、理想形が見えてこず、改良の発想が表面的なものに陥る可能性があります。

今回の用いた概念以外にも、自由エネルギー原理や脳の可塑性に関する理論などをアーキテクチャの整理に用いることでまた違った気付きが得られることが期待されます。それは今後の宿題とします。