Difyに入門してLLMを活用した謎掛けチャットボットを作る

# Difyを使って簡単にLLMを活用したアプリを作ってみたい
さて、暖かくなってきて過ごしやすくなってきたのでDifyを使ってLLMを活用したアプリをサクーンと作ってみたいと思います。
ちなみに、これを書いている現在まだDifyを触ったことがないので、一通り機能を把握できるようなチュートリアルをGeminiに出力してもらい、それをもとにハンズオンをやっていきます。

## この記事で取り扱うこと
- Difyの概要
- Difyを使ってアプリを作る方法
- Difyの一通りの機能

## Difyとは？
https://dify.ai/jp

DifyはLLMのアプリケーションを作るためのノーコードプラットフォームです。

プログラミングなしでAIチャットボットやエージェントを作成可能。

用途は違いますがZapierやCloud Data Fusionのようなイメージで、各アクションをパイプラインで繋いでいって処理を作成するみたいなことができます。

普通の開発が野菜を切ったり炒めたり煮込んだりしてご飯にかけてカレーライスを作る行為だとすると、Difyを使った開発はレトルトカレーとご飯というパーツがあって、それを組み合わせたらカレーライスができるみたいな。
そういうことだと思います。

つまるところ、これまでは生成AIを活用したアプリ（カレーライス）を作るためにプログラミング（料理）いう特殊技能を必要としていましたが、プログラミングの知識がなくてもできるようになったということです。これは革命ですね。

もちろんプログラミングを知っていたほうが使い方や設計をイメージしやすいとは思うので、エンジニアが使うとよりパワーを発揮しそうな気がします。

## 環境セットアップ
DifyはSaas版とローカル版があります。
せっかくならということで今回はローカル版で試しました。

