ノーコードで生成AIアプリを開発!Dify(ディファイ)の使い方ガイド

最終更新日: 2025-02-26

ノーコードで高速開発を実現する
オープンソースで徹底的に安全を確保する
多彩な機能でビジネスを加速する

これらを同時に叶えるのがDify(ディファイ)です。
この記事では、複数の大規模言語モデル(LLM)に対応しながらセルフホストやワークフロー自動化を簡単に行えるDifyの使い方を紹介します。ビジネスシーンから個人利用まで、多彩なユースケースに適応するDifyを活用して、生成AIアプリ開発を大きく前進させてみてください。

また、弊社では「AI使いたいが、どのような適用領域があるのかわからない…」「AI導入の際どのサービス提供者や開発企業を組めばいいかわからない…」という事業者の皆様に、マッキンゼーやBCGで生成AIプロジェクトを経験したエキスパートが完全無料で相談に乗っております。

興味のある方はぜひ以下のリンクをご覧ください:
代表への無料相談はこちら

仲 思成
監修者: 仲 思成

AI導入.comを提供する株式会社FirstShift 代表取締役。トロント大学コンピューターサイエンス学科卒業。株式会社ANIFTYを創業後、世界初のブロックチェーンサービスを開発し、東証プライム上場企業に売却。その後、マッキンゼー・アンド・カンパニーにコンサルタントとして入社。マッキンゼー日本オフィス初の生成AIプロジェクトに従事後、株式会社FirstShiftを創業。

Difyの概要と基本機能

Difyとは何か、どのような仕組みでノーコードの生成AIアプリを作れるのかを説明します。
この章では、Difyの基本的な特徴とメリット、セルフホスト対応などの重要ポイントを整理します。

Difyの基本情報
Dify(ディファイ)はノーコードで生成AIアプリを構築できるオープンソースプラットフォームです。
LangGenius, Inc.が開発・提供しており、Dockerを使ってセルフホストできる点が大きなメリットです。

項目 内容
正式名称 Dify (Define + Modify / Do it for you)
特徴 ノーコードでAIアプリ開発、複数の主要LLMに対応、RAG機能搭載、セルフホストOK
提供形態 クラウド(SaaS)OSS版(セルフホスト)
主な活用領域 AIチャットボットワークフロー自動化AIエージェント開発など

この表ではDifyの概要をまとめています。ノーコードを前提とするため、プログラミング知識が少なくてもAIチャットボットやワークフローを構築できます。複数のLLMに対応し、安全を重視してオープンソース版をセルフホストできるため、企業用途にも向いています。


セットアップ手順

クラウド版を利用するのか、コミュニティ版をセルフホストするのかによって初期準備が異なります。
この章ではクラウド版とセルフホスト版の導入手順を紹介します。

クラウド版を使う流れ

クラウド版は公式サイトにアクセスし、アカウント登録を済ませるだけで始められます。
ノーコードでAIアプリを試したい場合、まずはSANDBOXプラン(無料)で検証すると便利です。

  1. 公式サイトでアカウント作成
    OAuthでGitHubやGoogle認証が可能です。
    登録後、Dify管理画面に移動できます。

  2. モデルプロバイダーの設定
    OpenAIのGPT-4AnthropicのClaudeなど、使いたいモデルのAPIキーを登録します。

  3. アプリの作成と公開
    「最初から作成」ボタンで新規アプリを作成し、ノーコードでカスタマイズしたら公開できます。

セルフホスト(コミュニティ版)の導入

OSS版はDocker Composeで起動し、完全にローカル(または自社クラウド)でDifyを運用できます。
オープンソースライセンスなので、機密データを外部に出さずに開発できるのがメリットです。

  1. Docker環境を用意する
    CPU2コア以上、メモリ4GB以上を推奨としています。

  2. 環境変数の設定
    .env.exampleをコピーし、必要に応じてポート番号などを編集します。
    その後docker compose up -dでコンテナ群を起動します。

  3. 初期セットアップとモデル登録
    ブラウザからhttp://localhost/installにアクセスして管理者情報を登録します。
    モデルプロバイダー画面でOpenAIやGoogle PaLMなどのAPIキーを加えて完了です。

    # Difyのソースコードの取得
    git clone https://github.com/langgenius/dify.git
    cd dify
    
    # docker ディレクトリへの移動
    cd docker
    
    # 環境変数の設定
    cp .env.example .env
    
    # Docker の起動
    docker compose up -d
    

主要機能の詳細解説

Difyにどのような機能があり、どのようにノーコードでアプリを構築できるかを示します。
この章では、アプリ設計の基本やRAG機能、ワークフロー自動化などを詳しく解説します。

複数の主要LLMに対応

OpenAI GPTAnthropic ClaudeGoogle PaLM2などを統一UIで切り替えて試せます。
セルフホスト版ならローカルLLMにもつなげるため、外部クラウドにデータを出したくない環境にも適しています。

