Difyでローカル環境のチャットボットを作る

# はじめに
最近話題のDifyを触ってみました。

## Difyとは?
Difyは、オープンソースの大規模言語モデル(LLM)アプリケーション開発プラットフォームです。 
Backend-as-a-ServiceとLLMOpsの概念を組み合わせて、開発者が実稼働グレードの生成AIアプリケーションを迅速に構築できるようにします。
技術者でなくても、AI アプリケーションの定義とデータ操作に参加できます。

https://docs.dify.ai/

GUI操作でLLMのチャットボットやAPIが簡単に作れるようです。


## 動作環境
MacBook Pro(2020)
CPU: 2.3GHz クアッドコアIntel Core i7
メモリ: 32GB 3733MHz LPDDR4X
macOS: 14.4.1

## 環境構築

Gitに書いてある手順で構築を進めました。

https://github.com/langgenius/dify

```bash
git clone https://github.com/langgenius/dify.git
```

```bash
cd dify/docker
```

```bash
docker compose up -d
```

## 実際に触ってみる。
`http://localhost/install`にアクセスすると以下の画面になりました。
日本語に対応しているのは嬉しいですね。
![スクリーンショット 2024-05-10 18.53.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591134/f97a53a9-10d1-7fad-4074-7f3611a64aa2.png)

初期画面
![スクリーンショット 2024-05-10 18.58.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591134/e9367773-966d-d016-35c7-4ee67e5c337d.png)

