本格運用で学んだDifyの使い所

# はじめに

本記事は、社内の生成AI活用促進に際して、Difyを活用した学びです。

## 前提

弊社、株式会社リンクアンドモチベーションでは生成AIを活用した生産性向上プロジェクトを2024年から本格的に行なっています。
ChatGPTをはじめとするサードパーティツールを活用する一方、自社内での専用ツールの開発にも取り組んでいます
しかし、社内ニーズに対応するための開発速度が課題となっていました。
この課題を解決し、開発速度を向上させるための手段としてDifyを導入しました。

## 執筆の背景

DifyはLLM関連のローコードツールの一つです。
一般的にローコードツールは、下記の価値を提供します。
- エンジニア工数削減（非エンジニアによる開発を可能にする）
- 開発速度の向上

一方で、ローコードツールは一定の制約も伴います。あらゆるツールはトレードオフが存在するので、目的に応じて適切なツールを選び、過度な期待や再発明を避けることが肝要だと考えております。

ノーコード/ローコードツール市場におけるDifyの位置付けを確認し、実際に運用した際の学びを踏まえ、Difyの可能性と限界を考えます。

# ローコードツールの市場におけるDifyの位置づけ

この章では、ノーコード/ローコードツール市場を俯瞰したときの、Difyの優位性を整理します。

## ノーコード/ローコードツールとは

ノーコードツールはプログラミングの知識がなくても、ローコードツールは最小限のプログラミングスキルで、ドラッグ＆ドロップやテンプレートを使ってアプリケーションやウェブサイトを開発できるソフトウェアプラットフォームを指します。それぞれ、開発の簡素化とスピードアップを目的としています。

### ノーコード/ローコードツールの特徴

- ビジュアルインターフェース：
    - ノーコード/ローコードツールは、直感的なビジュアルインターフェースを提供し、ユーザーがコードを記述する代わりに、グラフィカルな要素を組み合わせたり、必要に応じて一部のコードを記述してアプリケーションを作成できます。
- テンプレートとプリビルドコンポーネント：
    - 多くのツールが、よく使われる機能やデザイン要素を含んだテンプレートやプリビルドコンポーネントを提供しており、ユーザーはこれを利用して素早く開発を進められます。
- リアルタイムプレビュー：
    - 作成したアプリケーションやウェブサイトのプレビューをリアルタイムで確認でき、即座にフィードバックを得ることが可能です。
- 柔軟なカスタマイズ：
    - ローコードツールでは、コードを一部追加することで、テンプレートにない機能を実装したり、高度なカスタマイズが可能です。

## LLM関連ローコードツールの市場におけるDifyの位置づけ

DifyはLLM（Large Language Model）に特化したローコード開発環境で、「Webアプリ、チャットUI構築が容易」といった強みを持つ。

### 他のツールとの比較