プロンプトのオーケストレーション

ドラッグ&ドロップのノード設計でAIチャットフローを可視化できる点が特徴です。
条件分岐やループ、外部ツール連携など複雑な処理をノーコードで構築できます。

RAG機能(Retrieval-Augmented Generation)

PDFやテキスト、Notionページをナレッジとして取り込み、質問に応じて自動検索させる仕組みです。
ベクトル検索やキーワード検索を組み合わせて、適切な資料を引用しながら回答できます。

AIエージェントとワークフロー自動化

会話型ではなく、定時実行のバッチ処理や複数ステップの自動化を行うワークフローも用意されています。
ユーザー操作なしにタスクを進めたいときに便利です。


データ連携と外部API

Difyは社内外のデータや外部サービスと連携し、使い勝手を大きく広げられます。
この章ではNotionやSlack、HTTPリクエストノードなどの活用例を紹介します。

連携先の例

  • Slackボットプラグイン: Slack上でDifyのAIに質問し、そのまま回答を受け取れます。
  • Googleスプレッドシート: Chrome拡張やGASと組み合わせて、表データを一括処理できます。
  • Notionとの同期: 企業がNotionに蓄積したドキュメントを定期的に取り込み、RAGで回答精度を向上させます。

DifyのカスタムAPIを使うと、外部サービスからDifyを呼び出してチャットやワークフローを実行できます。
また、逆にDify側からHTTPリクエストノードで外部APIへアクセスすることも可能です。


実践例

Excelと連携して企業情報のリサーチをする

今回はExcelと連携して企業情報のリサーチをするワークフローを作成したいと思います。

1.エクセルを開いて以下のような表を作成します.

2.拡張機能から「Apps Scripts」を選択します。

3.Goole App Scriptに以下のコードを貼り付けます

APIキー等は任意の値に設定する必要があります。

/**
 * ==============================
 * 1. 外部からのPOSTリクエストを受け取るメイン部分
 * ==============================
 */
function doPost(e) {
  try {
    // --- 1回目パース: 全体 (function, data などを含む) ---
    var raw = e.postData.contents;  // e.g. "{\"function\":\"writeDataToSheet1\",\"data\":\"\\\"〇〇\\\"\"}"
    var onceParsed = JSON.parse(raw);

    // onceParsed が文字列なら2回目のパースを試みる
    if (typeof onceParsed === "string") {
      onceParsed = JSON.parse(onceParsed);
    }

    // function名, data(文字列想定) を取得
    var functionName = onceParsed.function;
    var dataStr = onceParsed.data;

    // dataStr が JSON文字列の可能性もあるため、パースを試みる
    try {
      dataStr = JSON.parse(dataStr);  // "〇〇" → 〇〇 など
    } catch(e2) {
      // JSONとして解釈できない場合はそのまま使う
    }

    // ---- 関数を分岐して呼び出す ----
    var result = "";
    if (functionName === "writeDataToSheet1") {
      result = writeDataToSheet1(dataStr);
    } else if (functionName === "writeDataToSheet2") {
      result = writeDataToSheet2(dataStr);
    } else if (functionName === "writeDataToSheet3") {
      result = writeDataToSheet3(dataStr);
    } else if (functionName === "writeDataToSheet4") {
      result = writeDataToSheet4(dataStr);
    } else if (functionName === "writeDataToSheet5") {
      result = writeDataToSheet5(dataStr);
    } else if (functionName === "writeDataToSheet6") {
      result = writeDataToSheet6(dataStr);
    } else {
      throw new Error("No valid functionName specified.");
    }

    // 成功時のレスポンス
    return ContentService
      .createTextOutput(
        JSON.stringify({ status: "success", result: result })
      )
      .setMimeType(ContentService.MimeType.JSON);

  } catch (error) {
    // エラー時のレスポンス
    return ContentService
      .createTextOutput(
        JSON.stringify({ status: "error", message: error.message })
      )
      .setMimeType(ContentService.MimeType.JSON);
  }
}


/**
 * ==============================
 * 2. 文字列をスプレッドシートに書き込む関数 (6つ)
 * ==============================
 * それぞれB3, B4, B5, B6, B7, B8 に書き込む
 */
function writeDataToSheet1(dataStr) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("シート1"); // 実際のシート名に合わせる
  sheet.getRange("B3").setValue(dataStr);
  return "writeDataToSheet1 complete. (B3)";
}

function writeDataToSheet2(dataStr) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("シート1");
  sheet.getRange("B4").setValue(dataStr);
  return "writeDataToSheet2 complete. (B4)";
}

function writeDataToSheet3(dataStr) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("シート1");
  sheet.getRange("B5").setValue(dataStr);
  return "writeDataToSheet3 complete. (B5)";
}

function writeDataToSheet4(dataStr) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("シート1");
  sheet.getRange("B6").setValue(dataStr);
  return "writeDataToSheet4 complete. (B6)";
}

