※この記事は AI(Microsoft Copilot)によって生成され、筆者が内容を確認・調整しています。
※この記事は前回の記事
https://qiita.com/genkyoryo110/items/e5df2060d9f3b6493b6e
の続編です。
はじめに
AI タウンは「複数の作業AIが街の住人として働き、管理AIが街全体を統括する」
というコンセプトで設計している個人開発プロジェクトです。
Version 6 では作業AIを大量に増産する方向で進めていましたが、
開発が複雑化し、街の“脳”となる管理AIが不在のまま肥大化してしまいました。
そのため、しばらく開発は中止し、参考文献を読んでいました。
参考文献の中で、仕組みからわかる大規模言語モデル 生成AI時代のソフトウェア開発入門という本が非常に分かりやすかったです。
こちらの本を参考に、Version 7 では方向転換し、
LangGraph を使った最小構成の AI タウン基盤を構築しました。
この記事では、その最小構成のアーキテクチャをまとめます。
🎯 Version 7 のゴール
- LangGraph による制御フローの確立
- 管理AI(TaskPlannerNode)によるタスク分類
- 作業AI(chat_agent / rag_agent)の役割分離
- RAGStore による永続化された街の知識ベース
- Tool Registry による作業AIの抽象化
- MemoryUpdateNode による「街の記憶」更新
- 最小構成として動作する AI タウンの完成
🏛️ ディレクトリ構成(Version 7)
ai-town/
├─ city_controller/ ← LangGraph 制御フロー
├─ agents/ ← 作業AI(chat / rag)
├─ tools/ ← LangChain Tools 化
└─ memory/ ← RAGStore(FAISS 永続化)
🧠 city_controller:街の司令塔(LangGraph)
Version 7 の中心は LangGraph の StateGraph。
ノード構成は以下の通り:
task_planner(管理AI:LLM)
→ agent_selector(作業AI選択)
→ worker_call(ツール呼び出し)
→ memory_update(RAG保存)
→ END
task_planner.py
LLM によるタスク分類(chat / search / save / summarize)。
agent_selector.py
task_type に応じて作業AIを選択。
worker_call.py
Tool Registry から該当ツールを呼び出す。
memory_update.py
save タスク時に RAGStore に保存。
🤖 agents:作業AI(街の住人)
chat_agent.py
- 日本語で自然な会話
- 前置きなしの簡潔な応答
- 汎用タスク担当
rag_agent.py
- RAGStore から関連情報を検索
- 文脈を踏まえて日本語で回答
- search タスク担当
🧰 tools:作業AIを LangChain Tool 化
chat_agent_tool.py / rag_agent_tool.py
BaseTool を継承し、作業AIをツールとして公開。
registry.py
作業AIツールを辞書として管理し、
worker_call_node がここからツールを取得する。
📚 memory:街の知識ベース(RAGStore)
rag_store.py
- FAISS によるベクトルストア
- 永続化(save_local / load_local)
- 類似度検索(similarity_search)
- MemoryUpdateNode からの保存を受け付ける
🔍 LangGraph ノードの流れ(Version 7)
-
task_planner
LLM がユーザ入力を分類(chat / search / save / summarize) -
agent_selector
task_type に応じて作業AIを選択
save の場合は memory_to_add をセット -
worker_call
registry からツールを取得し、作業AIを実行 -
memory_update
save タスク時に RAGStore に保存 -
END
🧪 Version 7 の動作例
入力
街のルールを調べて
処理
- task_planner → search
- agent_selector → rag_agent
- worker_call → rag_agent 実行
- memory_update → 保存なし
出力
RAGStore の文脈を踏まえた日本語回答。
入力
このルールを覚えて
処理
- task_planner → save
- agent_selector → chat_agent(応答)+ memory_to_add
- worker_call → chat_agent 実行
- memory_update → RAGStore に保存
🧩 Version 6 → Version 7 の変遷
| Version | 内容 |
|---|---|
| 6 | 作業AIを大量生産する路線。管理AI不在。複雑化して開発停止。 |
| 7 | LangGraph による最小構成の街の脳と記憶を構築。作業AIは2つに整理。 |
Version 7 は「増やす」ではなく「まとめる」方向に舵を切ったことで、
街の基盤がシンプルかつ強力になった。
🔧 改善ポイント(Copilot 解析より)
- TaskPlanner の分類精度向上(JSON化など)
- save 専用 memory_agent の追加
- RAGStore の初期化改善(ダミー文書撤廃)
- RAGStore のロード・保存の効率化
- エージェント追加に備えた AgentSelector の拡張性向上
🎉 まとめ:Version 7 は「AIタウンの最小構成の完成形」
Version 7 で構築したのは、
AIタウンの 脳(管理AI) と 記憶(RAG) と 住人(作業AI) が
最小構成で連携するアーキテクチャ。
この基盤の上に、
- 新しい作業AI
- 新しいツール
- 新しい街のルール
- 新しい記憶
を積み上げていくことができる。