競合となり得るn8n, Zapierを含む比較表を
[n8n vs Zapier](https://n8n.io/vs/zapier/)を参考に制作しました.


| 特徴                         | n8n                                                                                  | Zapier                                                                   | Dify                                                                                  |
|------------------------------|--------------------------------------------------------------------------------------|---------------------------------------------------------------------------|------------------------------------------------------------------------------------------|
| **利用形態**                 | オープンソース、自分でホスティング可能                                               | クラウドベース                                                          | クラウドベース、セルフホスティングも可能  |
| **価格モデル**               | 無料（セルフホスティング）＋クラウド版の有料プラン                                    | 有料プランベース（無料プランは制限付き）                                 | 無料プランあり（制限付き）、有料プランは$59/月から |
| **連携サービス数**           | 約150（カスタム統合も可能）                                                          | 5,000以上                                                               | 主にAIモデルやデータソースとの連携  |
| **カスタマイズ性**           | 高い（コードを書いて複雑なワークフローを構築可能）                                    | 低い（UIベースで簡単だが制限あり）                                       | 高い（ローコードでAIアプリを構築可能）  |
| **拡張性**                   | 高い（セルフホスティングにより、リソースを柔軟に拡張可能）                             | 限定的（Zapierのインフラに依存）                                         | 高い（クラウドとセルフホスティングの選択肢あり）  |
| **ターゲットユーザー**       | 技術者、エンジニア、カスタマイズ重視のユーザー                                       | ノンエンジニア、迅速な導入を求めるユーザー                               | AIアプリ開発者、エンジニア、非エンジニア  |
| **主なメリット**             | 高いカスタマイズ性、データコントロール、費用対効果が高い（セルフホスティングの場合）    | 幅広い連携サービス、高い使いやすさ                                      | Webアプリ、チャットUI構築が容易  |
| **主なデメリット**           | 初期設定に技術的な知識が必要、連携サービス数が少ない                                   | 高コスト、カスタマイズの柔軟性が低い                                    | 連携サービスの数が限られる可能性がある  |

**まとめ:**  
- n8nは、技術者やエンジニア向けに設計されており、高いカスタマイズ性とデータ管理が必要なユーザーに最適です。
- Zapierは、幅広いユーザーを想定して開発されており、技術的な知識がなくても利用できる直感的な操作性と広範なサービス連携を提供します。
- Difyは、現状エンジニア向けのツールですが、LLMの性質上テキストのみなのでデバッグが容易なので、幅広いユーザーが学習コスト低く利用可能です。また、ワークフロー構築とUI構築がシームレスに行えるため、非常に体験が良いです。


# 運用する中での学び

実際に運用する中で、Difyの学びを共有します。

## Difyが得意とするシナリオ

### 1. プロトタイプ作成

Difyを利用することで、有用なプロンプトを再利用したり、簡単な業務フローを代替したりすることが可能です。
エンジニアではないビジネスサイドのコンサルタントにも利用され、約100個のツールが誕生しました。

下記は、ツール例です。

| ツール名                 | 概要                                                                           |
|--------------------------|--------------------------------------------------------------------------------|
| メール文章作成くん       | ビジネスシーン、文章のトーン、内容を入力してメール文章を考案する                     |
| バグチェックくん         | 文章の誤字・脱字を抽出して修正する                                               |
| アンケート集計くん       | 集計したアンケートのサマリを出力する                                             |
| 統合報告書のサマリ作成    | 会社名を入力することで、統合報告書のURLを取得してサマリを作成する                   |
### 2. 複数の検索・処理ステップを伴う大きめなワークフロー

アウトプットが明確ではあるが、工程が多い業務フローをDifyで代替しました。
例えば営業資料などに使う、顧客情報のサマリーの作成がビジネスサイドに大変反響がありました。

| ツール名                 | 概要                                                                           |
|--------------------------|--------------------------------------------------------------------------------|
| 組織サマリくん       | 社名を入力することで、営業資料に活用する、組織の"これまで"と"これから"を検索し情報を要約して出力する。 |

使用例（弊社、リンクアンドモチベーションを入力した場合）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2898059/3b138685-8f26-0a78-8f54-930cddb5fb63.png)


### 3. 大量データの要約処理

大量なデータ（トークン数が10万以上）を扱う場合、Difyに優位がありました。
例えば1時間以上の文字起こしデータは、ChatGPTに直接入力できるトークン数を超えていることがあり、Difyは有用でした。

| ツール名                 | 概要                                                                           |
|--------------------------|--------------------------------------------------------------------------------|
| 議事録要約くん       | オンライン会議などの文字起こしデータを要約する。 |


### 4. ナレッジの活用（RAG）

RAG（Retrieval-Augmented Generation）を利用したチャットUIを簡単に構築できることもDifyの強みです。
社内テストの対策を行えるチャットアプリを作成したところ、反響がありました。

| ツール名                 | 概要                                                                           |
|--------------------------|--------------------------------------------------------------------------------|
| 社内テスト対策くん       | 社内テストの過去問をナレッジとして、過去問の出題と回答の出力を行う。 |



## 補足: Difyの限界

一方で、大規模な業務変革や外部連携が必要な本格運用には限界があり、より高度なワークフロー構築にはn8nやZapierなど他ツールとの組み合わせ検討が不可欠。

また運用面での課題にも直面しました。

### 直面した課題①「わざわざDify Webアプリを開こうと思わない」

DifyはWebアプリとして簡単にデプロイできる一方で、通常の業務フローと離れて利用する必要があります。
業務フローを離れてまで、使おうと思わないユーザーが多くいました。
私もプロンプトを作成することで同様の効果を得られる場合、通常の業務を離れてまでDifyツールを利用しません。

成功例のように、「業務フローを離れてまで使おう」と思えるインパクトがないと、プロトタイピングとしてのツールになってしまう恐れがありました。

### 直面した課題②「不意な人的ミスでアプリが消えた」

Difyはアプリを削除した際に、復旧手段が現状ありません。
対策としては、定期的にバックアップを取ることが挙げられますが、機能としてはサポートされていません。

**対策**
弊社では、クラウドのWebAPIを利用して全アプリのバックアップをGoogle Driveに保存するスクリプトで代用しています。
~~（Webトークンを手動で取得する必要があり、自動化には至っていません...）~~

[2025/3/17:追記] トークンを取得できるように修正しました. 


