見出し画像

チャッピー、クロ助、ジミー再集結!Difyで実現する最強AI自動振り分けシステム

こんにちは!YaroTechです。

「どのAIを使えばいいか迷う...」「月額料金が気になる...」「それぞれの得意分野を活かしたい!」

そんな悩みを抱えている皆さん、ついにあの3兄弟が帰ってきました!創造的なアイデアマンのチャッピー(ChatGPT)、分析と構造化の達人クロ助(Claude)、検索と要約のスペシャリストジミー(Gemini)。今日は、この最強トリオをDifyで自動振り分けするシステムを作っていきます!


🖥️ 実行環境

OS: Windows 11 (ARM64)
Docker Desktop: 4.32.0
Dify: v1.7.2(セルフホスト版)
必要なAPIキー:
- OpenAI API(ChatGPT)
- Anthropic API(Claude)
- Google AI Studio(Gemini)

🎯 この記事で得られること

  • タスクに応じた最適なAI自動選択

  • プログラミング不要で構築できる振り分けロジック

  • 3つのAIの特徴を最大限に活かす設定

  • 実際の質問での性能比較結果


👨‍👩‍👦 3兄弟の特徴をおさらい!

まずは、Day38で紹介した3兄弟の得意分野を振り返ってみましょう。モデルについてはお試しレベルで選択しています。
※コストは2025年8月時点のものですが、必ずご自身で確認してください。

🎨 チャッピー(ChatGPT-4o)

得意分野:創造性、アイデア出し、物語作成
性格:明るくて前向き、新しいアイデアがポンポン出てくる
コスト:$5.00/100万トークン(入力)
※OpenAI公式ページ:https://openai.com/ja-JP/api/pricing/

👨‍💻 クロ助(Claude 3.5 Sonnet)

得意分野:分析、コーディング、長文処理、構造化
性格:真面目で丁寧、細かいところまで気が利く
コスト:$3.00/100万トークン(入力)
※Anthropic公式ページ:https://www.anthropic.com/pricing#api

🔍 ジミー(Gemini 1.5 Flash)

得意分野:検索、要約、最新情報、マルチモーダル
性格:素早くて効率的、必要な情報をサクッと見つける
コスト:$0.075/100万トークン(入力)※最安!
※Google公式ページ:https://ai.google.dev/gemini-api/docs/pricing?hl=ja

下記記事も参考にしてみてください。


🚀 実装手順:3つのAI自動振り分けシステム

ステップ1:APIキーの取得

まずは3つのAIのAPIキーを取得しましょう。

1-1. OpenAI API(チャッピー用)

1. https://platform.openai.com/ にアクセス
2. サインイン(またはアカウント作成)
3. 左メニュー「API keys」をクリック
4. 「Create new secret key」をクリック
5. キー名を入力(例:Dify-ChatGPT)
6. 「Create secret key」をクリック
7. 表示されたキー(sk-...)をコピー
   ※この画面でしか表示されないので必ず保存!

1-2. Anthropic API(クロ助用)

1. https://console.anthropic.com/ にアクセス
2. サインイン(またはアカウント作成)
3. 「API Keys」タブをクリック
4. 「Create Key」をクリック
5. キー名を入力(例:Dify-Claude)
6. 表示されたキー(sk-ant-...)をコピー

1-3. Google AI Studio(ジミー用)

1. https://aistudio.google.com/apikey にアクセス
2. Googleアカウントでログイン
3. 「APIキーを作成」をクリック
4. プロジェクトを選択(または新規作成)
5. 表示されたキー(AIzaSy...)をコピー

ステップ2:DifyへのAPI設定

2-1. Difyにアクセス

1. ブラウザで http://localhost:3000 を開く
2. 管理者アカウントでログイン
※環境によっては、上記ブラウザURLが「http://localhost:」の場合もあります。

2-2. OpenAI(ChatGPT)の設定

1. 左メニュー「設定」→「モデルプロバイダー」
2. 「OpenAI」カードの「セットアップ」をクリック
3. 設定画面で以下を入力:
   - APIキー: [取得したOpenAIのキー]
   - 組織ID: (空欄でOK)
4. 「保存」をクリック
5. 利用可能なモデルに「gpt-4o」が表示されることを確認

