変数とコンテキスト管理

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}」ボタン を押すか、{ を入力することで変数選択リストを呼び出せます。

条件分岐での参照

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

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

会話変数(Conversation Variables)の操作

1. 定義(作成)

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

設定手順

  1. フローエディタ上部の「変数」をクリック

  2. 「+ 変数を追加」をクリック

  3. 変数名とタイプを設定

設定項目:

  • 変数名(例: user_name

  • タイプ(String, Number, Array 等)

    タイプ
    用途

    文字列

    テキストデータ

    数値

    カウンターなど

    配列

    リストデータ

  • 説明(任意)

2. 更新(書き込み)

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

  1. フロー内に「変数割り当て」ノードを追加。

  2. 「ターゲット変数」に、定義した会話変数(例: user_name)を選択。

  3. 「値」に、書き込みたい内容(例: 前段のLLMノードで抽出した名前)を設定。

3. 利用(読み出し)

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

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

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

  1. 抽出 (LLMノード)

    • ユーザー入力 sys.query から名前を抽出するよう指示。

    • 出力: extracted_name

  2. 保存 (変数割り当てノード)

    • 会話変数 user_name に、extracted_name の値を代入。

    • モード: 「上書き (Overwrite)」など。

  3. 応答 (LLMノード)

  4. デジタルヒューマンでの活用例

    ユーザー情報の保持

    コンテキストの引き継ぎ

ベストプラクティス

  1. 明確な命名規則

    • ノード名や変数名は、後で見た時に理解しやすい英語名推奨(例: extract_intent, user_category)。

  2. 会話変数は必要最小限に

    • すべてを会話変数に入れると管理が複雑になります。セッションをまたいで保持する必要がある情報(ユーザー属性、現在のステータス等)に絞りましょう。

  3. 初期値の考慮

    • 変数が空(null/empty)の場合の挙動をプロンプト内で考慮するか、IFノードでチェックするとエラーを防げます。

参考URL

最終更新