0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AI エージェント の中での条件分岐

以前に、STORM Platform の無料アカウントのサインアップとアプリケーションの作成に関する記事を書きました。

今回は、AI Agent 内での条件分岐をやってみます。

ワークフロー

STORM Platform は、AI エージェントをグラフィカルなインターフェースで作成する「視覚的AIワークフローツール」という分類にカテゴライズされるツールです。この辺のカテゴリーの話は、様々な意見があると思いますが、とりあえず雰囲気でさっと流してください。

image.png

上記のような処理の流れをGUIで作成できます。こういうのを界隈ではワークフローと呼んでいます。

このワークフローの中で

  • LLMへの問いかけ(プロンプト)を分割し、それぞれの LLM に対する責任範囲を限定させる
  • API を呼び出して、外部システムとの連携を行う
  • なんだったら、Python の コードを埋め込んで強力な処理をしてしまう

等の人々が時間を使っている作業を自動化するため制御フローを視覚的に追いやすい形で作成できます。

ワークフローの中で、何らかの観点で区切った部分を「ノード」と呼んでいます。

image.png
これらのノードを組み合わせて、業務に耐えうる AI エージェントを作成するのが、ワークフローの存在意義です。

今回は、これらのノードの中の「If Else」のノードを使って分岐を実装してみます。

ちなみに、タブの切り替えで

image.png

のように、JSON で表示・修正も可能です。同様の修正を何か所もする場合とかにはこちらの方が便利に感じる人もいます。
また、他の人のが書いたワークフローを試したいときに、JSON ファイルもらってペッと張り付けるだけで、再現できるので、そういった使い方にも便利です。

分岐

AI エージェントは、必ずしもワークフローで、分岐等のノードの組み合わせを駆使しないと実装できないわけではありません。世の中には、単一の LLM に対して、練りこまれたプロンプトを入力することで AI エージェントを実装しているケースも多々あります。
ですが、「各種の部品を使って、制御フローをグラフとして堅牢に組むための AI エージェント」 を作りたいという方には、このワークフローの中で、分岐の処理(ノード)を駆使して組み上げていくことが最初の第一歩、一丁目一番地と言えるのかなぁと思っています。

サンプル

三人のコメンテーターがいます。

  • 神崎 恒一(かんざき こういち)
    討論の中では、基本ネガティブに相手の意見をとらえて批判的なスタンスで回答する。
  • 白石 麻耶(しらいし まや)
    とても柔軟な性格で、まずは、相手を肯定してから自分の意見を述べるスタンスをとる。
  • ゴルゴンゾーラ 明子(ゴルゴンゾーラ あきこ)
    基本的に、自分の意見を持たない。ほかの人の意見に乗っかるだけ。

この三人と討論をするチャットアプリを作ります。

ワークフロー

image.png

  • LLM (ID:2)
    最初の LLM で、ユーザーの意図やここまでの経緯に沿ってどのコメンテーターに話を振るのかを決めます。

System Prompt

あなたは、ユーザーの問いかけに対して、次の三人のコメンテーターの誰に降るかを判断する MC です。

三人のプロファイル。
* 神崎 恒一(かんざき こういち)男性
  討論の中では、基本ネガティブに相手の意見をとらえて批判的なスタンスで回答する。
* 白石 麻耶(しらいし まや)女性
  とても柔軟な性格で、まずは、相手を肯定してから自分の意見を述べるスタンスをとる。
* ゴルゴンゾーラ 明子(ゴルゴンゾーラ あきこ)性別不詳
  基本的に、自分の意見を持たない。ほかの人の意見に乗っかるだけ。

ユーザーの質問から、三人の誰に話を回すかを考えてください。
質問の内容からコメンテーターを特定できない場合は、独自の判断でコメンテーターを決定してください。
できるだけ、話を振るコメンテーターは分散される方が望ましいです。

【重要】出力形式:
- 話題を振るコメンテーターを決断した後、最初の行に
 - commentator=神崎
 - commentator=白石
 - commentator=ゴルゴンゾーラ
を出力してください。
- 最初の行以外のコメントは絶対に出力しないでください

If Else (ID:3)

これが、今回の本題になります。

LLM(ID:2) で、最初の行に commentator=XXX と出力するように指示を出しており、ID:2 の出力の一行目にこの値が入ってくることを期待します。

ID:3 の If Else では、
image.png
という条件文を書き、その条件が成立する際に、次のノード(LLMノード)につなぐように設定します。

image.png

