Difyの変数代入ノードとは?会話を記憶させる仕組みを解説

室谷今回はDifyの変数代入ノードについて話しましょう。これ、.AI(ドットエーアイ)コミュニティでもよく話題になるんですよね・・・「チャットボットに前の会話を覚えさせたい」って声が本当に多くて。
テキトー教師講座でも必ず出てくるテーマです。受講生さんがDifyでチャットボットを作り始めると、「なんで前の会話を忘れるんですか?」って質問が序盤に集中するんですよ。
室谷Difyのワークフローって、基本的に各ノードが独立して動くんですよね。前のステップで取得した情報を次のステップで使いたい場合、明示的に「引き継ぎ」の仕組みを入れないといけない。
テキトー教師そこで登場するのが変数代入ノードです。整理すると、Difyには「ワークフロー変数」と「会話変数」の2種類があって、変数代入ノードは会話変数に対して書き込みをするノードなんですよ。
室谷ワークフロー変数と会話変数の違いって、ここが一番ポイントですよね。
テキトー教師そうなんです。ワークフロー変数は1回のワークフロー実行が終わるとリセットされます。
でも会話変数は、同じチャットセッションの中で何度やり取りしても値が残り続ける。この持続性が変数代入ノードの核心です。
でも会話変数は、同じチャットセッションの中で何度やり取りしても値が残り続ける。この持続性が変数代入ノードの核心です。
室谷MYUUUでもDifyでのチャットボット開発をよくやるんですが、ユーザーの名前や設定を最初に聞いて会話変数に保存しておくと、その後の会話全体でパーソナライズできるんですよね。それがチャットフローの一番の強みだと思っています。
テキトー教師これはXでも室谷さんが書いていましたよね。
室谷そうですそうです。チャットフロー×会話変数の組み合わせ、これマジで便利なんですよ。
ワークフローだと複雑な処理をやり直したいときに最初から実行しなおす必要があるんですが、チャットフローで会話変数を使えば途中でセーブポイントを作れる。
ワークフローだと複雑な処理をやり直したいときに最初から実行しなおす必要があるんですが、チャットフローで会話変数を使えば途中でセーブポイントを作れる。
テキトー教師「途中から再開できる」って表現、受講生さんに一番刺さりますね(笑)。RPGのセーブポイントのようなイメージで説明すると理解が早い。
変数代入ノードの使い方:基本設定からワークフローへの追加まで

室谷実際の使い方に入りましょう。変数代入ノードをワークフローに追加する方法から話しますか。
テキトー教師ワークフロー編集画面で「+」アイコンをクリックして、「変数の代入」を選択するだけです。ノードが追加されたら、3つの設定を行います。
室谷3つですね。順番に説明しましょうか。
テキトー教師まず「変数」の設定。ここでは書き込み先となる会話変数を選びます。
事前に会話変数を定義しておく必要があるんですが、新規作成もここからできますね。
事前に会話変数を定義しておく必要があるんですが、新規作成もここからできますね。
室谷変数名は
user_nameやmemory_itemsみたいに英語のスネークケースで付けるのが慣習です。日本語でも動くんですが、後でコードノードと連携するときに困るケースがあって・・・
テキトー教師講座でもそれは強調して教えてますね。変数名は半角英数字にしておくと後々ラクです。
室谷次が「変数設定(ソース変数)」。これは代入する値の取得元ですね。
前のノードの出力、LLMノードの結果、ユーザーの入力など、上流にあるノードの出力変数を指定します。
前のノードの出力、LLMノードの結果、ユーザーの入力など、上流にあるノードの出力変数を指定します。
テキトー教師そして3つ目が「操作モード」です。ここが変数代入ノードの一番の特徴で、変数のデータ型によって選べるモードが変わります。
まとめるとこうなります。
まとめるとこうなります。
| データ型 | 利用可能な操作モード |
|---|---|
| 文字列型(String) | 上書き、クリア、設定 |
| 数値型(Number) | 上書き、クリア、設定、算術演算 |
| 真偽値型(Boolean) | 上書き、クリア、設定 |
| オブジェクト型(Object) | 上書き、クリア、設定 |
| 配列型(Array) | 上書き、クリア、追加、拡張、最初/最後を削除 |
室谷配列型の操作モードが一番種類が多いですね。「追加(Append)」と「拡張(Extend)」の使い分けがちょっとわかりにくいんですよね・・・
テキトー教師これ、受講生さんがよくハマるポイントです(笑)。「追加」は配列の末尾に1つの要素を加えるもの。
「拡張」は別の配列から全要素をまとめて追加するものです。
「拡張」は別の配列から全要素をまとめて追加するものです。
室谷なるほど。ユーザーが好きな商品を1つずつ選んでいくなら「追加」、別の場所でリストアップした複数の商品を一気に登録するなら「拡張」ですね。
テキトー教師それと「最初/最後を削除」も地味に便利です。メモリが一定サイズを超えたときに古いものから消していく、スライディングウィンドウ方式の会話履歴管理ができるんですよ。
室谷容量制限の回避にもなりますし、これは設計の選択肢として持っておくといい方法ですね。
操作モードの詳細:上書き・追加・設定・算術演算の使い分け

