🔖

技術ブログ:Difyにおける各種制限・エラーまとめ

に公開

Difyにおける各種制限・エラーまとめ:実例と対処法、よくある落とし穴を総整理

はじめに

ノーコードで高度なAIチャットアプリが作れるDify。
API連携・外部ファイル処理・記憶機能など、非エンジニアでも使いやすい設計が魅力です。

しかし、Difyには未公開・未文書化の制限や仕様が多数存在し、それらを理解せずに開発を進めると、思わぬ形で詰まることが多々あります。

本記事では、Difyを実務で使い込んできた筆者の経験をもとに、代表的な制限・エラー・落とし穴とその回避法を体系的にまとめます。


1. Run failed: Reached maximum retries (0) for URL

🔍 原因

  • APIノード / Scrapeノードがタイムアウト
  • URLの存在しない・スペルミス
  • Cloudflare等のアクセス制限
  • HTTPS証明書エラー

✅ 解決策

  • Retry times オプションを 1回以上 に設定
  • IF/ELSEノードstatus_code による分岐を追加
  • Pythonノードで try-except + バックオフ処理
  • User-Agent を偽装して回避(Scrape時など)

2. 配列数制限:Maximum number of arrays (30)

🕳 よくある落とし穴

  • Firecrawlで40件のURLを取得 → エラー
  • Pythonノードから30件以上のJSONリスト返却 → 失敗
  • GPTノード → JSON配列 → 次のノードで詰まる

✅ 対処法

  • .[:30] でリストをスライス
  • イテレーション処理で小分け処理に設計
  • 一時変数を array1, array2 に分割して保存

3. メモリ制限:Memory overflow / Too many characters

🔢 目安

  • 約10,000〜12,000文字でMemory上限に達する傾向

🕳 よくあるパターン

  • 長いPDFをチャンクせずMemoryにそのまま保存
  • ユーザーの入力履歴がMemoryに蓄積 → 膨張

✅ 解決策

  • GPTノードで要約してから保存する構成に変更
  • チャンク分割 + インデックス付き処理に設計変更
  • sys.memory_xxx = "" のように明示的にクリア

4. 変数参照エラー:Invalid variable reference

🔍 代表的な原因

  • 未定義変数の呼び出し
  • Pythonノードで None を返している
  • 前段で分岐未通過 → 変数が未定義のまま

✅ 対処法

  • value or "" のように空文字でフォールバック
  • テンプレート内の変数名に typo がないか確認
  • IF/ELSEすべての分岐で必ず定義を通す

5. LLM出力における、JSONエラー:Invalid JSON / Failed to parse

❌ よくある失敗例

[
  "Title: ABC",
  "Content: DEF"
]

→ LLMにJSONを出力させると良く起きる。
 一見JSON風だが、配列の中身がJSONでないためエラー

✅ 解決策

type: text でまず出力の形式を確認

Pythonノードで json.dumps() を使用する

明示的にテンプレートで構造を指定:

type: json
format: |
  {
    "title": "{{title}}",
    "description": "{{description}}"
  }

6. Token使用量に関する注意点

🔢 目安

Difyでは、各LLMノードの処理において、入力と出力の両方でトークンが消費されます。特に長文の処理や、多数のやり取りが発生するアプリケーションでは、予期せぬトークン消費による課金やパフォーマンスの問題が発生する可能性があります。

🕳 よくあるパターン

  • Contextの肥大化: ユーザーとの会話履歴が長くなるにつれて、Memoryに保存されるコンテキストが増大し、それに伴いLLMへの入力トークンが増加します。
  • Retrievalノードでの多数のチャンク取得: RAG(Retrieval Augmented Generation)構成において、関連性の高い情報として多数のドキュメントチャンクを取得すると、それら全てがLLMへの入力に利用され、トークン消費が増えます。
  • 複雑なプロンプト: System PromptやFunction Callの定義が複雑になるほど、ベースとなるトークン消費が増加します。

✅ 解決策

Memoryの最適化:

  • 要約: 長い会話履歴を定期的に要約し、要約した内容のみをMemoryに保存することで、コンテキストの肥大化を防ぎます。
  • 特定の情報のみを保持: 全ての会話を記憶するのではなく、特定のキーワードや直前のターンのみをMemoryに保存するロジックを組み込むことで、必要な情報に絞り込みます。

Retrieval戦略の見直し:

  • チャンクサイズの調整: ドキュメントのチャンクサイズを適切に設定し、不要な情報の取得を避けます。
  • 取得チャンク数の制限: Retrievalノードで取得するチャンクの数を明示的に制限します。
  • 関連性スコアの活用: 取得したチャンクを関連性スコアに基づいてフィルタリングし、本当に必要な情報のみをLLMに渡します。
  • プロンプトの簡素化:
    可能な限り簡潔で明確なプロンプトを作成し、冗長な表現を避けます。
    Function Callの定義も、必要最低限の情報に絞ります。

🧪 よくある構成パターンと注意点

PDF翻訳ループ

✅ 注意点:

  • chunk_index の初期化忘れ
  • Memoryの再帰が重くなりすぎてフリーズ

🧰 よく使うYAMLテンプレート例

● テキストとファイルを同時処理

input:
  sys.query: 質問文
  sys.files: PDF等のファイル

if: |
  {{sys.files}} != null

● 出力をJSON形式に固定

type: json
format: |
  {
    "項目": "{{output1}}",
    "詳細": "{{output2}}"
  }

おわりに

Difyは非常に強力なツールですが、暗黙の制限を知らずに構築を進めると「ハマりポイント」が随所にあります。この記事で紹介した落とし穴や制限を参考に、よりスムーズなDify開発に役立てていただければ幸いです。

UPGRADE tech blog

Discussion