🍣

DifyをシンプルなLLMラッパーとして使うという選択

に公開

はじめに

こんにちは!メドレーで QA エンジニアをしている@Daishu です。
Dify といえば「ノーコード AI 開発プラットフォーム」ですが、シンプルに LLM のラッパーとして使ってみたら便利だったので、その方法を紹介します。

背景: API キー管理とモデル切り替えの悩み

E2E テストの失敗を分析する Slack bot「MagicPod Assistant」を実装する中で、いくつかの課題に気づきました。

課題感

  • 個別に払い出した Claude API キーの管理責任
  • 新しい LLM を試すたびに API キーの発行手続きが必要
  • Token 使用量のモニタリングを実装・管理する必要

プロンプトのチューニングにも一手間かかる

プロンプトを微調整したい
コード修正 → PR 作成 → レビュー → デプロイ → 数十分後に反映

💀 Dify でイチから作り直すか?

この課題に気づいたのは、実装終盤です。弊社は、全社的に Dify での業務効率化も推奨しており、積極利用できる環境があります。Dify でも Slack bot を作成できるので、Dify でゼロから作り直すという選択も検討していました..😭

解決策: Dify を「ただのラッパー」として使う

Dify は API で呼び出せるので、ただの LLM ラッパーとして使うことで解決しました。既存の Slack bot の実装はそのままで、LLM API の呼び出し部分だけ Dify 経由にしました:

Before:直接 Claude API を呼び出し

After: Dify 経由で LLM API を呼び出す

Dify 経由で呼び出すことで各課題を解決することができました:

項目 Before (直接API呼び出し) After (Dify経由の呼び出し)
プロンプト変更 コード修正 → PR → デプロイ必要 Dify の UI で即座に反映
APIキー管理 個別に払い出し・管理が必要 Dify が一元管理
モデル切り替え 新規キー申請・実装が必要 Dify 上でプルダウン選択のみ
Token使用量 自前で実装・モニタリング Dify のダッシュボードで自動可視化

既存コードの変更を最小限にしながら、Dify のメリットを活用することができました。

実装例

エラーメッセージを LLM で分析するアプリケーションを例にして説明します。

1. 既存アプリケーション側の実装

エラーメッセージをLLMで分析するサンプルコード
// difyを呼び出す関数
async function callDify(workflowId: string, inputs: any) {
  const response = await fetch(`${process.env.DIFY_API_URL}/workflows/${workflowId}/run`, {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${process.env.DIFY_API_KEY}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      inputs,
      response_mode: 'blocking',
      user: 'app'
    })
  });
  return response.json();
}

既存コードの変更は、LLM API の呼び出し箇所とプロンプト管理部分です:

-const prompt = `以下のエラーを分析してください:
-  エラー: ${errorMessage}
-  コンテキスト: ${context}`;
-
-const response = await anthropic.messages.create({
-  model: "claude-3-5-sonnet-20241022",
-  messages: [{ role: "user", content: prompt }],
-  max_tokens: 1024
-});
+const response = await callDify('your-workflow-id', {
+  error_message: errorMessage,
+  context: context
+});

2. Dify 側のワークフロー設定

RAG[1] やエージェントは使わず、LLM ノードを配置するだけのシンプルな Dify ワークフローです。


シンプルな3ノード構成(Start → LLM → End)

具体的な設定手順

  1. 入力変数の設定 (Startノード)

    • error_message: エラー内容を受け取る
    • context: 実行コンテキストを受け取る
  2. LLM ノードの設定

    • モデル: 任意の LLM
    • プロンプト: 変数を {{error_message}} のように埋め込み
  3. API キーの発行

    • Publish 後、「API Access」からキーを取得
    • このキーを環境変数 DIFY_API_KEY として使用

導入メリット

1. API キー管理から解放

個別に払い出してもらった Claude の API キーを破棄し、Dify の API キー 1 つで運用可能に。モデル変更に必要な社内手続きも不要になりました。

2. プロンプト変更が簡単に

デプロイ不要でプロンプトの調整が可能です。LLM が切り離されて独立しているので、ツール動作中でも即時反映できます:

- 想定していた運用:コード修正 → PR → レビュー → デプロイ (数十分)
- 実際の運用   :Dify のUI → テキスト編集 → 保存で即時反映 (10秒)

3. Token使用量の可視化

Dify のダッシュボードで自動的にモニタリング。実装不要で使用量を追跡できます。

4. LLMの付け替え、使い分けが簡単

分析タスクごとに最適な LLM を簡単に使い分けできる点もメリットです。

LLM を タスクごとに使い分ける例

このように LLM で処理を行うタスクごとに最適なモデルを選択できます。また、切り替えは Dify の UI でプルダウンで選択するのみです。実装側への影響を気にせず、いつでも変更できます。気軽に新しい LLM を試したり、戻したりできます。


実際のMagicPod Assistantワークフロー(Pythonアダプタ付き)

5. その他のメリット

下記のようなメリットもありました。

メリット 詳細
実行履歴の可視化 誰が実行したか、入出力の内容、エラー詳細が全て記録される
A/Bテストが簡単 ワークフロー複製して異なるプロンプトを並行運用
コストの一元管理 複数LLMの利用料金をDifyのダッシュボードで統一管理

注意点

社内ツールには適していますが、本番プロダクトでの運用は難しいと思われます。

技術的な制約

  • レスポンス速度:プロキシ経由で遅延が発生 (体感で数百 ms ほど)
  • 初期設定:複雑な JSON を扱う場合、Python アダプタでの整形などの工夫が必要
  • デバッグ:確認箇所は増えてハマりやすい。プロンプトの変更履歴が追えない

向いている用途

  • 社内向けのツール・システム
  • 実験的なプロトタイプ
  • プロンプトを頻繁に調整したいプロジェクト

向いていない用途

  • ユーザー向けの本番プロダクト
  • レスポンス速度がクリティカルなサービス
  • 変更履歴の厳密な管理が必要なシステム

まとめ

API キー管理、社内手続き、Token 使用量のモニタリングといった課題が、Dify をラッパーとして使うことで全て解決しました。また、プロンプト変更は 10 秒で完了、モデル切り替えも容易です。

同じような課題を抱えている方の参考になれば幸いです。既存コードはそのままで、LLM 呼び出し部分だけ Dify 経由にすれば、最小限の変更で済むはずです。


メドレーでは生成 AI 利用のガイドラインが社内で展開されており、各部門の業務ではそのガイドラインに沿って利用をしています。

脚注
  1. Retrieval-Augmented Generation (検索拡張生成) 。事前に登録したドキュメントから関連情報を検索し、その情報を基に LLM が回答を生成する仕組み ↩︎

株式会社メドレー

Discussion