テキトー教師各操作モードをもう少し深掘りしましょう。一番よく使う「上書き(Overwrite)」から。
室谷上書きは文字通り、変数の現在の値をソース変数の値で置き換えます。ユーザーが名前を再入力したときに
user_name変数を更新するシーンが典型例ですね。
テキトー教師「設定(Set)」は上書きと似ていますが、ソース変数ではなく手動で固定値を指定します。フラグの初期化や、特定の状態に強制的にリセットしたいときに使います。
室谷「算術演算(Arithmetic)」は数値型専用です。これが地味に強力で、足し算・引き算・掛け算・割り算ができます。
ユーザーのアクセス回数をカウントアップしたり、スコアを加算したりできる。
ユーザーのアクセス回数をカウントアップしたり、スコアを加算したりできる。
テキトー教師講座でよくやる実習例が「訪問回数カウンター」です。
これだけで「〇回目のご訪問ですね」みたいなパーソナライズされた応答が作れる。
visit_countという数値型の会話変数を作って、毎回の会話で+1する。これだけで「〇回目のご訪問ですね」みたいなパーソナライズされた応答が作れる。
室谷シンプルだけど効果的ですよね。「クリア(Clear)」はその変数の値を空にするモードです。
セッションのリセットボタンを作りたいときとか、一時的な情報を消したいときに使います。
セッションのリセットボタンを作りたいときとか、一時的な情報を消したいときに使います。
テキトー教師単一のノードで複数の変数を同時に代入できるのも覚えておくといいですね。「名前」と「言語設定」と「ポイント数」を一度のノードで更新できます。
室谷ノードが増えすぎるとワークフローが複雑になるので、まとめられるものはまとめるのがコツです。
dify 変数代入 できない場合のトラブルシューティング
室谷「変数代入ができない」という相談、コミュニティでもよく見ます。代表的な原因をいくつか挙げますか。
テキトー教師一番多いのが「会話変数が定義されていない」です。変数代入ノードを追加する前に、チャットフローのアプリ設定で会話変数を事前に定義しておく必要があります。
室谷ここ、見落としやすいんですよね。ワークフロー変数は自動的に作られるイメージがありますが、会話変数は明示的に定義しないといけない。
テキトー教師次によくあるのが「データ型の不一致」です。文字列型の変数に対して配列型の値を代入しようとするとエラーになります。
変数を定義するときに型をちゃんと決めておくことが大事です。
変数を定義するときに型をちゃんと決めておくことが大事です。
室谷変数代入のセット(Set)操作も意外なところで詰まる。入力フォームで手動入力した値の型変換がされないケースがあって・・・
テキトー教師特に数値型に対して文字列を設定しようとするときに出るエラーです。コードノードで型変換を挟むか、テンプレートノードで処理するのが解決策になります。
室谷ワークフローではなくチャットフローを使っているかどうか、これも確認ポイントですね。変数アサイナーは公式ドキュメントにも「チャットフローアプリケーションで永続的な会話変数を管理する」と明記されていて、通常のワークフローでは会話変数の概念自体がありません。
テキトー教師これは大事なポイントです。「dify 変数代入 ワークフロー」で調べている方は特に注意してほしいですね。
チャットフローとワークフローの違いを把握してから設計しないと、ハマります。
チャットフローとワークフローの違いを把握してから設計しないと、ハマります。
室谷公式ドキュメントにも「ワークフロー変数は単一のワークフロー実行中のみ存在し、ワークフローが完了するとリセットされる」と書いてあります。永続化が必要ならチャットフロー×会話変数のセットが正解です。
変数代入ノードの実践パターン:スマートメモリ・ユーザー設定保存・段階的チェックリスト
テキトー教師実際のユースケースに入りましょう。公式ドキュメントが紹介している「スマートメモリシステム」、これ非常に使えます。
室谷会話から重要な情報を自動的に検出して保存するパターンですね。具体的にはLLMノードにユーザーの発言を食わせて、「記憶すべき事実を抽出して」と指示し、その結果を会話変数に追加していく。
テキトー教師ポイントはLLMに「JSON配列形式で出力して」と指示することです。LLMノードの出力を配列型の会話変数に代入するとき、エスケープ機能を使ってarray形式に変換する必要がある。
室谷このエスケープ機能、知らないと詰まりますよね。LLMノードの出力をそのまま配列型の変数に代入しようとすると型エラーが出る。
Jinja2のテンプレート構文で変換する必要があります。
Jinja2のテンプレート構文で変換する必要があります。
テキトー教師次が「ユーザー設定の保存」パターン。言語設定や通知設定などの個人設定を会話変数に保存して、以降のLLMプロンプトに渡す使い方です。
上書きモードで最初の設定をキャプチャしておけば、会話全体でその設定が反映されます。
上書きモードで最初の設定をキャプチャしておけば、会話全体でその設定が反映されます。
室谷MYUUUで作ったカスタマーサポートボットでも似た実装をしていて、最初の会話でユーザーの属性(担当業務、使用ツール)を聞いてから、その情報をすべての応答に組み込むようにしています。
テキトー教師そして「段階的チェックリスト」のパターン。配列型の会話変数で完了済みタスクを管理して、LLMが残りタスクをガイドするワークフローです。
室谷タスク管理ボットやオンボーディングボットにぴったりですね。配列に追加していくだけで進捗が自然に追跡できる。
テキトー教師変数代入ノードをうまく使えば、単発の質問応答を超えた「記憶を持つAI」が作れる。これがDifyでチャットボットを作る醍醐味だと思います。
変数代入ノードを使う上での注意点
室谷便利な機能ですが、気をつけないといけないポイントもありますね。
テキトー教師まず「変数のスコープ」の問題です。会話変数はワークフロー全体で共有されるので、あるノードで変数を書き換えると他のノードの動作にも影響します。
室谷特に複数の分岐がある複雑なワークフローでは、意図せず変数を上書きしてしまうことがある。変数名を適切に設計して、どこでどの変数を変更しているかを把握しておく必要があります。
テキトー教師容量制限も頭に入れておいた方がいいですね。会話変数には格納できるデータ量に制限があります。
長い会話履歴やファイルの内容を丸ごと入れようとすると問題が出ることがある。
長い会話履歴やファイルの内容を丸ごと入れようとすると問題が出ることがある。
室谷大量データを扱いたい場合は、LLMで要約してから保存するか、外部データベースに保存してIDだけを会話変数に持つ設計にするのが現実的ですね。
テキトー教師あとは変数のデータ型は定義後に変更しにくい点も注意です。設計段階で型をしっかり決めておくことが大切で、後から「やっぱり配列にしたかった」となると作り直しになることもあります。
室谷最初の設計が後から効いてくるんですよね・・・。ここを丁寧にやっておくと後の開発がスムーズになる。
よくある質問(FAQ)
テキトー教師よくある質問をまとめましょう。「変数代入ノードと変数アグリゲーター(集約器)の違いは何ですか?」という質問が多いですね。
室谷これは用途がまったく違います。変数代入ノードは「会話変数への書き込み」が目的。
変数アグリゲーター(集約器)は「複数の分岐からの出力を1つにまとめる」ためのものです。
変数アグリゲーター(集約器)は「複数の分岐からの出力を1つにまとめる」ためのものです。
テキトー教師変数代入ノードはチャットフローでの永続化、集約器はワークフローでの並列処理のマージ、という整理がわかりやすいですね。
室谷「会話変数はいつリセットされますか?」という質問も多いです。答えは「新しいチャットセッションが始まったとき」です。
同じユーザーでも新しい会話を開始すると変数はリセットされます。
同じユーザーでも新しい会話を開始すると変数はリセットされます。
テキトー教師「変数代入ノードはワークフローアプリでは使えませんか?」という点も。会話変数の概念はチャットフロー固有です。
ワークフローアプリで状態を保持したい場合は、外部DBに書き出すか、HTTPリクエストノードでAPIを叩いてデータを保存する設計になります。
ワークフローアプリで状態を保持したい場合は、外部DBに書き出すか、HTTPリクエストノードでAPIを叩いてデータを保存する設計になります。
室谷「変数代入ノード セット操作の値は何を入れればいいですか?」という質問も見ます。セット操作は固定値を手動で入力するものですが、変数参照(
別の変数の値を元に設定したい場合に便利です。
{{変数名}}形式)も使えます。別の変数の値を元に設定したい場合に便利です。
テキトー教師最後に「変数代入ノードで配列への追加と上書きを使い分けるにはどうすればいいですか?」という質問。「毎回の会話で情報を蓄積したい」なら追加、「最新情報で置き換えたい」なら上書きというのが基本的な考え方です。
まとめ
室谷まとめると、Difyの変数代入ノードはチャットフローで「記憶を持つAI」を作るための核心的な機能です。会話変数との組み合わせで、ユーザーの情報や進捗を会話をまたいで保持できます。
テキトー教師使いこなすポイントは3つです。まず会話変数を事前に適切な型で定義すること。
次に操作モード(上書き・追加・クリア・算術演算)を用途に合わせて選ぶこと。最後に変数のスコープと容量制限を意識した設計をすること。
次に操作モード(上書き・追加・クリア・算術演算)を用途に合わせて選ぶこと。最後に変数のスコープと容量制限を意識した設計をすること。
室谷変数代入ノードを使えば、「毎回同じ説明を繰り返さなくていいチャットボット」から「ユーザーの好みを学習して最適化するパーソナルAI」まで、かなり幅広いアプリケーションが作れます。DifyでAI開発に取り組む方はぜひ試してみてください。
テキトー教師.AIのコミュニティでもDifyを使った実践例を多数シェアしています。ぜひ活用してみてください。
