皆さんこんにちは、横浜で清掃業を営む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):変数
daysが1と等しい ➡ 上の「日帰りレーン」へ - ELSE(それ以外):変数
daysが1より大きい ➡ 下の「宿泊レーン」へ
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代の体力で無理なく回れるか?」をチェックさせ、不要な予定を削らせます。ただし、「夜のサウナと酒場の予定は絶対に削るな」というルールも敷いておき、大人のロマンを保護します。その後、テンプレートブロックで見栄えを整えて完成です!

【まとめ】 IT未経験のおじさんでも、現場の配管作業のように「役割を分けてブロックを繋ぐ」だけで、嘘をつかない実用的なAIアプリが作れます。 一気に完璧なものを作ろうとせず、「エラーが出たらレーンを分ける」「嘘をついたら検索ツールを持たせる」と、一つ一つ現場対応していくのがDifyの醍醐味です。
結構たくさんのブロックを使いましたが
一つ一つは意外とシンプルです。errorも一回で済みましたので。
同世代の皆さん、失敗を恐れずに一緒に手を動かして突っ走りましょう!
xもやってるので良かったら見に来てください
次回も是非お楽しみに!


コメント