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

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>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.digitalhumans.jp/dify-guide/chatflow/dify-docs-manage-variables-and-context.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