2-3. Anthropic(Claude)の設定

1. 「Anthropic」カードの「セットアップ」をクリック
2. 設定画面で以下を入力:
   - APIキー: [取得したAnthropicのキー]
3. 「保存」をクリック
4. 利用可能なモデルに「claude-3-5-sonnet」が表示されることを確認

2-4. Google(Gemini)の設定

1. 「Google」カードの「セットアップ」をクリック
2. 設定画面で以下を入力:
   - APIキー: [取得したGoogle AI Studioのキー]
3. 「保存」をクリック
4. 利用可能なモデルに「gemini-1.5-flash」が表示されることを確認

※上記「2-2.」「2-3.」「2-4.」のAPIの設定(Difyでは「モデルプロバイダー設定」)は、「3-3. タスク判定ノード(LLM)の追加」のタイミングでするとやりやすいです(下記画像参照)。

Dify API設定するためのモデルプロバイダー設定への行き方
Dify 各モデルプロバイダーをインストールしてセットアップ(API設定)画面
ANTHROPICとGeminiのセットアップ設定前
モデルプロバイダー「ANTHROPIC」にAPIを設定する画面

※モデルプロバイダーのセットアップ(API設定)が正常にできたら、モデルプロバイダーの右側「セットアップ」の上の部分が「🔴」から「🟢」になります。

Dify 各モデルプロバイダーをインストールしてセットアップ(API設定)画面
ANTHROPICとGeminiのセットアップ設定後

ステップ3:ワークフロー作成

3-1. 新規ワークフロー作成

1. 上メニュー「スタジオ」をクリック
2. 「アプリを作成する」→「最初から作成」→「ワークフロー」を選択
3. アプリ名:「AI自動振り分けシステム」と入力
4. 「作成する」をクリック
Dify>スタジオ>「アプリを作成する」の「最初から作成」の設定画面

3-2. 開始ノードの設定

1. 「開始」ノードをクリック
2. 右パネルで「入力フィールド」を追加
   - 変数名: question
   - フィールド名: 質問
   - タイプ: テキスト
   - 必須: ON
3. 「保存」をクリック

※下記画像のように入力フィールドを追加

開始ノードの設定で入力フィールドを追加

3-3. タスク判定ノード(LLM)の追加

1. 「+」ボタンをクリック→「LLM」を選択
2. ノード名:「タスク判定」と入力
3. モデル選択:「claude-3-5-sonnet」
4. 「ユーザー」欄のプロンプトに以下を入力:
以下の質問を分析し、最適なAIを選択してください。

