【完全図解】Dify Workflowで「HTTP→Template→LLM」構成を作る(SearXNG検索→要約まで)

【完全図解】Dify Workflowで「HTTP→Template→LLM」構成を作る(SearXNG検索→要約まで)

Difyで「検索→要約」のワークフローを作ろうとすると、意外と詰まりがちなのが 検索結果(JSON)をLLMにどう渡すか変数の受け渡し です。 この記事では、画像01〜14の操作手順に沿って、SearXNGの検索結果をLLMへ渡して要約するところまでを そのまま再現できる形でまとめます。

完成するノード構成

今回の最終形は以下です。

  • ユーザー入力
  • SearXNG(またはHTTP Request)
  • LLM(要約)
  • 出力
ユーザー入力 →(SearXNG / HTTP)→ Template → LLM → 出力

手順(画像01〜14に沿って作成)

1) ログイン

Difyにログインします。ローカル構築でもクラウド版でも基本の流れは同じです。

Difyログイン

2) 「最初から作成」→「ワークフロー」

「最初から作成」から進み、アプリタイプはワークフローを選択します。 検索→整形→要約のように工程がある場合、ワークフローが扱いやすいです。

Dify最初から作成
Difyワークフロー

3) 開始ノードは「ユーザー入力」

Difyユーザー入力

開始ノードはユーザー入力(元の開始ノード)を選びます。 トリガー(スケジュール/Webhook)も可能ですが、まずは手動実行で動作確認しやすいユーザー入力からが安全です。

4) ユーザー入力に検索語 stxt を追加

ユーザー入力ノードを開き、「入力フィールド」から以下を追加します。

Difyユーザー入力

ユーザー入力ノードの+ボタンをクリックすると入力フィールドが開きます

Difyユーザー入力 項目追加
  • フィールドタイプ:短文(string)
  • 変数名:stxt
  • ラベル名:検索文字(任意)
  • 必須:ON

5) SearXNGノード追加

次のノード選択 → ツールタブ → SearXNG を追加します。 SearXNGノードの設定は以下の例でOKです。

Difyノード選択 ブロックタブ
Difyノード選択 ツールタブ
SearXNGノードの設定
  • Query string:ユーザー入力 stxt
  • search type:General
  • time range:In a year(必要に応じて変更)

7) LLMノード追加

次のノード選択でLLMを追加します。使用したいモデル(例:Ollamaの gpt-oss:20b)は 事前にDifyへ登録しておく必要があります。

 LLMノード追加

LLM設定の要点

  • AIモデル:推論に使うモデルを選択
  • コンテキスト:前段の結果など“材料”を渡す入口
  • SYSTEM:アプリ全体の方針・制約(最重要)
  • USER:ユーザー入力やTemplate出力を渡す

SYSTEM

LLMの基本的な動作原則や役割を定義する
検索結果をもとに要約してください。
重要ポイントを3〜7点、箇条書きで出力してください。
不確かな点は「不確か」と明記してください。

USER

個別の質問や要求に対する「具体的な指示」です。
検索項目:{{ stxt }}
検索結果:
{{ template_output }}

※Difyでは、Web記事などにある {{ "{{stxt}}" }} のような手入力が変数として認識されないケースがあります。 Templateノード以外、UIから変数を選択して挿入するのが安全です。

ASSISTANT

SYSTEM の指示と USER の入力に基づいて生成する応答を定義します。

8) Thinkingモデルの内部推論が表示される(13.jpg)

 LLMノード設定項目

Thinking対応モデルの場合、内部推論が出力に混ざることがあります。 改善策として、LLM設定の「推論タグの分離を有効にする」をONにします。 それでも改善しない場合は、モデル(Ollama側)の出力仕様の可能性があるため、 Thinking設定を調整した派生モデル作成など運用側の対応が必要になることがあります。

 LLMノードの出力項目

9) 出力ノード追加(14.jpg)

出力ノード

最後に「出力」ノードを追加し、出力変数はLLMの生成内容(text)を選択します。 これで検索→整形→要約→表示が一通り完成です。

追記:検索クエリの加工やHTTP Requestでの高度化

ユーザー入力とSearXNGの間で検索語を加工する

今回は入力文字をそのままSearXNGに渡していますが、ユーザー入力とSearXNGの間にTemplate等を挟めば、 検索語を加工してから渡すことも可能です(例:固定キーワード付与、site指定など)。

SearXNGより細かく制御したいならHTTP Request

SearXNGノードでも検索タイプ等は選べますが、HTTP Requestを使うと engines / language / safesearch / ページングなど 検索方法をより細かく指定できます。運用で「検索結果のブレ」を抑えたい場合に有効です。

SearXNGの戻り値をそのまま渡すのではなく加工してからLLMに渡す

そのままLLMに渡すと情報量が多くなりやすいので、 Templateノードやコードノードで整形してから渡します。 最小構成なので実装していませんが実運用では必要項目だけ抽出するのもいいかもしれません。

ハマりどころ(詰まりポイント)

1) 変数の受け渡しは「UIから選択」が安全

Difyのバージョン差やノード差で、手入力の {{ "{{変数名}}" }} が認識されないことがあります。 Template以外(特にLLMのUSER欄)は、UIの変数選択から挿入するのが確実です。

2) Thinkingの内部推論が出る

「推論タグの分離」をONにして改善する場合があります。改善しない場合はモデル側仕様の可能性があります。

3) SearXNGの有効エンジン確認

有効な検索エンジンの確認は下記から行えます。Cookie参照があるため、念のためプライベートブラウズ推奨です。

http://192.168.0.15:8081/preferences

まとめ

Dify Workflowで「HTTP→Template→LLM」構成を作るポイントは、 JSONはTemplateで整形変数はUIで挿入Thinkingモデルは表示制御に注意の3点です。 この型が作れると、技術調査、IR要点抽出、レビュー補助などにも横展開できます。

関連記事