🥸

Difyをローカルで動かしてRAGまで試してみる

2024/05/06に公開

Difyを試してみました

Difyが話題だったので、少し試してみました。一言でいうとOSS版の高機能ChatGPTのカスタムGPT(GPTs)でしょうか。より詳しくはnpaka先生の記事を参考にしてください。

ChatGPTの有料版でできること以上のことができます。機能も多機能で、少し触った感じでは完成度も高いように感じました。

クラウド版を使うこともできますし、ローカルで自前でサーバーを立てることもできます。GPTsに比べた分かりやすいメリットある使い道は、容量制限なく手軽にローカルでRAGをクラウドにデータをアップロードできる点でしょうか。

それ以外には、GPT-4以外のClaude 3 OpusなどのLLMも使えたり、細かい設定を切り替えたりできるので、手軽に色々できそうです。ただ、結構できること多いので少し詳しい人向けかもしれません。

Difyのローカルセットアップ方法

クラウド版は、簡単に使えますし他にも解説あると思いますので、この記事ではローカルでの動かし方を説明します。以下が公式サイトとGitHubです。

https://dify.ai/jp

https://github.com/langgenius/dify

セットアップ

DifyはDockerfileが用意されているので、Dockerを使ったことある人であれば、GitHubのREADMEの説明をもとにセットアップすれば動かせると思います。ここでは、少し補足説明と、注意事項を記載します。

OSはLinux前提です。Macだと、色々エラー出ました(一応対応方法は記載します)。Windowsでは試していませんが、おそらくWSL2ならDockerをインストールすれば動くかと思います(すんなりいくかは不明)。

Dockerを知らない人は、以下記事を参考にセットアップと使い方を確認してください。
https://zenn.dev/mkj/articles/292a70b4f4e5e8

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さんの以下の記事の通りですが、少し差があったので差分を中心に記載していきます。
https://note.com/npaka/n/nca849f1a23f1

モデルプロバイダーですが、この記事では「OpenAI」のAPIのみ使います。より高機能なベクトル検索をしたいときは、npakaさん同様「Cohere」のAPIも使用しましょう。

使用する外部知識(ナレッジ)データに関しては、私は自分のTwitterとブログのテキストデータを利用しました。テキストデータの抽出に関しては、以下記事を参考にしてください。

https://zenn.dev/karaage0703/articles/c8baa66c40f9b7

設定は、npakaさんとほぼ同じですが、再ランクモデルのトグルスイッチは無効にしています(有効にするには、CohereのAPIが必要です)。

その他の設定は、npakaさんと同様に進めていきます。

RAGのテスト

とりあえず動かしてみました。

定性的な感覚ですが、デフォルト設定ではうまく対応してくれませんでした。QAの性能が再ランクなどの設定をしていくと性能が変わってくるのかもしれません。

問題切り分けのために、中で何が起っているかもみることができます。

例えば、以下のようにRAGで正しく回答できなかったとします。

原因を調べるためには、問題を切り分ける必要があります。

PDFのテキスト化なのか、ナレッジのベクトル検索なのか、LLMの性能なのか等考えられる原因は様々ですが、GUI画面でナレッジのブロックをクリックすると、以下のようにベクトル検索自体はできているといった途中経過を確認できたりします。

こういった問題の切り分け、中身の確認が手軽にできるのは良いですね。

ナレッジの容量を増大する

デフォルトだと、ナレッジとしてアップロードできるファイルの容量は15MBが最大ですが、これも変更可能です。

具体的には以下2点を実施します。

  1. ~/dify/docker/docker-compose.yamlapienvironmentに例えば150MBにしたいときはUPLOAD_FILE_SIZE_LIMIT: 150を追記します。

  2. ~/dify/docker/docker-compose.yamlnginxenvironmentNGINX_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です。

https://github.com/langgenius/dify/issues/3865

https://github.com/langgenius/dify/issues/496

https://github.com/langgenius/dify/pull/818

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化できそうです。

まだ試してはいないですが、以下のリポジトリ使えばできそうな予感がします。

https://github.com/crazywoola/dify-bot

もしくは、以下の記事の内容を参考にDifyのAPIを叩けば良さそうです。

https://qiita.com/minorun365/items/4c5dba1de7977c386249

Slackの設定に関しては以下記事参照ください。
https://zenn.dev/karaage0703/articles/fcc3dde4ad090a

Ollamaとの連携

驚くべきことに、Ollamaとの連携もできます。こちらの記事が参考になりました。

私の場合は、以下の記事の通りDockerでOllamaをインストールしていました。

https://zenn.dev/karaage0703/articles/c271ca65b91bdb

その場合は、モデルプロバイダーのBase URLは以下の通りとなりました(公式のドキュメントを参照しました)。

http://172.17.0.1:11434

まとめ

DifyのセットアップとRAGを試すところまでを説明しました。

Difyは、多少追加の制約はあるもののApache License 2.0という使いやすいライセンスのOSSで、高機能かつ、手軽で非常に便利なソフトウェアです。

ローカルでもDockerで手軽に構築できるので、ひとまず手元でRAGを試してみたい、色々な手法やモデルを比較したいといった様々な用途に使えると思います。デバッグがしやすいのも良いですね。

参考リンク

https://note.com/shi3zblog/n/necd6de514475

https://qiita.com/akiraabe/items/2b2e856d9bafc6d32440

https://www.m3tech.blog/entry/dify-aws

https://acro-engineer.hatenablog.com/entry/2024/07/09/120000

https://zenn.dev/howdy39/articles/d8e241dc8496f8

https://dify101.com/

https://acro-engineer.hatenablog.com/entry/2024/09/17/120000

https://acro-engineer.hatenablog.com/entry/2024/10/18/120000

関連記事

https://zenn.dev/karaage0703/articles/c8baa66c40f9b7

https://zenn.dev/karaage0703/articles/50a3830046f5fc

変更履歴

  • 2024/09/05 docker-compose.yamlの設定をバージョンに合わせて変更

Discussion