【ローカル】Dify＋OpenAIを使って生成AIアプリ作ってみる

## Difyって？
> DifyはオープンソースのLLMアプリ開発プラットフォームです。 RAGエンジンを使用して、エージェントから複雑なAIワークフローまでLLMアプリを編成します。 LangChain よりも本番環境に適しています。

公式サイト

https://dify.ai/jp

## 事前準備（WSL）
1.Windows PoweShellを「管理者として実行」し
`wsl --install`と入力してインストールする
![wsl事前準備1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789535/8b397e2f-c9db-27a3-1495-89481899d63f.png)
2.インストールが完了したら、OS再起動

3.再起動するとUbuntuが自動で立ち上がり、ユーザ名とパスワードを設定
![wsl事前準備2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789535/f99f2a5f-2106-9638-b7e3-7ee5474fb7bd.png)

4.コマンドプロンプトを開いて`wsl -l -v`と入力しWSLのバージョン情報が表示されればOK
![wsl事前準備3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789535/be4f1b9e-43fb-8405-8c55-510e4d45aeaa.png)

## 事前準備（Docker）
1.Ubuntu（WSL）にDockerをインストールする
```bash
sudo apt update
# インストールに必要なものをインストール
sudo apt install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

# GPGキー追加
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# dockerのパッケージリポジトリをaptに追加
echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# dockerEngineのインストール
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io

# docker-composeのインストール
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

# docker daemonの起動
sudo service docker start
```

2.docker自動起動設定
WLS使用時に自動でdockerを起動するようにする
```bash
# service docker startだけパスワード無しでsudoできるようにする
sudo visudo
```

```bash
# User privilege specificationに以下を追記
ユーザー名 ALL=NOPASSWD: /usr/sbin/service docker start, /usr/sbin/service docker stop, /usr/sbin/service docker restart
```
3.docker操作権限を付与
dockerグループに対してOS操作をするユーザを追加（権限付与）する
```bash
sudo usermod -aG docker [ユーザ名]
```
Ubuntuを開きなおすことで設定が反映されます。

## ローカルにDifyコンテナを起動する
GithubからDifyのコードをcloneしdocker composeでコンテナを起動する
```bash
git clone https://github.com/langgenius/dify.git
cd dify/docker
docker compose up -d
```
### 実行結果
![docker起動1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789535/1d6f139f-bfe3-de14-1cf4-a5477d11132b.png)
![docker起動2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789535/356aa31f-c358-4fb2-dc0f-310ef8819640.png)
8個のコンテナが起動していますね。

## Difyにログインする
ローカルにDifyが起動しているので下記URLにアクセスし、サインアップする
http://localhost/install
![Dify画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789535/f3fef8f9-77b0-0916-871c-0bfe0ef80541.png)

管理者アカウントのセットアップを終えたらサインインする
![Dify画面2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789535/ab157d39-d270-27fe-0822-8e147f138594.png)

サインインできました！
画面はこんな感じ。
![Dify画面3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789535/c664a001-474e-ec73-4392-7efd9548a237.png)

## LLMモデル設定
:::note warn
OpenAIで無料プランの場合はAPI Key登録時にエラーが出ました
:::

今回はOpenAIのモデル`gpt-3.5-turbo-16k-0613`を使います。
事前にOpenAIでAPI Keyを取得しておきます。

右上のアカウント＞設定からモデルプロバイダーを選択し
使用するLLMモデルをセットアップします。
以下のようにモデルの右端に緑色のステータスが表示されていればOK
![モデル設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789535/e06eaba6-92a2-181e-280c-7e5f35debd1a.png)


## ワークフローを作る
「アプリを作成する」の最初から作成を選択してワークフローを作ってみます。
名前は何でもよいですが「検索くん」にしました。
自分の代わりにGoogle検索してくれるアプリです。
![Dify画面4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789535/aee9804b-f5a1-2632-648d-e88bb83ca5f0.png)

初期配置されている「開始」モジュールを選択して
ユーザが質問入力できるように`input`変数を登録します。
![Dify画面5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789535/4221d0b2-aa74-ff7d-3e7a-cbe1f156e0e7.png)


次にユーザが入力した内容を基にGoogle検索をしてくれるように「GoogleSearch」モジュールを追加します。
この時、SerpAPIキーが必要になりますのでGoogleアカウントを持っていればアカウント連携してサインアップしAPIキーを取得します。

https://serpapi.com/

入力変数には「開始」モジュールで登録した`input`を選択し
Result typeを`text`に設定します。

![Dify画面8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789535/d1458b90-19b7-92a8-1ae7-20b6f5855da5.png)

次に、検索結果から推論するLLMモジュールを追加
モデルは事前にモデルプロバイダーで設定したOpenAIの`gpt-3.5-turbo-16k-0613`を選択します。
SYSTEMプロンプトには入力変数`input`とGoogle検索結果の`text`を入力します。
![Dify画面9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789535/e62a23c1-80b0-0688-0774-75b06b7a8182.png)

最後に「終了」モジュールを追加
デフォルトだとJSONで結果が返ってきてしまうので、出力変数に`LLM/text`を設定します。

![Dify画面10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789535/ca60bf55-b40a-85ad-808e-09a6c73e7bbd.png)

これでワークフロー（アプリの）の作成が完了です。

## テスト実行
画面上部にある「▷実行」を押してテストしてみます。
FF14のディレクターである吉田氏の肩書を聞いてみました。
![実行テスト1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789535/43d9bcc1-2c6d-11b2-b662-1cd9896111e5.png)

実行すると、ワークフローが流れて回答が出力されました。
合ってそうですｗ
![実行テスト2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789535/2ec050df-e63c-694c-6fcb-e98c4d763cd2.png)

## アプリを公開する
今回はローカル環境なので外部公開はできませんが
画面右上の「公開する」をクリックするとブラウザアクセス用のURLが生成されます。
`http://localhost/workflow/xxxxxxxx`

![アプリ公開.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3789535/0ed19811-5f0a-4ce8-181d-20e88932af87.png)

初心者にはDPSがおすすめのようですね。
かわいい装備は白魔導士だけじゃないですが、まぁ言いたいことは分かりますｗ


## 最後に
サーバも要らずにアプリを簡単に作れちゃうので面白いですね。
使用するLLMモデルによって回答の精度は変わりますが、その分お金もかかるのでトレードオフです。
今回は代替検索してくれるアプリでしたが、学習データを登録してチャットボットを作ったり
いろんなことがDifyで出来るのでもっと試したいですね。