Difyをローカル環境で起動してLLMアプリを作成してみた

# Difyとは
> 先進的なAIアプリケーションのためのイノベーションエンジン
DifyはオープンソースのLLMアプリ開発プラットフォームです。RAGエンジンを使用して、エージェントから複雑なAIワークフローまでLLMアプリを編成します。

以下詳細
https://dify.ai/jp

# ローカルで起動(WSL)

### 実行コマンド
```
git clone https://github.com/langgenius/dify.git
cd dify/docker
docker compose up -d
```
起動手順は以下に記載があります。
https://github.com/langgenius/dify?tab=readme-ov-file#quick-start


### 実行結果
```
$ docker compose up -d
[+] Running 66/8
 ✔ redis 6 layers [⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled                                                                 30.0s
 ✔ weaviate 4 layers [⣿⣿⣿⣿]      0B/0B      Pulled                                                                49.7s
 ✔ nginx 7 layers [⣿⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled                                                                11.4s
 ✔ sandbox 10 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled                                                          59.2s
 ✔ worker Pulled                                                                                                  70.6s
 ✔ api 10 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled                                                              70.6s
 ✔ db 9 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled                                                                 17.2s
 ✔ web 12 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled                                                            47.6s
[+] Building 0.0s (0/0)
[+] Running 8/8
 ✔ Container docker-redis-1     Started                                                                            3.2s
 ✔ Container docker-weaviate-1  Started                                                                            3.5s
 ✔ Container docker-db-1        Started                                                                            3.3s
 ✔ Container docker-web-1       Started                                                                            3.3s
 ✔ Container docker-sandbox-1   Started                                                                            3.7s
 ✔ Container docker-api-1       Started                                                                            5.0s
 ✔ Container docker-worker-1    Started                                                                            5.0s
 ✔ Container docker-nginx-1     Started
```

以下の通り、実行後8つのコンテナが起動します。

```
$ docker ps
CONTAINER ID   IMAGE                              COMMAND                  CREATED          STATUS                    PORTS                               NAMES
500d20104fe0   nginx:latest                       "/docker-entrypoint.…"   53 seconds ago   Up 45 seconds             0.0.0.0:80->80/tcp, :::80->80/tcp   docker-nginx-1
73a54d6264b7   langgenius/dify-api:0.6.6          "/bin/bash /entrypoi…"   53 seconds ago   Up 47 seconds             5001/tcp                            docker-api-1
ca6df3663c2f   langgenius/dify-api:0.6.6          "/bin/bash /entrypoi…"   53 seconds ago   Up 47 seconds             5001/tcp                            docker-worker-1
8083aaf2459c   langgenius/dify-sandbox:0.1.0      "/main"                  53 seconds ago   Up 48 seconds
                                  docker-sandbox-1
42d51ac7e40f   postgres:15-alpine                 "docker-entrypoint.s…"   53 seconds ago   Up 49 seconds (healthy)   5432/tcp                            docker-db-1
daf190a30b24   langgenius/dify-web:0.6.6          "/bin/sh ./entrypoin…"   53 seconds ago   Up 49 seconds             3000/tcp                            docker-web-1
acf0e14f2b9b   redis:6-alpine                     "docker-entrypoint.s…"   53 seconds ago   Up 49 seconds (healthy)   6379/tcp                            docker-redis-1
136438d2d53e   semitechnologies/weaviate:1.19.0   "/bin/weaviate --hos…"   53 seconds ago   Up 49 seconds
                                  docker-weaviate-1
```


# ログイン
以下にアクセスして、アカウントを作成しログイン！
http://localhost/install

のはずが、初期パスワードに入力ミスがあったせいでログインパスワードがわからなくなりログインできなくなる事態発生ｗ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896507/1e31052a-fcc8-b562-c701-dce00ab03375.png)




DBにアカウント情報が保存されているはずだと思い、docker-compose.yamlからDBログイン情報チェックしコンテナに入りテーブルをチェック。
が、パスワード情報は当然暗号化されている。

コンテナ再起動してもアカウント情報が残ったまま。

あたふたしてましたが、調べたらパスワードリセット手順発見。

- Reset password
https://docs.dify.ai/getting-started/install-self-hosted/install-faq#id-1.-how-to-reset-the-password-if-the-local-deployment-initialization-fails-with-an-incorrect-password
```
$ docker exec -it docker-api-1 flask reset-password
None of PyTorch, TensorFlow >= 2.0, or Flax have been found. Models won't be available and only tokenizers, configuration and file/data utilities can be used.
Email: xxx@xxx.com
New password: xxxxx
Password confirm: xxxxx
Congratulations!, password has been reset.
```

(実行ディレクトリ配下にvolumeというフォルダが作成されていてDBのデータが永続化されていたのですが、フォルダ削除するか、cloneしなおせばよかったかも笑)


そして無事Login完了！
ログイン後の画面は以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896507/fe0ce9a0-40a1-678b-9142-fbfdfc52c5c1.png)


# Model設定
右上のアカウント設定から使用するモデルを設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896507/3b974d5f-1498-3001-61cb-040f072eab03.png)

今回は`Claude`を利用
電話番号登録すると$5無料枠がもらえる
https://www.anthropic.com/api



# アプリ作成
既存のテンプレートがいくつかあります。
今回は、Pythonコードのバグを修正してくれるテンプレートを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896507/6a789409-e362-1f8a-2a6e-e3b025f37779.png)



Chat形式でエラーが発生するコード(PDFから文字列出力)とエラーメッセージを入力
*今回は検証なので聞くまでもないエラー内容ですがご了承ください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896507/e1a6db9d-ea71-421c-a626-2c8e906ba17f.png)


Difyというよりは選択したモデルのおかげですが、
ご丁寧にソースコードの修正とエラーの原因を説明してくれました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896507/1d8382b5-a1a7-09b4-41a9-b6b6e9ab4b28.png)

作成したアプリケーションは公開したりサイトに埋め込んだり(今回はlocalhostですが)、API実行もできるようです。
自作のテンプレートも共有できるようです。

また、テンプレートはほかにもたくさんあり、ワークフローとかも作成できるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896507/209b9311-7a00-26dc-1e63-0bff66b4bf8a.png)

# 所感
ユーザー体験までの速さに感動しました。
使われるサービスになるためには、すぐ利用できるって大事ですね。

今回は簡単な検証でしたが、アイデアがあれば個人でも簡単にそれを実現できるようになりそうですね。