【Dify実践】ブログ記事ネタ出しくんを作る|LLMを2つ連携させたら「つなぎの罠」にハマった話

alt="【Dify実践】ブログ記事ネタ出しくんを作る|LLMを2つ連携させたら「つなぎの罠」にハマった話を解説したブログ記事のアイキャッチ画像(第172話)" Difyワークフロー

横浜で清掃業を営みながら、IT未経験の状態からDifyを学んでいる49歳のYasuです。このブログでは、私が実際に手を動かしてつまずいたこと、解決できたことを、できるだけ正直に記録しています。

前回は作業日報まとめくん

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

今回はその応用編として、ちょっとメタなアプリに挑戦しました。「Difyブログ記事ネタ出しくん」です。

やることは、これまで書いてきた記事の一覧をアプリに渡すと、まだ書いていない切り口を分析して、次に書くべき記事ネタを20個提案してくれる、というもの。自分の発信を、AIに支援してもらう仕組みです。今回の新しい挑戦は、LLM(AIの頭脳)を2つ連携させたこと。ところが、この2つをつなぐところで、私はまた深い落とし穴にハマりました。単体で動かすと完璧なのに、全体で動かすと結果が空っぽになる。その原因を一つずつ切り分けていった記録を、今回もまるごとお見せします。

完成イメージ

まず、何ができるのかをお見せします。入力するのは、これまでの記事タイトルの一覧です。

#164 1on1メモを貼るだけ!部下の成長課題分析アプリ

#163 Dify×GAS連携!備品購入申請→稟議書自動生成

#162 銘柄コードを入れるだけ!株価自動取得アプリ

(…以下、これまでの記事を並べる)

これを渡すと、アプリが「どんなテーマが手薄か」を分析し、次の記事ネタを20個、それぞれ「タイトル案」と「狙い」つきで生成して、Googleスプレッドシートに1行で記録してくれます。ネタ帳として溜めていける仕組みです。

アプリの全体像(6ブロック構成)

今回の構成は6ブロック。前回の日報アプリ(4ブロック)より少し増えました。一番の違いは、LLMが2つあることです。

ブロック役割
開始これまでの記事一覧を貼る入力欄
LLM(分析)扱った話題・まだ無い切り口を整理
LLM(ネタ出し)分析を元に記事ネタを20個生成
コード実行20個を1行ずつのリストに整える
HTTPリクエストGAS経由でスプレッドシートへ記録
終了完了メッセージを表示

なぜLLMを2つに分けるのか

ここが今回の肝です。「これまでの記事を見て、いいネタを20個出して」と1つのLLMに丸投げすると、深く考えずにありきたりなネタを並べがちです。そこで、まず②で「何を扱ってきて、何がまだ無いか」をじっくり分析させ、その結果を③に渡してネタを出させる。人間でも『現状を整理してから考える』と良いアイデアが出るのと同じで、LLMも考える手順を分けると質が上がります。これを『ステップを分ける』と呼びます。

💡 実践のヒント: いきなり答えを出させず、分析→生成と工程を分けるのは、複雑なタスクでLLMの質を上げる王道テクです。1つのプロンプトに詰め込みすぎていると感じたら、工程を分けられないか考えてみましょう。

① 開始ブロック

入力フィールドを1つ作るだけです。種類は「段落(複数行)」、変数名はarticlesとしました。ここに記事タイトルを貼り付けます。

💡 実践のヒント: 全記事を入れなくても、直近10〜15本で十分いい分析になります。多すぎるとLLMの分析がかえって浅くなることもあります。

② LLM(分析担当・1人目)

記事一覧を受け取り、テーマ分類・厚い領域と手薄な領域・読者の未解決の疑問・活かしきれていない強み、の4項目を分析させます。ここではネタを出させないのがコツです。出力はJSONにせず、箇条書きのテキストのままにします。次の③が読むだけで、コード実行を通さないからです。

💡 実践のヒント: 「この段階ではネタを出さない(次工程で行うため)」と理由つきで明記すると、LLMが分析に集中します。理由つきの指示は、ただの禁止より守られやすくなります。

③ LLM(ネタ出し担当・2人目)

②の分析結果を受け取り、記事ネタを20個生成させます。出力は私の技術ルールどおりバッククォートなしの1行JSONにし、20個を区切り文字で並べます。ここで区切り文字に工夫が必要でした(後述)。

④ コード実行

③が返した『区切り文字で連結された20個』を、1個ずつのリストに切り分けて、番号つきの読みやすいテキストに整えます。

⑤ HTTPリクエスト&⑥ 終了

⑤は前回の日報アプリとほぼ同じで、GASを受付窓口にしてスプレッドシートへ記録します。⑥の終了ブロックで「20個記録しました」と完了を伝えて完成です。

区切り文字の工夫:コロン1つでは危ない

