Difyのリスト処理機能を徹底解説!初心者でもわかるデータ配列の活用方法
AIアプリケーション開発プラットフォーム「Dify」をご存知ですか?ノーコード/ローコードで生成AIアプリを作れるこのツールは、ワークフロー機能を使って複雑な処理を自動化できる優れものです。その中でも今回は「リスト処理」という機能に焦点を当てて、初心者の方にもわかりやすく解説します。
Difyのリスト処理を使えば、複数のファイルやデータを一度に扱い、それぞれに適した処理を自動的に適用することができます。例えば、ユーザーがアップロードした画像と文書を自動で分類して別々の処理を行うなど、手作業では面倒な作業を効率化できます。
1. リスト処理とは?配列データの基本
Difyのワークフローでは、データは「変数」として扱われます。その中でも「配列(Array)」と呼ばれる特殊なデータ型があります。配列は複数のデータをまとめて管理するための仕組みで、以下のような形を持っています:
例:[1.mp3, 2.png, 3.doc]
ユーザーが複数のファイル(画像、音声、文書など)をアップロードすると、それらは自動的に配列変数として保存されます。しかし、LLM(大規模言語モデル)は配列全体を一度に処理することができず、個別の値のみを読み取ることができます。
ここで「リスト処理」ノードの出番です。このノードを使うことで、配列の中から特定の条件に合致するデータだけを抽出したり、並べ替えたりすることができるのです。
- 配列(Array):複数のデータをまとめて管理するためのデータ構造
- リスト処理ノード:配列データをフィルタリング・ソート・加工するための機能
- LLM:大規模言語モデル(ChatGPTなどのAI)
2. リスト操作ノードの基本構造
Difyのリスト操作ノードは、配列データを条件に基づいて処理するための機能です。その構造は5つの主要な部分から成り立っています:
1. 入力変数
処理したい配列データを選択します。以下のデータ型のみ受け付けます:
- Array[string](文字列の配列)
- Array[number](数値の配列)
- Array[file](ファイルの配列)
2. フィルタ条件
配列の中から特定の条件に合致するデータだけを抽出します。例えば:
- type:ファイルの種類(画像、文書など)
- size:ファイルサイズ
- name:ファイル名
- extension:拡張子(.jpg、.docxなど)
3. ソート機能
フィルタリングされたデータを特定の順序で並べ替えます:
- 昇順:小さい値から大きい値へ(A→Z)
- 降順:大きい値から小さい値へ(Z→A)
4. 上位N項目
フィルタリング・ソート後の配列から、先頭からN個の要素だけを取得します(1~20の範囲で設定可能)。
5. 出力変数
処理結果が格納される変数:
- result:フィルタリング結果の配列
- first_record:結果配列の最初の要素
- last_record:結果配列の最後の要素
これらの構成要素を適切に設定することで、複雑な配列処理を簡単に実現できます。
3. リスト処理の実践例
例1:画像と文書を自動分類するワークフロー
ユーザーが複数の画像ファイルと文書ファイルをアップロードする機能を持つアプリを考えてみましょう。この場合、アップロードされたファイルを種類ごとに分類し、画像はAIに分析させ、文書はテキスト抽出して処理するというワークフローが考えられます。
(ファイル入力)
(画像のみ抽出)
(画像解析)
(ファイル入力)
(文書のみ抽出)
(テキスト処理)
画像ファイルを抽出するリスト処理ノードでは、「type」属性を「画像」に設定します。一方、文書ファイルを抽出するノードでは、「type」属性を「文書」に設定します。これにより、アップロードされたファイルが自動的に適切な処理フローに振り分けられます。
例2:最新のファイルだけを処理する
複数のファイルがアップロードされた場合に、最も新しいファイルだけを処理したいケースもあるでしょう。この場合は、ソート機能と上位N項目の設定を活用します。
2. ソート設定:「modifiedTime」(更新日時)を「降順」に設定
3. 上位N項目:1(最初の1つだけを取得)
4. 出力:first_record(結果配列の最初の要素=最新ファイル)
この設定により、常に最新のファイルだけを処理対象とすることができます。
4. フィルタリング条件の詳細
リスト処理の中でも特に重要なのが「フィルタリング条件」の設定です。ファイル配列の場合、以下のような属性でフィルタリングできます:
属性名 | 説明 | 使用例 |
---|---|---|
type | ファイルの種類 | 画像、文書、音声、映像など |
size | ファイルサイズ | 1MB以下のファイルのみ抽出 |
name | ファイル名 | 「report」を含むファイル名のみ抽出 |
url | アップロードURL | 特定のURLからアップロードされたファイル |
extension | ファイル拡張子 | .jpg、.pdf、.docxなど |
mime_type | MIMEタイプ | text/html、image/jpeg など |
transfer_method | アップロード方法 | ローカル、URL経由 |
ファイルの内容や形式を示す標準化された識別子です。例えば、HTMLファイルは「text/html」、JPEGファイルは「image/jpeg」と表現されます。この識別子を使うことで、より正確なファイル分類が可能になります。
5. リスト処理とイテレーション(反復処理)の違い
Difyには「リスト処理」と似た機能として「イテレーション(反復処理)」という機能もあります。この2つは混同されやすいですが、目的が異なります:
リスト処理
目的:配列から条件に合致する要素をフィルタリング・抽出する
用途:配列を種類や条件で分類し、異なる処理フローに渡す
出力:フィルタリングされた配列または特定の要素
イテレーション(反復処理)
目的:配列の各要素に対して同じ処理を繰り返し適用する
用途:複数のデータに同じ処理を順番に適用し、結果を積み上げる
出力:各要素の処理結果の集合
つまり、「リスト処理」は配列を分類・抽出するためのもので、「イテレーション」は配列の各要素に同じ処理を繰り返し適用するためのものです。状況に応じて適切な方を選びましょう。
ファイルの種類ごとに異なる処理をしたい場合は「リスト処理」を、同じ処理を複数のファイルに適用したい場合は「イテレーション」を使用するのが効果的です。
6. 実践ワークフロー:ポケモン進化系統自動生成の例
実際のDify活用事例として、テキスト入力をリスト化して処理する例を見てみましょう。以下は、ポケモンの名前を入力すると、その進化系統をすべて英語名で出力するワークフローの例です:
(ポケモン名入力)
(文字列→配列変換)
(各ポケモン処理)
(英語名取得)
このワークフローでは、まずコードノードで入力されたポケモン名をカンマで区切って配列に変換し、イテレーションノードでそれぞれのポケモンに対してLLMを使って英語名を取得しています。
このように、文字列データであっても配列化することで「リスト処理」や「イテレーション」の機能を活用できます。
7. よくあるつまずきポイントと解決策
配列変数が正しく認識されない
原因:データ型の不一致
解決策:変数のデータ型を確認し、必要に応じてコードノードで型変換する
フィルタリング条件が働かない
原因:属性名や条件設定の誤り
解決策:正確な属性名(type、size、nameなど)を使用しているか確認
出力変数が次のノードに渡らない
原因:出力変数の選択ミス
解決策:「result」(全結果)か「first_record」(最初の要素)かを目的に応じて選択
ループ処理ができない
原因:Difyの制約
解決策:ループ内で終了条件を判定するループはワークフロー単体では実現できない。複数のワークフローを組み合わせる
Difyのワークフローでは「ノードのループ」はできません。つまり、あるノードからフローを辿って元のノードに戻るような構造は作れません。また、一般のノードから「IF/ELSE」や「質問分類機」を使わずに2つのフローに分岐することはv0.8.0から可能になりました。
8. まとめ:リスト処理の効果的な活用法
Difyのリスト処理機能は、複数のデータや入力を効率よく処理するための強力なツールです。以下のポイントを押さえて活用しましょう:
- 適切なデータ型を使う:リスト処理は Array[string]、Array[number]、Array[file] のみ受け付けます
- 明確なフィルタリング条件を設定する:目的に応じて type、name、extension などの属性を活用
- ソートと上位N項目を組み合わせる:特に重要なデータだけを抽出するために効果的
- リスト処理とイテレーションを使い分ける:分類には「リスト処理」、繰り返し処理には「イテレーション」
- 複雑な処理は分割して考える:一度に複雑なことをせず、シンプルな処理の組み合わせで実現する
これらのテクニックを使いこなせば、Difyでより効率的で柔軟なAIアプリケーションを構築できるようになります。
リスト処理の基本を理解したら、次は「変数集約」や「テンプレート」などの機能と組み合わせて、より高度なワークフローを構築してみましょう。Difyのドキュメントも参照しながら、実際に手を動かして試してみることが上達の近道です。