マルチエージェントAIの自動化構築方法:LangGraph


# はじめに

langchainのblogに以下が投稿されました。
本記事は意訳要約記事になります。

https://blog.langchain.dev/how-to-build-the-ultimate-ai-automation-with-multi-agent-collaboration/


# 要約

**1. GPT Researcherの進化**
   - AIエージェントの構築、テスト、デプロイの方法は大幅に進化している
   - 現在のAIの進歩の性質とスピードそのものである
   - プロンプティングから、エージェント関数の呼び出し、RAG、エージェントのワークフローへと進化している

https://github.com/assafelovic/gpt-researcher

**2. LangGraphの紹介**
   - LangGraphはLangChainの拡張版である
     - エージェントとマルチエージェントのフローを作成することを目的としている
     - 循環フローを作成する機能が追加されている
     - メモリが内蔵されている
   - LangGraphは開発者に高度な制御性を提供する
     - カスタムエージェントとフローを作成するために重要である
     - ほとんどの実稼働エージェントは特定のユースケースに合わせてカスタマイズされている
     - カスタマイズされた任意のエージェントを作成する柔軟性を提供する
     - 直感的な開発者エクスペリエンスを提供する

**3. 究極の自律研究エージェントの構築**
   - LangGraphを活用することで研究プロセスの深さと品質を大幅に向上できる
     - 専門スキルを持つ複数のエージェントを活用できる
     - すべてのエージェントが特定のスキルだけに注力し、特化することで利点がある
       - 関心事の分離
       - カスタマイズ性の向上
       - プロジェクトの成長に伴う拡張性の向上
   - STORM論文に触発された例を示す
     - AIエージェントのチームが計画から公開までの特定のトピックに関する研究を行う方法を示す
     - 最先端の自律研究エージェントであるGPT Researcherも利用する

**4. 研究エージェントチーム**
   - 研究チームは7つのLLMエージェントで構成されている
     - チーフエディター
     - GPT Researcher
     - エディター
     - レビュアー
     - リバイザー
     - ライター
     - パブリッシャー

**5. アーキテクチャ**
   - 自動化プロセスは以下の段階に基づいている
     - 研究の計画
     - データの収集と分析
     - レビューと修正
     - レポートの作成
     - 最終的な公開
   - プロセスの詳細
     - Browser (gpt-researcher)
     - Editor
     - 各アウトライントピックについて（並行して）
       - Researcher (gpt-researcher)
       - Reviewer
       - Reviser
     - Writer
     - Publisher

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348593/bf41457c-60ca-62e5-a836-84e3b3facf41.png)


**6. グラフの状態を定義する**
   - 状態管理はLangGraphの重要な機能である
     - 開発者がアプリケーション全体の状態をカプセル化するGraphStateを定義する
     - グラフの各ノードはこの状態を変更できる
     - 相互作用の発展するコンテキストに基づいて動的な応答を可能にする
   - ResearchStateの定義
     - 研究タスクとレポートのレイアウトコンテンツの2つの領域に分かれている

**7. LangGraphを使ったグラフの初期化**
   - マルチエージェント開発の利点
     - 各エージェントを特化してスコープの絞られたスキルを持つように構築できる
   - Researchエージェントの例
   - グラフの初期化方法
     - add_node、add_edge、set_entry_pointの3つの主要な関数で構成される

**8. ステートフルな並列化をサポートするためのグラフ内のグラフ**
   - 並列作業の活用方法を知ることはスピードを最適化するための鍵となる
   - サブグラフを作成することで並列実行における状態の問題を解決できる
   - DraftStateの定義
   - 条件付きエッジの活用

**9. 研究アシスタントの実行**
   - エージェント、ステート、グラフを完成させたら、研究アシスタントを実行する
   - カスタマイズを容易にするためにtask.jsonファイルを使用する

**10. 今後の展望**
    - 人間の介入の重要性
      - 最適化されたAIエクスペリエンスのために重要である
      - 正確性、制御感、決定論的な結果を保証する
    - Webとローカルデータの両方に関する研究のサポートが重要である
    - 取得したソースの品質向上と最適なストーリーラインでの最終レポートの作成に努める
    - LangGraphとマルチエージェントコラボレーションの進歩
      - アシスタントが動的にグラフを計画・生成できるようになる
      - 与えられたタスクに対して必要なエージェントのみを選択できるようになる
      - グラフの基本に基づいて戦略を立てられるようになる
      - 新しい可能性の世界を切り開く



# 用語まとめ