20個のネタを1つの文字列にまとめて④に渡すとき、区切り文字の選び方が地味に重要でした。最初はネタ同士を「|」、タイトルと狙いを「:」で区切ろうとしました。でも、タイトルや狙いの文章中に「:」が出てくると、④で分割したときにズレてしまいます。

そこで、タイトルと狙いの区切りを「::」(コロン2つ)にしました。文章中にまず出てこない珍しい記号にすることで、安全に切り分けられます。出力形式はこうです。

{“netas”:”タイトル1::狙い1|タイトル2::狙い2|…|タイトル20::狙い20″}

💡 実践のヒント: 区切り文字は「データの中身に絶対出てこない記号」を選ぶのが鉄則です。迷ったら、|| や :: のように記号を2つ重ねると安全性が上がります。

ここからが本番:つなぎの罠との格闘

配線を組んでテスト実行したら、エラーは出ず「成功(SUCCESS)」。でもスプレッドシートを見ると、ネタが空っぽ。『1.(狙い:)』とだけ記録され、個数は1。20個出るはずが、空のものが1個だけ。ここから原因を切り分ける旅が始まりました。

切り分け1:③のネタ出しLLMを単体テスト

まず③だけを単体でテスト実行しました。すると、ネタが20個、正しいJSON形式で完璧に出力されました。つまり③のプロンプトもコードも正常。問題はもっと手前にある、と分かりました。

💡 実践のヒント: 「全体で動かない」ときは、ブロックを1つずつ単体テストして、どこまでが正常かを切り分けましょう。犯人を絞り込めれば、解決はぐっと早くなります。

切り分け2:②の分析LLMの出力を確認

次に②(分析担当)の『最後の実行』を確認。ここも正常で、テーマ分類など4項目の分析をきちんと出していました。②も③も単体では正常。ということは、犯人は『つなぎ』か『最後のコード実行』に絞られます。

切り分け3:③の本番出力を確認

全体実行したあとの③の出力を確認すると、こちらも20個のJSONを正しく返していました。②正常、③正常、つなぎも正常。残った容疑者は、ただ一つ。最後の④コード実行です。

真犯人:④コード実行の入力変数のつなぎ間違い

④の入力変数arg1を確認したところ、ここが③(ネタ出し=LLM 2)ではなく、②(分析=LLM)につながっていました。LLMが2つあるせいで、私はarg1のつなぎ先を取り違えていたのです。④は③の20個のネタではなく、②の分析テキストを受け取っていた。だから正規表現で『netas』を探しても見つからず、空を返していたわけです。

arg1のつなぎ先を、正しく『LLM 2のtext』に直しました。すると——全体実行で、ついにスプレッドシートにネタが20個ずらりと並び、個数も20になりました。長い切り分けの旅が報われた瞬間です。

💡 実践のヒント: LLMやブロックを複数置くと、変数のつなぎ先を取り違えやすくなります。LLM・LLM 2 のように似た名前が並ぶときは、つなぐたびに『これは何番のブロックか』を指差し確認しましょう。

切り分けの教訓:単体で動くのに全体で動かない時

今回いちばんの学びは、『単体で動くのに全体で動かない』ときの考え方です。エラーが出ず成功するのに結果がおかしい——これは一番やっかいなパターンですが、ブロックを1つずつ単体テストして『どこまで正常か』を確かめれば、必ず犯人にたどり着けます。今回の切り分けの流れを表にまとめます。

確認した場所結果分かったこと
③を単体テスト20個出た③のプロンプト・コードは正常
②の最後の実行分析4項目出た②も正常
③の本番出力20個出た②③のつなぎも正常
④の入力arg1②につながっていたこれが真犯人。③へ直す

もう一つの学び:ネタの質はプロンプトで決まる

無事に20個出たのですが、最初のネタは正直『微妙』でした。清掃業の業務アプリ(在庫管理、顧客管理…)ばかりが並び、抽象的なタイトルが多かったのです。原因は、③のプロンプトで『清掃業の実務×Difyの具体例を半数以上』と縛りすぎたこと。私のブログは『清掃業の業務システム』ではなく『IT未経験者がDifyを学ぶ過程』が主役なのに、そこからズレていました。

そこで③の方針を3点直しました。業務アプリ縛りを外してDify自体の機能・つまずき・解決を主軸にする。抽象的なタイトルを禁止し、具体的な機能名・数字・失敗の状況を必ず入れる。実際に書いてきた記事タイトルをお手本として見せる。これだけで、『Dify設定5つの基本ミスと解決策』『遭遇する5つのエラーとその解決法』のような、ぐっと自分らしい具体的なネタに変わりました。

💡 実践のヒント: ネタ出しAIは『20個中3〜4個使えれば勝ち』の道具です。完璧を求めてプロンプトをいじり続けるより、刺さったネタを実際に書くほうが健全。質を上げたいなら、数を20個から10個に減らすと、水増しが減って一つ一つが濃くなります。

プロンプト全文(③ネタ出しLLM・改善後)

