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

ながみえ

テンプレートノード は、生成AIの出力をそのまま使うのではなく、「必要な形に整えて次の処理へ渡す」ための便利な仕組みです。

たとえば、複数のノードから出てくる文章を1つにまとめたり、条件によって表示内容を変えたり、決まったフォーマットに当てはめて整形したりできます。

これができるようになると、アプリの使い勝手が一気に実務向きになるでしょう。

この記事の到達目標は、次のことができるようになることです。

  • テンプレートノードが何のためにあるのかを説明できる
  • 変数を使って、出力をわかりやすく整理できる
  • 条件分岐を使って、翻訳結果などを状況に応じて切り替えられる

Lesson1:Dify入門|環境構築と最初の生成AIアプリ開発
Lesson2:まずは体験|基本的なアプリを作ろう
Lesson3:文章業務を自動化するアプリを開発しよう
 ・Lesson3-1:多機能な文書変換アプリを作ろう
 ・Lesson3-2:テンプレートノード入門(前編) ◁今回はここ
 ・Lesson3-3:問い合わせ対応チャットボットを作ろう
Lesson4:ファイル処理で広がるDifyアプリ開発
Lesson5:RAG実践|ナレッジ検索アプリを作ろう
Lesson6:機能拡張と外部システム連携|ツールを使いこなそう
Lesson7:総仕上げ|実践投入への準備

<<前のページ

Difyの記事一覧

次のページ>>

Difyのテンプレートノードとは:役割とできること

テンプレートノードは、Difyのワークフローの中で「文章を組み立てるためのノード」です。

LLMが生成した文章や、変数集約器などがまとめた値を受け取り、それらを好きな形に整形して次のノードに渡します。

LLMの出力は便利ですが、そのままだと「出力の形式が毎回ブレる」「複数の出力をうまく結合できない」「場合分けして表示したい」といった場面で困りがちです。

テンプレートノードは、そうした “仕上げ” を担当してくれます。

今回のレッスンでは、前回(Lesson3-1)開発した「多機能な文書変換アプリ」にテンプレートノードを追加し、出力の見た目と使い勝手を整えていきます。

テンプレート言語:Jinja2とは

Difyによるアプリ開発はノーコード(プログラミングをしない)か、もしくは ローコード であると言われます。

ロー、ということは、少しだけプログラミングをするということです。

それがこのテンプレートノードであり、Jinja2(ジンジャツー) という テンプレート言語 を用います。

といっても、最初から難しく考える必要はありません。この記事で扱うのは次の2つだけです。

1つ目は「変数の埋め込み」です。

{}を二つ重ねて、「{{ 変数名 }}」 のように書くと、そこに別ノードの出力(変数)が差し込まれます。

たとえば {{ text }} のように書けば、その変数の中身をテンプレートの中で悪扱う事ができます。

2つ目は「条件分岐」です。

{% if 条件 %} ... {% else %}の形で、状況に応じて出す文章を切り替えられます。

翻訳方向や、ユーザーの選択内容に応じて結果を出し分けるときに活躍します。

テンプレートノードでは「決まった型をコピペして、変数名や条件だけ置き換える」感覚で十分使いこなせます。

実際に使いながら、覚えていきましょう。

実装:文書変換アプリにテンプレートノードを追加しよう

ここからは、前の記事(Lesson3-1)で作成した「C3-1_文書変換スペシャリスト」を土台にして、アプリを改善していきます。

テーマは「出力の整形」と「結果の出し分け」です。

どちらも実務で使うときに欠かせないポイントなので、手を動かしながらしっかり身につけましょう。

今回作成するアプリの最終的なノード構成は次の通りです。

Difyで作った多機能な文書変換アプリの改善版の全体図。

変数埋め込み:校正結果+原文をテンプレートで整形

まずは前回開発した「文書校正スペシャリストアプリ」の開発画面を開き、4つのLLMよりも後ろにあるノードを全て削除してください。

Difyによる多機能な文書翻訳アプリ(改善版)の開発画面のキャプチャ。ユーザー入力ノードとIFELSEノードと4つのLLMが表示されている。

一番上の文書校正用LLMの「+」をクリックし、テンプレートノードを追加してください。

分かりやすいように、名前も「校正テンプレート」に変更しておきましょう。

Difyによる多機能な文書翻訳アプリ(改善版)の開発画面のキャプチャ。文書校正用LLMノードの後ろにテンプレートノードを追加したところ。

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

Difyによる多機能な文書翻訳アプリ(改善版)の開発画面のキャプチャ。テンプレートノードの設定画面。

【入力変数を2つ作成】

  • llm_out:文書校正用LLMの変数text
  • u_text:ユーザー入力の変数text

コード欄に以下のように記入。

【文書校正結果】
{{ llm_out }}

---
【オリジナル文書】
{{ u_text }}

---
※上記の校正結果はAIによる提案です。

このコード内では3種類の書き方が使われています。

  • 文章:「【文書校正結果】」等の通常の文章
  • 変数:{{}}で囲われた変数。今回の例では、【文書校正結果】という文章の下にLLMの出力結果を表示し、さらにその下に【オリジナル文書】という文章が続くように書かれている。
  • —:区切り線

ここで一度、このテンプレートノードの後ろに出力ノードを配置し、アプリを起動してみましょう。

Difyによる多機能な文書翻訳アプリ(改善版)の開発画面のキャプチャ。テンプレートノードの後ろに出力ノードを追加した図。

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

Difyによる多機能な文書翻訳アプリ(改善版)の実行結果のキャプチャ。

作成したテンプレートノードの通りに出力されている点を確認してください。

その後、出力ノードはいったん削除しましょう。

そして今回の作業と同様の手順で、文書要約用LLMの後ろにもテンプレートを追加してください。

Difyによる多機能な文書翻訳アプリ(改善版)の開発画面のキャプチャ。文書要約用LLMの後ろにテンプレートノードを追加したところ。

条件分岐:翻訳方向で「英訳/和訳」を出し分ける

「日本語への翻訳用LLM」と「英語への翻訳用LLM」についても、テンプレートを追加していきましょう。

こちらは変数集約器ノードを用いて出力結果をまとめ、一つのテンプレートノードで対応させます。

下の画像のようにノードを追加してください。

Difyによる多機能な文書翻訳アプリ(改善版)の開発画面のキャプチャ。二つの翻訳用LLMの後ろに変数集約器ノードがあり、その後ろにテンプレートノードがある。

こちらのテンプレートノードは以下のように設定しましょう。

【入力変数を3つ作成】

  • u_role:ユーザー入力の変数role
  • u_text:ユーザー入力の変数text
  • output:変数集約器の出力変数output
Difyによる多機能な文書翻訳アプリ(改善版)の開発画面のキャプチャ。翻訳LLM後ろのテンプレートの設定画面。
{% 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の出力をそのまま見せるのではなく、必要な情報を必要な順番で整えて表示できます。

また条件分岐を組み込めば、翻訳方向などユーザーの選択に合わせて、出すべき結果だけをスマートに提示できるようになります。

今回作った「整える・出し分ける」の感覚を忘れないうちに、ぜひ次のレッスンに進みましょう!

Q
記事改善アンケート|ご意見をお聞かせください(1分で終わります)

本サイトでは、みなさまの学習をよりサポートできるサービスを目指しております。
そのため、みなさまの意見をアンケート形式でお伺いしています。

1分だけ、ご協力いただけますと幸いです。

(※)APIキーや個人情報等は入力しないようお願いします。

【Dify】記事改善アンケート
4.改善してほしい点(任意・複数選択)

<<前のページ

Difyの記事一覧

次のページ>>

記事URLをコピーしました