📊
変数システムとデータフロー
Difyワークフローを貫くデータの流れ——入力・出力・会話・環境・システム変数の種別と使い方を体系的に解説。
変数の役割
Dify のワークフローはノード間でデータを変数を通じて受け渡す。変数がなければノードは孤立した処理で終わり、フロー全体の「流れ」が生まれない。
[Start]
│ user_input = "Pythonの非同期処理を教えて"
▼
[Knowledge Retrieval]
│ context = [チャンク1, チャンク2, ...]
▼
[LLM]
│ answer = "Pythonの非同期処理は asyncio ライブラリを..."
▼
[End / Answer]
→ 各矢印が「変数によるデータの受け渡し」
変数の種別
1. 入力変数(Input Variables)
Start ノードで定義する。ユーザーや API からの入力を受け取る。
入力変数の型:
String : テキスト(ユーザーの質問等)
Number : 数値(件数・しきい値等)
Select : ドロップダウン選択肢
Paragraph: 長いテキスト
File : ファイルアップロード(PDF等)
File List: 複数ファイル
例:
user_question: String(必須)
language: Select ["ja", "en", "zh"](任意)
document: File(任意)
2. 出力変数(Output Variables)
各ノードが生成する変数。下流ノードで参照できる。
[LLM ノード] が生成する変数:
{{lllm_node.text}} : 生成テキスト
{{llm_node.usage}} : トークン使用量
{{llm_node.finish_reason}}: 終了理由
[HTTP Request ノード] が生成する変数:
{{http_node.body}} : レスポンスボディ
{{http_node.status_code}}: HTTPステータス
{{http_node.headers}} : レスポンスヘッダ
[Code ノード] が生成する変数:
return {"result": ...} で定義した変数すべて
3. 会話変数(Conversation Variables)— Chatflow 専用
会話セッション全体を通して値を保持できる変数。ページをリロードしても消えない。
型:
String, Number, Object, Array, File
使い方:
- Variable Assigner ノードで書き込む
- 任意のノードで {{conversation_variable}} として読み込む
典型的な用途:
user_name: "山田太郎"(1回取得して全ターンで使い回す)
topic: "Pythonプログラミング"(現在の話題)
order_items: [...](注文内容を蓄積)
language: "ja"(ユーザーの言語設定)
4. 環境変数(Environment Variables)
API キーなどの機密情報を安全に管理する。ハードコーディングを避けるため。
Settings → Environment Variables → Add Variable
種別:
String: テキスト
Number: 数値
Secret: 暗号化保存(ログに表示されない)←APIキーはこれ
参照方法:
{{env.MY_API_KEY}}
用途:
- 外部APIのシークレットキー
- 接続先URLなどの設定値
- 環境ごとに変えたい設定(dev/staging/prod)
5. システム変数(System Variables)
Dify が自動的に提供する変数。設定不要で使える。
{{sys.user_id}} : 現在のユーザーID
{{sys.app_id}} : アプリID
{{sys.conversation_id}} : 会話セッションID(Chatflow)
{{sys.query}} : 最新のユーザー入力(Chatflow)
{{sys.files}} : アップロードされたファイル
{{sys.dialogue_count}} : 現在の会話ターン数(Chatflow)
{{sys.workflow_run_id}} : ワークフロー実行ID(Workflow)
変数の参照方法
ドロップダウン選択(GUI)
ノードの入力欄でスラッシュ(/)を打つと変数一覧が表示される
→ 上流ノードの変数を一覧から選択して差し込む
Jinja2 テンプレート
Template ノードや LLM プロンプト内で使える。
こんにちは、{{ conversation.user_name }} さん!
今日の{{ sys.query }}についてお答えします。
{% if items | length > 0 %}
カート内の商品:
{% for item in items %}
- {{ item.name }}: {{ item.price }}円
{% endfor %}
合計: {{ items | sum(attribute='price') }}円
{% endif %}
データフローの設計パターン
パターン1: 線形パイプライン
{{start.user_query}}
→ [Knowledge Retrieval] → {{retrieval.context}}
→ [LLM] → {{llm.answer}}
→ [End]
パターン2: 並列集約
{{start.text}}
├─→ [LLM A: 要約] → {{llm_a.summary}}
├─→ [LLM B: 感情分析] → {{llm_b.sentiment}}
└─→ [LLM C: 翻訳] → {{llm_c.translation}}
↓ Variable Aggregator
[End] → {{result}}
パターン3: 会話状態管理(Chatflow)
Turn N:
{{sys.query}} = "注文したい"
→ [分類] → 注文フロー
→ [LLM] → "何をご注文しますか?"
→ [Variable Assigner: conversation.flow = "ordering"]
Turn N+1:
{{conversation.flow}} を読んで「注文フロー中」と判断
→ 適切なノードへルーティング
Variable Assigner ノード
会話変数への書き込みを担う専用ノード。
設定例:
# ユーザー名を会話変数に保存
target: conversation.user_name
value: {{llm_name_extractor.text}}
# リストに追加(append モード)
target: conversation.history
mode: append
value: {{sys.query}}
実践ユースケース
- 構造化データ抽出ワークフロー — 変数の型変換とデータ整形の実例
- 1. 🧩Dify概要・アプリ種別・アーキテクチャ
- 2. 🔀ワークフロー vs チャットフロー
- 3. ⚙️ノード一覧と制御フロー(並列・イテレーション)
- 4. 📚ナレッジベース・RAGパイプライン
- 5. 🤖モデルプロバイダー統合(OpenAI・Anthropic・OSS)
- 6. 🤖エージェント機能(自律推論・ReAct)
- 7. 🔧ツール・プラグインエコシステム
- 8. 📊変数システムとデータフロー
- 9. 🚀API・公開・デプロイオプション
- 10. 🔍可観測性・デバッグ・評価(LangSmith等)
出典: Dify公式ドキュメント https://docs.dify.ai