改善後の③のネタ出しプロンプトを掲載します。②の分析を受け取る変数は、必ずメニューから選んで挿入してください(手打ちはつなぎミスのもとです)。

# 役割

あなたは、個人ブログの企画が得意なコンテンツ編集者です。

読者の検索意図と筆者の強みを掛け合わせ、「読まれて、かつ筆者にしか

書けない」記事ネタを生み出すことを得意としています。

# 筆者の前提

– 横浜で清掃業を営む49歳、IT未経験からDifyを独学中

– 強み:清掃業の実務という現場 × ゼロから学ぶ正直な記録

– 読者層:Difyを学び始めた初心者〜中級者

# これまでの記事一覧

{{#開始.articles#}}

# 前工程の分析結果(これを最大限に活用すること)

{{#LLM.text#}} ← メニューから②のtextを選んで挿入

# ネタ出しの方針

– 「Difyの機能・つまずき・解決法」を主軸にする(業務アプリの紹介に偏らない)

– 筆者が実際に書いてきた記事のような、具体的で引きのあるタイトルにする

– 抽象的なタイトル(「〜を向上させる方法」等)は禁止

– 具体的な機能名・数字・失敗の状況のいずれかを必ずタイトルに入れる

– 「清掃業の実務」は主役にせず、筆者らしさの味付け程度にとどめる

– 分析で「手薄」とされた領域を最優先で狙う

– 初心者がつまずきやすい「お助け系」も必ず混ぜる

# 出力形式(厳守)

– 記事ネタを20個提案すること

– 下記JSONを「1行」で出力すること

– バッククォート(“`)や前置き・後書きを一切付けないこと

– 20個のネタは半角の「|」で区切ること

– 各ネタは「タイトル::狙い」の形にすること

– 値の中に波カッコ{ }やダブルクォート”を含めないこと

{“netas”:”タイトル1::狙い1|…|タイトル20::狙い20″}

コード全文(④コード実行)

import re

def main(arg1: str) -> dict:

m = re.search(r'”netas”:”(.*?)”‘, arg1)

text = m.group(1) if m else “”

netas = text.split(“|”)

lines = []

for i, n in enumerate(netas):

parts = n.split(“::”)

title = parts[0] if len(parts) > 0 else n

aim = parts[1] if len(parts) > 1 else “”

lines.append(f”{i+1}. {title}(狙い:{aim})”)

result = “\n”.join(lines)

return {“netas_text”: result, “count”: str(len(netas))}

※ ④の入力変数arg1は、必ず③(LLM 2)のtextにつなぐこと。出力変数はnetas_textとcountの2つを、コードのキーと一字一句そろえて作ること。今回はここの取り違えが最大のハマりどころでした。

alt="Difyで構築したブログ記事ネタ出しくんAIアプリのワークフロー画面とLLMの2個連携およびHTTPリクエストノードの解説画像"

テスト結果のサンプル

改善後のプロンプトで生成し、スプレッドシートに記録された20個の一部です(抜粋)。

作成日時:2026/06/10 18:00 / 個数:20

1. Dify設定5つの基本ミスとその解決策(狙い:初心者が陥りがちな設定ミスを解消)

6. 初心者必見!Difyで遭遇する5つのエラーとその解決法(狙い:初めて使う際のエラー対策)

9. Dify学習の失敗談:3つのつまずきとその教訓(狙い:筆者の学びの過程から得た教訓を共有)

18. Difyを使ったアプリ開発の初歩的な失敗と対処法(狙い:初心者が陥りやすい失敗と対策)

業務アプリの羅列だった最初の出力に比べ、『つまずき×解決』という自分のブログらしいネタが並ぶようになりました。

alt="Googleスプレッドシートの「ブログネタ出しくん」シートに自動で出力された、Difyや清掃業に関連する記事ネタ一覧の画面"

まとめ

今回の最大の学びは2つです。1つは、複数のブロックを連携させると『つなぎ』でつまずきやすいこと。特にLLMを2つ置くと変数のつなぎ先を取り違えやすく、しかもエラーは出ず『成功なのに結果が空』という分かりにくい形で現れます。こういうときは、ブロックを1つずつ単体テストして『どこまで正常か』を切り分けるのが、遠回りに見えて一番の近道でした。

もう1つは、ネタの質はプロンプト次第で大きく変わること。最初の微妙なネタも、方針を3点直し、お手本を見せ、縛りを調整するだけで、見違えるように良くなりました。AIに丸投げするのではなく、こちらが『どういう切り口がほしいか』を具体的に伝えることが、良い出力への近道です。

IT未経験から始めた私でも、LLM2つの連携という一歩進んだ構成を、つまずきながらも完成まで持っていけました。そんなに難しいアプリではないのに相変わらずエラーを出してます

まだまだですね。頑張ります!

次におすすめの記事

【Dify×WordPress】ブログにAIを住まわせよう! コピペだけで設置できる「埋め込みチャットボット」の作り方

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

私のエックスです。

次回も是非お楽しみに!

コメント

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