Difyをローカルで動かしてRAGまで試してみる
Difyを試してみました
Difyが話題だったので、少し試してみました。一言でいうとOSS版の高機能ChatGPTのカスタムGPT(GPTs)でしょうか。より詳しくはnpaka先生の記事を参考にしてください。
ChatGPTの有料版でできること以上のことができます。機能も多機能で、少し触った感じでは完成度も高いように感じました。
クラウド版を使うこともできますし、ローカルで自前でサーバーを立てることもできます。GPTsに比べた分かりやすいメリットある使い道は、容量制限なく手軽にローカルでRAGをクラウドにデータをアップロードできる点でしょうか。
それ以外には、GPT-4以外のClaude 3 OpusなどのLLMも使えたり、細かい設定を切り替えたりできるので、手軽に色々できそうです。ただ、結構できること多いので少し詳しい人向けかもしれません。
Difyのローカルセットアップ方法
クラウド版は、簡単に使えますし他にも解説あると思いますので、この記事ではローカルでの動かし方を説明します。以下が公式サイトとGitHubです。
セットアップ
DifyはDockerfileが用意されているので、Dockerを使ったことある人であれば、GitHubのREADMEの説明をもとにセットアップすれば動かせると思います。ここでは、少し補足説明と、注意事項を記載します。
OSはLinux前提です。Macだと、色々エラー出ました(一応対応方法は記載します)。Windowsでは試していませんが、おそらくWSL2ならDockerをインストールすれば動くかと思います(すんなりいくかは不明)。
Dockerを知らない人は、以下記事を参考にセットアップと使い方を確認してください。
Dockerをセットアップしたら、Difyをダウンロード(git clone)します。
$ cd && git clone https://github.com/langgenius/dify
Docker compose upします。
$ cd ~/dify/docker
$ docker compose up -d
Docker compose invalid mount config for type "bind"エラー対応
docker compose
コマンドで以下のようなエラーが出たときがありました。MacでDocker Desktop、Rancher Desktop両方で発生しました。
The new 'docker compose' command is currently experimental. To provide feedback or request new features please open issues at https://github.com/docker/compose-cli
Error response from daemon: invalid mount config for type "bind": bind source path does not exist: /Users/karaage/dify/docker/volumes/db/data
以下のようにディレクトリを自分で作成することで対応しました。
$ cd ~/dify/docker
$ mkdir -p volumes/redis/data
$ mkdir -p volumes/db/data
$ mkdir -p volumes/weaviate
$ mkdir -p volumes/app/storage
$ mkdir -p volumes/certbot/conf/live
$ mkdir -p volumes/certbot/www
Webブラウザで以下のアドレスにアクセスします。しばらく待ちましょう。
http://localhost/install
以下のような画面が表示されます。好きなメールアドレスとパスワードで登録しましょう(ローカルなので、サーバーに情報は送られません。多分)。
インストールが終わったら、以下アドレスにアクセスするとDifyが起動します。
http://localhost
これ以降は、以下コマンドを実行すればDifyが起動するようになります。
$ cd ~/dify/docker
$ docker compose up -d
終了したい場合は以下コマンドを実行してください。
$ cd ~/dify/docker
$ docker compose down
DifyでローカルRAGを実現する
RAGのセットアップ
ローカルでRAGを実施します。基本はnpakaさんの以下の記事の通りですが、少し差があったので差分を中心に記載していきます。
モデルプロバイダーですが、この記事では「OpenAI」のAPIのみ使います。より高機能なベクトル検索をしたいときは、npakaさん同様「Cohere」のAPIも使用しましょう。
使用する外部知識(ナレッジ)データに関しては、私は自分のTwitterとブログのテキストデータを利用しました。テキストデータの抽出に関しては、以下記事を参考にしてください。
設定は、npakaさんとほぼ同じですが、再ランクモデルのトグルスイッチは無効にしています(有効にするには、CohereのAPIが必要です)。
その他の設定は、npakaさんと同様に進めていきます。
RAGのテスト
とりあえず動かしてみました。
定性的な感覚ですが、デフォルト設定ではうまく対応してくれませんでした。QAの性能が再ランクなどの設定をしていくと性能が変わってくるのかもしれません。
問題切り分けのために、中で何が起っているかもみることができます。
例えば、以下のようにRAGで正しく回答できなかったとします。
原因を調べるためには、問題を切り分ける必要があります。
PDFのテキスト化なのか、ナレッジのベクトル検索なのか、LLMの性能なのか等考えられる原因は様々ですが、GUI画面でナレッジのブロックをクリックすると、以下のようにベクトル検索自体はできているといった途中経過を確認できたりします。
こういった問題の切り分け、中身の確認が手軽にできるのは良いですね。
ナレッジの容量を増大する
デフォルトだと、ナレッジとしてアップロードできるファイルの容量は15MBが最大ですが、これも変更可能です。
具体的には以下2点を実施します。
-
~/dify/docker/docker-compose.yaml
のapi
のenvironment
に例えば150MBにしたいときはUPLOAD_FILE_SIZE_LIMIT: 150
を追記します。 -
~/dify/docker/docker-compose.yaml
のnginx
のenvironment
のNGINX_CLIENT_MAX_BODY_SIZE: ${NGINX_CLIENT_MAX_BODY_SIZE:-15M}
の15M
を変更。例えば150MBにするならNGINX_CLIENT_MAX_BODY_SIZE: ${NGINX_CLIENT_MAX_BODY_SIZE:-150M}
にします。
以下は記入例です。
(略)
api:
image: langgenius/dify-api:0.7.2
restart: always
environment:
# Use the shared environment variables.
<<: *shared-api-worker-env
# Startup mode, 'api' starts the API server.
MODE: api
UPLOAD_FILE_SIZE_LIMIT: 150
depends_on:
(略)
nginx:
image: nginx:latest
restart: always
(略)
environment:
NGINX_SERVER_NAME: ${NGINX_SERVER_NAME:-_}
NGINX_HTTPS_ENABLED: ${NGINX_HTTPS_ENABLED:-false}
NGINX_SSL_PORT: ${NGINX_SSL_PORT:-443}
NGINX_PORT: ${NGINX_PORT:-80}
# You're required to add your own SSL certificates/keys to the `./nginx/ssl` directory
# and modify the env vars below in .env if HTTPS_ENABLED is true.
NGINX_SSL_CERT_FILENAME: ${NGINX_SSL_CERT_FILENAME:-dify.crt}
NGINX_SSL_CERT_KEY_FILENAME: ${NGINX_SSL_CERT_KEY_FILENAME:-dify.key}
NGINX_SSL_PROTOCOLS: ${NGINX_SSL_PROTOCOLS:-TLSv1.1 TLSv1.2 TLSv1.3}
NGINX_WORKER_PROCESSES: ${NGINX_WORKER_PROCESSES:-auto}
NGINX_CLIENT_MAX_BODY_SIZE: ${NGINX_CLIENT_MAX_BODY_SIZE:-150M}
NGINX_KEEPALIVE_TIMEOUT: ${NGINX_KEEPALIVE_TIMEOUT:-65}
NGINX_PROXY_READ_TIMEOUT: ${NGINX_PROXY_READ_TIMEOUT:-3600s}
設定したら、以下のコマンドを実行してDifyを再起動します。
$ cd ~/dify/docker
$ docker compose down
$ docker compose up -d
これで、ナレッジをアップロードすると、最大容量の記載が変わっているのが分かると思います。ここにはUPLOAD_FILE_SIZE_LIMIT
の設定が反映されています。
nginx
の設定は画面には現れませんが、設定値以上のファイルはドラッグ&ドロップのアップロード機能が働きません。
以下は参考にしたissueやPRです。
nginxの設定に関して
nginx
の設定は古いバージョンのDifyでは~/dify/docker/nginx/nginx.conf
の設定を以下の通り修正していました。参考までに残しておきます。
client_max_body_size 150M;
パワーポイントの読み込み
Difyは、現状パワーポイントは、読み込みの対象外なので、libreofficeがインストールされた環境で、以下コマンドでPDFに変換するのが手軽でよいと思います(Ubuntuであれば標準でできると思います)。
$ libreoffice --convert-to pdf --outdir pdf_dir --headless *.pptx
参考記事:【Linux】複数の PowerPoint ファイルを一括で PDF に変換し 1 つの PDF に結合する方法
Slackとの連携
Dify直接にはSlackとの連携機能は今のところなさそうですが、DifyをWeb APIとして使う機能を使えばSlack bot化できそうです。
まだ試してはいないですが、以下のリポジトリ使えばできそうな予感がします。
もしくは、以下の記事の内容を参考にDifyのAPIを叩けば良さそうです。
Slackの設定に関しては以下記事参照ください。
Ollamaとの連携
驚くべきことに、Ollamaとの連携もできます。こちらの記事が参考になりました。
私の場合は、以下の記事の通りDockerでOllamaをインストールしていました。
その場合は、モデルプロバイダーのBase URLは以下の通りとなりました(公式のドキュメントを参照しました)。
http://172.17.0.1:11434
まとめ
DifyのセットアップとRAGを試すところまでを説明しました。
Difyは、多少追加の制約はあるもののApache License 2.0という使いやすいライセンスのOSSで、高機能かつ、手軽で非常に便利なソフトウェアです。
ローカルでもDockerで手軽に構築できるので、ひとまず手元でRAGを試してみたい、色々な手法やモデルを比較したいといった様々な用途に使えると思います。デバッグがしやすいのも良いですね。
参考リンク
関連記事
変更履歴
- 2024/09/05
docker-compose.yaml
の設定をバージョンに合わせて変更
Discussion