はじめに
Difyでワークフローを組み始めると、かなり高い確率で一度は迷うのが Iteration と Loop の使い分けです。機能は似ているように思いますが、実際には「配列を順番にさばく仕組み」と「前回の結果を引き継ぎながら繰り返す仕組み」で、設計思想がかなり違います。この記事では、実装方法 と 違い を整理します。
この記事でわかること
- IterationとLoopの違い
- それぞれの典型的な実装パターン
- どんなユースケースで使い分けるべきか
この記事は、DifyのVersion1.13.2時点での内容です。
バージョン違いによっては内容が適していないこともありますのでご留意ください。
先に結論:配列を回すなら Iteration、状態を育てながら回すなら Loop
Dify公式Docsの説明を一言で要約すると、Iterationは「各要素を独立して処理する」ためのノード、Loopは「前回の結果を次回に引き継ぎながら処理を進める」ためのノードです。つまり、複数ファイルなどを一括処理したいならIteration、要約の改善・品質が閾値に達するまで再実行・知識ギャップを埋めながら調査を進めるような処理ならLoopが向いています。
Iteration と Loop の違いを表で見る
| 観点 | Iteration | Loop |
|---|---|---|
| 基本思想 | 配列の各要素に同じ処理を適用する | 前回の結果を引き継ぎながら繰り返す |
| 入力の前提 | Array型 が必要 | ループ変数を定義して開始 |
| 各サイクルの独立性 | 高い。各要素は基本的に独立 | 低い。前回結果に依存 |
| 並列実行 | 可能 | 基本は逐次的な状態更新 |
| 主な用途 | 一括変換、バッチ翻訳、配列処理 | 改善ループ、再試行、探索、再帰的処理 |
| 出力の形 | 配列として集約される | ループ変数の最終状態として残る |
| エラー時 | 停止 / 継続 / 異常除外を選べる | 子ノード失敗時は即停止 |
この差分は公式Docsでもかなり明確で、Loopは「progressive workflow(段階的に進化するワークフロー)」、Iterationは「batch processing(バッチ処理)」として説明されています。さらにエラーハンドリングも異なり、Iterationは失敗アイテムの扱いを選べますが、Loopは子ノード失敗時に全体停止です。
Iteration の実装方法
Iterationは、「配列を受け取り、各要素ごとにサブワークフローを実行し、その結果を再び配列として返す」 のが基本形です。
実装の基本ステップ
- イテレーションノードを配置する
- イテレーションノード内に処理を実装する
- イテレーションノードの設定として、
- 入力にArray型の変数を設定する
- 出力に処理結果を設定する
- 必要に応じてパラレルモードをオンにする
- イテレーション処理中のエラー対応として、エラー応答方式を設定する
- イテレーション処理結果を次のノードで受け取る
Iteration内で使える変数
Iterationの内部では、各サイクルごとに少なくとも以下の変数が使えます。
-
items[object]: 現在処理中の要素 -
index[number]: 現在のインデックス(0始まり)
このため、LLMノードに {{items.xxx}} を渡して要素ごとの説明文を生成したり、{{index}} を使って章番号を振ったりできます。
処理モード:順次 or 並列
Iterationは パラレルモードのオンオフが選べます。並列実行で同時処理できるので、各要素が独立している処理では処理時間を削減できるためかなり有効です。
エラーハンドリング
Iterationは、子ノードが失敗したときの扱いを選べるのが強いです。
-
終了: 失敗した時点で全体停止 -
エラー時に続行: 失敗要素をnullにして継続 -
アブノーマルアウトプットの削除: 失敗要素を出力配列から除外
「100件中3件だけ失敗しても、残り97件は処理したい」というバッチ用途だと、この違いがかなり効きます。
Iterationの実践例
複数ファイルからテキストを抽出してLLMに処理させるフローの実践例
- 入力フィールドでファイルリストの入力を作成する
- イテレーションノードの入力に、インプットのファイルリストを設定する
- イテレーションノード内に、テキスト抽出ノードを配置し、テキスト抽出ノードの入力変数にイテレーションのitemを設定する
- イテレーションノードの出力に、テキスト抽出ノードの結果を設定する
- イテレーションの結果をLLMノードで処理する
Loop の実装方法
Loopは、「前回の結果を持ち越して、条件を満たすまで回し続ける」 ノードです。Iterationが「配列の各要素を処理する箱」だとすると、Loopは「状態を持つwhileループ」に近い感覚です。
実装の基本ステップ
- ループノードを配置する
- ループノードの設定として、
- ループ変数を設定する
- ループ終了条件を設定する
- 最大ループ数を設定する
- ループノード内に処理を実装する
- ループ処理結果を次のノードで受け取る
Loopを組むときに最初にやることは、ループ変数の定義です。これらの変数は各反復で更新され、ループ完了後にも参照できます。たとえば 草案を毎回改善したり、カウンターを増やしたり、品質スコアを最新値で持ち回したりできます。
ループ停止条件の考え方
Loopには主に3つの停止手段があります。
- ループ終了条件 を満たす
- 最大ループ回数 に達する
- 「ループ完了」ノード に到達する
この3段構えがあるので、「品質スコアが0.9を超えたら終了」「ただし無限ループ防止のため最大5回まで」「例外的にこの分岐に入ったら即終了」といった制御ができます。
Loop内でよく使う構成
Loopの中では、以下のような流れが典型です。
If-Else で現在状態を判定
↓
LLM で改善案を作る / Toolで追加情報を取る
↓
Variable更新
↓
必要なら Exit Loop
Loopの実践例
LLMに納得がいくまで文章校正させるフローの実践例
- 入力フィールドで校正元テキストを入力するためのテキスト入力フィールド(段落)を作成する

