> For the complete documentation index, see [llms.txt](https://docs.digitalhumans.jp/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.digitalhumans.jp/dify-guide/chatflow/dify-docs-manage-variables-and-context.md).

# 変数とコンテキスト管理

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#}}
```

* **参照の仕組み**:
  * 前段にあるノードの出力（`text` や `result`など）を、後続ノードの入力欄で選択して使用します。
  * 例: 「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. フローエディタ上部の「変数」をクリック
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ノード)**

   ```jsx
    プロンプト:
    {{#user_name#}}さん、こんにちは。
    
    //以降のターンでも {{#user_name#}} は保持され続ける。
   ```
4. **デジタルヒューマンでの活用例**

   **ユーザー情報の保持**

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

   **コンテキストの引き継ぎ**

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

## ベストプラクティス

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

## 参考URL

* Dify 公式ドキュメント (Variables): <https://docs.dify.ai/versions/3-0-x/en/user-guide/workflow/variables#variables>
* Dify 公式ドキュメント (Conversation Variables): <https://docs.dify.ai/versions/3-0-x/en/user-guide/workflow/variables#conversation-variables>
