Difyのチャットフローはワークフローとどこが違う?基本から会話変数・条件分岐・RAGまで完全解説
室谷今回はDifyのチャットフローを深掘りしていきましょう。.AI(ドットエーアイ)のコミュニティでも「ワークフローとの違いがわからない」という声が多くてですね・・・
テキトー教師講座でも初日に必ず出てくる疑問ですね。「チャットフロー使えばいいですか?ワークフロー使えばいいですか?」って。
最初からきちんと整理しておくと、後々の設計が楽になるので大事なポイントです。
最初からきちんと整理しておくと、後々の設計が楽になるので大事なポイントです。
室谷そうなんですよね。チャットフローって「会話できるワークフロー」くらいのイメージで使い始める人が多いんですが、実際はもっと本質的な違いがあって、そこを理解してないと設計が崩れていくんです。
テキトー教師この記事では、チャットフローとワークフローの違いから始めて、チャットフローの作り方、会話変数・メモリの使い方、条件分岐、知識検索(RAG)との組み合わせ、最後は公開・ツール化まで一気に解説していきます。
室谷ここを読めば「Difyのチャットフローを使いこなす」ための全体像が掴めるはずなので、ぜひ最後まで読んでみてください。
チャットフローとワークフロー、何が違うのか

室谷まず根本的な違いを整理すると、一番わかりやすいのは「会話という概念があるかどうか」なんですよ。
テキトー教師そうですね。ワークフローは「タスクを1回実行する」ための仕組みです。
ユーザーが入力を渡して、処理が走って、結果が出て、終わり。各実行は完全に独立しています。
ユーザーが入力を渡して、処理が走って、結果が出て、終わり。各実行は完全に独立しています。
室谷一方でチャットフローは、会話のターンごとにフローが起動します。しかも会話IDというものがあって、同じ会話の中ではセッションが継続するんですよね。
テキトー教師整理するとこういう構造です。
| 機能 | ワークフロー | チャットフロー |
|---|---|---|
| 実行トリガー | ユーザー入力 or スケジューラー | 会話のターンごと |
| 会話ID・セッション | なし | あり |
| LLMのメモリ設定 | なし(毎回リセット) | あり(コンテキスト継続) |
| 会話変数 | なし | あり(セッション内で保持) |
| バッチ処理 | 対応 | 非対応 |
| ツール化 | 可能 | 不可 |
| 開始ノード | User Input / Trigger | User Input のみ |
室谷このテーブルで注目してほしいのが「ツール化」のところで、ワークフローはチャットフローの中でツールとして呼び出せるんですよ。つまり「複雑な処理をワークフローとして切り出して、チャットフローからツール経由で呼ぶ」という設計パターンが成立します。
テキトー教師MYUUUさんはその設計パターン、よく使われてますよね。
室谷めちゃくちゃ使います。チャットフローで会話の文脈を管理しながら、重い処理はワークフローに投げる。
そうするとチャットフロー側がスリムになって、保守しやすくなるんですよね。
そうするとチャットフロー側がスリムになって、保守しやすくなるんですよね。
テキトー教師コミュニティのメンバーさんがよくはまるのが「ワークフローで会話系のアプリを作ろうとして、会話変数が使えなくてフリーズする」パターンです(笑)。会話系のアプリを作りたいなら、チャットフロー一択です。
チャットボット、エージェント、チャットフローの関係
室谷ここも混乱しやすいところなんですが、Difyには「チャットボット」「エージェント」「チャットフロー」という3つの会話型アプリタイプがあります。
テキトー教師大まかに言うと、チャットボットとエージェントはシンプルなインターフェースで、チャットフローは「ビジュアルなフロービルダーで細かく制御できる会話型アプリ」です。
室谷Difyの公式ドキュメントでも「会話型のアプリを作るならWorkflowかChatflowを選ぶべき」と書かれていて、チャットボットは「よりシンプルなレガシーインターフェース」という位置付けになっています。
テキトー教師実際、講座ではほぼチャットフローか、単発タスクならワークフローを教えています。チャットボットは細かい制御が難しいですし、エージェントも今はチャットフロー内のエージェントノードで代替できるので。
室谷そうですね。チャットフローとワークフローの違いを理解した上で、「これは会話が必要か?」という1点で選べばほぼ迷わなくなります。
チャットフローの作り方・基本的な作成手順

