とほほのDify入門
Difyとは
- 「ディファイ」と読まれることもありましたが、2025年6月のリブランディングにより「ディフィ」の読み方に統一されました。
- 米国 LangGenius 社が開発しているノーコードでAIアプリを構築できるプラットフォームです。
- クラウドサービスとして利用するクラウドサービス版と、ソフトウェアを自前やAWSなどのホストにインストールして使用するセルフホストサービス版があります。
- 2025年10月時点で下記のプランがあります。
- Community : セルフホストサービス。無料。
- Premium : セルフホストサービス。AWS などのマーケットプレイス毎に価格付け。
- Enterprise : セルフホストサービス。要相談。
- Sandbox : クラウドサービス版。無料。
- Professional : クラウドサービス版。$59/ワークスペース・月。
- Team : クラウドサービス版。$159/ワークスペース・月。
- OpenAI、Anthropic、Gemini など様々なモデルプロバイダーを利用できます。モデルの利用には別途料金はかかります。
- あるモデルを利用して画像を識別してテキスト化し、別のモデルがそのテキストを読み取って音楽にするなど、いくつかのモデルをワークフローで連結し、高度な処理を実現することができます。
- RAG 機能を備えており、一般の推論に加えて追加データを用いた処理が可能です。
- 類似のツールには Langflow、Flowise、AgentScope などがありますが Dify が一番利用されているようです。
対象バージョン
本書は下記のバージョンを対象として執筆しています。
Date: 2025-10-19 Windows : Windows 11 Home 24H2 WSL : WSL2 Linux : Ubuntu 24.04 Docker : 28.5.1 Docker Compose : 2.40.0 Dify : 1.9.1
インストール
WSL2 のインストール
WSL2 がインストールされていない場合は [コマンドプロンプト] を起動して WSL2 をインストールします。Docker Desktop for Windows を利用している場合は Docker Desktop のバックエンドも WSL2 である必要があります。
wsl --install
Ubuntu 24.04 のインストール
WSL2 上に Ubuntu の最新安定版 24.04 をインストールします。
wsl --list --online wsl --install Ubuntu-24.04
インストールできたら、Ubuntu 24.04 を起動します。
wsl --distribution Ubuntu-24.04
Docker, Docker Compose のインストール
Ubuntu 24.04 上に Docker と Docker Compose をインストールします。
# 作業ディレクトリ(例えば$HOME)に移動する cd $HOME # コンフリクトしそうなパッケージを削除する for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc do sudo apt-get remove $pkg done # Dockerレポジトリを追加する sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \ https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update # Docker CE と Docker Compose をインストールする sudo apt-get -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
RHEL/AlmaLinux/Rockey Linux 系であれば下記で構いません。
dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo dnf -y install docker-ce docker-ce-cli
Docker を起動します。
sudo systemctl start docker sudo systemctl enable docker
Dify のインストール
Dify をコンテナとして起動します。
git clone https://github.com/langgenius/dify.git cd dify/docker sudo docker compose up -d
ブラウザから下記にアクセスし、管理者のメールアドレス、ユーザー名、パスワードを設定してください。
http://localhost/install
Dify の画面構成
- ヘッダ左部
- Difyロゴ : Dify のロゴをクリックするとトップ画面に遷移します。
- Xxxxx's Workspace : ワークスペースを選択します。
- ヘッダ中央部
- 探索 : テンプレートとなる様々なアプリを探索します。
- スタジオ : アプリを作成・管理します。
- ナレッジ : 知識検索 ノードから RAG 機能で探索するナレッジを管理します。
- ツール : ワークフローエディタから ツール として利用可能なツールを表示・管理します。
- ツール : プラグインとしてインストールしたツールを管理します。
- カスタム : OpenAPI-Swagger で仕様を提示できるカスタムツールを作成・管理します。
- ワークフロー : ワークフロー編集画面から [公開する]-[ワークフローをツールとして公開する] を行って公開されたワークフローの一覧を表示・管理します。
- MCP : MCP サーバーを管理します。例えば GitHub MCP サーバーを登録することにより、ワークフローの LLM が GitHub を操作することが可能となります。
- ヘッダ右部
- プラグイン : プラグインを管理します。
- プラグイン : インストール済のプラグインの一覧を表示します。
- マーケットプレイスを探索する : マーケットプレイスから新しプラグインを探してインストールします。
- アカウント
- アカウント : アカウント管理画面に遷移します。ユーザー名、メールアドレス、パスワードを変更できます。
- 設定 : 各種設定を行います。
- モデルプロバイダー : マーケットプレイスからインストールしたモデルを管理します。
- メンバー : Dify にアクセスできるメンバの一覧を管理します。
- データソース : マーケットプレイスからインストールしたデータソースを管理します。
- API拡張 : Web API による拡張機能を管理します。
- 言語 : 表示言語やタイムゾーンを設定します。
- ヘルプ : Dify のヘルプを表示します。
- サポート :
- フィードバック : Dify のフィードバックページを開きます。
- コミュニティ : Dify に関する Discord 上のコミュニティページを開きます。
- ロードマップ : Dify のロードマップに関する情報ページを開きます。
- GitHub : Dify の GitHub ページを開きます。
- Difyについて : Dify のバージョン情報を表示します。
- テーマ : テーマを [システムに従う] [ライトテーマ] [ダークテーマ] のいずれかで指定します。
- ログアウト : ログアウトします。
- プラグイン : プラグインを管理します。
Dify を使ってみる
ログイン・ログアウト
ログインする
http://localhostにアクセスすることでログインできます。
ログアウトする
- 画面右上の丸いアカウントアイコンから [ログアウト] でログアウトします。
プラグインをインストールする
モデルをインストールする
- 右上の [プラグイン]-[プラグインをインストールする]-[マーケットプレイス] を開いてください。
- 「Gemini」を検索してインストールしてください。
- 画面右上の丸いアイコンから [設定]-[モデルプロバイダー]-[Gemini]-[セットアップ] を開いて Gemini の APIキーを設定してください。
- Gemini の無料プランを利用している場合は、下記の手順の中で使用するモデルを [Gemini 2.5 Pro] ではなく [Gemini 2.5 Flash] を選択するとある程度の回数無料で使用できるようです。
ツールをインストールする
- 右上の [プラグイン]-[プラグインをインストールする]-[マーケットプレイス] を開いてください。
- 「Wikipedia」を検索してインストールしてください。
- 後述の作業で Wikipedia 検索ツールを利用できるようになります。
アプリを作成する
チャットボット
- チャットボット はチャットアプリを簡単に作成するものです。
- 画面中央上部の [スタジオ] を開いてください。
- [最初から作成]-[初心者向けの基本的なアプリタイプ]-[チャットボット] を選択してください。
- [アプリのアイコンと名前] に「ロボチャット」と入力して [作成する] ボタンを押してください。
- [プロンプト] に下記を入力してください。
あなたはロボタンです。ロボットアニメが好きです。語尾にできるだけ「ロボ」をつけてください。
- Gemini 無料版を使用している場合は、右上の [Gemini 2.5 Pro] のモデルを [Gemini 2.5 Flash] に変更してください。
- 右上の [公開する]-[更新を公開] ボタンを押し、[アプリを実行] してください。
- 別タブが開きます。「こんにちは」と入力するとロボタンが答えてくれます。
- 公開環境の場合、この URL を知っている人はチャットボットにアクセスできます。
エージェント
- エージェント は AI が決められたタスクを実行するものです。
- [ツール] を用いることにより、他システムとの連携が可能です。
- 画面中央上部の [スタジオ] を開いてください。
- [最初から作成]-[初心者向けの基本的なアプリタイプ]-[エージェント] を選択してください。
- [アプリのアイコンと名前] に「ロボエージェント」と入力して [作成する] ボタンを押してください。
- [プロンプト] に下記を入力してください。
ユーザーからの質問に対してWikipediaで調べて回答してください。参照したWikipediaのURLも提示してください。
- [ツール]-[+追加] ボタンから [Wikipedia]-[WikipediaSearch] ツールを追加してください。
- Gemini 無料版を使用している場合は、右上の [Gemini 2.5 Pro] のモデルを [Gemini 2.5 Flash] に変更してください。
- 右上の [公開する]-[更新を公開] ボタンを押し、[アプリを実行] してください。
- 「ニホンカワウソについて教えてください。」などを入力すると Wikipedia ツールを用いて Wikipedia の情報を教えてくれます。
テキストジェネレーター
- テキストジェネレーター はユーザーの入力に対して要約・翻訳などの作業を行うものです。
- 画面中央上部の [スタジオ] を開いてください。
- [最初から作成]-[初心者向けの基本的なアプリタイプ]-[テキストジェネレーター] を選択してください。
- [アプリのアイコンと名前] に「ロボテキスト」と入力して [作成する] ボタンを押してください。
- [接頭辞プロンプト] に下記を入力してください。
{{query}}は入力済みだと思うので、それに続く文章を追加してください。{{query}} を英語に翻訳してください。回答は簡素にしてください。 - Gemini 無料版を使用している場合は、右上の [Gemini 2.5 Pro] のモデルを [Gemini 2.5 Flash] に変更してください。
- 右上の [公開する]-[更新を公開] ボタンを押し、[アプリを実行] してください。
- query に「こんにちは」と入力すると「Hello」と英訳してくれます。
変数を使用する
- 前述のテキストジェネレーターの「
{{query}}」などを 変数 と呼びます。 - 上記で作成した「ロボテキスト」に変数を追加して、英語以外の言語にも翻訳できるようにしてみましょう。
- [変数]-[+追加] ボタンを押し、[短文] をクリックしてください。
- 新しく追加された変数の [✏️(鉛筆)] ボタンを押して下記を設定してください。
変数名:
languageラベル名:言語 - [接頭辞プロンプト] を下記に修正してください。
{{query}} を {{language}} に翻訳してください。回答は簡素にしてください。 - プロンプト入力中に
/や{をタイプすることで変数名の候補を表示することができます。 - 右上の [公開する]-[更新を公開] ボタンを押し、[アプリを実行] してください。
- 言語入力欄が増えて「英語」や「中国語」などを指定できるようになれば成功です。
チャットフロー
- チャットフロー はチャットボットの高機能版です。
- キーワードを入力すると Wikipedia を調べて要約を回答してくれるチャットボットを作成してみましょう。
- 画面中央上部の [スタジオ] を開いてください。
- [最初から作成]-[アプリタイプを選択]-[チャットフロー] を選択してください。
- [アプリのアイコンと名前] に「ロボチャットフロー」と入力して [作成する] ボタンを押してください。
- [開始] と [LLM] と [回答] が表示されます。これら個々の部品を ノード と呼びます。
- ノードを接続線で連結することにより ワークフロー を作成します。
- [開始] と [LLM] の接続線の真ん中にマウスカーソルを当てて [⊕] をクリックしてください。
- [ツール]-[Wikipedia]-[WikipediaSearch] をクリックして追加してください。
- 下記の様な流れを作成していきます。
[開始] ↓ {{sys.query}} [WIKIPEDIASEARCH] ↓ {{WikipediaSearch:text}} [LLM] ↓ {{LLM:text}} [回答] - [WIKIPEDIASEARCH] ノードをクリックし、右ペインで下記を指定してください。
{{sys.query}}変数はキーボードから入力するのではなく、スラッシュ(/) キーを押して表示される候補から選択してください。Query string:
{{sys.query}}Language: ja - 右ペインの [出力変数] で、[WIKIPEDIASEARCH] が出力する変数名を確認してください。
text変数を出力していることがわかります。 - [LLM] ノードをクリックし、右ペインの [SYSTEM] に下記を入力してください。変数は
/候補から選択してください。{{WikipediaSearch.text}} を4~5個の箇条書きに要約してください。 - Gemini 無料版を使用している場合は、右上の [Gemini 2.5 Pro] のモデルを [Gemini 2.5 Flash] に変更してください。
- 右上の [公開する]-[更新を公開] ボタンを押し、[アプリを実行] してください。
- プロンプト入力欄に「ニホンカワウソ」などを入力して、AI が Wikipedia を参照して要約して表示してくれれば成功です。
ワークフロー
- ワークフロー は Dify の最も基本的な機能です。
- 下記の流れのワークフローを作成してみましょう。
[開始] ↓ {{開始.query}} [LLM] ↓ {{LLM:text}} [終了] - 画面中央上部の [スタジオ] を開いてください。
- [最初から作成]-[アプリタイプを選択]-[ワークフロー] を選択してください。
- [アプリのアイコンと名前] に「ロボワークフロー」と入力して [作成する] ボタンを押してください。
- [開始] ノードの次に追加するノードの選択肢が表示されているので、[LLM] を追加してください。
- [開始] ノードをクリックして、[入力フィールド] に下記の変数を追加してください。
フィールドタイプ: 短文 変数名: query ラベル名: クエリ
- [LLM] ノードをクリックしてください。
- Gemini 無料版を使用している場合は、右上の [Gemini 2.5 Pro] のモデルを [Gemini 2.5 Flash] に変更してください。
- [+メッセージ追加] で [USER] 欄に下記を入力してください。変数
{{開始.query}}はキーボードから入力するのではなく、/キーを押して表示される選択肢から選択してください。{{開始.query}}を英訳してください。回答は簡素にしてください。 - [LLM] ノードの次に [終了] ノードを追加してください。
- [終了] ノードの [出力変数] に
{{LLM.text}}を加えてください。 - 右上の [公開する]-[更新を公開] ボタンを押し、[アプリを実行] してください。
- プロンプト入力欄に「日本」などを入力して、Japan と回答してくれれば成功です。
APIから呼び出す
ワークフローをAPIから呼び出す
- ワークフローは API から呼び出すこともできます。
- [ロボワークフロー] を開いた画面の左メニューから [APIアクセス] をクリックしてください。
- 下記の様なサンプルコードが表示されていると思います。
curl -X POST 'http://localhost/v1/workflows/run' \ --header 'Authorization: Bearer {api_key}' \ --header 'Content-Type: application/json' \ --data-raw '{ "inputs": {}, "response_mode": "streaming", "user": "abc-123" }' {api_key}は画面右上の [APIキー]-[APIシークレットキー] で発行することができます。- 上記を下記の様に修正してください。APIキーはサンプルです。
curl \ -X POST 'http://localhost/v1/workflows/run' \ --header 'Authorization: Bearer app-AbCdEfGhIjKlMoPqRsTuVwXyZ' \ --header 'Content-Type: application/json' \ --data-raw '{ "inputs": { "query": "日本" }, "response_mode": "blocking", "user": "abc-123" }' - この curl を実行して、
{ "text": "Japan" }を含む応答を得ることができれば成功です。 - API 利用方法の詳細は上記の [APIアクセス] 画面に掲載されているので確認してください。
RAG
- 社内規約などの文書を RAG としてナレッジ登録し、AI がこれを参照することにより、AI が社内規約に関連した推測を行うことが可能となります。
ナレッジを登録する
- 下記の内容の SmartSpeaker.txt ファイルを用意してください。
SmartSpeaker N500 は、音声操作に対応したスマートスピーカーです。Wi-Fi 接続を通じて音楽再生、天気予報、ニュース読み上げ、スマート家電の操作などが可能です。
【主な機能】
- 音声コマンドによる操作(例:「音楽をかけて」「照明を消して」)
- Bluetooth 接続による外部デバイスとの連携
- 専用アプリによる設定変更と履歴管理
【よくある質問】
Q. 初期設定の方法は?
A. 専用アプリをインストールし、Wi-Fi に接続後、音声認識のチュートリアルを完了してください。
Q. 音声が認識されない場合は?
A. マイクのミュート設定を確認し、周囲の騒音を減らしてください。
- 画面中央上部の [ナレッジ] を開いてください。
- [+ナレッジベースを作成] から [テキストファイルからインポート] を選択してください。
- [テキストファイルをアップロード] 欄に SmartSpeaker.txt をドラッグアンドドロップし、[次へ] ボタンを押してください。
- [インデックス方法] は [経済的] を選択して [保存して処理] ボタンを押してください。
- 「埋め込みが完了しました」が表示されたら [ドキュメントに移動] ボタンを押してください。
- [SmartSpeaker.txt] をクリックすると、テキストがどのようなチャンクに区切られたかを確認することができます。
チャットボットからナレッジを利用する
- 下記の設定でチャットボットを作成してください。
プロンプト: ユーザーからの質問に対してナレッジを使用して回答してください。 コンテキスト: 上記で登録したナレッジ。
- 例えば「SmartSpeakerとは?」や「初期設定方法を教えてください。」などと質問し、ナレッジを利用した回答が返れば成功です。
ワークフローからナレッジを利用する
- [スタジオ] のトップ画面から、上記で作成したチャットボットの右下の […] から [ワークフローオーケストレートに切り替える] を実行すると、作成したチャットボットがワークフローに展開されます。
- 基本的に [開始]-[知識検索]-[LLM]-[回答] の流れとなります。
- 各ノードでパラメータがどのように設定されているか確認してください。
ナレッジ登録時のパラメーター
- 汎用
- チャンク識別子 : チャンクの区切り文字を指定します。\n は改行を、\n\n は空行を区切り文字とします。
- 最大チャンク長 : ひとつのチャンクの最大文字数(トークン数ではない)を指定します。500~1000 くらいの数値がよいようです。
- チャンクのオーバーラップ : 同じ文章が前後複数のチャンクに含まれてもよい文字数を指定します。チャンク間の関連を保持することができます。最大チャンクサイズの 10~25% 程度が推奨されています。
- テキストの前処理ルール
- 連続するスペース、改行、タブを置換する : 連続するスペース、改行、タブを置換します。
- すべての URL とメールアドレスを削除する : 機密保持を目的としてメールアドレスや URL と思われるものを削除します。
- Q&A形式で分割 : AI を利用して Q&A を行いながら分割します。
- 親子 : 文書を親子構造のあるものとみなし、親チャンクをコンテキスト抽出に、子チャンクを検索に用いるなど高度な解析を行います。
- 段落 : チャンク識別子を用いて段落(親チャンク)を区切ります。
- 全文 : 全文を AI で解析して区切ります。
- インデックス方法 : インデックス方式を [高品質] または [経済的] から選択します。
- 埋め込みモデル : 解析に使用するモデルを指定します。
- 検索設定
- ベクトル検索 : AI を用いて検索します。スマホとスマートフォンなど用語のゆれがあっても検索することができます。
- Rerankモデル : モデルを用いて候補文書リストを再配置し、検索精度を向上させます。
- トップ K : 最大で何件の結果を取得するかを指定します。正確な回答を求める場合は 3~5 程度、幅広い回答を求める場合は 5~10 程度を指定します。
- スコア閾値 : 検索結果の類似性の閾値を指定します。厳密な回答を求める場合は 0.7~0.9 程度、幅広い回答を求める場合は 0.4~0.5 程度を指定します。
- 全文検索 : 用語の完全一致で検索します。
- ハイブリッド検索 : ベクトル検索と全文検索を組み合わせて検索します。
- ウェイト設定 : セマンティクス検索(ベクトル検索)とキーワード検索(全文検索)の重みの割合を指定します。
- Rerankモデル : AI を用いた再配置を用いて検索精度を向上させます。
- ベクトル検索 : AI を用いて検索します。スマホとスマートフォンなど用語のゆれがあっても検索することができます。
エクスポート・インポート
DSLにエクスポート
- アプリ一覧画面でアプリの右下の
[…]アイコンから [DSL をエクスポート] でエクスポートできます。
DSLからインポート
- アプリ一覧画面の [DSL ファイルをインポート] でインポートできます。
ノード
ワークフローやチャットフローでは下記のブロックノードを使用することができます。
開始
ワークフローやチャットフローの開始ポイントとなるノードです。
- 入力フィールド : ワークフローの入力となる変数です。
- システム変数 :
sys.で始まるものはシステム変数とよばれ自動的に設定されます。 - ユーザー変数 :
sys.以外で始まるものはユーザー変数と呼ばれます。ワークフロー起動時に画面や API から入力します。デフォルト値を設定することもできます。
- システム変数 :
終了
ワークフローの終了ポイントとなるノードです。
- 出力変数 :
{{LLM.text}}など、ユーザーに回答として表示する内容や、API の戻り値として返却する情報(変数)を指定します。
回答
チャットフローの終了ポイントとなるノードです。
- 応答 : チャットの応答とする変数やテキストを指定します。
LLM
LLM(大規模言語モデル)ノードです。
- AIモデル : 使用するAIモデル (GPT-5, Gemini 2.5 Pro など) を選択します。モデルにもよりますが、下記などのパラメーターがあります。
- Temperature : 出力のランダム性(0.0~2.0)。小さいと毎回同じ答え、大きいと毎回異なった出力となります。
- Top P : トップの○%(0.0~1.0)。0.6 であれば上位 60% のトークンを候補とする。
- Top K : トップの○個(1~)。上位 K 個のトークンを候補とする。
- Max Tokens : 出力の最大トークン数。
- Include thoughts : モデルが思考過程を明示するか否か。
- Set thinking budget : AI が思考に活用するトークン数の上限。
- Grounding : AI が外部情報に基づいて応答するか否か。
- コンテキスト : 主に [知識検索] ノードからの出力変数 {{知識検索.result}} を受け取るために使用します。
- プロンプト :
- SYSTEM : LLM の性格や制約事項などを記述します。「あなたはロボタンです。ロボットアニメが好きです。語尾にできるだけ「ロボ」をつけてください。」など。
- USER : チャット会話履歴のユーザー入力として解釈されます。「回答は2~3個の箇条書きでお願いします。」など、ユーザーからの依頼事項を記述することもできます。最後の USER プロンプトには最低限
{{sys.query}}等 LLM への入力変数を指定してください。 - ASSISTANT : チャット会話履歴の USER プロンプトに対する LLM からの回答として解釈されます。LLM がどのような口調で応答するかの手本となります。
- メモリ : チャットフローの場合に表示されます。チャットの会話履歴を USER と ASSISTANT として記憶・参照する機能を持ちます。
- ビジョン : LLM に画像を渡す場合に On にします。
- 変数 :
{{sys.files}}などの画像ファイルを示す変数を指定します。 - 解像度 : 画像処理の解像度を [高] または [低] から選択します。
- 変数 :
- 推論タグの分離を有効にする :
<think>タグで囲まれた思考プロセス部を最終的な回答と分離して管理します。 - 出力変数 : ノードが出力する変数を確認することができます。
- 失敗時再試行 : 失敗時に再試行するか否かを選択します。
- 最大試行回数 : 最大試行回数を指定します。
- 再試行間隔 : 再試行するまでのインターバルを指定します。
- 例外処理 : 例外発生時の処理方法を指定します。
- 処理なし : 後続処理を中断して終了します。
- デフォルト値 : デフォルト値を出力して終了します。
- 例外分岐 : 例外処理のワークフローに分岐します。
知識検索
RAG 機能として [ナレッジ] を検索します。
- 検索変数 :
{{sys.query}}など検索する情報を指定します。 - ナレッジベース : 検索対象のナレッジを指定します。
- メタデータフィルタ : タグ/カテゴリ等の属性で検索を絞り込みます。
- 無効 : メタデータフィルタを使用しません。
- 自動生成 : 検索履歴からフィルタ情報を自動生成します。
- 手動設定 : フィルタ情報を手動設定します。
- 出力変数 : ノードが出力する変数を確認することができます。
エージェント
ユーザーからの問い合わせに応じて AI を用いてツールを自動的に選択・実行することができるノードです。
- エージェンティック戦略 : どのようなロジックでツール選択を行うかを指定します。あらかじめプラグインマーケットプレイスから [エージェント戦略] プラグインをインストールしておく必要があります。例えば [Agent] や [Support MCP Tools Agent] プラグインでは下記の戦略をサポートしています。
- Function Calling : あらかじめ登録したツールの中から、ユーザーからの入力を元に推論・選択して実行します。
- ReAct : エージェントが推論(Reasoning)と行動(Action)を繰り返し実行しながらより良い回答を求めます。
- MODEL : ツール選択に使用するモデルを選択します。
- TOOL LIST : 選択肢となるツールを指定します。ツールには下記を指定できます。
- プラグイン : プラグインとしてインストールしたツール。
- カスタム : トップ画面上部の [ツール]-[カスタム]-[カスタムツールを作成する] で作成したカスタムツール。OpenAPI-Swagger 仕様に準じた REST API を登録することができます。
- ワークフロー : 他のワークフローを登録できます。利用するにはワークフロー編集画面で [公開する]-[ワークフローをツールとして公開する] を設定しておく必要があります。
- MCP : トップ画面上部の [ツール]-[MCP]-[MCPサーバー(HTTP)を追加] で追加した MCP サーバーを指定できます。
- INSTRUCTION : エージェントに対する指示(システムプロンプトに相当)を指定します。
- CONTEXT : [知識検索] ノードの出力 {{知識検索.result}} などを指定します。
- QUERY :
{{sys.query}}など推論を行う際の入力変数を指定します。 - MAXIMUM ITERATIONS : 最大試行回数を指定します。
- 出力変数 : ノードが出力する変数を確認することができます。
質問分類器
入力内容に応じて [クラス1] と [クラス2] ... などに分岐します。[IF/ELSE] ノードと似ていますが、[IF/ELSE] ノードが厳密な条件によって機械的に分岐するのに対して、[質問分類器] ノードは LLM を用いた推論により分岐します。
- モデル : 推論に使用するモデルを指定します。
- 入力変数 :
{{sys.query}}など推論の入力情報を指定します。 - ビジョン : 画像を入力とする場合に指定します。LLM の説明を参照してください。
- クラス : クラス1, クラス2, ... の概要を記述します。この内容が出力変数の
class_nameに格納されます。 - 高度な設定 : 質問分類器に対するシステムプロンプトに相当する指示を入力します。
- 出力変数 : ノードが出力する変数を確認することができます。
IF/ELSE
変数が指定した文字列を含んでいるなどの条件を指定して処理を分岐します。[質問分類器] と似ていますが、[質問分類器] が LLM を用いた推論によって分岐するのに対して、指定した文字列を含んでいるかなどの単純なルールで分岐します。
- IF : 変数と条件と値を指定します。条件は [含む] [含まない] [で始まる] [で終わる] [である] [でない] [空] [空でない] のいずれかで指定します。
- ELIF : IF と同様の変数と条件と値を指定します。
- それ以外 : IF/ELIF のいずれの条件にも合致しなかった場合の分岐先となります。
イテレーション
配列型変数の個々の要素に対してサブワークフローを実施した結果を返します。
- 入力 : 入力となる配列変数を指定します。
- 出力変数 : サブワークフローの出力変数の内、イテレーションノードの出力とする変数を指定します。
- パラレルモード : 個々の要素に対する処理を平行実行します。
- エラー応答方式
- 終了 : エラーが発生すると処理を終了します
- エラー時に続行 : エラーが発生しても処理を継続します。
- アブノーマルアウトプットの削除 : エラーがあった要素に関する出力を削除します。
- サブワークフロー : イテレーション処理の中でサブワークフローを実装します。
使用例を下記に示します。
- 下記のノードから構成される [ワークフロー] を作成してください。
[開始]-[イテレーション [開始]-[テンプレート] ]-[終了]
- [開始] の [入力フィールド] にファイルリスト型変数
filesを追加してください。 - [イテレーション] の [入力] に
{{開始.files}}を指定してください。 - [イテレーション] の [出力変数] に
{{テンプレート.output}}を指定してください。 - [テンプレート] の [入力変数] の [arg1] に
{{item.name}}を指定してください。 - [テンプレート] の [コード] に
FILE: {{ arg1 }}を指定してください。 - [終了] の [出力変数] に {{イテレーション.output}} を指定してください。
- チャットフローを実行し、アップロードするファイル名の一覧が「FILE: ファイル名」としてリスト表示されれば成功です。
ループ
条件を満たすまでループするノードです。
- ループ変数 : ループ処理内で参照可能な変数を定義します。変数名、型、初期値(固定値または他の変数値)を指定します。
- ループ終了条件 : ループを終了する条件を指定します。
- 最大ループ回数 : 無限ループになってしまわないように、ループの上限回数を指定します。
ループノード自体は出力変数をサポートしないので、チャットフローの会話変数を用いた実行例を下記に示します。
- 下記のノードから構成される [チャットフロー] を作成してください。
[開始]-[ループ [開始]-[コード実行]-[変数代入] ]-[回答]
- 右上の
[ENV]の左隣りにある 吹き出しに x の [会話変数] アイコンをクリックし、total_countという名前で、Number 型、デフォルト値1の変数を作成してください。 - [ループ] の [終了条件] を「
total_countが 200 以上になったら」としてください。 - [コード実行] で [入力変数] を
total_countという名前で定義し、値を{{会話変数.total_count}}としてください。 - [コード実行] で [PYTHON3] のプログラムを下記としてください。
def main(total_count: int): return { "result": total_count * 2 } - [コード実行] で出力変数は Number 型の
resultとしてください。 - [変数代入] で
{{会話変数.total_count}}に{{コード実行.result}}を [上書き] 代入してください。 - [回答] で
{{会話変数.total_count}}を応答するにように指示してください。 - チャットフローを実行し、実行結果が 256 となれば成功です。
コード実行
Python3 または JavaScript のコードを実行するノードです。
- 入力変数 : コードの引数を定義します。
- コード : Python3 または JavaScript の関数を記述します。
- 出力変数 : コードの戻り値を、コード実行ノードの出力変数として定義します。
- 失敗時再試行 : 失敗時に再試行するか否かを選択します。
- 最大試行回数 : 最大試行回数を指定します。
- 再試行間隔 : 再試行するまでのインターバルを指定します。
- 例外処理 : 例外発生時の処理方法を指定します。
- 処理なし : 後続処理を中断して終了します。
- デフォルト値 : デフォルト値を出力して終了します。
- 例外分岐 : 例外処理のワークフローに分岐します。
テンプレート
Jinja2 のテンプレートを用いて文字列整形するノードです。
- 入力変数 : テンプレート内で参照する変数を定義します。
- コード : Jinja2 に従ったテンプレートを記述します。
{{variable}}は変数を参照します。{% if ... %}や{% for ... %}などの構文もサポートしています。 - 出力変数 : ノードが出力する変数を確認することができます。
変数集約器
IF/ELSE ノードなどで分岐したノードの出力変数をひとつの出力変数にまとめます。
- 変数を代入する : 集約する変数を指定します。
- グループ : 複数のグループに分けて集約する場合に用います。
下記に使用例を示します。
- 下記の構成のワークフローを作成してください。
[開始]─[IF/ELSE]─┬─[コード実行 1]─┬─[変数集約器]─[終了] [開始]─[IF/ELSE]─└─[コード実行 2]─┘ - [開始] には Number 型のユーザー変数
numberを追加してください。 - [IF/ELSE] では
numberが 5以上であれば [コード実行 1] に、さもなくば [コード実行 2] に分岐してください。 - [コード実行 1] では、
{ "result": "BIG" }を返却してください。 - [コード実行 2] では、
{ "result": "SMALL" }を返却してください。 - [変数集約器] では、[コード実行 1] の
resultと [コード実行 2] のresultを集約してください。 - [終了] では、[変数集約器] の
outputを出力変数としてください。 numberに 8 を指定して実行し、"BIG" と表示されれば成功です。
下記にグループを使用した例を示します。
- [コード実行 1] を
{ "result": "BIG", "message": "大きい" }に変更してください。 - [コード実行 2] を
{ "result": "SMALL", "message": "小さい" }に変更してください。 - [変数集約器] で Group2 を作成し、[コード実行 1] と [コード実行 2] の
messageを追加してください。 - [終了] では [変数集約器] の
Group1とGroup2を出力変数としてください。 numberに 8 を指定して実行し、実行結果の DETAIL が"Group1": { "output": "BIG" }, "Group2": { "output": "大きい" }となっていれば成功です。
テキスト抽出
ファイルを読み込みテキストを抽出します。ファイルは TXT, MARKDOWN, PDF, HTML, DOCX 形式などをサポートしています。画像や動画は対応していません。
- 入力変数 :
FileまたはArray[File]型の変数を指定します。 - 出力変数 : ノードが出力する変数を確認することができます。
変数代入
受け取った変数を 会話変数 に代入します。会話変数はチャットの流れの中で常時記憶しておくメモリの役割を担います。
- 変数 : 代入対象の会話変数と、設定方法と、代入する値を示す変数を指定します。
下記に使用例を示します。
- 下記の構成の チャットフロー を作成してください。
[開始]-[コード実行]-[変数代入]-[LLM]-[回答]
- 画面右上の
[ENV]の左隣にある、吹き出しに x のついたアイコンをクリックしてください。 - 会話変数として Number 型の
countを追加してください。初期値は 0 としてください。 - [コード実行] で入力変数を
count = {{会話変数.count}}とし、下記のコードを指定してください。def main(count: int): return { "count": count + 1 } - [変数代入] で [代入変数] に
{{会話変数.count}}を、[パラメーター] に{{コード実行.count}}を指定してください。 - [LLM] の USER プロンプトに
{{開始.query}}を指定してください。 - [回答] の [応答] に「カウント:{{会話変数.count}}:{{LLM.text}}」を指定してください。
- チャットを開始し、各回答にカウントが表示されれば成功です。
パラメータ抽出
テキストから構造化されたパラメータを LLM を用いて抽出します。
- モデル : パラメータ抽出に用いる LLM を指定します。
- 入力変数 :
{{sys.query}}などパラメータ抽出の対象とする変数を指定します。 - ビジョン : LLM に画像を渡す場合に On にします。
- 変数 : {{sys.files}} などの画像ファイルを示す変数を指定します。
- 解像度 : 画像処理の解像度を [高] または [低] から選択します。
- パラメーターを抽出 : 抽出するパラメーター名と型を指定します。
- 指示 : LLM に対する指示を指定します。
- 高度な設定
- 推論モード : 推論モードを指定します。
- 出力変数 : ノードが出力する変数を確認することができます。
下記に使用例を示します。
- 下記の構成の チャットフロー を作成してください。
[開始]-[パラメータ抽出]-[回答]
- [パラメータ抽出] の [入力変数] に
{{sys.query}}を指定してください。 - [パラメータ抽出] の [パラメータを抽出] に下記を追加してください。
first_name : String : ファーストネーム last_name : String : ラストネーム
- [回答] の [応答] に下記を指定してください。
姓:{{ パラメータ抽出.last_name }} 名:{{ パラメータ抽出.first_name }} - チャットを開始し、「私の名前は山田太郎です。」と入力すると、「性:山田 名:太郎」と表示されれば成功です。
HTTPリクエスト
HTTPリクエストを発行するノードです。
- API
- 認証 : 認証方式を 認証無し, ベーシック, Bearer, カスタムのいずれかで指定します。
- メソッド : GET, POST, HEAD, PATCH, PUT, DELETE のいずれかで指定します。
- URL : URL を指定します。
- ヘッダー : 追加で設定する HTTP ヘッダーを指定します。
- パラメータ : GET パラメーターを指定します。
- ボディ : POST パラメーターなど、ボディに埋め込む情報を指定します。通常のフォーム POST の場合は
x-www-form-urlencoded、JSON の場合はJSONを選択します。 - SSL証明書を確認する : 評価用にオレオレ証明書を使用している場合は Off にします。
- タイムアウト設定 : 接続・読み取り・書き込みのタイムアウト時間を秒単位で指定します。
- 出力変数 : ノードが出力する変数を確認することができます。
- 失敗時再試行 : 失敗時に再試行するか否かを選択します。
- 最大試行回数 : 最大試行回数を指定します。
- 再試行間隔 : 再試行するまでのインターバルを指定します。
- 例外処理 : 例外発生時の処理方法を指定します。
- 処理なし : 後続処理を中断して終了します。
- デフォルト値 : デフォルト値を出力して終了します。
- 例外分岐 : 例外処理のワークフローに分岐します。
リスト処理
リスト型の変数に対して処理を行います。
- 入力変数 : 処理する対象のリスト変数を指定します。
- フィルター条件 : ○○を含むものだけを抽出するなどのフィルター条件を指定します。
- N個のアイテムを抽出します : 日本語訳は「N個の...」とありますが、N番目のアイテムのみを抽出します。
- トップ N : 先頭から N個のアイテムを抽出します。
- 並べる順番 : 要素を並べる順番の 昇順(ASC)/降順(DESC) を選択します。
- 出力変数 : ノードが出力する変数を確認することができます。
コメント
ブロックノードではないですが、ワークフロー編集画面でマウスを右クリックして [コメントを追加] でコメントを追加することができます。ノードの近くにおいて処理内容のメモを記載することができます。
ツール
ツール
ワークフローで使用する下記などのツール群があります。
- Audio : テキストを音声にしたり、音声をテキストにしたりします。
- CodeInterpreter : コードを実行します。
python3とjavascriptをサポートしています。 - CurrentTime : 現在時刻を取得したりタイムゾーン変換したりします。
- WebScraper : 指定した URL の情報を取得します。
- Google : Google の検索を行います。
- Wikipedia : Wikipedia の検索を行います。
- GitHub : GitHub の操作を行います。
カスタム
- カスタムツールを作成します。
- カスタムツールは OpenAPI Swagger 仕様に従ったインタフェースを公開する Web API です。
- Swagger に準拠した仕様書ファイルを張り付けることで利用可能となります。
ワークフロー
- 作成したワークフローをツールとして他のワークフローから呼び出すことができます。
- ワークフロー編集画面から [公開する]-[ワークフローをツールとして公開する] を行うことで、ツールとして利用できるようになります。
MCP
- MCP(Meta Controller Protocol) サーバーは AI が利用可能なインタフェースを公開するサーバーです。
- MCP サーバー機能を提供している様々なサービス(Gmail, Notion, Zapier, Linear等)を Dify の AI から操作することが可能となります。
- また、Dify のワークフロー自体を MCP サーバーとして公開し、他の AI から利用することも可能です。
変数
システム変数
- [開始] ノードが持つ
{{sys.*}}で始まる変数を システム変数 と呼びます。 - ワークフローの場合は下記のシステム変数を持ちます。
- sys.user_id : ユーザーID
- sys.app_id : アプリケーションID
- sys.workflow_id : ワークフローID
- sys.workflow_run_id : ワークフロー実行ID
- sys.files : アップロードファイル
- チャットフローの場合は上記に加えて下記が定義されます。
- sys.query : ユーザーの入力文字列
- sys.dialogue_count : 会話カウント(1, 2, 3, ...)
- sys.conversation_id : 会話ID
ユーザー変数
- [開始] ノードなどで設定する
{{sys.*}}以外の変数を ユーザー変数 と呼びます。
会話変数
- チャットフローでは 会話変数 を利用することができます。
- 編集画面の右上
[ENV]アイコンの左隣にある吹き出し+x のアイコンをクリックすると会話変数管理パネルが開きます。 - 会話変数はチャットの開始から終了まで値を保持します。
- 新しいチャットを開始すると会話変数は初期化されます。
- 画面下部の [キャッシュされた変数を表示] から会話変数の値を参照したりクリアすることができます。
- 会話変数に値を設定するには 変数代入 ノードを使用します。
環境変数
- チャットフローやワークフローでは 環境変数 を利用することができます。
- 編集画面の右上の
[ENV]アイコンをクリックすると環境変数管理パネルが開きます。 - 環境変数は DSL にはエクスポートされません。環境毎に異なる値を設定・参照する目的で使用されます。