Difyを使ってMacBookでRAGを試してみた

# はじめに
今更ながらDifyを使ってRAGを試してみたので、その時のメモです。  
全てローカルで動かしたかったので、手持ちのMacBook Proで動くものを作ります。ローカルでLLMを動かすためにollamaを使います。

# 目的
- Difyを使ってMacBook Proで動くChatbotを作る。
- [こちら](https://huggingface.co/datasets/matsuxr/JaGovFaqs-22k)の官公庁のQ Aデータを読み込み、類似の質問とその回答を表示する。
- 回答する際に、ソースのリンク等を表示する。

# 環境
- MacBook Pro
   - プロセッサ：1.4 GHz クアッドコアIntel Core i5
   - メモリ：16 GB
- Dify: commit 42b02b3 (バージョン指定するのを忘れた)
- ollama: ver. 0.3.12

# RAGを試してみた
## Difyとollamaの準備
ローカルでLLMを動かすためにollamaというツールを使う。  
モデルはELYZA, Inc.が開発したLlama-3-ELYZA-JPを使用した。  
Dify, ollama, モデルの準備はこちらの記事を参考に行った。  
https://zenn.dev/michy/articles/1dfddbcf88c80e

## ナレッジの準備
RAGで外部情報を取得するためにナレッジを作成する。  
今回は官公庁のQAのデータを使用する。  
### データの準備
下記のサイトから"data.jsonl"をダウンロードする。  
https://huggingface.co/datasets/matsuxr/JaGovFaqs-22k/tree/main
Difyで読み込むために、.jsonlファイルを.csvに変換する。 

1つのファイルのサイズが15 MB以下でないとDifyで読み込めないので、ファイルサイズが大きい場合は適度に分割する。  
今回のデータは22794個のQAが含まれており、全てを1つの.csvファイルにすると19.9 MBとなったため、2つのcsvファイル("data_0_10000.csv", "data_10001_22794.csv")に分割した。

.jsonlファイルから.csvファイルへの変換、ファイルの分割は下記のように行なった。

```
import pandas as pd

df = pd.read_json('data.jsonl', orient='records', lines=True)
df.to_json('data.json', orient='records', force_ascii=False, lines=True)

df = pd.read_json("data.json")
df = df.T

df.loc[0:10000, :].to_csv("data_0_10000.csv")
df.loc[10001:, :].to_csv("data_10001_22794.csv")
```

### ナレッジの作成
「ナレッジ」をクリックする。
![スクリーンショット 2024-10-14 14.34.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1319419/1008a3b4-6b10-5cb7-29a4-c28bdf686bbe.png)

「ナレッジを作成」をクリックする。
![スクリーンショット 2024-10-14 14.36.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1319419/c828a41d-760a-83b7-79e8-7ef1a7745195.png)

「テキストファイルをインポート」を選択し、.csvファイルをドラッグ&ドロップする。
![スクリーンショット 2024-10-14 14.38.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1319419/a51a2599-c055-ba84-3896-196200e3e9bb.png)

チャンク設定「自動」、インデックスモード「経済的」を選択し、「保存して処理」をクリックする。
![スクリーンショット 2024-10-14 14.31.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1319419/25f729e8-97ea-a09c-97bd-8c874f4e2b01.png)

ステータスが利用可能になるまで待つ（数十分かかる）。  
ナレッジの名前を任意の名前に変更する。今回は"官公庁QA"とした。
![スクリーンショット 2024-10-14 15.19.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1319419/d2d50f95-4805-817c-6373-35bf534f90e4.png)


## アプリの作成
「スタジオ」をクリックし、「最初から作成」をクリックする。
![スクリーンショット 2024-10-14 15.09.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1319419/b7c107ca-ee90-f995-5dd2-854a6435d3d6.png)

アプリのタイプは、「チャットボット」を選択する。  
オーケストレーション方法は「Chatflow」を選択する。  
アプリの名前と説明を入力する。
![スクリーンショット 2024-10-14 15.07.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1319419/81e8e6c1-b509-4f1a-7cc6-7e83e8480bdd.png)

開始ブロックとLLMブロックの間に知識取得ブロックを追加する。
![スクリーンショット 2024-10-14 15.16.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1319419/59db348e-4136-9a51-5bf3-3ed9f96122cf.png)

知識取得ブロックに、先ほど作成したナレッジを追加する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1319419/23d41f7a-c7f1-759f-9a75-6ed59b038a66.png" width=300>

検索設定のRERANK設定はオフにする。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1319419/58dc5bec-3698-9b61-5f2a-1dcc15075331.png" width=300>

LLMブロックを下記のように設定する。モデルのパラメータはデフォルトのままにした。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1319419/d1dd97b2-5a29-1204-e22d-3e570f154b80.png" width=300>


## 動かしてみる
「プレビュー」をクリックするとパイプラインを試しに動かすことができる。  試しに以下のような質問をしてみると、3分ほどで回答が返ってきた。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1319419/71afb556-72e1-060a-211a-98e40b94d69e.png" width=300>

引用のリンクをクリックすると、ナレッジの中から引用した箇所を表示してくれる。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1319419/ff59bd7f-1377-1e08-76af-b562d9a41570.png" width=400>

右上の「公開する」をクリックするとアプリとして使用できるようになる。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1319419/48bf64aa-0301-5a71-2108-5c2102d8739f.png" width=300>

アプリの画面はこんな感じ。
![スクリーンショット 2024-10-14 17.46.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1319419/e0a2f952-b8f6-54a2-61b4-dd4c8f03eb2f.png)


# おわりに
ノートPCでもRAGを試すことができました。もちろんオフラインで使えます。  
今回は最もシンプルな方法でとりあえず動くものを作っただけなので、今後は設定などを調べて改修していきたいです。

# 参考記事
- https://zenn.dev/michy/articles/1dfddbcf88c80e
- https://note.com/elyza/n/n360b6084fdbd
- https://huggingface.co/datasets/matsuxr/JaGovFaqs-22k/tree/main