テキトー教師では実際の作り方を見ていきましょう。Difyにログインしてスタジオを開き、「アプリを作成する」から始めます。
室谷アプリタイプの選択で「チャットフロー」を選んで、名前をつけて作成するとキャンバスが開きます。最初から「開始」ノードと「回答」ノードがあって、その間にLLMを繋いでいく形ですね。
テキトー教師最もシンプルなチャットフローの構成はこうなります。
- 開始ノード - ユーザーの入力を受け取る(
sys.queryに格納される) - LLMノード - プロンプトを設定してLLMで処理する
- 回答ノード - LLMの出力をユーザーに返す
室谷このシンプルな構成でも、ワークフローのチャットボットとは違って会話履歴が自動で管理されるんですよ。LLMノードのメモリ設定で「会話のターン数」を指定すれば、過去N回のやりとりをコンテキストとして渡してくれます。
テキトー教師補足すると、LLMノードの「メモリ」設定は、チャットフロー特有の機能です。ここで「ウィンドウ」を有効にして「ウィンドウサイズ」を設定すると、直近N回の会話を記憶してくれます。
コミュニティのメンバーさんで、ここの設定を忘れてて「なんで前の話を覚えてないんだ」と悩む方が多いので要注意です。
コミュニティのメンバーさんで、ここの設定を忘れてて「なんで前の話を覚えてないんだ」と悩む方が多いので要注意です。
室谷あとは会話の開始メッセージを設定したいケースも多いですよね。「こんにちは!何かお手伝いできますか?」みたいな開始メッセージは、アプリ設定の「機能」から「会話の開始」を有効にして設定できます。
チャットフローのプロンプト設定
テキトー教師LLMノードのプロンプト設定で重要なのは、
sys.query(ユーザーの最新入力)と会話変数を使いこなすことです。基本的なシステムプロンプトの書き方はこうなります。あなたは〇〇のアシスタントです。
ユーザーの質問に丁寧に答えてください。
{% if conversation_var %}
これまでに記録した情報:{{conversation_var}}
{% endif %}
室谷sys.queryはチャットフロー専用の変数で、毎ターンのユーザー入力が入ります。プロンプト内で{{sys.query}}と書くか、変数参照で呼び出せます。
テキトー教師ちなみにワークフローにはない、チャットフロー専用のシステム変数として、
sys.conversation_id(会話ID)とsys.dialogue_count(対話ターン数)があります。これを使うと「何回目の対話か」によって処理を分岐させることもできますよ。会話変数とメモリ:チャットフロー最大の強み
室谷チャットフローで一番大事なのは、ここじゃないかなと思っていて。会話変数を使いこなせるかどうかで、作れるアプリのレベルが全然変わります。
テキトー教師室谷さんのポストにある通りで、チャットフロー×会話変数の組み合わせが本当に強力です。ワークフローだと毎回最初からやり直しになる処理も、会話変数に中間結果を保存しておけば、次のターンで引き継げます。
室谷具体的にイメージしてもらうと、例えば「①ウェブ検索して情報収集→②その結果を元に記事を生成→③修正リクエストに応じて再生成」みたいなフローがあったとして。
テキトー教師ワークフローだと③をやるときに①からやり直しが必要になりますよね。でもチャットフローなら、①の結果を会話変数に保存しておいて、③のときはその変数を参照するだけでいい。
室谷そう、これがセーブポイントみたいな使い方なんですよね。処理コストも削減できるし、ユーザー体験も全然違ってきます。
会話変数の設定方法

テキトー教師会話変数を使うには、まず「変数」タブで会話変数を定義する必要があります。型はString、Number、Boolean、Object、Arrayから選べます。
室谷会話変数に値を書き込むのが「変数代入ノード」です。LLMノードの出力を変数代入ノードに繋いで、「contents」という会話変数にLLMの出力を書き込む、みたいな使い方が基本ですね。

