【Dify】Lesson3-2:テンプレートノード入門(前編)

テンプレートノード は、生成AIの出力をそのまま使うのではなく、「必要な形に整えて次の処理へ渡す」ための便利な仕組みです。
たとえば、複数のノードから出てくる文章を1つにまとめたり、条件によって表示内容を変えたり、決まったフォーマットに当てはめて整形したりできます。
これができるようになると、アプリの使い勝手が一気に実務向きになるでしょう。
この記事の到達目標は、次のことができるようになることです。
- テンプレートノードが何のためにあるのかを説明できる
- 変数を使って、出力をわかりやすく整理できる
- 条件分岐を使って、翻訳結果などを状況に応じて切り替えられる
Lesson1:Dify入門|環境構築と最初の生成AIアプリ開発
Lesson2:まずは体験|基本的なアプリを作ろう
Lesson3:文章業務を自動化するアプリを開発しよう
・Lesson3-1:多機能な文書変換アプリを作ろう
・Lesson3-2:テンプレートノード入門(前編) ◁今回はここ
・Lesson3-3:問い合わせ対応チャットボットを作ろう
Lesson4:ファイル処理で広がるDifyアプリ開発
Lesson5:RAG実践|ナレッジ検索アプリを作ろう
Lesson6:機能拡張と外部システム連携|ツールを使いこなそう
Lesson7:総仕上げ|実践投入への準備
Difyのテンプレートノードとは:役割とできること
テンプレートノードは、Difyのワークフローの中で「文章を組み立てるためのノード」です。
LLMが生成した文章や、変数集約器などがまとめた値を受け取り、それらを好きな形に整形して次のノードに渡します。
LLMの出力は便利ですが、そのままだと「出力の形式が毎回ブレる」「複数の出力をうまく結合できない」「場合分けして表示したい」といった場面で困りがちです。
テンプレートノードは、そうした “仕上げ” を担当してくれます。
今回のレッスンでは、前回(Lesson3-1)開発した「多機能な文書変換アプリ」にテンプレートノードを追加し、出力の見た目と使い勝手を整えていきます。
テンプレート言語:Jinja2とは
Difyによるアプリ開発はノーコード(プログラミングをしない)か、もしくは ローコード であると言われます。
ロー、ということは、少しだけプログラミングをするということです。
それがこのテンプレートノードであり、Jinja2(ジンジャツー) という テンプレート言語 を用います。
といっても、最初から難しく考える必要はありません。この記事で扱うのは次の2つだけです。
1つ目は「変数の埋め込み」です。
{}を二つ重ねて、「{{ 変数名 }}」 のように書くと、そこに別ノードの出力(変数)が差し込まれます。
たとえば {{ text }} のように書けば、その変数の中身をテンプレートの中で悪扱う事ができます。
2つ目は「条件分岐」です。
{% if 条件 %} ... {% else %}の形で、状況に応じて出す文章を切り替えられます。
翻訳方向や、ユーザーの選択内容に応じて結果を出し分けるときに活躍します。
テンプレートノードでは「決まった型をコピペして、変数名や条件だけ置き換える」感覚で十分使いこなせます。
実際に使いながら、覚えていきましょう。
実装:文書変換アプリにテンプレートノードを追加しよう
ここからは、前の記事(Lesson3-1)で作成した「C3-1_文書変換スペシャリスト」を土台にして、アプリを改善していきます。
テーマは「出力の整形」と「結果の出し分け」です。
どちらも実務で使うときに欠かせないポイントなので、手を動かしながらしっかり身につけましょう。
今回作成するアプリの最終的なノード構成は次の通りです。

変数埋め込み:校正結果+原文をテンプレートで整形
まずは前回開発した「文書校正スペシャリストアプリ」の開発画面を開き、4つのLLMよりも後ろにあるノードを全て削除してください。

一番上の文書校正用LLMの「+」をクリックし、テンプレートノードを追加してください。
分かりやすいように、名前も「校正テンプレート」に変更しておきましょう。

校正テンプレートの設定を変更していきます。

【入力変数を2つ作成】
- llm_out:文書校正用LLMの変数text
- u_text:ユーザー入力の変数text
コード欄に以下のように記入。
【文書校正結果】
{{ llm_out }}
---
【オリジナル文書】
{{ u_text }}
---
※上記の校正結果はAIによる提案です。このコード内では3種類の書き方が使われています。
- 文章:「【文書校正結果】」等の通常の文章
- 変数:{{}}で囲われた変数。今回の例では、【文書校正結果】という文章の下にLLMの出力結果を表示し、さらにその下に【オリジナル文書】という文章が続くように書かれている。
- —:区切り線
ここで一度、このテンプレートノードの後ろに出力ノードを配置し、アプリを起動してみましょう。

