【Dify】Web検索ツール連携で作る「旅行プラン自動生成アプリ」

DifyのWeb検索ツール(Web Search)を活用し、最新の観光情報を取得して「日帰りプラン」や「宿泊プラン」を自動生成する旅行プラン作成アプリの作り方を解説したブログ第124話のアイキャッチ画像。夕暮れの横浜みなとみらいをバックに、作業着姿の49歳男性(Yasu)が、AI Planningによる情報収集からサンプルレポート作成までの一連の自動化フローを指差しで紹介しているイメージ図。 Dify×外部連携

皆さんこんにちは、横浜で清掃業を営む49歳、ヤスです。

前回は4つのLLMを連携!成約率が爆上がりする「超ニッチB2B営業

のアプリを作りましたね。

皆さんは、AIに旅行の計画を丸投げして「北海道なのに徒歩移動させられた」「実在しない架空の海鮮居酒屋をおすすめされた」なんて経験はありませんか?AIは放っておくと、自分の記憶だけで適当な嘘(ハルシネーション)をつく新人作業員のようなものです。

今回は、Difyを使って**「最新のネット検索ツール」を持たせ、さらに「サウナと美味い酒」**のロマンを強制的にねじ込む、40代のおじさんが泣いて喜ぶ【旅行プラン丸投げAI】を作ります。全10ブロックにおよぶ超本格的な配管工事ですが、中学生でも分かるように完全解説します!


【結論】 Difyで「Google検索ブロック」と「複数のAI(LLM)」を組み合わせ、さらに「日帰りルート」と「宿泊ルート」で完全にパイプ(配管)を分けることで、バグのない最強の自動旅行代理店システムが完成します!

AIに「検索ツール」という高圧洗浄機を持たせることで、架空の店名は一掃され、実在する最高の名店だけをリストアップさせることができます。


【手順】10ブロックを繋ぐ完璧な配管図

今回の全体設計図(ブループリント)は以下の通りです。 途中で「日帰り」と「宿泊」の2つのレーンに完全に分かれるのがポイントです。

[開始] ➡ [Google検索] ➡ [LLM①/②] ➡ [ルーター] ➡ [日帰りレーン] or [宿泊レーン] ➡ [終了]

