Dify使ってRAG作ってみた

WSLのUbuntu環境でDify動かしてみた

## Dockerインストール
👇を参考にDocker desktopをインストール

https://qiita.com/zembutsu/items/a98f6f25ef47c04893b3#docker-desktop-for-windows-%E3%81%AE%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%A8%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754443/eb8cf1bf-9db9-6e06-4623-a545241a89fe.png)
~~なんか怒られたが、コマンドプロンプトに下記のコマンドでUbuntuのVersionを2にしたら動いた~~
```
wsl --set-default-version 2
```
Doker Desktopの設定が良くなかった。Docker desktopとWSLの統合設定をしてあげればOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754443/5e891f79-9663-3453-83cd-467eb0c083bd.png)


余談：Docker desktop有料化に伴って、WSL2のUbuntuに直接Dockerを導入するパターンもあるらしい

https://qiita.com/haveAbook/items/0d0ae20a19214f65e7cd

## Dify起動

```
cd ./dify/docker
docker compose up -d
```

http://localhost にアクセスしてアカウント登録、ログイン
右上のユーザーから設定を開き、モデルプロバイダーからLLMのAPI Keyを設定（今回はOpenAIをセッティング）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754443/2f611ce2-68e7-42e1-795b-33b353241bab.png)

## RAGの作成
実際にRAGのアプリを作成する

### フローの作成
最初から作成を選んで、チャットボットとChatflowを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754443/9099d05e-c9f2-cfbd-6f9c-cc819cad2878.png)

作成するを押すと、GUIでフローが組める画面になる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754443/0f66832f-2fee-301b-99ba-1ba4916b55ba.png)

### ナレッジの作成
LLMが参照するナレッジを作成する
手元にあったスクラムガイドをナレッジに突っ込んでみる

https://scrumguides.org/docs/scrumguide/v2020/2020-Scrum-Guide-Japanese.pdf

ナレッジからナレッジ作成してみると、テキストファイル以外にもNotionからの同期やFirecrawlでのクローリングもデータソースとして使えるみたい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754443/a2dfc21c-35c7-1c9a-9cdd-475ed35c23ca.png)

ファイルをアップロードして次の画面に行くと、テキストの処理方法などが選択できる画面に移る。チャンキングの設定やEmbedding、検索方法の設定が出来る。今回はデフォルトのままで。
（最初インデックスモードを「経済的」にしたら、検索しても何もヒットしないナレッジが出来上がったのでやめた）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754443/03d6c22f-550a-fc94-de7f-abd93c1308e1.png)

設定完了するとEmbedding処理が開始され、処理が完了するとステータスが利用可能となり、ナレッジとして参照できるようになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754443/f74fd06c-d77d-74b6-3697-2f4435825d57.png)

作成したナレッジは左のメニューの的当てアイコンから検索テストも行える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754443/7752b3e4-2eeb-ec1c-15f5-45c876517a07.png)

### ナレッジをフローに組み込む
出来上がりの図はこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754443/3f4b1709-3c2d-40dc-545a-720722d5ce02.png)

LLMの前に知識取得モジュールを追加して、ナレッジに先ほど作ったスクラム開発のナレッジを追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754443/acfca5b8-ef9c-3a3b-f81b-d15c02c47292.png)

LLMのモジュールでは、使用するモデルを選択する。
また、コンテキストの部分に知識取得モジュールからの結果を受け取るように設定した上でユーザープロンプトにコンテキストを書き込むようにする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754443/a7b28085-6d8c-cf00-00d2-5185eadc9e3f.png)
必要があればシステムプロンプトを書いておく。

これで大体完成。
デバッグとプレビューから、試しにチャットを送るとスクラム開発について解説してくれる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754443/e098b69e-e895-50ae-998d-a2df883895cb.png)


## 感想
ポチポチするだけでRAGが出来るので相当簡単になったなという感想。
（自前でRAGを実装したことが無いので、あんまり言う権利が無さそう）