例えば以下のように出力されれば成功です。

作成したテンプレートノードの通りに出力されている点を確認してください。
その後、出力ノードはいったん削除しましょう。
そして今回の作業と同様の手順で、文書要約用LLMの後ろにもテンプレートを追加してください。

条件分岐:翻訳方向で「英訳/和訳」を出し分ける
「日本語への翻訳用LLM」と「英語への翻訳用LLM」についても、テンプレートを追加していきましょう。
こちらは変数集約器ノードを用いて出力結果をまとめ、一つのテンプレートノードで対応させます。
下の画像のようにノードを追加してください。

こちらのテンプレートノードは以下のように設定しましょう。
【入力変数を3つ作成】
- u_role:ユーザー入力の変数role
- u_text:ユーザー入力の変数text
- output:変数集約器の出力変数output

{% if u_role == "日本語へ翻訳" %}
【日本語訳】
{{ output }}
---
【オリジナル英文】
{{ u_text }}
---
※上記の翻訳結果はAIによる提案です。
{% else %}
【英訳】
{{ output }}
---
【オリジナル和文】
{{ u_text }}
---
※上記の翻訳結果はAIによる提案です。
{% endif %}このコードの中で、条件分岐に関わる部分が3行あります。
{% if u_role == "日本語へ翻訳" %} | 分岐の始まり (もし変数u_roleの中身が「日本語へ翻訳」なら…) |
{% else %} | 別の条件 (もし変数u_roleの中身が「日本語へ翻訳」ではないのなら…) |
{% endif %} | 分岐の終わり |
最初の「{% if 変数 == 〇〇 %}」の部分で条件を定め、それに該当する場合はその下の処理を行います。
{% else %} より下は条件を満たさなかった場合の処理です。
最後に {% endif %} を入れることで、分岐処理のコードが終了することを意味します(必ずつける必要があります)。
先ほどと同様に、このテンプレートノードの後ろに出力ノードを配置し、アプリを起動してみましょう。
仕上げ:変数集約→最終出力ノードでアプリ完成
仕上げを行いましょう。
3つのテンプレートの後ろに変数集約器を配置し、その後ろに出力ノードを配置してください。

これで「文書変換スペシャリストアプリ(改善版)」は完成となります。
実際に起動し、4つのパターンで正しく出力されることを確認しましょう。
練習問題:テンプレートノードを統合しよう(elifの活用)
既に気付いている人もいるかもしれませんが、このアプリのノードはもっと減らすことができます。
テンプレートノードを3つ使うのではなく、一つのテンプレートの中で4つに条件分岐させましょう。
そのためには、コード内で elif文 を使用する必要があります。
{% if 変数 == "〇〇" %} | 分岐の始まり (もし変数の中身が〇〇なら…) |
{% elif 変数 == "△△" %} | 次の分岐の始まり (もし変数の中身が〇〇ではなく、△△なら…) |
{% else %} | 最後の分岐 (もし変数の中身が上記のどれでもないのなら…) |
{% endif %} | 分岐の終わり |
elif文はコード内に何度でも書くことができます(今回は2回書くことになります)。
このレッスンで開発したアプリの機能はそのままに、下の図のような構成になるよう改善してください。

まとめ
今回は、Difyのテンプレートノード入門(前編)として、「変数の埋め込み」と「条件分岐」を使いながら、多機能な文書変換アプリを改善しました。
テンプレートノードを使うと、LLMの出力をそのまま見せるのではなく、必要な情報を必要な順番で整えて表示できます。
また条件分岐を組み込めば、翻訳方向などユーザーの選択に合わせて、出すべき結果だけをスマートに提示できるようになります。
今回作った「整える・出し分ける」の感覚を忘れないうちに、ぜひ次のレッスンに進みましょう!
- 記事改善アンケート|ご意見をお聞かせください(1分で終わります)
-
本サイトでは、みなさまの学習をよりサポートできるサービスを目指しております。
そのため、みなさまの意見をアンケート形式でお伺いしています。1分だけ、ご協力いただけますと幸いです。
(※)APIキーや個人情報等は入力しないようお願いします。
【Dify】記事改善アンケート


