【Dify】Lesson2-3:チャットフローアプリの基本|文字抽出アプリを作ろう

今回はDifyの「チャットフローアプリ」を使って、画像をアップロードすると中の文字を抽出(OCR)して返してくれるアプリを作ります。
チャットフローは、ここまで体験してきたチャットボット、テキストジェネレーター、エージェントアプリとは少し作り方が異なります。
“部品をつないで会話の流れを作る” イメージで、会話の中に「処理の手順」や「条件分岐」を組み込んで、意図した流れで確実に動かせるのが強みです。

チャットボット、テキストジェネレーター、エージェントの3つは初心者向けの勉強用アプリと思っていいかな。
いよいよここからDifyの真骨頂に触れていくよ!
Lesson1:Dify入門|環境構築と最初の生成AIアプリ開発
Lesson2:まずは体験|基本的なアプリを作ろう
・Lesson2-1:テキストジェネレーターアプリの基本
・Lesson2-2:エージェントアプリの基本
・Lesson2-3:チャットフローアプリの基本 ◁今回はここ
・Lesson2-4:ワークフローアプリの基本
・Lesson2-5:5つのアプリタイプの特徴と違いまとめ
・Lesson2-6:良いプロンプトの書き方
Lesson3:文章業務を自動化するアプリを開発しよう
Lesson4:ファイル処理で広がるDifyアプリ開発
Lesson5:RAG実践|ナレッジ検索アプリを作ろう
Lesson6:機能拡張と外部システム連携|ツールを使いこなそう
Lesson7:総仕上げ|実践投入への準備
Difyでチャットフローアプリを開発しよう
ここからは、Difyの「チャットフローアプリ」がどんな場面で役立つのか、そして中身がどんな仕組みで動いているのかを押さえていきます。
仕組みを先に理解しておくと、このあと作る「画像から文字を抽出する(OCR)アプリ」も、迷子にならずに組み立てられるようになります。
チャットフローアプリとは|できること・活用例
チャットフローアプリは、見た目はチャット形式ですが、裏側は「会話の流れに沿って処理を順番に進める」ように設計できるアプリタイプです。
チャットボットのように自然な会話を続けることもできますが、それ以上に強いのは「この入力が来たらこうする」「条件に合わないときは別の返答をする」といった、手順をコントロールできる点です。
たとえば、次のような “業務っぽい処理” と相性がいいです。
- ユーザーの入力をチェックして、不備があれば差し戻す(条件分岐)
- 入力内容を整形してからAIに渡す(前処理)
- 必要な情報だけを抜き出して、決まった形で返す(出力の整形)
- 「画像・テキスト・ファイル」など入力の種類に応じて処理を変える
- 社内の簡易ツールとして、問い合わせ対応や手順案内を半自動化する
つまりチャットフローは、「会話」+「処理手順」を組み合わせて、再現性の高いアプリを作りたいときに便利です。
副業でミニアプリを作る場合も、テンプレ化しやすいので扱いやすいジャンルです。
チャットフローの基本構造:ノードの流れと変数の考え方
チャットフローは、ざっくり言うと「ノード(部品)」を線でつないで、処理の流れを作っていく仕組みです。
各ノードには役割があり、入力を受け取る、AIに考えさせる、条件分岐する、結果をユーザーに返す…といった動きを担当します。

基本の流れは、次のイメージです。
- ユーザーがメッセージやファイル(画像など)を送る
- フローが入力を受け取り、必要ならチェックする(画像かどうか、空じゃないか など)
- 条件に応じて処理を分岐し、AI(LLM)やツールに渡す
- 生成された結果を整えて、チャット画面に返す
このとき大事なのが、「フローの途中で扱う情報は変数として保持できる」点です。
たとえば「ユーザーが送った画像」「抽出されたテキスト」「エラー時のメッセージ」などを変数として持っておき、後続のノードで使い回せます。
これができると、処理の見通しが一気によくなります。
画像から文字を抽出するOCRアプリを作ろう
それではアプリ開発に入ります。
アプリの骨格部分を作ろう
アプリタイプはチャットフローを選択し、名前は「画像OCRアプリ」として「作成する」をクリックしてください。

すると画面に以下のように表示されます。

