Difyを使ったchatbotをローカルサーバーからデプロイしてみた

2024/09/30に公開

大きなgithubリポジトリのQ&Achatbotができたらいいなと思い、Difyでchatbotを作ってみました。

今回は自動運転ソフトウェアのAutowareのchatbotに挑戦しました。
https://github.com/autowarefoundation/autoware

Difyの使い方は色んな人がテックブログやyoutubeで解説しています。自分はこれを見ました。めちゃわかりやすいです。
https://www.youtube.com/watch?v=O_bmmDWIjTc&t=2050s

Difyでは、KnowledgeというタブでRAGが簡単に使えます。
RAGは一回の入力に収めることができないほどのデータからいい感じの部分を抽出して、入力にするみたいなやつです(詳細は詳しい人にまかせる。。。)。
alt text

RAGを使うことによって、chatbotが大きなgithubリポジトリを参照できるようになるわけですね。

ということで、AutowareのソースコードをまるごとRAGに入れればいいのかー。テキトーにAWSとかからデプロイすればみんな使えてハッピーとか思ってました(AWSはほとんど使ったことないですが)。

ところが、ちょいちょい問題発生したのでそこらへんを書いときます。

Knowledgeにアップロードできるデータ量の上限が15MB

Difyが提供するクラウド上でchatbotを作ることもできるのですが、ローカルでも同じことができるみたいなのでローカルでやりました。

今回参照したAutowareのコードは、gpt-repository-loaderを使って1つのファイルにしました。
vcs importをしたあとのAutowareに対して実行したところ1GB弱のテキストファイルができました。
https://github.com/mpoon/gpt-repository-loader

このテキストファイルをアップロードすればいいのかとおもいきや、Knowledgeのデータ量は15MBに制限されていて、15MB以上のファイルをアップロードすることができません。クラウド版は課金すれば上限を増やせます。
alt text

Difyのアップデート頻度が高く、ちょいちょい対処方法が変わっているみたいなのですが、
.envのUPLOAD_FILE_SIZE_LIMITNGINX_CLIENT_MAX_BODY_SIZE、nginx.confのclient_max_body_sizeを変えればいけました(これは後ほど修正される?)。

参考:
https://github.com/langgenius/dify/discussions/8277
https://github.com/langgenius/dify/issues/3865

各環境変数の設定は、ここに書いてあってわかりやすいです。
https://docs.dify.ai/v/ja-jp/getting-started/install-self-hosted/environments

Knowledgeのアップロードが固まる

先程の手順で上限を1.5GB程度まで上げて、1GBのファイルのアップロードもできるようになったのですが、embedding processで固まってしまいました。ここちょっと時間を消費したのですが、
結論から言うと固まっているように見えるだけで、処理自体はしてくれているぽいです。
しかし、ここでSave&Processを連打したりするとその分処理が追加されて悪化します。そうなってしまった場合は、docker compose stopして再起動したほうがいいです。
alt text

autoware.txt全体をembeddingしようとするとかなり時間がかかるので、とりあえずAutowareのPlanningコンポーネントだけを使いました。150MBぐらいです(わざわざ1つのファイルにまとめる必要はないのですが、なんとなくまとめていました)。これでもembedding processに2~3時間かかった気がします。

自分は落ち着けずがちゃがちゃやって、API呼び出しのレートリミットを超えちゃうことがあったので、焦らず落ち着いて待った方がいいです。

Knowledgeがエクスポートできない

AWSでデプロイしようとしてた自分にはこれが一番でかかったです。
https://github.com/langgenius/dify/discussions/4394

つまり、embeddingの処理をクラウドでやる必要があるため、その分メモリも用意する必要があるわけです。さすがに安いプランの2GBのメモリで処理していたら、embedding processが全然終わらない気がしたのでここで、ローカルデプロイに変更しました(試したわけではないので、できるかもしれません)。

ローカルでデプロイする方法はこれが参考になります。
https://akkyorz.hatenablog.com/entry/2022/12/15/012728

CloudFlare Tunnelを使ってやってできました。
localhost:80でうまくいかなくて、localhost:8080だとうまくいったので.envのEXPOSE_NGINX_PORTを80から8080に変えておきます。
独自ドメイン経由でDifyを開くとこんな感じで、独自ドメインでアプリがデプロイできそうな感じになっていて、このリンクを共有すれば他の人でもchatbotにアクセスすることができるようになります。

alt text

それ以外の編集画面ではDifyログインが必要になるので外部の人はアクセスできなくなるわけですね。

こんな感じで、ちょいちょい躓きましたが無事にローカルでデプロイできました。終わってみれば以外と簡単にできたかもです。
Difyの限界として、上記以外にもループみたいなフローが組みづらいというのもあるっぽいです。

具体的にいうと、open interpreterみたいなエージェントを作ろうとすると結構難しいかもです。
alt text
open interpreterの構造

open interpreterはこちらが詳しいです(こちらの図をお借りしました)。
https://tech.every.tv/entry/2023/10/11/152257

エージェントのテンプレートもそんなに多くないので、これからなのかもですね。
alt text

余談ですが、DifyのPRで動いているbot中々いい感じだなーと思いました。これ使ってみたいですね。
https://github.com/langgenius/dify/issues/3865#issuecomment-2078539228

GitHubで編集を提案

Discussion