変数とコンテキスト管理

dify-docs-manage-variables-and-context

DifyのChatflow(チャットボット向けワークフロー)では、ノード間で値を受け渡したり、会話全体の状態(コンテキスト)を保持するために「変数」を使用します。

変数の種類

Difyのワークフローでは主に以下の3種類の変数を扱います。

1) システム変数 (System Variables)

システムが自動で提供する実行時情報です。ユーザー入力やセッションIDなどが含まれます。

変数
説明
sys.query
ユーザー入力メッセージ
sys.files
アップロードファイル
sys.conversation_id
会話ID(セッション識別用)
sys.user_id
ユーザーID

2) ノード出力変数 (Node Output Variables)

各ノードの処理結果です。後続のノードから参照することで、フロー内でデータをバケツリレーのように渡せます。

{{#ノード名.出力変数名#}}

例:
{{#knowledge_retrieval.result#}}
{{#llm.text#}}
  • 参照の仕組み:
    • 前段にあるノードの出力(textresultなど)を、後続ノードの入力欄で選択して使用します。
    • 例: 「LLMノード」の生成テキストを、「HTTPリクエストノード」の入力として使う。

3) 会話変数 (Conversation Variables)

会話(セッション)全体で値を保持・更新できる変数です。ノード出力変数はその場限りですが、会話変数は会話のキャッチボールが続いても値が維持されます。

用途:

  • 状態管理: ユーザー情報(名前、会員ランクなど)や選択、文脈の記憶(「現在どの話題について話しているか」など)、進行状況を保持
  • 累積情報: 複数ターンにわたる情報収集
  • カウンター: 質問回数などのカウント

変数の参照方法

プロンプトや入力フィールドでの参照

LLMノードのプロンプトや、各ノードの設定フィールド内で変数を埋め込みます。 DifyのUI上では、入力欄にある 「{x}」ボタン を押すか、{ を入力することで変数選択リストを呼び出せます。

## 参考情報
{{#knowledge_retrieval.result#}}

## ユーザーの質問
{{#sys.query#}}

//{{#ノード名.変数名#}} の形式で内部的に管理されます。

条件分岐での参照

「IF/ELSE(条件分岐)」ノードで変数の値を評価し、処理を分岐させます。

  • 例: sys.query (ユーザー入力) に「予約」という単語が含まれているか

会話変数(Conversation Variables)の操作

1. 定義(作成)

ワークフローエディタのメニュー(通常は「開始(Start)」ノード付近や画面下部の「Conversation Variables」タブ)から変数を定義します。

設定手順

  1. フローエディタ上部の「変数」をクリック
  1. 「+ 変数を追加」をクリック
  1. 変数名とタイプを設定

設定項目:

  • 変数名(例: user_name
  • タイプ(String, Number, Array 等)
    • タイプ
      用途
      文字列
      テキストデータ
      数値
      カウンターなど
      配列
      リストデータ
  • 説明(任意)

2. 更新(書き込み)

重要: 会話変数に値を保存するには、「変数割り当て (Variable Assigner)」ノードを使用します。

  1. フロー内に「変数割り当て」ノードを追加。
  1. 「ターゲット変数」に、定義した会話変数(例: user_name)を選択。
  1. 「値」に、書き込みたい内容(例: 前段のLLMノードで抽出した名前)を設定。

3. 利用(読み出し)

他の変数と同様に、プロンプト内などで {{#conversation.user_name#}} のように選択して参照します。

実践例:ユーザー情報の記憶

ユーザーが名前を名乗った場合、それを記憶して以後の会話で利用するフロー例です。

  1. 抽出 (LLMノード)
      • ユーザー入力 sys.query から名前を抽出するよう指示。
      • 出力: extracted_name
  1. 保存 (変数割り当てノード)
      • 会話変数 user_name に、extracted_name の値を代入。
      • モード: 「上書き (Overwrite)」など。
  1. 応答 (LLMノード)
    1.  プロンプト:
       {{#user_name#}}さん、こんにちは。
       
       //以降のターンでも {{#user_name#}} は保持され続ける。
  1. デジタルヒューマンでの活用例
    1. ユーザー情報の保持

      会話変数:
      - user_name: ユーザーが名乗ったら保存
      - inquiry_type: 問い合わせ種別

      コンテキストの引き継ぎ

      プロンプト:
      前回の会話で確認した情報:
      - お名前: {{#user_name#}}
      - お問い合わせ種別: {{#inquiry_type#}}

ベストプラクティス

  1. 明確な命名規則
      • ノード名や変数名は、後で見た時に理解しやすい英語名推奨(例: extract_intent, user_category)。
  1. 会話変数は必要最小限に
      • すべてを会話変数に入れると管理が複雑になります。セッションをまたいで保持する必要がある情報(ユーザー属性、現在のステータス等)に絞りましょう。
  1. 初期値の考慮
      • 変数が空(null/empty)の場合の挙動をプロンプト内で考慮するか、IFノードでチェックするとエラーを防げます。

参考URL

お役に立ちましたか?
😞
😐
🤩

最終更新日 February 20, 2026