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?

Node-RED AI Agentで手軽にAIエージェントを作ってみた

Posted at

Node-REDで簡単にAIエージェントを作成できるnode-red-contrib-ai-agentノードを実際に試してみました。このノードを使えば、会話の記憶機能やツール連携機能を備えたAIエージェントを視覚的に構築できます。

node-red-contrib-ai-agentとは?

node-red-contrib-ai-agentは、Node-REDでAIエージェントを構築するためのノードです。
https://flows.nodered.org/node/node-red-contrib-ai-agent

説明によれば、現在ベータ版として開発中で、以下の機能があります。

  • AI Agentノード: AIモデルを使ってメッセージを処理し、メモリーノードを通じて会話コンテキストを維持
  • メモリー管理: インメモリまたはファイルベースの永続化による会話コンテキスト管理
  • ツール統合: Function ToolやHTTP Toolなど、カスタムツールでAIエージェントの機能を拡張

セットアップ手順

1. ノードのインストール

Node-REDのパレットからnode-red-contrib-ai-agentをインストールします。

2. OpenRouterの設定

node-red-contrib-ai-agentは、OpenRouterを使って1つのAPIキーでAIモデルを選択できるようなプラットフォームです。

  1. OpenRouterにサインアップ
  2. API Keyを取得してメモ
  3. 利用上限を設定(今回は1ドル)
  4. クレジットを購入(クレカなら10ドルから、暗号通貨なら1ドルから可能と思われます)
  5. ai-modelノードのプロパティにAPI Keyを設定
  6. 使用するモデルを選択
    スクリーンショット 2025-09-13 11.19.01.png

実践例1: 多段LLMによる要約とキーワード抽出

まずは、ニュース記事を要約してキーワードを抽出する多段LLMシステムを構築してみました。

フロー構成

image.png

