# 繰り返し処理（ループ）

## 概要

繰り返し処理（ループ）ノードは、前回の結果に依存する反復タスクを実行し、終了条件を満たすか最大繰り返し回数に達するまで継続します。

## 繰り返し処理ノードと反復処理ノードの違い

| タイプ               | 特徴                        | 用途                                 |
| ----------------- | ------------------------- | ---------------------------------- |
| **繰り返し処理（ループ）**   | 各回の処理が前回の結果に依存する。         | 前回の計算結果を必要とする処理に適している。             |
| **反復処理（イテレーション）** | 各回の処理は独立しており、前回の結果に依存しない。 | データの一括処理など、各処理を独立して実行できるタスクに適している。 |

## 繰り返し処理（ループ）ノードの設定方法

| パラメータ    | 説明                                  | 例                                                                                             |
| -------- | ----------------------------------- | --------------------------------------------------------------------------------------------- |
| ループ終了条件  | ループを終了するタイミングを決定する式                 | `x < 50`、`error_rate < 0.01`                                                                  |
| 最大繰り返し回数 | 無限ループを防ぐための繰り返し回数の上限                | 10、100、1000                                                                                   |
| ループ変数    | 反復ごとにデータが受け渡され、ループ終了後も後続ノードで利用可能です。 | 変数 `x < 50` はループごとに1ずつ増加し、ループ内では `x < 50` の値に基づいて計算を実行できます。ループ終了後、`x < 50` の最終値は後続の処理で利用可能です。 |
| ループ終了ノード | ループ内でこのノードに到達すると、ループが終了します。         | 終了条件に関係なく、最大10回ループします。                                                                        |

{% hint style="info" %}
**ループ終了ノード**と**ループ終了条件**はどちらもループの終了トリガーとして機能し、いずれかの条件が満たされるとループは早期に終了します。

終了条件が設定されていない場合、ループは**最大ループ回数**に達するまで継続して実行されます（`while (true)`と同等です）。
{% endhint %}

## サンプル1：ループノードの使い方

**要件：1〜100の乱数を生成し、乱数が50未満になったら停止します。**

**実装手順：**

1. **ループ**ノードで、**ループ終了条件**を**テンプレートノード**の出力が`done`になるように設定します。
2. **コード実行ノード**を使用して、`1〜100`の乱数を生成します。
3. **条件分岐ノード**を使用して、乱数が`50`より大きいかどうかを判断します。

* 50以上の場合、`現在の数字`を出力し、ループを継続して新しい乱数を生成します。
* 50未満の場合、`最終出力数字`を出力し、**テンプレートノード**を経由して`done`を出力し、ループを終了します。

4. 乱数が`50`未満になると、ループは自動的に停止します。

![初級ループワークフロー](https://assets-docs.dify.ai/2025/04/282013c48b46d3cc4ebf99323da10a31.png)

![ステップ](https://assets-docs.dify.ai/2025/04/9d9fb4db7093521000ac735a26f86962.png)

## サンプル2：ループ変数とループ終了ノードの使い方

**要件：ループワークフローを使用して詩を生成し、段階的に書き直し、各出力は前のループの結果に基づきます。ループは4回実行された後に自動的に停止します。**

**実装手順：**

1. **ループ**ノードで、各イテレーションでデータを渡すために使用する **ループ変数** を設定します。

* num（ループ回数）：初期値は0で、ループごとに+1されます。
* verse（詩の内容）：初期値は `I haven't started creating yet` で、後続の各ループで更新されます。

2. **条件分岐ノード**を使用して、ループ回数が`3`より大きいかどうかを判断します。

* 3 より大きい場合、**ループ終了ノード**に到達し、ループを終了します。
* 3 以下の場合、**LLMノード**に到達し、ループを継続します。

3. **LLMノード**を使用して、ユーザーの入力と過去の作品に基づいて詩の内容を出力するようにモデルに指示します。

{% hint style="info" %}
プロンプト例：

* ユーザーの入力`sys.query`をもとに、ヨーロッパの長詩を作成してください。
* 前回の作成結果`verse`を参考に、新しい詩句で進歩と革新を示してください。
* 詩句がヨーロッパ文学のスタイルと伝統に合致し、韻律と意境に注意してください。
  {% endhint %}

最初のループでは、verseは`I haven't started creating yet`です。それ以降の各ループでは、前のループの出力に基づいて詩が更新されます。モデルが生成した新しい詩は毎回verse変数を上書きし、次のループで使用されます。

4. **変数設定ノード**を使用して、各ループの後にループ内の変数を更新します。

* num変数を更新し、ループごとに+1します。
* verse変数をモデルが新しく生成した詩の内容に更新し、前のループの詩の内容を直接上書きします。

5. 詩のインスピレーションを入力すると、モデルは4つのバージョンの詩を出力します。各詩は前の詩に基づいて生成されます。

{% embed url="<https://assets-docs.dify.ai/2025/04/7ecfc04458aa38e721baaa5f6355486c.mp4>" %}