### チャットボットを作成してみる。
今回は[会社のHP](https://www.haw.co.jp)情報をナレッジとして持たせてチャットボットを構築してみたいと思います。

モデルは先月に発表された小規模言語モデルの**Phi-3**を使用してローカルで動かしてみます。
~~本当はもう少し強めのモデルやAPIを叩きたいところですが、そんな予算やPCがないので...~~

https://news.microsoft.com/ja-jp/2024/04/24/240424-the-phi-3-small-language-models-with-big-potential/


### モデルをDifyで利用できるようにする。

Difyでローカル環境のモデルを利用する方法はいくつかありますが、今回はOllamaを使用してみます。

インストールは以下を参照

https://docs.dify.ai/tutorials/model-configuration/ollama

MacOSでbrewを入れている方は以下の方法が早いかもしれません。
(私はこの方法で入れました。)
```bash
brew install ollama
```

### モデルをOllamaで起動

ありがたいことにOllama用のphi3モデルが用意されているので、それを利用させてもらいます。

https://ollama.com/library/phi3:instruct

ollamaサーバーを起動
```bash
ollama serve
```

初回はモデルのDLに少し時間がかかります。
```bash
ollama run phi3:instruct
```

動作確認
![スクリーンショット 2024-05-11 11.55.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591134/e1bb83f6-bd9d-8dd5-31cd-f6a094350884.png)


### Difyの設定
続けてDify側の設定を行なっていきます。

#### ナレッジの作成
先にナレッジから設定を行なっていきます。

「ナレッジ」→「知識を作成」を選択します。
![スクリーンショット 2024-05-11 12.04.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591134/71ffb999-5687-87d1-5d93-b76af13cc6d1.png)

現時点だとテキストファイルもしくはNotionからしか作成できないようです。
今回は会社のHP情報をテキストにまとめて利用することにしました。

![スクリーンショット 2024-05-11 12.10.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591134/bb277ad3-c6e4-a237-8ab8-eecf6b283bf6.png)

前処理は以下の通り設定しました。
![スクリーンショット 2024-05-11 12.13.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591134/215b1b73-4793-4da6-d26e-e4a6114304da.png)

これで作成完了です。
![スクリーンショット 2024-05-11 12.14.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591134/6ab5105c-1a74-b475-00f4-7c21c595cee6.png)

#### モデルを登録
次にDify上でPhi-3を扱えるように登録してきます。
「設定」→「モデルプロバイダー」→「Ollama」を選択します。
![スクリーンショット 2024-05-11 12.17.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591134/cb25317a-b984-9bdb-f685-6240882ec780.png)

以下のように設定しました。
![スクリーンショット 2024-05-11 12.22.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591134/01d40330-a634-575d-fad5-9ebe18343ec2.png)

作成したものがモデルに追加されました。
![スクリーンショット 2024-05-11 12.23.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591134/5600ac2b-301c-417a-b1ba-0069cb969067.png)


### チャットボットの作成
必要な設定を行ったので実際にチャットボットの作成を行なっていきます。

「スタジオ」→「最初から作成」を選択します。
![スクリーンショット 2024-05-11 11.59.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591134/404fcb18-8949-5bcf-46ef-3efdf1b12af6.png)

チャットボットを選択して名前と説明を追加します。
![スクリーンショット 2024-05-11 13.00.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591134/d4c6459a-5fb8-2318-1cba-3e66601e61c3.png)

フローチャートのように順番に処理を作成して繋げて作るみたいです。
![スクリーンショット 2024-05-11 13.02.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591134/cdce5169-a20a-9c15-b569-0fe547476e5e.png)

「開始」の後ろに「知識取得」の処理を入れます。
![スクリーンショット 2024-05-11 13.03.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591134/4b35fa35-32b5-e96d-dba5-853e3e86b1cc.png)

先ほど作成した会社のHP情報を追加してそれを取得するようにします。
![スクリーンショット 2024-05-11 13.05.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591134/251e08bb-e8e2-dbfd-04a5-2a74660f8034.png)

ちなみに右上の「▶️」で個別デバックもできました。
![スクリーンショット 2024-05-11 13.08.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591134/586ea0ed-6a3c-8c99-90a9-eb6b8f177f48.png)

LLMは以下のように設定してます。
![スクリーンショット 2024-05-11 13.43.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591134/9773f472-0426-faa5-722c-c994e5071014.png)

デバッグとプレビューから実行してみます。
![スクリーンショット 2024-05-11 13.46.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591134/f1f7e793-9c8e-b153-44b6-8a0d88395d6b.png)

ちゃんと知識を取得して回答することができています。

ログのトレースもできるようなので、処理も詳細に追っていけそうです。
![スクリーンショット 2024-05-11 13.49.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591134/bc60620e-a7de-ac03-c86b-b1c0c682290a.png)


### その他機能について

#### API
以下のようなAPI仕様書も自動生成されていました。
![スクリーンショット 2024-05-11 13.51.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591134/c8889b29-af3c-92c4-8d9c-51cf189e2822.png)

#### ログ
アクセス毎に細かく見れるみたいです。
![スクリーンショット 2024-05-11 14.02.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591134/85dfc334-1359-8784-a172-c88ce26dc1f1.png)


#### 分析
ChatGPTなどのAPIで有料モデルを使う場合でもトークン消費量などが見られるのは嬉しいですね。
![スクリーンショット 2024-05-11 13.59.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591134/cab8d5bf-8dea-0a4a-30f6-6a9b5585f6db.png)


### おまけ
アプリ動作中のメモリの状態です。
![スクリーンショット 2024-05-11 12.50.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3591134/e38a3548-d154-eac3-b7b2-dd77cee1ecab.png)
全体で25GBほど消費していて、このレベル(3.8b)ならギリ動くって感じでした。(もう少し頑張れば7bぐらいは動きそう)

### 感想
コードを一切書かずにここまでのことができるのはすごいと感じました。
GUIで処理フローを作るのが、langchainで構築するより直感的で分かりやすくとてもよかったです。
GPT-4とか触っていると感覚がおかしくなりますが、Phi-3もGPUなしのローカルで動かしていることを考えるとすごいと思いました。
回答は若干怪しいところもありますが、小規模パラメータにしてはなかなかの精度かと思います。
今後もローカル環境で動作する小規模ながら高精度なモデルが増えていくことに期待したいと思います。