各ブロックの具体的な設定とプロンプト(指示書)を見ていきましょう。プロンプトには全行に解説コメント(//)をつけています。そのままコピペして使えます!

1. 現場の最新状況を洗い出す「GoogleSearchブロック」

いきなりAIに考えさせるのではなく、まずは「GoogleSearch」ブロックを置きます。 Query string(検索ワード)の欄に {{location}} 観光地 ご当地グルメ 最新 と設定し、対象地域(熱海など)の最新のネット記事を引っ張ってきます。

2. 【LLM①】リサーチ係 & 【LLM②】交通網係

検索結果を読み込み、素材を抽出します。ここで「実在する店名を出せ」と厳しく縛ります。

▼ LLM①(リサーチ係)のプロンプト

Markdown

// Google検索が拾ってきた最新のネット記事を読み込ませます。
以下の【目的地】と、たった今Google検索で取得した【最新の検索データ】を読み込み、プランの素材を抽出してください。

【目的地】:{{location}}
【最新の検索データ】:
{{GoogleSearchのtext}}

/* * * ここから指示書 * * */
// AIに一流の旅行雑誌編集者の役割を与えます。
# Role
あなたは世界中を旅してきた、一流のトラベルリサーチャーです。
大人の旅行者が心底満足する「絶対に行くべき観光地」と「食べるべきご当地グルメ」を抽出してください。

# Constraints
// ガイドブックにあるような定番と、穴場をバランスよく出させます。
1. 【定番と穴場の融合】:「王道の観光地」と「知る人ぞ知るディープな穴場」を必ず含めること。
// グルメの表現を具体的にして、胃袋を掴みます。
2. 【美食の解像度アップ】:単なる「海鮮丼」といった抽象的な表現は禁止。情景が浮かぶ具体的な表現を使用すること。
// 後のスケジュール作成のために、目安時間を書かせます。
3. 【滞在時間の目安】:各観光地の「滞在時間の目安(例:約2時間)」を必ず併記すること。
// ここが超重要!検索データから「実在する店」だけを抽出させます。
4. 【実在する固有名詞の厳守】:必ず上記の【最新の検索データ】に書かれている情報を基にして、実際に営業している具体的な飲食店名や施設名(固有名詞)を出力すること。AIの記憶による架空の名称のでっち上げは絶対禁止。
5. 【厳守】:挨拶不要。指定フォーマットのみ出力。

# Output Format
【目的地】:{{location}}
■絶対外せない観光地
1. [観光地名](目安:約〇時間)
・魅力:[なぜ行くべきか]
■必食のご当地グルメと名店
1. [具体的なグルメ名](おすすめ店:[実在の店名])
・特徴:[特徴]

※LLM②(交通網係)には、並列で「その土地は車必須か?バスは渋滞するか?」という移動のリアルな罠を分析させます。

3. 【ルーター】で日帰りと宿泊の配管をパカッと分ける

LLM①と②の調査が終わったら、ルーターブロックでパイプを2つに分けます。

  • IF(条件1):変数 days1 と等しい ➡ 上の「日帰りレーン」へ
  • ELSE(それ以外):変数 days1 より大きい ➡ 下の「宿泊レーン」へ

4. Dify最大の罠「幽霊変数エラー」を回避する完全分離ルート

ここで注意!Difyでは、後で2つのルートを1つのブロックで合流させようとすると、「通らなかったルートのデータがないぞ!」とパニックになり「Variable not found」というエラーが出ます。「Code Execution Block」を使って空の変数を処理するコードを書く裏技もありますが、現場で一番トラブルが起きないのは**「最後まで配管を別々にする(合流させない)」**ことです!

日帰りは【LLM③(日帰りツアコン)】➡【LLM⑥(日帰り用添削)】➡【終了】へ。 宿泊は【LLM④(宿泊ツアコン)】➡【LLM⑤(夜の番長)】➡【LLM⑥(宿泊用添削)】➡【終了】へと、完全に別の線路を引きます。

5. 【LLM⑤】夜の番長(サウナ&酒場への魔改造)

宿泊ルート最大のハイライトです。LLM④が作った真面目なスケジュールの夜の予定だけを、大人のロマンに書き換えます。ここでも直前にGoogleSearchを挟んで「サウナ 居酒屋 最新」で検索させます。

▼ LLM⑤(夜の番長)のプロンプト

Markdown

// ベースのスケジュールと、最新の検索結果を読み込ませます。
以下の【目的地】と【ベースのスケジュール】、【最新の検索データ】を読み込み、夜の予定を「最高の大人の休息」に魔改造してください。

【目的地】:{{location}}
【ベースのスケジュール】:
{{LLM④のtext}}
【最新の検索データ】:
{{GoogleSearchのtext}}

/* * * ここから指示書 * * */
// AIに「サウナと酒を愛する夜の番長」の魂を吹き込みます。
# Role
あなたは、日本全国のディープな酒場とサウナ施設を知り尽くした「夜の宴会&サウナ番長」です。
提供されたスケジュールの日中の予定は活かしつつ、夕方以降の予定に「最高のサウナ」と「美味い酒」をねじ込んでください。

# Constraints
// 実在するサウナと居酒屋を強制します。
1. 【実在する固有名詞の厳守】:必ず上記の【最新の検索データ】を基にして、実在する「評価の高いサウナ」と「美味い居酒屋」のリアルな店舗名を出力すること。でっち上げは絶対禁止。
// 昼のスケジュールは壊さないように守ります。
2. 【日中の維持】:ベースのスケジュールの「チェックイン」までの日中の行程は、一切変更せずにそのまま出力すること。
3. 【厳守】:挨拶不要。指定フォーマットのみ出力。

# Output Format
【ベースのスケジュールを夜だけ書き換えた完全版の行程表をそのまま出力】
■夜の番長からの推薦状 ♨️🍻
・サウナの魅力:[実在する店名となぜ選んだか]
・酒場の魅力:[ビールやハイボール、芋焼酎に合うアテの描写]

6. 【LLM⑥】鬼のベテラン添削者による最終確認

最後に「40代の体力で無理なく回れるか?」をチェックさせ、不要な予定を削らせます。ただし、「夜のサウナと酒場の予定は絶対に削るな」というルールも敷いておき、大人のロマンを保護します。その後、テンプレートブロックで見栄えを整えて完成です!


今 アップロードした画像一枚のみ 代替えテキストの作成をお願いします。ブログ記事のSEO対策を考えて下さい。
絶対に1枚の代替えテキストだけ、生成してください

必ず守ってください!
前にアップロードした画像の代替えテキスト絶対に書かないでください
複数の代替えテキストいらないです。

【まとめ】 IT未経験のおじさんでも、現場の配管作業のように「役割を分けてブロックを繋ぐ」だけで、嘘をつかない実用的なAIアプリが作れます。 一気に完璧なものを作ろうとせず、「エラーが出たらレーンを分ける」「嘘をついたら検索ツールを持たせる」と、一つ一つ現場対応していくのがDifyの醍醐味です。

結構たくさんのブロックを使いましたが

一つ一つは意外とシンプルです。errorも一回で済みましたので。

同世代の皆さん、失敗を恐れずに一緒に手を動かして突っ走りましょう!

xもやってるので良かったら見に来てください

私のエックス

次回も是非お楽しみに!

コメント

タイトルとURLをコピーしました