[{"id":"a1b2c3d4.567890","type":"inject","z":"c7a9a9a9.385658","name":"News Article Input","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"東京, 2025年9月12日 - 本日、株式会社Exampleは、画期的な新製品「AIアシスタントPro」を発表しました。この製品は、最新の自然言語処理技術を駆使し、ユーザーの業務効率を大幅に向上させることを目的としています。特に、複雑な文章の要約や、大量のデータからのキーワード抽出に優れており、ビジネスパーソンにとって強力なツールとなることが期待されています。","payloadType":"str","x":130,"y":60,"wires":[["b1c2d3e4.f5g6h7"]]},{"id":"b1c2d3e4.f5g6h7","type":"ai-model","z":"c7a9a9a9.385658","name":"AI Model(Llama 4 Maverick)","model":"meta-llama/llama-4-maverick:free","temperature":0.7,"maxTokens":1000,"x":370,"y":60,"wires":[["c1d2e3f4.g5h6i7"]]},{"id":"c1d2e3f4.g5h6i7","type":"ai-memory-inmem","z":"c7a9a9a9.385658","name":"Shared Context","maxItems":"3","x":380,"y":120,"wires":[["d1e2f3g4.h5i6j7"]]},{"id":"d1e2f3g4.h5i6j7","type":"ai-agent","z":"c7a9a9a9.385658","name":"Summarizer Agent","systemPrompt":"あなたはプロの要約者です。与えられたニュース記事のテキストを簡潔に要約してください。","responseType":"text","x":430,"y":180,"wires":[["e1f2g3h4.i5j6k7"]]},{"id":"e1f2g3h4.i5j6k7","type":"ai-agent","z":"c7a9a9a9.385658","name":"Keyword Extractor Agent","systemPrompt":"あなたはプロのキーワード抽出者です。与えられたテキストから、最も重要なキーワードと固有名詞を5つ抽出してください。抽出したキーワードはカンマ区切りで出力してください。","responseType":"text","x":470,"y":240,"wires":[["f1g2h3i4.j5k6l7"]]},{"id":"f1g2h3i4.j5k6l7","type":"debug","z":"c7a9a9a9.385658","name":"Output","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":710,"y":320,"wires":[]}]

処理の流れ

  1. Injectノード: サンプルのニュース記事を入力
  2. AI Modelノード: Llama 4 Maverickモデルを設定
  3. AI Memory: 会話コンテキストを最大3項目まで保持
  4. Summarizer Agent: 要約専門エージェントがテキストを要約
  5. Keyword Extractor Agent: キーワード抽出専門エージェントが重要なキーワードを抽出

実行結果

AIアシスタントPro, 株式会社Example, 自然言語処理, 業務効率, ビジネスパーソン

Injectのノードのボタンをクリックしてしばらくすると記事から5つの重要なキーワードが抽出されました。

実践例2: ツール機能を使った天気情報取得

次に、AIエージェントがツールを呼び出して天気情報を取得するシステムを構築しました。

注意点: モデルの選択

最初はLlama 4 Maverickを使用しましたが、ツール呼び出し機能が正常に動作しませんでした。そこでGPT-4o miniに変更したところ、正常に動作するようになりました。ツール呼び出し機能を使用する場合は、対応するモデルを選択する必要があります。プロパティにOpenRouterのすべてのモデルが選択できるようになっていないので注意が必要です。

モデル検索
https://openrouter.ai/models?fmt=cards&supported_parameters=tools

フロー構成

image.png

[{"id":"00192b8db9442e39","type":"inject","z":"e637b6ebbcb47bf1","name":"東京","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"今日の東京の天気は?","payloadType":"str","x":130,"y":100,"wires":[["86adc5de1f78ba9d"]]},{"id":"86adc5de1f78ba9d","type":"ai-model","z":"e637b6ebbcb47bf1","name":"AI Model(GPT 4o mini)","model":"openai/gpt-4o-mini","temperature":0.7,"maxTokens":1000,"x":380,"y":100,"wires":[["2a211536969c96e9"]]},{"id":"2a211536969c96e9","type":"ai-memory-inmem","z":"e637b6ebbcb47bf1","name":"Conversation Memory","maxItems":"3","x":380,"y":160,"wires":[["fa0c4fad42eb77e3"]]},{"id":"fa0c4fad42eb77e3","type":"ai-tool-function","z":"e637b6ebbcb47bf1","name":"Get Current Weather","toolName":"get_current_weather","description":"指定された都市の現在の天気情報を取得するツールです。ユーザーが「〇〇の天気」のように都市名を含む天気の質問をした場合に使用してください。引数として都市名 (city: string) を受け取ります。このツールは以下のJSONスキーマに従って引数を渡す必要があります: {\"type\": \"object\", \"properties\": {\"city\": {\"type\": \"string\", \"description\": \"天気情報を取得したい都市名\"}}, \"required\": [\"city\"]}","functionCode":"if (input.city === \"東京\") {\n    return \"東京の現在の天気は晴れで、気温は25度です。\";\n}\nelse if (input.city === \"大阪\") {\n    return \"大阪の現在の天気は曇りで、気温は22度です。\";\n}\nelse {\n    return \"申し訳ありませんが、\" + input.city + \"の天気情報は取得できませんでした。\";\n}","x":440,"y":220,"wires":[["efeccdc762dca50d"]]},{"id":"efeccdc762dca50d","type":"ai-agent","z":"e637b6ebbcb47bf1","name":"Weather Assistant","systemPrompt":"あなたは親切な天気予報アシスタントです。ユーザーが都市の天気について質問した場合、必ず利用可能なツール(get_current_weather)を使って天気情報を取得し、その結果に基づいて回答してください。ツールを呼び出す際は、ユーザーの質問から都市名を抽出し、get_current_weatherツールのcity引数に渡してください。","responseType":"text","x":530,"y":280,"wires":[["8bc1ee8bccd724d2"]]},{"id":"8bc1ee8bccd724d2","type":"debug","z":"e637b6ebbcb47bf1","name":"AI Response","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":670,"y":340,"wires":[]},{"id":"5c1188ef6dd1cad7","type":"inject","z":"e637b6ebbcb47bf1","name":"大阪","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"今日の大阪の天気は?","payload":"今日の大阪の天気は?","payloadType":"str","x":130,"y":160,"wires":[["86adc5de1f78ba9d"]]}]

処理の詳細

システムプロンプトでは、AIエージェントに以下の指示を与えました。

あなたは親切な天気予報アシスタントです。ユーザーが都市の天気について質問した場合、必ず利用可能なツール(get_current_weather)を使って天気情報を取得し、その結果に基づいて回答してください。

ツール呼び出しの内部動作

実行時の途中経過を見ると、AIエージェントが適切にツールを呼び出していることが分かります。

{
  "model": "openai/gpt-4o-mini",
  "temperature": 0.7,
  "messages": [
    {
      "role": "system",
      "content": "あなたは親切な天気予報アシスタントです。ユーザーが都市の天気について質問した場合、必ず利用可能なツール(get_current_weather)を使って天気情報を取得し、その結果に基づいて回答してください。ツールを呼び出す際は、ユーザーの質問から都市名を抽出し、get_current_weatherツールのcity引数に渡してください。"
    },
    {
      "role": "user",
      "content": "今日の東京の天気は?"
    },
    {
      "role": "assistant",
      "content": "",
      "refusal": null,
      "reasoning": null,
      "tool_calls": [
        {
          "index": 0,
          "id": "call_I5w1xoUZwcfGzoszgsTDjYn6",
          "type": "function",
          "function": {
            "name": "get_current_weather",
            "arguments": "{\"city\":\"東京\"}"
          }
        }
      ]
    },
    {
      "tool_call_id": "call_I5w1xoUZwcfGzoszgsTDjYn6",
      "role": "tool",
      "name": "get_current_weather",
      "content": "東京の現在の天気は晴れで、気温は25度です。"
    }
  ]
}

実行結果

今日の東京の天気は晴れで、気温は25度です。素敵な一日になりそうですね!

Injectノードのボタンをクリックすると、AIエージェントがツールから取得した情報をもとに、自然な形で回答を生成しました。

まとめ

node-red-contrib-ai-agentを使用することで、以下のメリットがわかりました。

  • 各エージェントに明確な役割を与えることで、タスクを効率的に分割処理できる
  • メモリー機能により、複数のやり取りを通じて情報を蓄積できる
  • ツール機能により、外部システムとの連携が可能になる
  • 視覚的な構築により、複雑なAIワークフローも理解しやすい

注意点としては、以下の2点です。

  • ツール呼び出し機能を使用する場合は、対応するモデルを選択する必要がある
  • 実用的な使用にはクレジット購入が必要(暗号通貨で最低1ドルから)

このノードを使えば、ビジネスプロセスの自動化、顧客サポートの効率化、データ分析の自動化など、様々な場面でAIエージェントを構築できそうです。
ノードの更なるバージョンアップに期待したいです。

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?