テキトー教師変数代入ノードの設定で重要なのが「オペレーションモード」です。
- 上書き(Overwrite): 既存の値を新しい値で置き換える
- 追記(Append): 配列型変数に要素を追加する
- クリア(Clear): 値を削除する
室谷「上書き」がシンプルで使いやすいですね。「ユーザーの言語設定」「前回の検索キーワード」「これまでに収集した情報」みたいなものを上書き保存しておくパターンが多いです。
テキトー教師「追記」は例えばチェックリスト型のアプリで使います。「終わったタスク」を配列変数に追記していって、LLMが次に何をすべきか判断するときに参照する、みたいな感じですね。
コミュニティのメンバーさんで「ステップ管理ツール」を作った方が居て、これが見事にはまってました。
コミュニティのメンバーさんで「ステップ管理ツール」を作った方が居て、これが見事にはまってました。
チャットフローのメモリ設定
室谷会話変数と混同されやすいのが「LLMノードのメモリ」なんですよね。これは別物です。
テキトー教師メモリは「過去の会話ターンをLLMに渡す仕組み」です。会話変数は「あなたが明示的に保存・参照する値」で、メモリは「会話履歴をLLMが自動で参照する仕組み」です。
室谷つまり、メモリをオンにするだけで基本的な文脈継続はできます。ただし、長い会話になるとトークン消費が増えていくので、ウィンドウサイズの設定が重要になってきます。
テキトー教師一般的な設定だとウィンドウサイズ「3〜5」くらいが多いですね。サポートチャットなら直近3回分あれば十分なことが多いですし、複雑な作業支援なら5〜10回必要なケースもある。
ユースケース次第で調整してみてください。
ユースケース次第で調整してみてください。
条件分岐・質問分類・繰り返し:複雑なフローを作る
室谷チャットフローが「ただの会話AIじゃない」と実感できるのが、条件分岐やループを組み合わせたときですね。
テキトー教師その通りで、「ユーザーの質問内容によって違う処理をする」「特定の条件を満たすまで繰り返す」みたいな制御が、ビジュアルに組めるのがDifyの強みです。
質問分類ノードで会話を振り分ける
室谷条件分岐の強力なツールが「質問分類ノード」です。LLMがユーザーの発言を意味的に分類して、それぞれのカテゴリーに対応するフローに振り分けてくれます。
テキトー教師例えばカスタマーサポートのチャットフローを作るときに、「クレーム系」「使い方の質問」「注文・返品」「その他」みたいなカテゴリーを定義しておくと、LLMが適切なカテゴリーを判断して対応する知識ベースや回答フローに飛ばしてくれます。
室谷If-Elseノードも使えて、こちらはより条件ロジックを細かく書けます。「変数の値が特定の条件を満たすか」「数値が一定以上か」みたいな判定ですね。
質問分類はLLMで意味的に分類、If-Elseは明示的な条件で分岐、と使い分けると整理しやすいです。
質問分類はLLMで意味的に分類、If-Elseは明示的な条件で分岐、と使い分けると整理しやすいです。
テキトー教師チャットフローの条件分岐で出てくる「最初に戻る」の概念も重要です。通常、チャットフローは1ターンで開始から回答まで流れますが、特定の回答を返した後に「フローの最初(開始ノード)に戻る」ような制御は、次のターンが自動的にそれを行います。
繰り返し(ループ)ノード
室谷ループノードは、同じ処理を繰り返すときに使います。例えば「10件のURLを順番にクロールして要約する」みたいな処理ですね。
テキトー教師チャットフローでループを使うシーンとして多いのは、「ユーザーが追加の情報を入れるたびに処理を継続する」パターンです。例えば「まず会社名を教えてください→次に業種を教えてください→最後に課題を教えてください」みたいな複数ステップの入力収集を、会話変数と組み合わせて実装できます。
室谷これを実装するときのコツとして、「どのステップにいるか」を会話変数(Numberや String型)で持っておくといいですよ。
stepみたいな変数に1, 2, 3という数字を代入していって、If-Elseノードで「step=1なら○○を聞く」「step=2なら△△を聞く」と分岐させる。
テキトー教師コミュニティのメンバーさんが「ヒアリングシートをチャットで収集するBOT」を作られていて、まさにそのパターンでした。フォームよりも自然な会話形式で情報収集できるので、ユーザーの回答率が上がったって話でした。
選択肢をボタンで提示する
テキトー教師Difyのチャットフローには「選択肢ボタン」を表示する機能もあります。アプリの設定で「機能→会話の開始→開始メッセージ」や、回答の後に選択肢を表示して、ユーザーがボタンをクリックして回答する形式ですね。
室谷チャットフローのオープナー(会話開始時のメッセージ)で、「何を手伝いましょうか?」とともに「業務自動化の相談」「ツールの使い方」「料金について」みたいなボタンを出すパターンはよく使います。ユーザーが何を打ち込めばいいかわからない場合に、取り掛かりを提供できるんですよね。
知識検索(RAG)とチャットフローの組み合わせ
室谷チャットフローのユースケースで一番多いのが、ナレッジベース(知識検索)との組み合わせですね。いわゆるRAGのチャットボットです。
テキトー教師「社内ドキュメントに基づいて質問に答えるチャットボット」みたいなやつですね。これ、Difyのチャットフローだと本当に簡単に作れます。
室谷DifyのRAGチャットフローの基本構成はこうです。
- 開始ノード -
sys.queryでユーザーの質問を受け取る - 知識検索ノード - Difyのナレッジベースを検索して関連チャンクを取得
- LLMノード - ユーザーの質問 + 検索結果を元に回答を生成
- 回答ノード - 生成した回答を返す
テキトー教師知識検索ノードの設定で大事なのは、クエリに何を渡すかです。シンプルに
sys.queryを渡す場合と、LLMを使って「質問をより検索しやすい形に書き換えてから」渡す「クエリ書き換え」を挟む場合があります。
室谷高精度が求められるRAGだとクエリ書き換えを入れた方がいいですね。「あれって何でしたっけ?」みたいな省略した質問でも、LLMが「先ほど話していた〇〇の設定方法は?」と書き換えてから検索に出してくれます。
テキトー教師複数のナレッジベースをチャットフローで使い分ける場合は、質問分類ノードと組み合わせると整理しやすいですよ。「技術質問」は技術ドキュメントのナレッジベースへ、「料金質問」は料金表のナレッジベースへ、みたいに振り分けます。
室谷MYUUUでは複数事業のFAQを1つのチャットフローで対応させているんですが、まさにこのパターンで作っています。ナレッジベースを事業ごとに分けて、質問分類で振り分けているので、知識の混線が起きにくいですよ。
ファイルアップロードとチャットフロー
テキトー教師最近よく使われているのが「ファイルアップロード」機能との組み合わせです。チャットフローでファイルアップロードを有効にすると、ユーザーがPDFやWordなどのファイルを会話中にアップロードできます。
室谷開始ノードで
sys.filesという変数にアップロードされたファイルが入って、その後のドキュメント抽出ノードでテキスト化→LLMで処理、という流れで「アップロードしたファイルについて質問する」チャットフローが作れます。
テキトー教師画像のアップロードも対応しています。ビジョン対応のLLMと組み合わせると、「この図の中の〇〇を説明してください」みたいな画像についての質問もできますね。
チャットフローの公開・API化・ツール化
室谷チャットフローを作ったら、次は公開・利用の方法ですね。Difyのチャットフローは複数の公開方法があります。
テキトー教師まとめるとこういう選択肢があります。
| 公開方法 | 概要 | 向いているケース |
|---|---|---|
| Webアプリとして公開 | DifyのホスティングURLで誰でもアクセス可能 | 社内ツール、お客様向けチャット |
| 埋め込みウィジェット | iframeやJSでWebサイトに埋め込む | 自社サイトへの設置 |
| API(バックエンドAPI) | チャットフローをAPIエンドポイントとして公開 | 自前のアプリに組み込む |
室谷APIで公開するときはエンドポイントとAPIキーが発行されます。これを使って自前のアプリから呼べるようになるので、Difyの処理エンジンをバックエンドとして利用できます。
テキトー教師ここで1点確認しておきたいのが、チャットフローはワークフローと違って「ツール化」ができません。他のワークフロー・チャットフローの中でツールとして呼び出すことはできないので、注意が必要です。
室谷ツール化したい処理はワークフローで作っておいて、それをチャットフローの中で呼び出す形が正解です。
チャットフローのDSLエクスポート・インポート
テキトー教師作ったチャットフローはYAML形式のDSLとしてエクスポートできます。これがかなり便利で、他のDifyインスタンスにインポートしたり、バックアップとして保存したり、チームメンバーと共有したりできます。
室谷フローのエクスポートは「アプリの設定→エクスポート DSL」から。インポートは「アプリを作成→DSLからインポート」で読み込めます。
テンプレートとして配布する場合もこの形式を使います。
テンプレートとして配布する場合もこの形式を使います。
テキトー教師コミュニティのメンバーさん同士でDSLを共有し合う文化も育ってきていて、「このチャットフローのテンプレート使えます」みたいな形で広がっています。フローのコピーや移植が簡単なのも、Difyの使いやすさの一つです。
チャットフロー活用事例:実際の使い方サンプル
室谷実際どんなものが作れるか、具体的な事例を紹介しますね。
テキトー教師私が講座で教えている定番パターンをまとめると、こういった事例があります。
事例1:社内FAQチャットボット(RAGチャットフロー)
テキトー教師最もオーソドックスな構成です。社内ドキュメント・マニュアル・規定をナレッジベースに登録して、チャットフローで「質問→知識検索→回答生成」の流れを作ります。
室谷質問分類を加えて「HRに関する質問」「システムに関する質問」「経費に関する質問」で知識ベースを分ければ、部門横断の社内FAQも一本のチャットフローで対応できます。会話変数に「部門名」を保存しておくと、同じ部門からの質問が続くときにコンテキストを持ち続けられます。
事例2:ヒアリング・収集チャットボット
テキトー教師複数の情報を段階的に収集するタイプです。「まず会社名→業種→人数→課題」と順番に聞いて、最後に提案書を生成する、みたいな使い方ですね。
室谷このパターン、会話変数に
step(進行ステップ)とcollected_info(収集した情報)を持たせて、If-Elseで分岐させるのが定石です。MYUUUでも新規相談の事前ヒアリングに似た仕組みを作っていて、かなり工数削減になっています。事例3:反復改善型コンテンツ作成
室谷私のポストで紹介したやつですが、「情報収集→コンテンツ生成→ユーザーのフィードバックで修正」というループ型のフローです。
テキトー教師会話変数に「生成したコンテンツ」を保存しておいて、「もっとカジュアルに」「前半を短くして」みたいな修正指示が来たときに、最初から情報収集せずに保存済みのコンテンツを修正するだけで済む、という構成です。これ、実装してみると思ったよりシンプルにできるので、ぜひ試してほしいです。
室谷エージェントノードとチャットフローの組み合わせも最近増えてきていますね。チャットフロー内にエージェントノードを置いて、そこで自律的なツール呼び出しをさせながら、会話変数で文脈管理する。
かなり高度なことができます。
かなり高度なことができます。
テキトー教師講座で教えていて気づくのですが、最初から複雑なチャットフローを作ろうとすると挫折しやすいです。まず「開始→LLM→回答」のシンプルな構成から始めて、会話変数を一つ追加して、質問分類を追加して、と段階的に拡張していく方が学習効率が良いですね。
よくある疑問と落とし穴
室谷ここまでで基本的な使い方はカバーできましたが、実際に作っていてハマりがちなポイントをまとめておきましょう。
テキトー教師コミュニティのメンバーさんから聞いた「あるある」を整理するとこういう感じです。
室谷まず会話変数について。会話変数を定義したのに「なぜか値が引き継がれない」というケースが多いんですが、原因の大半は「変数代入ノードが接続されていない」か「変数の型が合っていない」のどちらかです。
テキトー教師あとは「チャットフローの最初に戻りたい」というケースですが、これはチャットフローの仕様上、自動的に次のターンが最初から実行されます。なので「フローをリセットする」ことは、会話変数の値をクリアすることと同義です。
室谷ワークフローへの変更・変換の話もよく出ますね。チャットフローをワークフローに変換することは基本的にできません。
作り直しが必要です。だからこそ最初の設計段階で「会話が必要か」を考えることが大事なんですよ。
作り直しが必要です。だからこそ最初の設計段階で「会話が必要か」を考えることが大事なんですよ。
テキトー教師チャットフロー内のLLMノードの「回答」と「回答ノード」の違いで混乱する方もいます。LLMノードの出力はあくまでテキスト変数で、それをユーザーに見せるためには「回答ノード」に繋ぐ必要があります。
「LLMノードを置いたのになぜ出力されない?」と悩む方が多いので念のため。
「LLMノードを置いたのになぜ出力されない?」と悩む方が多いので念のため。
室谷チャットフローの公開前に、必ずプレビューでテストしましょう。Difyのスタジオ画面右上の「プレビュー」ボタンから実際の会話インターフェースでテストできます。
変数の受け渡しや条件分岐が意図通りに動いているか確認してから公開するのが安全です。
変数の受け渡しや条件分岐が意図通りに動いているか確認してから公開するのが安全です。
まとめ:Difyのチャットフローを使いこなすために
テキトー教師今回のポイントを整理すると、こういうことですね。
- チャットフローはワークフローの「会話版」。セッション・会話変数・LLMメモリが使える
- 会話が必要なアプリはチャットフロー、単発タスクはワークフローで設計する
- 会話変数 × 変数代入ノードがチャットフロー最大の武器
- 質問分類・If-Else・ループで複雑な会話フローも設計できる
- ナレッジベース(RAG)と組み合わせると社内FAQや資料QAが簡単に作れる
- チャットフローのエクスポート(DSL)でテンプレートの共有・再利用が可能
室谷チャットフローって、触ってみると「こんなに細かく制御できるのか」と驚く人が多いんですよね。従来の「チャットボットを作る」という発想を超えて、会話型のワークフローを設計するツールとして捉えると、できることの幅が一気に広がります。
テキトー教師ぜひ最初はシンプルな構成から始めて、徐々に会話変数や条件分岐を足していってみてください。「小さく作って動かしながら育てる」が、チャットフロー習得の一番の近道だと思います。
Dify全体の基本的な使い方はDify公式ドキュメントを参照してください。チャットフローとワークフローの詳しい比較はhellodify.comにもわかりやすい解説があります。
FAQ
Q. Difyのチャットフローとチャットボットはどちらがいい?
室谷チャットフローを選ぶのが基本です。Difyはワークフローとチャットフローをメインの選択肢として推奨しており、チャットボット(旧来のシンプルなインターフェース)は「レガシーなシンプルモード」という位置づけです。
細かい制御やノードの組み合わせが必要なら迷わずチャットフローを使ってください。
細かい制御やノードの組み合わせが必要なら迷わずチャットフローを使ってください。
Q. チャットフローをワークフローに変更できる?
テキトー教師残念ながら直接の変換機能はありません。作り直しが必要です。
DSLのエクスポート機能を使っても、チャットフロー用の構成はワークフローにそのまま移植できません。設計段階で「会話が必要か」を見極めるのが重要です。
DSLのエクスポート機能を使っても、チャットフロー用の構成はワークフローにそのまま移植できません。設計段階で「会話が必要か」を見極めるのが重要です。
Q. チャットフローでRAGを構築するには?
室谷知識検索ノードをLLMノードの前に配置して、クエリに
まずナレッジを作成→チャットフローに知識検索ノードを追加、の流れです。
sys.queryを渡し、出力をLLMのコンテキストとして渡します。DifyのナレッジベースはUI上で簡単に作成できます。まずナレッジを作成→チャットフローに知識検索ノードを追加、の流れです。
Q. 会話変数はどこで定義するの?
テキトー教師チャットフローのキャンバス画面で「変数」タブを開くと、会話変数の作成・管理ができます。名前・型(String/Number/Boolean/Object/Array)を設定して保存するだけです。
その後、変数代入ノードで値を書き込み、他のノードで参照して使います。
その後、変数代入ノードで値を書き込み、他のノードで参照して使います。
