Difyでよく使うノード一覧(利用例付き)

記事タイトルとURLをコピーする

サーバーワークスの村上です。

このブログではDifyの主要なノードをピックアップして、利用例とともに紹介します。

Difyのノードとは

Difyのノードは、チャットフローやワークフローのキャンバス上で処理を組み立てる「部品」です。

Difyのようなワークフローを作る際は、どのような情報を入力するか/どのような処理が行われるか/どのような情報が出力されるか、を検討します。各フェーズでは主に以下のようなノードを使用します。

  • 入力
  • 処理
    • LLM
    • 知識検索
    • IF/ELSE(分岐)、イテレーション、ループ など(詳細は後述)
  • 出口
    • 回答(チャットフローの場合)
    • 出力(ワークフローの場合)

Difyの主要なノード一覧表

ノード名 概要
ユーザー入力(User Input) エンドユーザーから収集する入力を定義するノード (Dify Docs)
トリガー(Trigger) スケジュールやWebhook等でワークフローを起動するノード (Dify Docs)
LLM 設定したモデルにプロンプトを入力し応答を得るノード (Dify Docs)
知識検索(Knowledge Retrieval) ナレッジベースを検索して関連情報を抽出し、LLMなどのノードにコンテキストを渡す。 (Dify Docs)
エージェント(Agent) LLM にツール利用の権限を持たせ、タスクを自律的に実行させる。 (Dify Docs)
ツール(Tools) 事前に設定しておいた外部サービス等を利用する。 (Dify Docs)
質問分類器(Question Classifier) LLMが入力を定義したカテゴリに分類し、適切な後続フローへルーティングする。 (Dify Docs)
If-Else 条件評価により実行パスを分岐する。 (Dify Docs)
反復処理(Iteration) 配列の各要素に対して同じ処理を適用する繰り返し処理 (Dify Docs)
ループ(Loop) 終了条件を満たすまで処理を繰り返す。反復処理と異なり、各サイクルは前回の結果を踏まえて動きを決定する。 (Dify Docs)
コード(Code) Python / JavaScript のカスタムコードで変換・計算・ロジックを実装する。 (Dify Docs)
テンプレート(Template) Jinja2 で変数を整形・結合する。 (Dify Docs)
変数アグリゲーター(Variable Aggregator) 分岐で別々に作った変数を「統一した出力」にまとめ、下流の重複処理を減らす。 (Dify Docs)
ドキュメント抽出ツール(Document Extractor) PDF/DOCX などのアップロードファイルを、LLM が扱えるテキストに変換する。 (Dify Docs)
変数割り当て(Variable Assigner) チャットフローの会話変数に書き込み、セッション中ずっと使える状態を作る。 (Dify Docs)
パラメータ抽出器(Parameter Extractor) 自然文を「構造化データ」に変換し、ツール/API が欲しい引数に落とし込む。 (Dify Docs)
HTTP リクエスト 任意の外部 API / Web サービスへ HTTP で接続 (Dify Docs)
リスト演算子(List Operator) 配列(リスト)のフィルタ/抽出/加工など、リスト処理のためのノード。 (Dify Docs)
回答(Answer) チャットフローでユーザーへレスポンスする内容を定義するノード (Dify Docs)
出力(Output) ワークフローでユーザーへレスポンスする内容を定義するノード (Dify Docs)

利用サンプル

シンプルな社内問合せ用チャットボット(知識取得、LLM)

シンプルなRAGワークフローの例です。

知識取得で得たコンテキストをLLMに渡し、回答を出力します。

知識取得で得たコンテキストをLLMに渡す例

ウェブを調査するエージェント(エージェント、ツール)

こちらはエージェントノードにウェブ検索ツールであるTavilyを設定した例です。

このようにすることで、エージェントが自律的にウェブを検索して必要な情報を収集したうえで応答を出力します。

エージェントノードにウェブ検索ツールを持たせる例

タスクの複雑度に応じて、maximum_iterationsを増やすようにします。これはエージェントが行動する回数のことです。

最大反復回数は、無限ループを防ぐための安全制限を設定します。タスクの複雑さに応じて設定してください。単純なタスクでは3~5回の反復が必要ですが、複雑な調査では10~15回必要になる場合があります。
https://docs.dify.ai/en/use-dify/nodes/agent

さまざまなドキュメントを精査するアプリ(質問分類器、LLM)

ユーザーが添付したドキュメントの種別に応じて異なる観点での精査をLLMに行わせます。

ユーザーが添付したドキュメントに応じたチェック作業を行う

質問分類器にマルチモーダル処理が可能なLLMを採用することで、添付したドキュメントをより理解できるようにしています。

自然言語で外部APIにHTTPリクエストを送る(テンプレート、変数代入、パラメータ抽出、HTTPリクエスト)

最後にご紹介するのは、ユーザーの自然言語による入力をJSONに変換しHTTPリクエストをしてくれるチャットフローです。

ユーザー入力をHTTPリクエストに変換。不足情報があれば追加でユーザーに質問する

例えば、ユーザーが「山田太郎です。資料請求したいです。メールはtaro@example.com。AWS移行の概要が知りたいです」と入力すると、チャットフロー内で以下のようなJSONを生成し、外部APIにHTTPリクエストを送信します。

{
  "name": "山田太郎",
  "email": "taro@example.com",
  "request_type": "資料請求",
  "message": "AWS移行の概要が知りたい"
}

また、入力に氏名が抜けているなど、必要な情報が不足している場合はユーザーに質問を返します。

パラメータ抽出ノードがやっていること

パラメータ抽出ノードにはインストラクション(指示文)として、「すべての必須項目が揃っていればis_enoughをTrue、不足があればFalseにすること」「不足している場合はnext_questionを生成すること」といったルールをLLMに伝えています。そして、次のIF/ELSEノードでis_enoughがFALSEの場合、不足している項目をユーザーに質問するようにしています。

パラメータ抽出ノードはメモリの設定をONにしており、特に意識せずとも1回目の会話を踏まえてパラメータ抽出してくれます。※もし、メモリ機能を使わない場合は会話変数を使って過去の情報を保持しておく必要があります。

テンプレートノードがやっていること

パラメータ抽出ノードが出力したJSONから必要な情報だけを取り出す作業をやっています。

パラメータ抽出ノードは以下のような内容をレスポンスします。

{
  "__is_success": 1,
  "__reason": null,
  "__usage": {
    "prompt_tokens": 1164,
    "prompt_unit_price": "0",
    "prompt_price_unit": "0",
    "prompt_price": "0",
    "completion_tokens": 76,
    "completion_unit_price": "0",
    "completion_price_unit": "0",
    "completion_price": "0",
    "total_tokens": 1240,
    "total_price": "0",
    "currency": "USD",
    "latency": 1.7434988329187036,
    "time_to_first_token": null,
    "time_to_generate": null
  },
  "name": "村上",
  "email": "taro@example.com",
  "request_type": "資料請求",
  "message": "AWS移行の概要",
  "is_enough": true,
  "next_question": ""
}

ここから必要なパラメータだけ抽出します。

最後にテンプレートノードの出力を変数に代入し、HTTPリクエストノードのリクエストボディにセットしています。

村上博哉 (執筆記事の一覧)

2020年4月入社。機械学習が好きです。