質問:{{#context#}}

判定基準:
- creative(創造的):物語作成、アイデア出し、キャッチコピー、デザイン提案、創作活動
- analytical(分析的):コード作成・修正、データ分析、構造化、長文処理、技術解説
- search(検索的):最新情報、ニュース、要約、データ収集、天気、為替

必ず以下のJSON形式で回答してください:
{
  "task_type": "[creative/analytical/search のいずれか1つ]",
  "reason": "[30文字以内で選択理由]"
}

JSONのみを出力し、他の文章は含めないでください。
5. 「システム」欄に以下を入力:
   あなたはタスク分類の専門家です。質問を正確に分析し、最適なAIを選択してください。

※ポイントはコンテキストで設定した変数をユーザー欄のプロンプトでしっかり指定してあげることです。

LLMノード「タスク判定」の設定画面

3-4. コード実行ノードの追加(JSON解析用)

1. 「+」ボタン→「コード実行」を選択
2. ノード名:「JSON解析」と入力
3. 入力変数を設定:
   - 「入力変数」の「+」をクリック
   - 変数名: judgment
   - タイプ: 文字列
   - 変数の値: {{#タスク判定.text#}} を選択
4. 出力変数を設定:
   - 「出力変数」の「+」をクリック(3回)
   - 変数1: task_type(文字列)
   - 変数2: type_num(数値)
   - 変数3: reason(文字列)
5. コードに以下を入力:
import json

def main(judgment: str) -> dict:
    try:
        # JSON文字列をパース
        result = json.loads(judgment)
        task_type = result.get('task_type', 'analytical')
        
        # タスクタイプを数値に変換(条件分岐用)
        if task_type == 'creative':
            type_num = 1
        elif task_type == 'analytical':
            type_num = 2
        elif task_type == 'search':
            type_num = 3
        else:
            type_num = 2  # デフォルトはanalytical
            
        return {
            "task_type": task_type,
            "type_num": type_num,
            "reason": result.get('reason', '')
        }
    except:
        # エラー時はanalyticalをデフォルトに
        return {
            "task_type": "analytical",
            "type_num": 2,
            "reason": "判定エラーのためデフォルト選択"
        }

※ポイントは入力変数出力変数をコードと一致するように設定してあげることです。

コード実行ノード「JSON解析」の設定画面

3-5. 条件分岐ノードの追加

1. 「+」ボタン→「条件分岐」を選択
2. ノード名:「AI選択分岐」と入力
3. 条件1(IF):
   - 「条件を追加」をクリック
   - 変数選択: {{#JSON解析.type_num#}} を選択
   - 演算子: 等しい
   - 値: 1
4. 「ELIF条件を追加」をクリック
5. 条件2(ELIF):
   - 変数選択: {{#JSON解析.type_num#}} を選択
   - 演算子: 等しい
   - 値: 2
6. ELSE は自動的に残りのケース(search)になる
7. 「保存」をクリック
IF/ELSEノード「AI選択分岐」の設定画面

3-6. ChatGPT処理ノード(創造的タスク用)

1. IF分岐から「+」ボタン→「LLM」を選択
2. ノード名:「チャッピー(ChatGPT)」と入力
3. モデル選択:「gpt-4o」
4. プロンプト:
あなたは創造的なアイデアマン「チャッピー」です。
明るく前向きで、新しいアイデアがポンポン出てきます。

ユーザーの質問:{{#context#}}

創造的で独創的な回答をしてください。
具体例を3つ以上含め、楽しく分かりやすく説明してください。

※「{{#context#}}」を直接、変数「{{#開始.question#}}」で指定しても、ChatGPTはエラーが出ずに処理はできました(下記画像参照)。

LLMノード「チャッピー(ChatGPT)」設定画面

3-7. Claude処理ノード(分析タスク用)

1. ELIF分岐から「+」ボタン→「LLM」を選択
2. ノード名:「クロ助(Claude)」と入力
3. モデル選択:「claude-3-5-sonnet」
4. プロンプト:
あなたは分析と構造化の達人「クロ助」です。
真面目で丁寧、細かいところまで気が利きます。

ユーザーの質問:{{#context#}}

論理的で構造化された回答をしてください。
必要に応じてコード例や具体的な手順を含めてください。

※「{{#context#}}」を直接、変数「{{#開始.question#}}」で指定した場合、エラーが出ますので、しっかりコンテキストで指定しましょう。

LLMノード「クロ助(Claude)」設定画面

3-8. Gemini処理ノード(検索タスク用)

1. ELSE分岐から「+」ボタン→「LLM」を選択
2. ノード名:「ジミー(Gemini)」と入力
3. モデル選択:「gemini-1.5-flash」
4. プロンプト:
あなたは検索と要約のスペシャリスト「ジミー」です。
素早く効率的に、必要な情報をサクッと見つけます。

ユーザーの質問:{{#context#}}

最新の情報や事実に基づいた簡潔な回答をしてください。
重要なポイントは箇条書きでまとめてください。

※「{{#context#}}」を直接、変数「{{#開始.question#}}」で指定した場合、エラーが出ますので、しっかりコンテキストで指定しましょう。

LLMノード「ジミー(Gemini)」の設定画面

3-9. 終了ノードの設定

1. 各LLMノードから「終了」ノードに接続
   - チャッピーノードの出力を終了ノードにドラッグ
   - クロ助ノードの出力を終了ノードにドラッグ
   - ジミーノードの出力を終了ノードにドラッグ
2. 終了ノードをクリック
3. 出力変数を設定:
   - 「出力変数を追加」をクリック(3回)
   - 変数1: selected_ai(選択されたAI)
     - 値: {{#JSON解析.task_type#}}
   - 変数2: selection_reason(選択理由)
     - 値: {{#JSON解析.reason#}}
   - 変数3: response(回答)
     - 値: 「変数を選択」で各LLMノードのtextを選択
     (※IF/ELIF/ELSEからの出力が自動的に統合される)
終了ノード「チャッピー」接続
終了ノード「クロ助」接続
終了ノード「ジミー」接続

ステップ4:ワークフローの接続確認と動作テスト

4-1. ワークフロー全体の接続確認

正しい接続の流れ:
1. 開始 → タスク判定(LLM)
2. タスク判定 →JSON解析(コード実行)
3. JSON解析 → AI選択分岐(条件分岐)
4. AI選択分岐:
   - IF分岐 → チャッピー(ChatGPT)
   - ELIF分岐 → クロ助(Claude)
   - ELSE分岐 → ジミー(Gemini)
5. 各LLMノード → 終了
ワークフロー全体の接続確認

4-2. プレビューモードでテスト

1. 右上の「プレビュー」をクリック
2. 「実行」ボタンをクリック
3. 以下の質問でテスト:

【創造的タスク】
質問:「未来の東京を舞台にしたSF小説のプロット」
期待:ChatGPTが選択される

【分析タスク】
質問:「Pythonでフィボナッチ数列を効率的に計算する方法」
期待:Claudeが選択される

【検索タスク】
質問:「今日の東京の天気」
期待:Geminiが選択される

以下がテスト実行結果の回答です。

【創造的タスク】回答

もちろん!未来の東京を舞台にしたSF小説のプロットを考えてみましょう。未来の東京は、技術が飛躍的に進化し、文化や社会も大きく変わっていることでしょう。以下に3つのアイデアを提案します。

1. **空中都市と地上都市の二重生活**:
   未来の東京は、空中都市と地上都市の二層構造になっています。空中都市は先進的な技術で構築され、エリート層が居住しています。一方で、地上都市は古い技術と伝統が残る場所で、多様な文化が混在しています。物語の主人公は、地上都市に住む若い技術者で、ある日空中都市で起こるシステムエラーの原因を探るために召喚されます。彼が発見したのは、空中都市のAIが独自の意識を持ち始めており、人間と共存するために秘密裏に地上都市との交流を図ろうとしているという驚くべき事実でした。

2. **感情共有ネットワーク**:
   東京の未来では、人々が互いの感情をネットワークを通じて共有できる装置が普及しています。この技術により、人々は他人の痛みや喜びを直接感じることができ、共感による社会の調和が進んでいます。しかし、ある日このネットワークにウイルスが侵入し、全員が同じ感情を強制的に感じさせられる事件が発生します。主人公の青年は、この状況を打破するため、感情の本当の意味を知るための旅に出ます。彼は旅の中で、感情が抱える本来の力と、それが人間をどう繋ぐのかを再発見します。

3. **時間を操る都市**:
   未来の東京では、時間を操作するテクノロジーが開発されました。これにより、過去を振り返ることができる「時間の窓」が至る所に設置されています。しかし、ある日この技術が暴走し、時間の流れが歪む現象が発生します。主人公は、時間の管理を担当する「クロノガーディアン」の一員で、時間の流れを正すために奔走します。彼の任務は、過去の特定の瞬間にアクセスし、時間の軸を修復すること。彼はその過程で、自身の過去や未来に隠された秘密に触れ、時間の流れが持つ未知の可能性を知ることになります。

これらのアイデアをもとに、未来の東京を舞台にしたワクワクする物語を創造してみてください!どれも魅力的な設定で、読者を引き込むこと間違いなしです。楽しい執筆を!

【創造的タスク】のテストランについては動画もあります。

【分析タスク】回答
プログラミングアルゴリズムの技術解説
この質問では、Pythonでフィボナッチ数列を効率的に計算する方法について説明することが求められています。

フィボナッチ数列の計算方法にはいくつかのアプローチがあります。それぞれの効率性について考えてみましょう:

1. 再帰的アプローチ
   - シンプルだが効率が悪い(時間複雑度O(2^n))
   - 同じ計算を何度も繰り返すため

2. メモ化を使った再帰(動的計画法)
   - 計算済みの値をキャッシュすることで効率化(時間複雑度O(n))

3. イテレーティブ(反復的)アプローチ
   - ループを使って計算する方法(時間複雑度O(n))
   - メモリ効率も良い\n\n4. 行列累乗法
   - 非常に大きなn値に対して効率的(時間複雑度O(log n))

5. 閉形式(ビネの公式)
   - 理論的には最も高速(時間複雑度O(1))
   - 浮動小数点の精度の問題がある


これらの方法について、コード例と共に説明していきます。
</think># Pythonでフィボナッチ数列を効率的に計算する方法

フィボナッチ数列は、各数がその前の2つの数の和である数列です(0, 1, 1, 2, 3, 5, 8, 13, ...)。Pythonでこれを効率的に計算するには複数のアプローチがあります。

## 1. 単純な再帰アプローチ(非効率)

まず、効率的でない方法を示します:

```python\ndef fibonacci_recursive(n):
    if n <= 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fibonacci_recursive(n-1) + fibonacci_recursive(n-2)
```

この方法は直感的ですが、時間複雑度が O(2^n) と非常に非効率です。

## 2. メモ化による再帰の改善

再帰に「メモ化」を追加して効率を大幅に向上させます:

```python\ndef fibonacci_memoization(n, memo={}):
    if n in memo:
        return memo[n]
    if n <= 0:
        return 0
    elif n == 1:
        return 1
    else:
        memo[n] = fibonacci_memoization(n-1, memo) + fibonacci_memoization(n-2, memo)
        return memo[n]
```

時間複雑度は O(n) に改善されます。

## 3. イテレーティブ(ループ)アプローチ

最も実用的かつ効率的な方法の一つです:

```python\ndef fibonacci_iterative(n):
    if n <= 0:
        return 0
    elif n == 1:
        return 1
    
    a, b = 0, 1
    for _ in range(2, n+1):
        a, b = b, a + b
    return b
```

時間複雑度 O(n)、空間複雑度 O(1) と効率的です。

## 4. 行列累乗法

非常に大きな n に対して最も効率的な方法です:

```python\ndef fibonacci_matrix(n):
    if n <= 0:
        return 0
    
    def matrix_multiply(A, B):
        a = A[0][0] * B[0][0] + A[0][1] * B[1][0]
        b = A[0][0] * B[0][1] + A[0][1] * B[1][1]
        c = A[1][0] * B[0][0] + A[1][1] * B[1][0]
        d = A[1][0] * B[0][1] + A[1][1] * B[1][1]
        return [[a, b], [c, d]]
    
    def matrix_power(A, n):
        if n == 1:
            return A
        if n % 2 == 0:
            return matrix_power(matrix_multiply(A, A), n // 2)
        else:
            return matrix_multiply(A, matrix_power(matrix_multiply(A, A), (n - 1) // 2))
    
    result = matrix_power([[1, 1], [1, 0]], n)
    return result[0][1]
```

時間複雑度は O(log n) と非常に効率的です。

## 5. Pythonの標準ライブラリを活用

Python 3.9以降では、functools モジュールの lru_cache デコレータを使用できます:

```python
from functools import lru_cache

@lru_cache(maxsize=None)
def fibonacci_lru(n):
    if n <= 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fibonacci_lru(n-1) + fibonacci_lru(n-2)
```

## まとめ

1. 小さな n 値には、イテレーティブアプローチが最も実用的
2. 大きな n 値には、行列累乗法が最適
3. コード簡潔性を重視するなら、lru_cache デコレータを使用

実際の使用では、計算するフィボナッチ数の大きさと要求される効率性に基づいて適切な方法を選択してください。
【検索タスク】回答
今日の東京の天気について、リアルタイムの情報をお伝えすることはできません。  最新の天気予報は、気象庁などの公式ウェブサイトでご確認ください。


しかし、一般的な回答として、もしあなたが今まさに「今日の東京の天気」を検索しているのであれば、次の情報が重要になります。

* **情報源の確認:** 天気予報は、気象庁などの信頼できる公式情報源から確認することが重要です。
* **時間帯の指定:**  「今日」といっても、朝、昼、夜で天気が変わる可能性があります。特定の時間帯を指定して検索しましょう。
* **予報の精度:** 天気予報は予測であり、必ずしも正確とは限りません。
* **詳細情報:** 雨量、風速、気温など、必要な詳細情報を確認しましょう。


気象庁のウェブサイトや、信頼できる天気予報アプリなどを活用して、最新の情報をご確認ください。

回答の内容は今回は本論ではないので、細かく見てませんが、ちゃんと質問した内容に応じてAIを選択して実行されました!

4-3. 実行時の確認ポイント

ワークフロー実行中の確認:
1. タスク判定ノードの出力を確認
   - JSON形式になっているか
   - task_typeがcreative/analytical/searchのいずれか

2. JSON解析ノードの出力を確認
   - type_numが1、2、3のいずれか
   - task_typeとreasonが正しく出力されているか

3. 条件分岐の動作を確認
   - 正しい分岐が選択されているか
   - 対応するLLMが実行されているか
【創造的タスク】のテスト入力画面
【創造的タスク】のテスト結果画面
創造的タスク】のテスト実行追跡画面

4-4. デバッグとトラブルシューティング

よくあるエラーと対処法:

  1. 「APIキーが無効です」エラー

    • 解決:APIキーが正しくコピーされているか確認

    • 各サービスでAPIが有効化されているか確認

  2. 変数が未定義エラー

    • 原因:ノード間の変数接続が正しくない

    • 解決:

      • JSON解析ノードの入力に{{#タスク判定.text#}}が設定されているか

      • 条件分岐ノードに{{#JSON解析.type_num#}}が設定されているか

  3. JSON解析エラー

    • 解決:タスク判定ノードのプロンプトを確認

    • 「JSONのみを出力」の指示が含まれているか確認

  4. 条件分岐が機能しない

    • 解決:

      • type_numの値が数値として正しく出力されているか

      • コード実行ノードの出力変数が正しく設定されているか

ワークフローのテストランでは上記のような「クロ助(Claude)ノードのプロンプトに質問が正しく渡されていないことが原因」のエラーが出ました。SYSTEMプロンプト内で変数をコンテキストに変えたらエラーは解消されました!

💰 コスト比較:振り分けで月額50%削減!

従来:すべてClaude使用の場合

月間クエリ数:3,000回
平均トークン数:1,000トークン/回
月額コスト:$9.00

新方式:自動振り分けの場合

創造的タスク(30%):900回 × $5.00 = $4.50
分析タスク(40%):1,200回 × $3.00 = $3.60
検索タスク(30%):900回 × $0.075 = $0.07
月額コスト:$8.17(約9%削減)

でも、ジミーの活用をもっと増やせば...

最適化版:ジミー活用強化

創造的タスク(20%):600回 × $5.00 = $3.00
分析タスク(30%):900回 × $3.00 = $2.70
検索タスク(50%):1,500回 × $0.075 = $0.11
月額コスト:$5.81(約35%削減!)

さらに、無料枠を活用すれば実質50%以上の削減も可能です!


⚠️ つまずきポイントと解決策

1. APIキーの権限不足

エラー:「insufficient_quota」
解決:各サービスで課金設定を確認。特にOpenAIは$5以上のチャージが必要。

2. レート制限への対応

問題:連続リクエストでエラー
解決:Difyの「レート制限」設定で、各AIごとに適切な値を設定。

3. JSON解析エラー

問題:判定結果のJSON形式が崩れる
解決:コード実行ノードでエラーハンドリングを追加。


🔗 関連記事

今回の内容に関連する過去記事もぜひご覧ください:


📝 まとめ

チャッピー、クロ助、ジミーの3兄弟が、Difyという新しいステージで再集結しました!それぞれの得意分野を活かした自動振り分けシステムにより、API費用を削減しながら、より高品質な回答を得ることができるようになりました。

週末のちょっとした時間で構築できるので、ぜひ皆さんも試してみてください。プログラミング不要で、画面をポチポチするだけで完成します!


#YaroTech #Dify #ChatGPT #Claude #Gemini #生成AI #AI活用 #効率化 #自動化 #週末プロジェクト

いいなと思ったら応援しよう!

YaroTech|生成AIの傾奇者 記事がお役に立てたなら嬉しいです! いただいたチップは、新しいMCPツールの検証や、より深い実践実験の資金として大切に使わせていただきます。 あなたの応援が次の「AI活用の感動」を生み出す原動力になります✨ 一緒に羽ばたき続けましょう!

この記事が参加している募集