※ワークフローで作成しているため、テキスト入力フィールドを作成していますが、チャットフローであればチャット入力欄を利用しても問題ありません。 - ループ変数に校正元テキストを格納する変数を設定する
- ループ終了条件を設定する
※今回はLLMが校正終了と回答した場合にループを抜ける仕様として設定 - ループ回数の上限を設定する(最大ループ回数)
- ループ内にLLMノードを作成する
- LLMの出力を変数に格納するため、変数代入ノードを作成する
校正した文章を次のループのインプットにするため、ループ変数にLLMの出力を格納する
- ループの結果を終了ノードで出力する
補足
実践例ではシンプルな作りにするため、校正結果や終了判定を全て同じループ変数で受け持たせていますが、結果格納用のループ変数を別途用意して、校正ステップを記録させる方法や、ループ内で条件分岐ノードを配置して、別のLLMに終了判定をさせるといった実装も可能です。
【結果格納用のループ変数を設定する例】

【ループ変数にループ毎の結果を格納する例】

【ループ内でループ終了判定を行う例】

Loopの注意点:エラー時は即停止
Loopは便利ですが、エラーハンドリングはIterationよりシビアです。Loop内で子ノードが失敗すると、その時点でLoop全体が停止 します。なので、外部APIを叩く処理や不安定なTool呼び出しをLoop内に入れるなら、事前のガードや失敗しにくい設計がかなり重要です。
補足:Loop内の子ノード毎に例外処理を実装している場合は、子ノードの失敗とはならないため、Loopは継続します。

どう使い分けるべきか
Iteration を選ぶ場面
- 配列の各要素に同じ処理をかけたい
- 各要素は独立している
- 並列で速く回したい
- 一部失敗しても継続したい
Loop を選ぶ場面
- 前回の結果を次回に引き継ぎたい
- 条件を満たすまで改善・探索・再試行したい
- 「今の状態」を持ち回す必要がある
- 処理の回数が事前に固定されていない
まとめ
DifyのIterationとLoopは、どちらも「繰り返す」ためのノードですが、役割はかなり違います。Iterationは配列処理のための反復、Loopは状態遷移を伴う反復です。一括処理ならIteration、改善・探索・再試行ならLoop と覚えておくと、設計判断が早くなります。