function writeDataToSheet5(dataStr) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("シート1");
  sheet.getRange("B7").setValue(dataStr);
  return "writeDataToSheet5 complete. (B7)";
}

function writeDataToSheet6(dataStr) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("シート1");
  sheet.getRange("B8").setValue(dataStr);
  return "writeDataToSheet6 complete. (B8)";
}


/**
 * ==============================
 * 3. スプレッドシートのボタン押下で指定セルを読み込み→API呼び出し関数
 * ==============================
 */

/**
 * ボタンから呼び出すメイン関数
 * 今回は F3 の値を取得 → API呼び出しの引数として渡す
 */
function runWorkflowFromSheet() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var company = sheet.getRange("F3").getValue(); // 引数として渡したい値をF3から取得

  // API呼び出し
  var result = callWorkflowApi(company);
  Logger.log(result);  // 必要があればシート書き込みなどの処理もOK
}


/**
 * ワークフローアプリAPIを叩くサンプル関数
 * 今回は引数は1つだけ (company)
 */
function callWorkflowApi(company) {
  // エンドポイントURL (実際のURLを削除・マスク)
  var url = "https://example.com/v1/workflows/run"; // ここは実際のものに置き換えてください

  // APIキー (実際の値を削除・マスク)
  var API_KEY = "YOUR_API_KEY";

  // リクエストボディ
  var payload = {
    "inputs": {
      "company": company
    },
    "response_mode": "blocking",   // "streaming" でも可
    "user": "spreadsheet_user"
  };

  // オプション設定
  var options = {
    "method": "post",
    "headers": {
      "Authorization": "Bearer " + API_KEY,
      "Content-Type": "application/json"
    },
    "payload": JSON.stringify(payload),
    "muteHttpExceptions": true
  };

  // リクエスト送信
  var response = UrlFetchApp.fetch(url, options);
  var responseText = response.getContentText();

  // JSONパースして返す
  try {
    return JSON.parse(responseText);
  } catch (e) {
    return {
      "status": "error",
      "message": "Invalid JSON response",
      "rawResponse": responseText
    };
  }
}

4.Difyで下記のようなワークフローを作成します。

こちらからファイルをダウンロードして、DifyのDSLファイルをインポートして利用してください

5.Google App Script上でデプロイします。

Webアプリとしてデプロイしてください。

6.5で発行されたURLをDifyの最後の「HTTPリクエスト」ノードに貼り付けます.

7.ワークフローを実行すると以下のように出力されます。

料金プランとライセンス

クラウド版には無料のSANDBOXを含む複数のプランがあり、セルフホスト版はオープンソースとして公開されています。
この章では、各プランの特徴やOSSライセンスについて解説します。

クラウド版の主なプラン

プラン名 月額料金 ユーザー数 メッセージ上限 ストレージ 特徴
SANDBOX $0 1人まで 200回 5MB 試用向け、機能は一通り試せる
PROFESSIONAL $59 3人まで 5,000回 200MB 中小企業の本格利用に適する
TEAM $159 無制限 10,000回 1GB 部署規模の開発向け、サポート強化
ENTERPRISE 要問い合わせ 無制限 無制限 無制限 大企業向け、カスタム機能も相談可

この表はDify公式SaaSの料金プランをまとめています。上位プランほどメッセージ数やストレージ制限が緩和され、サポートが手厚くなります。

セルフホスト版ライセンス
コミュニティ版はApache 2.0ベースのライセンスに準拠しており、商用利用も含めて柔軟に改変・再配布ができます。
ただし機密データや高度なサポートが必要なケースではクラウド版の有料プランも検討すると安心です。


トラブルシューティングとFAQ

Dify利用中に起こりやすいエラーやFAQをまとめます。
この章ではセルフホストでのDockerエラー対処やモデルAPIのレート制限などに言及します。

代表的なエラー

  • 429エラー (Rate limit): モデル側の無料枠を使い切った場合に多発します。
  • APIキー登録エラー: APIキーのアクセス権限が不足している場合、403や400が返されることがあります。
  • Docker起動失敗: .envの設定ミスやメモリ不足が原因のケースが多いです。

まとめと今後の展望

総合的なノーコードAI開発基盤としてDifyを活用することで、多彩なLLMとの連携、RAG機能によるナレッジ活用、ワークフロー自動化など幅広いニーズに対応できます。
オープンソースとして公開されているため、機密データ保護や独自拡張がしやすく、企業DXの加速にも貢献します。
今後もコミュニティによるプラグインや連携ツールの増加が見込まれ、より柔軟なAIアプリケーション開発が可能になると考えられます。

AIサービス導入のご相談は AI導入.com へ(完全無料)

  • マッキンゼー出身の代表による専門的なアドバイス
  • 日本・アメリカの最先端AIサービスの知見を活用
  • ビジネスの競争力を高める実践的な導入支援
代表への無料相談はこちら