ローカル版はDockerで動かせるので、以下の記事を参考にセットアップしましょう
[Deploy With Docker Compose](https://docs.dify.ai/getting-started/install-self-hosted/docker-compose)

Dockerは入っている前提ですが、特に難しいことはなくクローンして.envをコピーして、docker compose up -dでコンテナを立ち上げるだけです。
バージョン指定とかが古くなってもアレなので、それぞれのコマンドは公式サイトのものを参考にしてください。

立ち上げたらブラウザで http://localhost にアクセスし、動作が確認できると思います。

アクセスしたら、アカウントを作成する画面があるので、画面に従ってアカウントを作成し、ログインします。

ログイン画面
![Screenshot 2025-04-29 at 10.44.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562446/1324229e-f26b-453c-bc8e-479c5b0f394a.png)

ログインが完了したら、ダッシュボードが表示されるので早速なにか作ってみましょう
![Screenshot 2025-04-29 at 10.45.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562446/0dd185bc-646c-4e55-8aa2-107035c12b38.png)

僕は特に作りたいものが思いつかなかったので、GeminiにDifyの機能を一通り触れるようなチュートリアルを作ってくださいと申し上げました。

なので、素直にそれを進めてみようと思います。

## まずはアプリケーションを作成する
Difyを開くと上のタブに、「探索」「スタジオ」「ナレッジ」「ツール」といくつかメニューがあります。
見た感じ以下のような機能が提供されていそうです。
- 探索→テンプレートを探せる
- スタジオ→ダッシュボード
- ナレッジ→LLMに渡すコンテキストの作成
- ツール→Difyで使えるアクションのリスト

今回はスタジオ→アプリを作成する→最初から作成で作っていきます。

### アプリ作成画面で概要を作る
最初から作成をクリックすると、どのようなアプリを作りたいかの概要を入力する画面になります。
![Screenshot 2025-04-29 at 11.44.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562446/ff90810c-7c41-4c76-8c2a-873274ce2e24.png)

今回は小粋な返しをしてくれるチャットボットを作っていきましょう。

他にもエージェントやテキストジェネレータ、ワークフロー的なものを構築することもできそう。

### プロンプトを作成する
アプリのタイプを選択すると、次はそのアプリ内でどのようなプロンプトを使用するかを設定する画面になります。

![Screenshot 2025-04-29 at 11.46.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562446/aa61e891-35d6-41e3-b067-d84e26341f94.png)

手順、変数、コンテキストと入力欄があります。
手順がプロンプト
変数はプロンプト内で使える変数の定義
コンテキストは追加で与える情報みたいなものでしょうか

とりあえず今回は以下のようなプロンプトを与えます。
```
あなたはねづっちです
単語Aを渡されたら、単語Bを生成し謎掛けをして返答します

単語以外の文章や複数単語が渡された場合はパニックに陥ってください

## 正しく単語が渡された場合の返答フォーマット
<format>
整いました！
[単語A]とかけまして、[単語B]とときます。
その心は、どちらも[謎掛けの内容]でしょう！
</format>

いくつか謎掛けの例を提示します
1. 相方とかけまして、すし屋のネタとときます、そのこころは、どちらも「かいさん」です。
解説：解散と海産の同じ音になるものをかけています
2. メディアとかけまして、秘密とときます、そのこころは、「​かくしごと​があるでしょう。
解説：書く仕事と隠し事で同じ音になるものをかけています
3. ダイヤモンドとかけまして、社員の熱意とときます、そのこころは、「​いし」​がかたい。
解説：石が硬いと意志が固いと同じ音になるものをかけています
```

正直、謎掛けの解説についてはコンテキストなのではという気もしましたが、一旦は一番シンプルな形で使ってみたいと思ったので、手順だけを記入。

プロンプトのポイントですが、単純にGeminiに謎掛けをしてくださいだけの指示で投げると、高校生が休み時間にふざけてやった謎掛けくらいのクオリティのものがでてきたので、謎掛けについて少し例も交えて指示しています。

あとは右側に「LLMプロバイダーが設定されていません」と出てしまっているので、APIキーを指定してLLMを呼び出せるようにしてあげます。
ここでもGeminiを使いたかったのですが、APIキーを発行して読み込ませると404エラーでモデルが見つかりませんと出て、それっぽい箇所のコードを書き換えたら、APIキーが即座に期限切れるというループに陥ってどうにもならなかったのでChat GPTのAPIキーを使用。

## プロンプトの入力が完了したらデバッグとプレビューを行う
プロンプトが完成したら、実際にそのアプリケーションに単語を投げてみます。
![Screenshot 2025-04-29 at 12.47.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562446/f096914e-ab4b-4427-ab64-f90d2c543d4d.png)

さて、どんな回答が出るんだろうか、、、

![Screenshot 2025-04-29 at 12.50.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562446/f561953d-ca87-478a-a413-eed88c92bacf.png)

Bot「整いました！
入学式とかけまして、入社式とときます。
その心は、どちらも「新しい一歩を踏み出す式典」でしょう！」

…やってくれたなという回答が来ました。

ただこれをチューニングすることがDifyでアプリを作る本質なのかなという気もするので、次はナレッジを活用してみようと思います。

以下のテキストをナレッジにアップして使用してみる
```txt
# 謎掛けとは
言葉遊びの一種で、「〇〇とかけて、××と解く。その心は？」という形式で、ある言葉と関連性のない別の言葉をかけて、その言葉の隠れた意味や関連性を示唆し、答を求める言葉遊びです。

## 謎掛けの例
1. 相方とかけまして、すし屋のネタとときます、そのこころは、どちらも「かいさん」です。
解説：解散と海産の同じ音になるものをかけています
2. メディアとかけまして、秘密とときます、そのこころは、「​かくしごと​があるでしょう。
解説：書く仕事と隠し事で同じ音になるものをかけています
3. ダイヤモンドとかけまして、社員の熱意とときます、そのこころは、「​いし」​がかたい。
解説：石が硬いと意志が固いと同じ音になるものをかけています

## 謎掛けのコツ
例のように音の響きを利用するのがポイントです。
また、言葉の意味や関連性を考えることで、より面白い謎掛けができるでしょう。

やってはいけないこととしては、例えば入学式とかけて入社式と解く、その心は「新しいスタート」など、あまりにも意味が直接的なものは避けるべきです。よほどキャラが立っていない限りは確実にスベります。
```

プロンプトに埋め込んでいた事例の提示は重複するので削除する。

このテキストをナレッジの画面でアップする
![Screenshot 2025-04-29 at 12.57.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562446/a72a88f1-8bdc-4622-9de3-fe2945a29504.png)

すると入力のチャンク設定やそのプレビューが見れる画面が表示されました。
ここでこれはRAGを作るための機能だと確信。

とりあえずパラメータはデフォルトで保存し、改めて手順とコンテキストを使ってやってみる

![Screenshot 2025-04-29 at 13.00.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562446/5c9fe263-8159-4423-b169-bd96456aecdf.png)

これで設定完了

もう一度単語を投げてみる

![Screenshot 2025-04-29 at 13.02.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562446/aa121e16-e7eb-4560-9dd2-d1e1f7d7f2b7.png)

ダメだったか。

念の為、別の単語でも試す

![Screenshot 2025-04-29 at 13.03.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562446/2defc138-89e3-469d-89d5-55bc05044a9f.png)

いや、整ってない。

![Screenshot 2025-04-29 at 13.04.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562446/d2869806-cab6-4b08-a741-adad011b14c9.png)

パニックはなんとか要件に沿っているが、正直パニック具合はGeminiで試したときの方が面白かった

![Screenshot 2025-04-29 at 13.05.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562446/b50da92b-ba72-478a-a492-1a860b0d19fa.png)

いや、Geminiの回答マジで面白いな

## 完成したらアプリをデプロイする
プロンプトのチューニングを終えたらボタン一つで公開できます。
![Screenshot 2025-04-29 at 13.07.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562446/6e0bfca8-a2f0-4c9e-832d-3711004a20a1.png)

Webアプリを実行をクリックすると、アプリの画面に遷移します。
![Screenshot 2025-04-29 at 13.09.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562446/ae40c873-1601-4ddc-99b9-483805d87810.png)

ボタンを押したらチャット可能

![Screenshot 2025-04-29 at 13.10.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562446/128f029e-b3c3-419a-9085-a77d01c3c119.png)

ダメだこりゃ。

デプロイについては既存のサイトに埋め込んだり、APIにすることもできそうです。

## Difyを触ってみた所感
ということで謎掛けチャットボットが無事完成しました。
使ってみた感想ですが、独自のLLMアプリを作るってなったときにプロンプトの工夫だけで作れるのは結構すごいことなんじゃないの？と感じました。

もはやアイディアと生成AIを活用するリテラシーさえあれば面白いものが作れそうな予感がします。

こうなると技術とかじゃなくて、いかにうまくLLMを動かすかというプロンプトのチューニングでどれだけ引き出しを持っているかで価値を発揮できそうですね。

今回はチャットボットでシンプルなものを作りましたが、ツールの機能とかを駆使すると、Web検索の結果に応じていろいろなタスクができるようなエージェントらしいも作れます。

Dockerで動くのでAWSとかに社内だけで使えるような形でデプロイしておいて、社員のアイディアに応じてどんどんエージェント誕生していくなんていうこともできますよね。

いやー、これ活用したら社内でとんでもないDX起きるんじゃないかというポテンシャルを感じました。

それでは、おつカレー。

参考になったという方はいいねとかをしてもらえると今後の執筆モチベーションに繋がるのでよろしくお願いします！