```javascript
// TODO: Community版の場合は修正.
const DIFY_ORIGIN = 'https://cloud.dify.ai';
const BASE_URL = `${DIFY_ORIGIN}/console/api`;

// TODO: メールアドレスとパスワードをスクリプトプロパティに格納しましょう.
const scriptProperties = PropertiesService.getScriptProperties();
const EMAIL = scriptProperties.getProperty('EMAIL');
const PASSWORD = scriptProperties.getProperty('PASSWORD');

const ACCESS_TOKEN = loginAndGetToken();

// TODO: Google Drive のフォルダIDを入力
const FOLDER_ID = '1mxxx-x_xxx';

/**
 * アプリ一覧を取得し、各アプリのDSLファイルをGoogle Driveに保存
 */
function backupDifyApps() {
  const apps = fetchAppList();
  if (!apps || apps.length === 0) {
    Logger.log("アプリが見つかりませんでした。");
    return;
  }
  
  const dateFolder = getOrCreateDateFolder();
  apps.forEach(app => {
    const yamlData = fetchAppExport(app.id);
    if (yamlData) {
      saveToGoogleDrive(dateFolder, app.name, yamlData);
    }
  });
}

/**
 * Dify アクセストークンを取得
 */
function loginAndGetToken() {
  // ログイン用のペイロードを作成
  var payload = {
    email: EMAIL,
    password: PASSWORD,
  };

  // ログイン用の URL を作成
  var url = BASE_URL + '/login';
  Logger.log('Login URL: ' + url);

  // POST リクエストのオプション設定
  var options = {
    method: 'post',
    contentType: 'application/json',
    payload: JSON.stringify(payload),
    muteHttpExceptions: true, // エラー時の例外発生を抑制する場合
  };

  // API リクエストを実行
  var response = UrlFetchApp.fetch(url, options);
  var result = JSON.parse(response.getContentText());

  // 結果をチェックし、access_token を返す
  if (result.result === 'success') {
    var accessToken = result.data.access_token;
    Logger.log('Access token obtained successfully');
    return accessToken;
  } else {
    Logger.log('Login API error: ' + result.result + ' - ' + url);
    throw new Error('Login failed');
  }
}


/**
 * Dify API からアプリ一覧を取得
 */
function fetchAppList() {
  const baseUrl = `${BASE_URL}/apps`;
  // 100件取得する
  const queryParams = '?page=1&limit=100';
  const url = baseUrl + queryParams; // クエリパラメータを追加
  const options = {
    method: 'get',
    headers: {
      'Authorization': `Bearer ${ACCESS_TOKEN}`
    }
  };
  
  const response = UrlFetchApp.fetch(url, options);
  const data = JSON.parse(response.getContentText());
  return data.data;
}

/**
 * Dify API から指定したアプリのエクスポートデータを取得
 */
function fetchAppExport(appId) {
  const url = `${BASE_URL}/apps/${appId}/export`;
  const options = {
    method: 'get',
    headers: {
      'Authorization': `Bearer ${ACCESS_TOKEN}`
    },
    muteHttpExceptions: true
  };

  try {
    const response = UrlFetchApp.fetch(url, options);
    const statusCode = response.getResponseCode();

    // アクセストークンが実行中に無効になることがあったのでログで分かるように追加しました。
    if (statusCode === 401) {
      const errorResponse = JSON.parse(response.getContentText());
      Logger.log(`アクセストークンが無効です: ${errorResponse.message}`);
      throw new Error("アクセストークンが期限切れです。新しいトークンを取得してください。");
    }

    const data = JSON.parse(response.getContentText());
    return data.data;
  } catch (error) {
    Logger.log(`アプリのエクスポートに失敗しました: ${error.message}`);
    return null;
  }
}

/**
 * 現在の日付フォルダ（yyyymmdd）を作成または取得
 */
function getOrCreateDateFolder() {
  const folder = DriveApp.getFolderById(FOLDER_ID);
  const date = new Date();
  const folderName = Utilities.formatDate(date, Session.getScriptTimeZone(), 'yyyyMMdd');
  
  // フォルダ内に同名のフォルダが既にあるかチェック
  const folders = folder.getFoldersByName(folderName);
  if (folders.hasNext()) {
    return folders.next();
  } else {
    // 日付フォルダが存在しない場合は作成
    return folder.createFolder(folderName);
  }
}

/**
 * Google Drive にファイルを保存（指定したフォルダ内）
 */
function saveToGoogleDrive(folder, fileName, content) {
  const blob = Utilities.newBlob(content, 'text/plain', `${fileName}.yaml`);
  folder.createFile(blob);
  Logger.log(`保存完了: ${fileName}.yaml`);
}

```

## まとめ

Difyは、迅速なプロトタイプ作成や業務効率化を支える強力なツールですが、運用上の課題や制約も存在します。業務フローとの連携やバックアップ体制の整備を進めることで、さらに多くの場面で有用性を発揮できる可能性があります。

特にプロトタイピングや大量データの処理、ナレッジベース活用において、社内での生成AI活用および業務効率化を加速させる一助として期待できることが学べました。

個人的にはまだまだ成長途上のDifyコミュニティに対して、contributeもしていきたいです。