Difyのイテレーション処理は使いこなせると強力なのですが、「配列がないと動かない」、「よくわからないエラーが出て止まる」、「そもそも概念が難しい」といった壁があるかと思います。
今回は非常にシンプルなイテレーションを利用したワークフローを作成し、動作および注意点を記載します。
わかりやすさ重視のため、実用性はないです。
処理イメージ
# 入力テキスト
春
夏
秋
冬
# イテレーション処理
入力テキストの各行に「なんです。」を付記
# 出力テキスト
春なんです。
夏なんです。
秋なんです。
冬なんです。
処理フロー全体
処理のポイント
イテレーション処理
本テストのメイン要素です。
以下の仕様/前提に注意する必要があります。
- 入力として配列を渡す必要がある
- 出力は配列が渡される
- イテレーションブロックの中の処理は、配列の中身ごとに実行される
- パラレル実行が可能で処理時間の短縮が可能
- 処理結果(出力)は、シリアル実行およびパラレル実行ともに、入力された配列の順番になる
パラメータ抽出処理
イテレーション処理の実行には配列が必要になるため、パラメータ抽出処理で配列を作成します。
以下の仕様/前提に注意する必要があります。
- 入力はテキスト(string型)を渡す必要がある
- 出力は配列(string,number,object)の変数を作成する
- LLMを使用して配列化処理を行う
- 配列化の指示命令を自然言語で書く
JSON To TEXT処理(Pythonコード)
イテレーション処理の出力は配列となるため、そのままだと終了ブロックが受け付ける形になりません。
(今回の実行では JSON 形式のみが出力されましたとなります)
そのため、配列をテキスト形式に変換する必要があるのですが、こちらはDify基本機能で提供されていない内容になるため、Python処理ブロックにプログラムを書いておく必要があります。
各ブロック解説
開始
テンプレート_入力テキスト
開始ブロックの入力の代わりに、以下のテキストを入力しておきます。

パラメータ抽出
パラメータ抽出ブロックを利用して、イテレーション用の配列を作成します。
モデルは適当なもの、入力変数は配列化したいテキストを設定します。
パラメータを抽出については、出力変数とその型を設定する項目です。
本テストの入力変数は改行で整理された文字列で、各行は単一の要素となるため、パラメータのタイプはArray[String]としておきます。
指示については、入力変数の特徴などを記載しておくとよいかと思います。
具体的な抽出命令がある場合も記載してください。

配列の入力形式が固定されている場合、コード実行ブロックでpython処理を記述してしまったほうが高速&トークン節約になります。
イテレーション処理
入力は前ブロックのパラメータ抽出で作成された配列変数になります。
この配列の個数だけ処理が実施されるので、今回は4要素=4回処理が行われます。
また、出力変数を定義しないとエラー停止するので、イテレーション内の処理記述が完了したあとに出力変数を記載しておきます。
最後に、パラレルモードの設定になります。
こちらをオンにすると処理が並列実行されるので、イテレーション処理回数が多いほど処理時間の短縮が見込まれます。今回は最大並列処理をデフォルトの10回のままにしておきます。

パラレルモード使用時において、LLM向けのAPIスロットル制限(トークンリミット超過)が出ることがあります。その場合は最大並列処理を減らして調整してください。
テンプレート_なんです化
イテレーション内の処理になります。
イテレーション変数を利用して、そのあとに「なんです。」という文字列を追加するだけの内容になります。
イテレーション変数
item:イテレーションの入力配列の個要素。今回は春、夏、秋、冬が渡される
index:イテレーションの実行インデックス。今回は4回実行なので0、1、2、3が存在
コード実行
イテレーションの出力内容は配列形式となるので、配列から文字型への出力変換を行っています。
現時点ではこのようにpythonコードを記述するしか対策は無いようです。
(将来的にはイテレーション処理にて、出力形式の変換オプションがでるかもしれませんね)

def main(input):
"""
入力: 配列 (例: ["A ...", "B ..."])
出力: 各行を改行区切りで結合した文字列
"""
try:
# 入力がリストである前提で処理
if isinstance(input, list):
result_text = "\n".join(input)
else:
# 万一文字列で来た場合に備える
result_text = str(input)
return {"result": result_text}
except Exception as e:
return {"result": str(e)}
出力変数は必ずstring形式にしてください。
終了
イメージはつかめましたでしょうか?
イテレーション処理が利用できるようになると、繰り返し処理にて 数の暴力 もとい大量の入出力に対応することが可能になります。
まだ触ってみたことがないという方はぜひトライしてみてください。
参考









