Difyのイテレーションで変数が文字列になる問題──原因と解決策を実体験から解説
最初は別の問題に気を取られていた
DifyでAI記事生成システムを作っていたとき、Googleシートに{{item.keyword}}という文字列がそのまま保存されている問題に、しばらく気づきませんでした。
理由は単純で、最初のテストでは別のエラーが続いていて、そちらの対応に集中していたからです。タイトルやメタディスクリプションは正しく保存されていたため、キーワード列だけがおかしいとは思っていませんでした。
テストで気づいた異変
テストを繰り返すうちに、生成される記事の内容が似通っていることが気になり始めました。
Difyのワークフローはキーワードを30個生成してイテレーションで1記事ずつ処理する設計でしたが、テスト段階では30個動かすとAPIクレジットの消費が大きいため、5個に絞ってテストしていました。
その5記事を見返したとき、「なんとなく同じような内容だな」という感覚がありました。重複チェックが機能しているはずなのに、なぜ似た記事ができるのか。
そこでGoogleシートを改めて確認すると、keyword列の中身が全行{{item.keyword}}のままでした。変数が展開されず、プレースホルダーがそのまま文字列として保存されていたのです。
問題を放置したコストは想定外のところで出た
この問題に気づくまでに、もうひとつ困ったことがありました。
途中でワークフローがおかしいと感じてテストを止めようとしたのですが、Difyのクラウド版には実行中のワークフローを途中停止する機能がありません。
結果、ワークフローは全部のキーワードを処理し終わるまで動き続けました。問題のある設定のまま無駄なAPIリクエストを出し続けたわけです。
この経験から、テスト時のキーワード数は必ず1個に設定するようにしました。問題があったときのダメージを最小限に抑えるためです。
本番:キーワード生成を「30個」
テスト:キーワード生成を「1個」
→ 確認できたら徐々に増やす原因:HTTPノードのbodyではitem変数が展開されない
問題の原因はDifyの仕様にあります。
LLMノードのプロンプト内では{{item.keyword}}と書けば正しく変数が展開されます。ところがHTTPノードのJSONボディ内では展開されません。 プレースホルダーが文字列のままPOSTされてしまいます。
解決策:イテレーション先頭にCodeノードを追加する
解決策はシンプルです。イテレーションの最初にCodeノードを追加して、item変数を展開してから後続のノードに渡します。
function main({ item_data }) {
const item = typeof item_data === "string"
? JSON.parse(item_data)
: item_data;
return {
kw: String(item.keyword || ""),
role: String(item.role || "")
};
}このCodeノードの出力変数kwとroleは、Difyの変数選択(/で呼び出せる変数)として扱われます。HTTPノードのbodyでもこの変数を参照できるようになります。
接続の変更:
変更前:iteration-start → 記事構成ノード
変更後:iteration-start → item変数展開(Codeノード)→ 記事構成ノードHTTPノードのbodyを変更:
{
"keyword": "{{#Codeノードのid.kw#}}",
"role": "{{#Codeノードのid.role#}}"
}これでGoogleシートに正しいキーワードが保存されるようになり、重複チェックが機能するようになりました。
テストの運用ルール
この問題を通じて、Difyのテスト運用に以下のルールを設けました。
キーワード数は段階的に増やす:
STEP1:キーワード1個でテスト → 動作確認
STEP2:キーワード3個でテスト → 複数処理の確認
STEP3:本番(30個)止められないことを前提に設計する:
Difyクラウド版は途中停止ができません。問題があっても最後まで動き続けます。テスト段階では処理数を最小にすることがコスト管理の基本です。
---
この問題自体は解決できました。ただ、解決してから少し考えました。イテレーション内の変数がなぜこういう仕様なのか、そもそもこの設計で本当に良かったのか。
ツールの動作を理解することと、設計の判断を持つことは別のことです。その話はbizinets.bizで書いています。
bizinets.biz
記事を読んで「もっと知りたい」と思ったあなたへ
bizinets.biz では、ビジネスの仕組みづくりを体系的に学べるコンテンツを用意しています。まずは一度、覗いてみてください。
bizinets.biz へ行く →