| 用語 | 説明 |
|------|------|
| GPT Researcher | 特定のトピックについて詳細な研究を行う専門の自律エージェント |
| LangGraph | エージェントとマルチエージェントのフローを作成することを目的としたLangChainの拡張版 |
| LangChain | 言語モデルを使用してアプリケーションを構築するためのライブラリ |
| RAG | Retrieval-Augmented Generationの略。検索によって拡張された生成モデル |
| GraphState | LangGraphにおいてアプリケーション全体の状態をカプセル化するために開発者が定義する重要な概念 |
| TypedDict | PythonのTypingモジュールで定義される型付け辞書 |
| STORM論文 | STructured Ovservation in Reasoning Modelsの略。AIエージェントのチームによる研究プロセスを提案した論文 |
| LLM | Large Language Modelの略。大規模な言語モデル |
| フローエンジニアリング | エージェントのワークフローを設計・実装すること |
| マルチエージェントワークフロー | 複数のエージェントが協調して働くためのワークフロー |

### GraphStateとは？

GraphStateは、LangGraphにおいてアプリケーション全体の状態をカプセル化するために開発者が定義する重要な概念である。以下のような特徴を持つ。

- GraphStateは構造化されたアプローチによって状態管理を促進する
- 開発者はアプリケーション全体の状態を表現するGraphStateクラスを定義する
- GraphStateはTypedDictを継承したPythonのクラスとして定義される
- GraphStateには、アプリケーションに必要なすべての状態変数が含まれる
- グラフの各ノードはGraphStateのインスタンスにアクセスし、状態を変更できる
- GraphStateにより、相互作用の発展するコンテキストに基づいて動的な応答が可能になる

具体的には、研究アシスタントの例ではResearchStateというクラスが定義されている。

```python
class ResearchState(TypedDict):
    task: dict
    initial_research: str
    sections: List[str]
    research_data: List[dict]
    title: str
    headers: dict
    date: str
    table_of_contents: str
    introduction: str
    conclusion: str
    sources: List[str]
    report: str
```

ResearchStateは研究タスクとレポートレイアウトに関する変数を含んでおり、アプリケーション全体で共有される状態を表現している。LangGraphの各ノードはこのResearchStateにアクセスし、状態を読み書きすることで、アプリケーションの状態を動的に変更していく。

このようにGraphStateは、LangGraphにおける状態管理の中核をなす重要な概念である。


### DraftStateとは？

DraftStateは、研究アシスタントの例において、研究レポートの下書きに関する状態を管理するために定義されたGraphStateである。以下のような特徴を持つ。

```python
class DraftState(TypedDict):
    task: dict
    topic: str
    draft: dict
    review: str
    revision_notes: str
```

- DraftStateはTypedDictを継承したPythonのクラスとして定義されている
- 研究タスク（task）、研究トピック（topic）、レポートの下書き（draft）、レビュー結果（review）、修正メモ（revision_notes）などの変数を含む
- 研究レポートの下書きに関連する状態を表現している
- LangGraphのサブグラフで使用される
- サブグラフ内の各ノード（Researcher、Reviewer、Reviser）はDraftStateにアクセスし、状態を読み書きする

DraftStateは、研究アシスタントの例において、並列処理される研究レポートの下書きに関する状態管理を担っている。メインのグラフで使用されるResearchStateとは異なり、DraftStateはサブグラフ内でのみ使用される。

サブグラフ内の各ノードは、DraftStateを通じて下書きの状態を共有し、連携しながら研究レポートの下書きを完成させていく。これにより、並列処理におけるエージェント間の状態の同期が実現されている。

このようにDraftStateは、LangGraphにおける並列処理を実現するためのサブグラフ内で使用される重要なGraphStateの一つである。

### task.jsonファイルとは？

task.jsonファイルは、研究アシスタントの例において、ユーザーが研究タスクの詳細を指定するために使用されるJSONファイルである。以下のような特徴を持つ。

```json
{
  "query": "AIはハイプサイクルにありますか？",
  "max_sections": 3,
  "publish_formats": {
    "markdown": true,
    "pdf": true,
    "docx": true
  },
  "follow_guidelines": false,
  "model": "gpt-4-turbo",
  "guidelines": [
    "レポートはAPA形式で書かなければなりません",
    "各サブセクションには、ハイパーリンクを使用したサポート元を含める必要があります。存在しない場合は、サブセクションを削除するか、前のセクションの一部として書き直します",
    "レポートはスペイン語で書かなければなりません"
  ]
}
```

- 研究の主題となるクエリ（query）を指定する
- レポートの最大セクション数（max_sections）を指定する
- 出力するレポートのフォーマット（publish_formats）を指定する
- ガイドラインに従うかどうか（follow_guidelines）を指定する
- 使用する言語モデル（model）を指定する
- レポート作成のためのガイドライン（guidelines）を指定する

task.jsonファイルは、研究アシスタントの実行時にコマンドライン引数として渡される。研究アシスタントはtask.jsonファイルを読み込み、指定された内容に基づいて研究タスクを実行する。

このようにtask.jsonファイルは、研究アシスタントのカスタマイズを容易にするために使用される設定ファイルである。ユーザーは、task.jsonファイルを編集することで、研究アシスタントの動作を柔軟に制御することができる。