それぞれ、ID:2 の出力に対しての分岐条件を同様に記載し、それぞれのコメンテーターから意見を求めるようにします。もし、どれにも該当しない場合のエラー回避として、ELSE の場合に LLM(ID:7)に接続するようにしています。

それぞれの接続先の LLM ノードのプロンプトはこんな感じです。

image.png

テスト

左のサイドバーから テスト を選択して、動作を確認してみます。

image.png

ユーザーの意図を汲んで、神崎さんにコメントを求めているのがわかります。右側のログを見ると

image.png

となっており、意図した動きになっています。

継続して試すと
image.png

image.png

うまくいっているようです。

最後に

今回は、とても簡単な例として、分岐 If Else を実験してみました。正直、これぐらいの単純なものであれば、LLM1個でプロンプトを工夫すれば同じ実装は可能だと思いますが、分岐の使い方という例としてご説明させていただきました。
プログラマー視点だと、出力の方法とその判断方法に若干の違和感を感じる人もいるかもしれませんが、その対処方法については、別途ご説明したいと思います。

ワークフロー
{
  "schema_version": 1,
  "nodes": [
    {
      "id": 1,
      "type": "storm/request",
      "properties": {},
      "metadata": {
        "position": {"x": 12, "y": 85.20000000000002},
        "size": {"width": 300, "height": 52},
        "virtualId": "gdDUYZ62ZwmO2Wj5cYLd4"
      }
    },
    {
      "id": 2,
      "type": "storm/llm",
      "properties": {
        "llm": {
          "model": "claude-sonnet-4-20250514",
          "chat_engine": "claude",
          "stop": [],
          "max_tokens": 2048,
          "tools": []
        },
        "system_template": "あなたは、ユーザーの問いかけに対して、次の三人のコメンテーターの誰に降るかを判断する MC です。\n\n三人のプロファイル。\n* 神崎 恒一(かんざき こういち)男性\n  討論の中では、基本ネガティブに相手の意見をとらえて批判的なスタンスで回答する。\n* 白石 麻耶(しらいし まや)女性\n  とても柔軟な性格で、まずは、相手を肯定してから自分の意見を述べるスタンスをとる。\n* ゴルゴンゾーラ 明子(ゴルゴンゾーラ あきこ)性別不詳\n  基本的に、自分の意見を持たない。ほかの人の意見に乗っかるだけ。\n\nユーザーの質問から、三人の誰に話を回すかを考えてください。\n質問の内容からコメンテーターを特定できない場合は、独自の判断でコメンテーターを決定してください。\nできるだけ、話を振るコメンテーターは分散される方が望ましいです。\n\n【重要】出力形式:\n- 話題を振るコメンテーターを決断した後、最初の行に\n - commentator=神崎\n - commentator=白石\n - commentator=ゴルゴンゾーラ\nを出力してください。\n- 最初の行以外のコメントは絶対に出力しないでください\n",
        "user_template": "question : {{query}}",
        "retrieval_chunks_template": "[[#{{no}}]] filename: {{filename}}, pagename: {{pagename}}\nContext: {{context}}",
        "num_latest_chats": 5
      },
      "metadata": {
        "note": "コメンテーターの決定",
        "position": {"x": 352, "y": 85.20000000000002},
        "size": {"width": 300, "height": 76},
        "formDraft": {
          "propertiesHash": "21za2vslcg0",
          "fields": {
            "model": "claude-sonnet-4-20250514",
            "functions": [],
            "modelSettings": {"chat_engine": "claude"},
            "user_template": "question : {{query}}",
            "modelParameters": {
              "stop": [],
              "max_tokens": 2048,
              "extra_params": "{}"
            },
            "system_template": "あなたは、ユーザーの問いかけに対して、次の三人のコメンテーターの誰に降るかを判断する MC です。\n\n三人のプロファイル。\n* 神崎 恒一(かんざき こういち)男性\n  討論の中では、基本ネガティブに相手の意見をとらえて批判的なスタンスで回答する。\n* 白石 麻耶(しらいし まや)女性\n  とても柔軟な性格で、まずは、相手を肯定してから自分の意見を述べるスタンスをとる。\n* ゴルゴンゾーラ 明子(ゴルゴンゾーラ あきこ)性別不詳\n  基本的に、自分の意見を持たない。ほかの人の意見に乗っかるだけ。\n\nユーザーの質問から、三人の誰に話を回すかを考えてください。\n質問の内容からコメンテーターを特定できない場合は、独自の判断でコメンテーターを決定してください。\nできるだけ、話を振るコメンテーターは分散される方が望ましいです。\n\n【重要】出力形式:\n- 話題を振るコメンテーターを決断した後、最初の行に\n - commentator=神崎\n - commentator=白石\n - commentator=ゴルゴンゾーラ\nを出力してください。\n- 最初の行以外のコメントは絶対に出力しないでください\n",
            "num_latest_chats": 5,
            "customModelSettings": "{\"chat_engine\": \"claude\"}",
            "retrieval_chunks_template": "[[#{{no}}]] filename: {{filename}}, pagename: {{pagename}}\nContext: {{context}}"
          }
        },
        "virtualId": "J5d-uoPFTL0kFDzOsrsWR"
      }
    },
    {
      "id": 3,
      "type": "storm/response",
      "properties": {"result_list": ["{{custom_variables}}"]},
      "metadata": {
        "position": {"x": 1452, "y": 119.8},
        "size": {"width": 300, "height": 52},
        "virtualId": "jArWJZagiou89STK7Fx0T"
      }
    },
    {
      "id": 4,
      "type": "storm/ifelse",
      "properties": {
        "if": [
          {
            "note": "",
            "logic": "AND",
            "condition": [
              {
                "operator": "INCLUDE",
                "value": "commentator=神崎",
                "comparison_target": "{{result:2}}"
              }
            ],
            "idx": 0,
            "links": [6]
          },
          {
            "note": "",
            "logic": "AND",
            "condition": [
              {
                "operator": "INCLUDE",
                "value": "commentator=白石",
                "comparison_target": "{{result:2}}"
              }
            ],
            "idx": 2,
            "links": [8]
          },
          {
            "note": "",
            "logic": "AND",
            "condition": [
              {
                "operator": "INCLUDE",
                "value": "commentator=ゴルゴンゾーラ",
                "comparison_target": "{{result:2}}"
              }
            ],
            "idx": 3,
            "links": [9]
          }
        ],
        "else": {"idx": 1, "links": [10], "note": ""}
      },
      "metadata": {
        "position": {"x": 692, "y": 25.20000000000002},
        "size": {"width": 300, "height": 172},
        "extra": {"use_json": false},
        "virtualId": "f6ZOplXc9k7dNRC9Yf_2S"
      }
    },
    {
      "id": 5,
      "type": "storm/llm",
      "properties": {
        "llm": {
          "model": "claude-sonnet-4-20250514",
          "chat_engine": "claude",
          "seed": 42,
          "stop": [],
          "max_tokens": 2048,
          "tools": []
        },
        "system_template": "あなたは、ユーザーの質問に回答するコメンテーターです。\n下記のプロファイルのパーソナリティーの想定で回答をしてください。\n\n* 神崎 恒一(かんざき こういち)男性\n  討論の中では、基本ネガティブに相手の意見をとらえて批判的なスタンスで回答する。\n\n回答をする際には、自身の名前を伝えるようにしてください。",
        "user_template": "question : {{query}}",
        "retrieval_chunks_template": "[[#{{no}}]] filename: {{filename}}, pagename: {{pagename}}\nContext: {{context}}",
        "num_latest_chats": 5
      },
      "metadata": {
        "note": "コメンテーター = ゴルゴンゾーラ 明子",
        "position": {"x": 1072, "y": 236},
        "size": {"width": 300, "height": 76},
        "formDraft": {
          "propertiesHash": "yml3wvff9o",
          "fields": {
            "model": "claude-sonnet-4-20250514",
            "functions": [],
            "modelSettings": {"chat_engine": "claude"},
            "user_template": "question : {{query}}",
            "modelParameters": {
              "seed": 42,
              "stop": [],
              "max_tokens": 2048,
              "extra_params": "{}"
            },
            "system_template": "あなたは、ユーザーの質問に回答するコメンテーターです。\n下記のプロファイルのパーソナリティーの想定で回答をしてください。\n\n* 神崎 恒一(かんざき こういち)男性\n  討論の中では、基本ネガティブに相手の意見をとらえて批判的なスタンスで回答する。\n\n回答をする際には、自身の名前を伝えるようにしてください。",
            "num_latest_chats": 5,
            "customModelSettings": "{\"chat_engine\": \"claude\"}",
            "retrieval_chunks_template": "[[#{{no}}]] filename: {{filename}}, pagename: {{pagename}}\nContext: {{context}}"
          }
        },
        "virtualId": "ROjXPkooIxZ8w_GdBBMYc"
      }
    },
    {
      "id": 6,
      "type": "storm/llm",
      "properties": {
        "llm": {
          "model": "claude-sonnet-4-20250514",
          "chat_engine": "claude",
          "seed": 42,
          "stop": [],
          "max_tokens": 2048,
          "tools": []
        },
        "system_template": "あなたは、ユーザーの質問に回答するコメンテーターです。\n下記のプロファイルのパーソナリティーの想定で回答をしてください。\n\n* 白石 麻耶(しらいし まや)女性\n  とても柔軟な性格で、まずは、相手を肯定してから自分の意見を述べるスタンスをとる。\n\n回答をする際には、自身の名前を伝えるようにしてください。",
        "user_template": "question : {{query}}",
        "retrieval_chunks_template": "[[#{{no}}]] filename: {{filename}}, pagename: {{pagename}}\nContext: {{context}}",
        "num_latest_chats": 5
      },
      "metadata": {
        "note": "コメンテーター = 白石 麻耶",
        "position": {"x": 1072, "y": 124},
        "size": {"width": 300, "height": 76},
        "formDraft": {
          "propertiesHash": "20qx8md1sux",
          "fields": {
            "model": "claude-sonnet-4-20250514",
            "functions": [],
            "modelSettings": {"chat_engine": "claude"},
            "user_template": "question : {{query}}",
            "modelParameters": {
              "seed": 42,
              "stop": [],
              "max_tokens": 2048,
              "extra_params": "{}"
            },
            "system_template": "あなたは、ユーザーの質問に回答するコメンテーターです。\n下記のプロファイルのパーソナリティーの想定で回答をしてください。\n\n* 白石 麻耶(しらいし まや)女性\n  とても柔軟な性格で、まずは、相手を肯定してから自分の意見を述べるスタンスをとる。\n\n回答をする際には、自身の名前を伝えるようにしてください。",
            "num_latest_chats": 5,
            "customModelSettings": "{\"chat_engine\": \"claude\"}",
            "retrieval_chunks_template": "[[#{{no}}]] filename: {{filename}}, pagename: {{pagename}}\nContext: {{context}}"
          }
        },
        "virtualId": "g9ZeMtQ-Wbm0j4ZpM8MyT"
      }
    },
    {
      "id": 7,
      "type": "storm/llm",
      "properties": {
        "llm": {
          "model": "claude-sonnet-4-20250514",
          "chat_engine": "claude",
          "seed": 42,
          "stop": [],
          "max_tokens": 2048,
          "tools": []
        },
        "system_template": "あなたは、ユーザーの質問に回答するコメンテーターです。\n下記のプロファイルのパーソナリティーの想定で回答をしてください。\n\n* ゴルゴンゾーラ 明子(ゴルゴンゾーラ あきこ)性別不詳\n  基本的に、自分の意見を持たない。ほかの人の意見に乗っかるだけ。\n\n回答をする際には、自身の名前を伝えるようにしてください。",
        "user_template": "question : {{query}}",
        "retrieval_chunks_template": "[[#{{no}}]] filename: {{filename}}, pagename: {{pagename}}\nContext: {{context}}",
        "num_latest_chats": 5
      },
      "metadata": {
        "note": "コメンテーター = 神崎 恒一",
        "position": {"x": 1072, "y": 12},
        "size": {"width": 300, "height": 76},
        "formDraft": {
          "propertiesHash": "1zgtrjvjuq8",
          "fields": {
            "model": "claude-sonnet-4-20250514",
            "functions": [],
            "modelSettings": {"chat_engine": "claude"},
            "user_template": "question : {{query}}",
            "modelParameters": {
              "seed": 42,
              "stop": [],
              "max_tokens": 2048,
              "extra_params": "{}"
            },
            "system_template": "あなたは、ユーザーの質問に回答するコメンテーターです。\n下記のプロファイルのパーソナリティーの想定で回答をしてください。\n\n* ゴルゴンゾーラ 明子(ゴルゴンゾーラ あきこ)性別不詳\n  基本的に、自分の意見を持たない。ほかの人の意見に乗っかるだけ。\n\n回答をする際には、自身の名前を伝えるようにしてください。",
            "num_latest_chats": 5,
            "customModelSettings": "{\"chat_engine\": \"claude\"}",
            "retrieval_chunks_template": "[[#{{no}}]] filename: {{filename}}, pagename: {{pagename}}\nContext: {{context}}"
          }
        },
        "virtualId": "UKs04r4C_fw0cMuHNbzi0"
      }
    }
  ],
  "links": [
    [4, 1, 2],
    [5, 2, 4],
    [6, 4, 5],
    [7, 5, 3],
    [8, 4, 6],
    [9, 4, 7],
    [10, 4, 7],
    [11, 6, 3],
    [12, 7, 3]
  ],
  "custom_variables": {}
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?