「ユーザー入力」「LLM」「回答」という3つの ノード がデフォルトで設定されています。
ノードは左から順番に実行されます。つまり現状のこのアプリは、
- ユーザー入力:ユーザーが何らかのアクションをする
- LLM:AIがそれに基づいて考える
- 回答:結果を出力する
という順番で動きます。これに手を加えていきましょう。
今回はユーザー入力には手を加えませんので、LLMを選択して画面右上(「公開する」の隣)の「機能」をクリックし、以下のように作業してください。
- 「ファイルアップロード」をオンにする
- 「アップロードされたファイルのタイプ」で「ローカルアップロード」を選択する
- 「アップロード最大数」を1にする
- サポートされた画像ファイルで「画像」だけにチェックを入れる
- 「保存」をクリックする

続いてプロンプトを設定しましょう。
LLMを選択した状態で「SYSTEM」の部分に書き込んでください。

# 役割 あなたは画像から文字情報を抽出する専門家です。 # 命令 - 画像に含まれる文字情報を抽出してください。 - 抽出した文字を分かりやすく整形してください。 - ユーザーからの質問には回答しないでください。
その後、メモリはオフ、ビジョンはオンにしましょう。

- メモリ:過去の会話を覚えておく機能。今回は不要。
- ビジョン:画像を扱うための設定。
「LLM」ノードの設定はこれで完了です。
続いて「回答」ノードですが、今回はこちらもデフォルトのままでOKです。
応答の部分に「LLM {x}text」という変数が入っていれば、LLMが生成したテキストがここで「回答」として表示されます。

それでは、アプリを公開して実行してみましょう。
なにか適当な画像(例えば↑↑の画像)などを読み込ませ、「実行」とだけ指示してください。


次に進む前に、ちょっと弄ってみよう!
Lesson1-3 で勉強した「オープナー」を入れてみたり、
回答ノードの「応答」欄にデフォルトの変数以外の文章を入れるとどうなるかな?
条件分岐|IF/ELSEノードを設定しよう
このアプリを、画像をアップロードせずに実行するとどうなるでしょう?
答えは「LLMがその状況を考え、回答する」です。画像のアップロードを促すことが多いと思われますが、毎回一から考えて決めるため確実ではありません。
そこで、「IF/ELSE」ノードを使って画像が無かった場合の処理を決めてしまいましょう。
IF/ELSEはPythonなどのプログラミング言語でよく使われる条件分岐の手法で、「もし〇〇なら××しろ。もしそうでないなら△△しろ」といった命令に使われます。
↓↓のコードは「もしaの値が0なら『こんにちは』と表示しろ。違うなら『さようなら』と表示しろ」という意味のPythonコードです。
if a==0:
print("こんにちは")
else:
print("さようなら")Difyではこれと同じことをコードを書かずに実行することができます。
LLMと回答を繋ぐ線にカーソルを合わせると「+」マークが見えます。それをクリックし、「IF/ELSE」ノードを選択してください。

するとLLMノードの後ろにノードが追加されます。

続いてIF/ELSEノードの設定画面で以下の手順で設定してください。

- 「条件を追加」をクリック
- ユーザー入力の「{x}files」をクリック
- 変数filesは、最初の「ユーザー入力」ノードでアップロードされたファイルが格納されている

- {x}filesの右側の「含む」を「空でない」に変更
- これで「もしアップロードされたファイルが空でないなら~」という条件が完成
IF/ELSEノードと回答ノードとの繋がりは切れますので、IFの横の「+」マークをドラッグし、回答ノードに繋ぎましょう(もしアップロードされたファイルがあるなら、回答する)。
続いて、「ファイルがない」場合の処理を追加します。
IF/ELSEノードのELSEの右の「+」マークをクリックし、「回答」ノードを追加してください。

最後に、「回答2」ノードの設定画面から「画像ファイルがみつかりません。」と入力すれば完成です。
実際にアプリを公開し、画像をアップロードせずに実行してみましょう。
まとめ
今回は、Difyのチャットフローアプリの基本として、画像を受け取って文字を抽出する(OCR)アプリを作成しました。
チャットフローは見た目こそチャット形式ですが、裏側は「入力 → 処理 → 出力」の流れをノードで組み立てられるのが強みです。
この構成が作れたなら、応用も簡単です。
今回は説明していない様々なノードを組み合わせることで、複雑なアプリも簡単に作れるようになります。
ぜひ、このまま学習を続けてください。
- 記事改善アンケート|ご意見をお聞かせください(1分で終わります)
-
本サイトでは、みなさまの学習をよりサポートできるサービスを目指しております。
そのため、みなさまの意見をアンケート形式でお伺いしています。1分だけ、ご協力いただけますと幸いです。
(※)APIキーや個人情報等は入力しないようお願いします。
【Dify】記事改善アンケート


