はじめに
今更ながらDifyを使ってRAGを試してみたので、その時のメモです。
全てローカルで動かしたかったので、手持ちのMacBook Proで動くものを作ります。ローカルでLLMを動かすためにollamaを使います。
目的
- Difyを使ってMacBook Proで動くChatbotを作る。
- こちらの官公庁の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")
ナレッジの作成
「テキストファイルをインポート」を選択し、.csvファイルをドラッグ&ドロップする。
チャンク設定「自動」、インデックスモード「経済的」を選択し、「保存して処理」をクリックする。
ステータスが利用可能になるまで待つ(数十分かかる)。
ナレッジの名前を任意の名前に変更する。今回は"官公庁QA"とした。
アプリの作成
アプリのタイプは、「チャットボット」を選択する。
オーケストレーション方法は「Chatflow」を選択する。
アプリの名前と説明を入力する。
開始ブロックとLLMブロックの間に知識取得ブロックを追加する。
LLMブロックを下記のように設定する。モデルのパラメータはデフォルトのままにした。
動かしてみる
「プレビュー」をクリックするとパイプラインを試しに動かすことができる。 試しに以下のような質問をしてみると、3分ほどで回答が返ってきた。
引用のリンクをクリックすると、ナレッジの中から引用した箇所を表示してくれる。
右上の「公開する」をクリックするとアプリとして使用できるようになる。
おわりに
ノートPCでもRAGを試すことができました。もちろんオフラインで使えます。
今回は最もシンプルな方法でとりあえず動くものを作っただけなので、今後は設定などを調べて改修していきたいです。