Difyの使い方 ~Difyで何ができる？~

# Difyとは
[公式サイト](https://dify.ai/jp)では、オープンソースのAIアプリ開発プラットフォームと紹介されています。
AIアプリといっても様々なものが考えられますが、
- チャットボット
- AIエージェント
- （バッチ処理的な）ワークフロー
    - Aの処理が終わればBを実行、Bの処理が終わればCを実行…というようなもの

がDifyが対象としている主なアプリだと思います。
そして、これらのアプリをいわゆるノーコードで直感的に作ることができます。
ただ、[GitHub](https://github.com/langgenius/dify)のソースコードを見れば分かるように開発スピードが非常に早く、対象となるアプリや用途は今後広がっていくはずです。

Difyの一番すごいところは、ソースコードがオープンソースとして公開されている点でしょう[^1]。そのため、AWSなど自分たちの環境にホスティングすることができ、その場合はデータをSaaSの提供元に送信する必要がありません。
さらに、オープンソースのLLM（生成AI）を使えば、自分たちの環境内で処理を完結させることができます。LLMの利用に際してはデータが外部に出ることが懸念点として挙げられがちですが、Difyはそのような懸念点を払拭してくれるサービスでもあります。

なお、Difyの読み方は「ディファイ」で、Define（定義する）+ Modify（改良する）の組み合わせで「Do it for you（あなたのためにやる）」という意味も込められているようです。

# Difyの活用事例
2025年1月時点でDifyの様々な活用事例が公開されています。

企業の活用事例としては、食べログと令和トラベルの事例があります。
特に、食べログは Dify Community(JP) の立ち上げにも参画するなど、Difyの活用だけでなく国内でのコミュニティ作りにも関わっているようです。

- 食べログ
    - https://tech-blog.tabelog.com/entry/dify-meetup-tokyo-no1-report
    - https://tech-blog.tabelog.com/entry/advent-calendar-20241207
- 令和トラベル
    - https://engineering.reiwatravel.co.jp/blog/Advent-Calendar-20241225

公共機関としては、東京都もDifyの活用を検討しているようです。
2024年12月に開催された「東京都AI戦略会議」の発表資料の中にDifyの名前があります。
さらに、AI ModelsとしてGPT4o、Gemini、Claudeと並んでLlama3.1(Local LLM)の記載もあるので、機密性の高い情報を扱う際はローカルLLMを利用することを想定しているのでしょう。

https://www.itmedia.co.jp/aiplus/articles/2412/06/news102.html

# Difyの使い方
Difyの使い方の例としてワークフローを取り上げます。「終了」ノードの有無が異なるだけで、ブロックを繋げていくのはチャットボットも同じです。

今、Zoomの文字起こしデータから議事録を作成するとします。
これが正解というものはありませんが、例えば下図のようなワークフローが考えられます。

![スクリーンショット 2025-01-23 15.08.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127582/0d9122bb-960c-2928-9e69-6ea7cb5d4589.png)

まず、文字起こしデータのファイルのアップロードとアジェンダをユーザに入力させるようにします（「開始」）。
次に、ファイルからテキストを抽出し（「文字起こしテキスト抽出」）、さらにアジェンダ数を判定します（「アジェンダ数判定器」）。アジェンダ数判定にLLMを利用できることがポイントの一つになります。
そして、アジェンダ数によって後続の処理を分岐します。今回は例なのでクラス数は2つ（アジェンダが1件、アジェンダが2件）としていますが、3つ以上に増やすこともできます。
分岐後は、文字起こしテキストを前処理にかけ（「LLM（前処理／1件）」）、前処理したテキストをもとに議事録を作成します（「LLM（議事録作成／1件）」）。なお、プロンプトの設定方法は下図を参考にしてください。手前の処理の結果をプロンプト内に組み込むことができます。
最後に、作成した議事録を表示するという流れになります（「終了1件」）。

![スクリーンショット 2025-01-23 16.54.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127582/b90c7bb9-3aa5-42b8-3440-6a7bf7ad2284.png)

Zoomの文字起こしテキストには漢字の変換ミスやノイズとなるテキスト（例えば、「聞こえていますか」「ミュートになっています」）が含まれることが多いので、前処理を明示的に入れています。
さらに、アジェンダが1件の場合と複数件の場合では出力が変わるという想定のもと、アジェンダ数によって処理を分岐しています。
もちろんこれらの処理を一つのプロンプトに詰め込んでもいいのですが、処理が複雑になれば出力がプロンプトの指示通りにならない可能性が高くなります。
そのような結果になるのを防ぐために処理を分けており、複雑な処理の場合にこそワークフローの威力が発揮されるのだと思います。

なお、先ほどのワークフローを実際に実行したのが下の図です。
`input_file`にはZoomの文字起こしデータのファイルをアップロードし、`agendas`にはアジェンダを入力します。
そして、「実行を開始」のボタンをクリックすると処理が開始されます。処理が終了すると結果が表示されます。
なお、今回アップロード、入力したのは自分で作成した仮データとなります。

![スクリーンショット 2025-01-23 15.59.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127582/5fd05d90-6e86-68a0-f3c7-6f6e7a51b7ed.png)
![スクリーンショット 2025-01-23 16.00.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127582/46673f11-5322-6604-50eb-848a815d219d.png)

# おわりに
Difyとはどういったサービスかという説明から、Difyの活用事例、Difyの使い方について簡単に説明しました。
百聞は一見にしかずなので、皆さんも是非試してください。Dockerで動かすことができるので、お手元のPCでも簡単に試すことができます。

[^1]: 追加条件付きのApache 2.0ベースのライセンスの下でオープンソース化されている点に注意してください。詳細は[こちら](https://docs.dify.ai/ja-jp/policies/open-source)。