ガイド

Difyのイテレーション(反復処理)完全ガイド:配列入力から並列処理・エラーハンドリングまで

室谷東吾
監修者室谷東吾(@0x__tom

株式会社MYUUU 代表取締役 / 日本最大級AIコミュニティ「.AI」創設者(累計2,000名超)/ セプテーニ・ホールディングス(電通グループ)と資本業務提携 / 著書「お金を使わず、AIを働かせる『Dify』活用」(ぱる出版、3刷)/ Xフォロワー約2万人

テキトー教師
監修者テキトー教師(@tekitoo_T_cher

.AI 認定講師 / 教育×AIの専門家 / 累計300名以上にAI活用を指導 / 「テキトーに学ぶ」がモットーの実践派講師 / Xアカウント

Difyのイテレーション(反復処理)完全ガイド:配列入力から並列処理・エラーハンドリングまで

Difyのイテレーション(反復処理)とは?繰り返し処理の仕組みを徹底解説

Dify公式ドキュメントのイテレーション(反復処理)ノード解説ページ(公式サイトより)

室谷室谷
今回はDifyのイテレーションについて話しましょう。これ、.AI(ドットエーアイ)コミュニティでも「使い方がよくわからない」という声が多いんですよね。

概念は簡単なのに、いざ設定しようとするとハマる・・・
テキトー教師テキトー教師
講座でも毎回質問が出るトピックです。「配列って何ですか?」から始まって「出力をどう受け取ればいいですか?」まで、段階的につまずきポイントがあるんですよね。

今回はそこを丁寧に解説していきましょう。
室谷室谷
イテレーション、日本語だと「反復処理」ですね。Difyの公式ドキュメントでは「各要素にワークフローを適用して配列を処理する」と説明されています。

要するに、リストになっているデータに対して、同じ処理を繰り返し実行するノードです。
テキトー教師テキトー教師
プログラミングで言うと「forループ」に相当します。ただ、Difyのイテレーションはノードをつなぐだけで実装できるので、コードを一行も書かずにループ処理が組めるんですよ。

これが非エンジニアにとっての強みですよね。
室谷室谷
そうそう。たとえば10件の顧客名リストがあって、それぞれに対してLLMで返信メールのドラフトを生成したい、みたいな場合に使います。

一件ずつ手動で実行する代わりに、イテレーションに配列を渡せば10件まとめて自動処理してくれる。
テキトー教師テキトー教師
整理すると、こういう構造です。
  • 入力: 配列(Array)データ
  • 処理: 配列の各要素に対してサブワークフローを実行
  • 出力: 処理結果を集めた新しい配列
室谷室谷
この「入力が配列、出力も配列」というのが肝で、最初にここを理解していないと後でハマります。
テキトー教師テキトー教師
ですよね。受講生さんが一番ハマるのが「出力をどうやってテキストにするか」という点です。

イテレーションの出力は配列なので、そのままでは終了ノードに渡せないんですよ。後で詳しく触れましょう。

ループノードとイテレーションの違い

室谷室谷
ここで一つ重要なポイントがあって、Difyには「ループ」と「イテレーション」という似た名前のノードが両方あるんですよね。これ、混同している人が多い・・・
テキトー教師テキトー教師
これ、本当によく聞かれます(笑)。整理すると、目的が全然違うんですよ。
ノード目的特徴
イテレーション配列の各要素を処理入力は配列、出力も配列
ループ条件が満たされるまで繰り返す前の結果を次のサイクルに引き継ぐ
室谷室谷
イテレーションは「同じ処理を複数のデータに適用する」もので、ループは「品質基準を満たすまで同じデータを改善し続ける」ものですね。用途が明確に違います。
テキトー教師テキトー教師
具体例で言うと、「100件の商品説明文をそれぞれLLMで要約したい」→ イテレーション。「詩の品質が基準を超えるまで何度も改稿させたい」→ ループです。
室谷室谷
MYUUUでも両方使いますが、ビジネスで圧倒的に出番が多いのはイテレーションです。バッチ処理系の自動化はほぼイテレーションで組んでいます。

Difyイテレーションの設定方法:配列入力から出力変数まで

Difyイテレーションノードの動作フロー図解(配列入力→各要素処理→出力配列)

テキトー教師テキトー教師
では実際の設定方法に入りましょう。まず大前提として、イテレーションノードへの入力は必ず「配列(Array)」である必要があります。

ここを理解していないと設定の段階でつまずきます。
室谷室谷
配列って、要はリストですよね。["りんご", "みかん", "ぶどう"] みたいな形式。

Difyだと Array[String]Array[Object] といった型で扱います。
テキトー教師テキトー教師
そうです。この配列をどこから持ってくるかがポイントで、主に4つの方法があります。
  • パラメータ抽出ノードで文字列から配列を生成する
  • コードノード(Python/JavaScript)で配列を組み立てる
  • 知識検索の結果を配列として受け取る
  • HTTPリクエストのレスポンスから配列を取得する
室谷室谷
実務でよく使うのはコードノードとパラメータ抽出の組み合わせですね。固定フォーマットならコードノードの方が速いし、LLMで柔軟に抽出したいときはパラメータ抽出を使います。

組み込み変数:itemとindex

テキトー教師テキトー教師
イテレーションの中では、2つの組み込み変数が使えます。これが便利で。
  • items[object] - 現在処理中の配列要素(現在のアイテム)
  • index[number] - 現在のインデックス番号(0から始まる)
室谷室谷
この items を、イテレーション内のLLMノードや変数アサイナーで参照する、というのが基本パターンです。たとえばLLMのシステムプロンプトに {{items}} と書けば、配列の各要素が順番に渡されます。
テキトー教師テキトー教師
index は「何番目の処理か」を把握したいときに使います。ログ出力や進捗管理に便利ですね。

ちなみに0から始まるので、1件目が index=0、2件目が index=1 になります。
室谷室谷
ここで一つ注意点があって、イテレーション内の処理が完了したら、必ず出力変数を設定してください。出力変数を定義せずに実行するとエラーが出ます。

これ、地味にハマりポイントです。
テキトー教師テキトー教師
受講生さんもここで詰まる人が多いんですよ(笑)。イテレーション内のノードの出力を設定パネルから指定する必要があります。

順次モードと並列モード

室谷室谷
処理モードが2種類あって、これが重要です。順次モードと並列モードですね。
テキトー教師テキトー教師
整理するとこうです。
モード動作向いている場面
順次モードアイテムを1件ずつ順番に処理順序が大事な処理、ストリーミング出力を使う場合
並列モード複数アイテムを同時に処理速度重視、各アイテムが独立している処理
室谷室谷
並列モードを使うと処理が速くなりますが、API のレート制限に引っかかることがあるので注意が必要です。特にOpenAIやAnthropicのAPIを使っているときは、並列数を絞った方が安全です。
テキトー教師テキトー教師
Qiitaに実践的な記事を書いてくれている方もいて、「パラレルモード使用時においてLLM向けのAPIスロットル制限が出ることがある。その場合は最大並列処理を減らして調整してください」という点も指摘されていますよ。
室谷室谷
ストリーミング出力が必要な場合は順次モード一択です。並列モードだと回答ノードでの段階的な出力ができないので。

Difyイテレーションの使い方:5ステップでワークフローを構築

室谷室谷
実際にどう組み立てるかを見ていきましょう。基本的なイテレーションワークフローの構築手順です。
テキトー教師テキトー教師
シンプルな例として「複数のテキストを1件ずつLLMに送って処理する」ワークフローを考えます。これが最も基本的なパターンです。

Step 1. 配列を用意する(コードノードまたはパラメータ抽出)

室谷室谷
まず、イテレーションに渡す配列を作ります。シンプルに固定リストを使う場合はコードノードが便利です。
def main(text1: str, text2: str, text3: str) -> dict:
    result = [text1, text2, text3]
    return {
        "result": result,  # Array[String] として返す
    }
テキトー教師テキトー教師
重要なのが、コードノードの出力変数の型を Array[String] に設定すること。これを忘れると、イテレーションノードで入力を受け取れないんですよ。
室谷室谷
パラメータ抽出ノードを使う場合は、抽出するパラメータの型を Array[String] に設定して、LLMに「入力テキストを各要素が個別アイテムになるよう配列に変換してください」と指示します。

Step 2. イテレーションノードを追加して配列を接続

テキトー教師テキトー教師
ノードの「+」ボタンから「反復処理」を選択して追加します。入力変数に先ほどのコードノードの出力配列を接続します。
室谷室谷
設定パネルで入力変数を選択するときに、型が Array[Object]Array[String] になっているものだけが選択できます。ここでも型の確認が大事です。

Step 3. イテレーション内にLLMノードを配置

テキトー教師テキトー教師
イテレーション内部に LLM ノードを追加して、プロンプトで {{items}} を参照します。こうすると、配列の各要素が順番に LLM に渡されます。
室谷室谷
LLMノードの入力変数として items を設定して、システムプロンプトで使います。たとえばこういう感じですね。
あなたは優秀な編集者です。
以下のテキストを100文字以内に要約してください。

テキスト: {{items}}
テキトー教師テキトー教師
この {{items}} の部分が、配列の各要素に自動的に置き換わるわけです。1件目の処理では1件目のテキスト、2件目では2件目のテキストが入ります。

Step 4. 出力変数を設定する

室谷室谷
イテレーション内の処理が決まったら、出力変数を設定します。LLMノードの出力(例:text)をイテレーションの出力変数として指定します。
テキトー教師テキトー教師
ここを忘れると実行時エラーが出るので、設定パネルの「OUTPUT VARIABLES」で必ず指定してください。これ、本当によく忘れるんですよね(笑)。

Step 5. 出力配列をテキストに変換する

室谷室谷
イテレーションの出力は配列なので、終了ノードに渡す前にテキストに変換する必要があります。コードノードかテンプレートノードで処理します。
テキトー教師テキトー教師
コードノードを使う場合はこうです。
def main(sections: list) -> dict:
    return {
        "result": "\n\n".join(sections)
    }

テンプレートノードの場合はJinja2の構文が使えます。

{% for item in arg1 %}
{{ loop.index }}. {{ item }}
{% endfor %}
室谷室谷
どちらを使うかはケースバイケースですが、シンプルな連結ならコードノード、フォーマットを整えたいならテンプレートノードが使いやすいですね。

Difyイテレーションのエラーハンドリング:上限・失敗時の挙動を制御する

Difyイテレーションのエラーハンドリング設定とパラレルモード(公式サイトより)

室谷室谷
実運用で重要になるのがエラーハンドリングです。配列の途中で1件失敗したとき、全体を止めるのか、その件をスキップして続けるのかを選べるんですよね。
テキトー教師テキトー教師
設定できるエラー処理が3種類あります。
  • 終了(Terminate): エラーが発生した時点で処理全体を停止する
  • エラー時継続(Continue on Error): 失敗したアイテムをスキップして処理を続ける。失敗した箇所はnullになる
  • 失敗結果を除去(Remove Failed Results): 失敗したアイテムをスキップして、成功したものだけを出力配列に含める
室谷室谷
これ、実務では「エラー時継続」か「失敗結果を除去」を選ぶことが多いですね。100件のバッチ処理で1件失敗したからといって全部やり直すのはコストが高すぎますから。
テキトー教師テキトー教師
ビジネス用途では「失敗結果を除去」が使いやすいと思います。成功したものだけが出力されるので、後続の処理で null チェックが不要になります。
室谷室谷
公式ドキュメントの例がわかりやすくて、入力が [1, 2, 3] でアイテム2だけ失敗した場合、「エラー時継続」だと [result-1, null, result-3]、「失敗結果を除去」だと [result-1, result-3] になります。

イテレーション回数の上限

テキトー教師テキトー教師
もう一つ、イテレーション回数の上限についても確認が必要です。Difyのイテレーションには処理回数の制限があります。
室谷室谷
バージョンによりますが、1回のイテレーションで処理できる件数には上限があります。Difyの公式GitHubでも「30件を超えるとどうなるか」という議論が出ているくらい、よく引っかかるポイントです。

大量データを処理したい場合は、あらかじめ配列を分割するか、ループノードと組み合わせて複数回に分けて処理する設計が必要です。
テキトー教師テキトー教師
受講生さんから「数十件のデータを処理したら途中で止まった」という相談がよくあって、上限に引っかかっていることが多いです。大量データを扱うときは分割を前提に設計しておくのが安全ですね。

Difyイテレーション活用例:CSV・JSON・ファイルのバッチ処理

室谷室谷
実際にどんなシーンで使うか、具体的な活用パターンを見ていきましょう。
テキトー教師テキトー教師
大きく分けると、入力データの形式によってパターンが変わります。

CSVデータをイテレーションで処理する

室谷室谷
CSVのイテレーション活用で一番多いのが、顧客リストを読み込んで1件ずつ処理するパターンです。MYUUUでも実際にやっています。
テキトー教師テキトー教師
フローとしてはこうなります。HTTPリクエストノードでCSVを取得 → コードノードでCSVをパースして配列に変換 → イテレーションで各行を処理 → 結果を集約。
室谷室谷
Pythonで書くとCSVのパースはこんな感じです。
import csv
import io

def main(csv_text: str) -> dict:
    reader = csv.DictReader(io.StringIO(csv_text))
    rows = [dict(row) for row in reader]
    return {"result": rows}  # Array[Object] として返す
テキトー教師テキトー教師
この場合、出力は Array[Object] になります。イテレーション内では {{items.name}}{{items.email}} のように、オブジェクトのフィールドにアクセスできます。

JSONデータのイテレーション

室谷室谷
APIのレスポンスをイテレーションで処理するパターンも多いですね。たとえばHTTPリクエストノードで取得したJSON配列をそのままイテレーションに渡すことができます。
テキトー教師テキトー教師
HTTPリクエストのレスポンスが {"items": [...]} という形式であれば、変数として response.items を参照してイテレーションに接続できます。これが一番シンプルなパターンです。
室谷室谷
ただ、JSONの構造によってはコードノードで整形する必要が出てくることも。レスポンスが配列でない場合や、必要なフィールドだけを抽出したい場合は、コードノードを挟むのがベストプラクティスです。

複数ファイルをイテレーションで処理する

テキトー教師テキトー教師
複数ファイルのバッチ処理も、Difyのイテレーションの強みですね。ドキュメントエクストラクターと組み合わせると、複数のPDFを一括で処理できます。
室谷室谷
たとえば10本の契約書PDFから特定の情報を抽出したいとき、配列にPDFのリストを入れてイテレーションに渡し、内部でドキュメントエクストラクター → LLM(抽出プロンプト)を実行する形です。これ、人手でやったら何時間もかかる作業が数分で終わります。
テキトー教師テキトー教師
ちなみに並列モードを使うとさらに速くなりますが、ファイルサイズが大きい場合はメモリ使用量に注意が必要です。大量の大きなファイルを並列処理すると負荷が高くなるので、適切な並列数に設定しましょう。

Difyイテレーションで長文記事を自動生成する実践例

室谷室谷
公式ドキュメントにも紹介されている、もっとも実践的なユースケースが「長文記事の章立て生成」です。これ、.AIコミュニティのメンバーがやって日本経済新聞さんに取材されたやつとも関連しているんですよね。
テキトー教師テキトー教師
フローを説明しましょう。まず開始ノードでユーザーが記事のタイトルとアウトラインを入力します。

次にLLMノードで詳細な章立てを生成します。パラメータ抽出ノードで章のリストを配列化して、イテレーションで各章を1つずつLLMに書かせます。

最後にコードノードかテンプレートノードで全章を結合して完成です。
室谷室谷
この構造の何が賢いかというと、LLMのコンテキストウィンドウの制限を回避できることです。1万字以上の記事を一度に生成しようとすると品質が下がりますが、章ごとに分けて生成すれば各章で高品質なアウトプットが得られます。
テキトー教師テキトー教師
そうそう。「最大トークン数管理」という観点でイテレーションを使うのは、上級者がよくやるパターンです。

1つのLLM呼び出しでは難しいタスクでも、分割してイテレーションすることで対応できます。
室谷室谷
あと、回答ノードをイテレーション内に配置すると、章ができあがるごとにストリーミングで表示できるんですよ。これが地味に体験が良くて・・・全部完成するまで待つのではなく、書き上がった章から順番に表示されるので、ユーザーから見てレスポンスが速く感じる。
テキトー教師テキトー教師
ストリーミングが使えるのは順次モードだけなので、この場合は順次モードを選択してください。

Difyオーケストレーションとイテレーションの組み合わせ

テキトー教師テキトー教師
少し応用的な話をしましょう。Difyのオーケストレーション機能とイテレーションを組み合わせると、複雑なワークフローが組めます。
室谷室谷
「Dify オーケストレーション」というのは、複数のAIアプリやワークフローを連携させる仕組みのことですよね。エージェントオーケストレーションとも言います。
テキトー教師テキトー教師
イテレーションをオーケストレーションに組み込むパターンで面白いのが、各イテレーションのアイテムに対してサブフローを呼び出す構成です。複雑な処理を外部ワークフローに分離できるので、保守性が上がります。
室谷室谷
MYUUUでもそういう設計をしているプロジェクトがあって、メインフローはシンプルに保って、処理の詳細はサブフローに任せるパターンです。これだと処理ロジックを変えたいときにサブフローだけ修正すればいいので管理が楽になります。
テキトー教師テキトー教師
あと、ネスト(入れ子)のイテレーション、つまりイテレーションの中にイテレーションを入れることも理論上は可能ですが、複雑になりすぎるので初心者にはおすすめしません。まずはシンプルな1階層で使いこなすことを優先しましょう。
室谷室谷
ネストに関しては「dify イテレーション ネスト」で検索している人も多いようなんですが、よほど特殊なケースでない限り、フラットな設計で解決できることがほとんどです。

Difyイテレーション使い方まとめ:よくあるエラーとその対処法

テキトー教師テキトー教師
最後に、よくあるエラーとその対処法を整理しておきましょう。
室谷室谷
これは本当に役に立つ情報ですよね。コミュニティで毎週のように同じ質問が来ますから。
テキトー教師テキトー教師
まとめるとこうなります。
エラー・症状原因対処法
イテレーションが動かない入力が配列型になっていないコードノードで Array[String] に変換する
出力変数エラーイテレーション内の出力変数が未設定設定パネルのOUTPUT VARIABLESで指定する
処理が途中で止まる処理件数が上限に達した配列を分割するか、ループと組み合わせる
結果がJSON形式のまま配列をテキスト変換していないコードノードでjoin()処理を追加する
API制限エラー並列モードで同時リクエストが多すぎる並列数を下げるか、順次モードに変更する
室谷室谷
一番多いのが「入力が配列型になっていない」ですね。コードノードで配列を作るときに出力変数の型設定を忘れると、イテレーションが受け取れなくて詰まります。
テキトー教師テキトー教師
「結果がJSON形式のまま」も頻発します。イテレーションの出力をそのまま終了ノードに渡そうとすると「JSON形式のみが出力されました」と表示される。

コードノードで文字列に変換する一手間を忘れずに。
室谷室谷
あとは、ハルシネーションという観点でも一つ。Difyのイテレーション内でLLMを使う場合、1件ずつ独立した処理になるので、前の件の文脈を引き継ぎません。

これを誤解して「前の処理結果を踏まえて次の処理をさせたい」と思うとうまくいかないんですよね。その場合はループノードを使う方が適切です。

よくある質問(FAQ)

テキトー教師テキトー教師
Qとして、「イテレーションの中でコードを書かずに処理を組めますか?」というのをよく受けます。
室谷室谷
答えはYesですが、ある程度の工夫が必要です。パラメータ抽出ノードを使って配列を作り、イテレーション内にLLMノードだけ置く構成であればコードレスで組めます。

ただ、出力をテキストに変換する部分はテンプレートノードを使えばコードなしでいけます。
テキトー教師テキトー教師
「並列モードと順次モード、どちらを使えばいいですか?」という質問も多いです。
室谷室谷
基本は順次モードから始めて、速度が問題になったら並列モードを試す、という順序がいいですね。並列モードはAPI制限との兼ね合いがあるので、本番前に小さい配列でテストしてから使う方が安心です。
テキトー教師テキトー教師
「配列ではなくて、文字列をそのままイテレーションに渡せますか?」もよく聞かれます。答えはNoです。

必ず配列型のデータを渡す必要があります。文字列の場合はコードノードかパラメータ抽出で変換してから接続してください。

まとめ

室谷室谷
今回はDifyのイテレーション(反復処理)について、基本概念から実践的な使い方まで解説しました。ポイントをまとめると・・・
テキトー教師テキトー教師
こういう整理になりますね。
  • イテレーションは配列の各要素に同じ処理を適用するノード
  • 入力は必ず配列(Array)型が必要。コードノードやパラメータ抽出で準備する
  • 組み込み変数 items(現在の要素)と index(インデックス)が使える
  • 順次モードはストリーミング可能、並列モードは高速処理向け
  • 出力は配列なので、終了ノードに渡す前にコードノードかテンプレートノードでテキストに変換する
  • エラーハンドリングで「終了」「エラー時継続」「失敗結果を除去」が選べる
  • 1回の処理件数には上限があるため、大量データは分割が必要
室谷室谷
Difyのイテレーションを使いこなせると、バッチ処理系の自動化が一気に広がります。「同じ処理をたくさんのデータにやりたい」という場面では積極的に活用してみてください。
テキトー教師テキトー教師
公式ドキュメント()も充実していますし、実際に手を動かしながら試すのが一番の近道です。シンプルな「テキスト3件をLLMで処理する」ワークフローから始めてみましょう。

出典・参考資料

.AI TIMES一覧に戻る