🐦

DifyのDeepresearchワークフローをざっくり理解する

に公開

はじめに

こんにちは。大宮です。
今回はDifyのDeepresearchテンプレートについて、
一見複雑そうに見えるワークフローの内容を調査してまとめてみたので紹介します。

そもそもDifyとは

Difyは、AI アプリケーションを構築するためのオープンソースプラットフォームです。
生成AIソリューションの開発を効率化し、開発者でなくともワークフローやRAGパイプラインの作成が容易に行えます。
参考:Dify公式ドキュメント

DifyのDeepresearchテンプレート


※見やすくするために全体的にブロックの位置をずらしています。
※LLMについて使用するモデルをテンプレートのものから切り替えています。

処理の概要

検索したい内容を入力するだけで、検索を繰り返し実行し、レポートを作成

  • ユーザー入力受付:最初の質問(sys.query)と検索の深さ(depth)を入力
  • 検索の初期化:GPT-4oを用いて質問を分析&検索テーマを抽出。追加検索が必要かどうかを判断
  • 反復検索:指定された深さに基づいて、複数回の反復検索を実行
    • Tavily検索エンジンで以前に抽出した検索テーマに基づいて検索を実行、検索結果を収集
    • LLMを用いてさらなる検索が必要かどうかを判断、反復処理を制御
  • 分析と要約:反復検索が終了すると(またはさらなる検索が不要と判断されると)、deepseek-reasonerモデルを用いて収集された検索結果を包括的に分析、要約

動作させてみる

入力:

Difyで作成したアプリを運用するにあたって、取得できるログについて詳細にまとめてください。

出力:

ワークフローを"読む"

1. STARTノード

役割:ユーザー入力の受付。
入力項目:

sys.query(検索したい内容)
depth(検索の深さ)

ここでユーザーは 「何について調べたいか」「何回程度深掘り検索を繰り返すか」 を指定
例)

sys.query = "AWSのコスト削減事例"
depth = 3

2. CREATE ARRAY ノード

役割:反復処理に使う配列を作成。
使い道:depth の回数分だけ空の配列やカウンターを作り、後の ITERATION ノードでループさせるための準備をする.
例:[0, 1, 2] のようなインデックス配列を生成して「3回繰り返す」きっかけを作る。

3. ITERATION ノード

一番処理の核心部分
各ループで「次の検索テーマを決める → Tavily検索 → 結果保存 → 続行判断」

3-1. LLM(最初の推論)

デフォルトモデル:GPT-4(画像例ではAmazon Nova)
役割:前回の検索結果や初期クエリから「次に検索すべきトピック」と「続けるべきか」を推論。
出力例

nextSearchTopic:"AWS Savings Plansの最新動向"
shouldContinue:true or false

3-2. EXTRACT NEXTSEARCHTOPIC / EXTRACT SHOULD CONTINUE

役割:LLMの出力から特定の値をJSONパースして抽出。
EXTRACT NEXTSEARCHTOPIC → 次に検索するテーマ文字列を取り出す。
EXTRACT SHOULD CONTINUE → 続行可否(true/false)を取り出す。
※ ENSURE_ASCII が付いているのは、文字化け防止やAPI互換性のため。

3-3. ASSIGN VARIABLES(nextSearchTopic / shouldContinue / topics)

役割:抽出した値をワークフロー変数に代入。
topics は今までの検索テーマの履歴として蓄積されることが多い。

3-4. IF/ELSE 分岐

条件:shouldContinue が true かどうかを判定
true の場合 → Tavily Search を実行
false の場合 → EMPTY ノード(何もせず次のループへ)

役割:指定された nextSearchTopic を使ってWeb検索
設定例

DAYS = 3(直近3日以内の情報を優先)
MAX_RESULTS = 5
SEARCH_DEPTH = advanced

出力:findings という変数に検索結果を格納。

※Tavilyとは?

Tavilyは、AIアプリケーション向けに最適化されたWeb検索API です。
通常の検索エンジンとは異なり、AIが使いやすい形式で検索結果を返すことに特化しています。

3-6. ASSIGN VARIABLES(findings)

Tavily の検索結果を findings 変数に保存。
次の集約ステップでまとめて使えるようにしておく。

3-7. INTERMEDIATE OUTPUT FOR / VARIABLE AGGREGATOR

INTERMEDIATE OUTPUT FOR:今回のループで得られた findings を中間出力に渡す。
VARIABLE AGGREGATOR:全ループの findings をまとめて最終的なレポート生成に使う。

4. REASONING MODEL

デフォルトモデル:DeepSeek Reasoner(なお廃止予定の記載あり)

役割
すべてのループで集めた検索結果を総合的に分析。
情報の重複や矛盾を整理し、網羅的なレポートにまとめる。

5. ANSWER ノード

役割:Reasoningモデルの結果をユーザーに返す。
出力内容:検索を繰り返して集めた全データを統合したレポート。

まとめ

START〜CREATE ARRAY
    → ユーザーの検索テーマと深さを設定。
ITERATION
    → ループの中で「次に調べること」と「続けるか」をAIが決定。
Tavily Search
    → 必要なら追加検索し、結果を蓄積。
Reasoningモデル
    → 全結果を分析・要約。
ANSWER
    → ユーザーに最終レポートを返す。

おわりに

最初にテンプレートを出した時にびっくりしたDeepresearchテンプレートでしたが、
ざっくりでも読み解くとDeepresearchについて理解が深まる有意義な体験ができました。

現状のDeepresearchをカスタマイズして、新規のノードの追加や最適化、出力先の変更などに取り組むための第一歩が踏めてよかったです。

では!

Discussion