Difyを使ったchatbotをローカルサーバーからデプロイしてみた
大きなgithubリポジトリのQ&Achatbotができたらいいなと思い、Difyでchatbotを作ってみました。
今回は自動運転ソフトウェアのAutowareのchatbotに挑戦しました。
Difyの使い方は色んな人がテックブログやyoutubeで解説しています。自分はこれを見ました。めちゃわかりやすいです。
Difyでは、KnowledgeというタブでRAGが簡単に使えます。
RAGは一回の入力に収めることができないほどのデータからいい感じの部分を抽出して、入力にするみたいなやつです(詳細は詳しい人にまかせる。。。)。
RAGを使うことによって、chatbotが大きなgithubリポジトリを参照できるようになるわけですね。
ということで、AutowareのソースコードをまるごとRAGに入れればいいのかー。テキトーにAWSとかからデプロイすればみんな使えてハッピーとか思ってました(AWSはほとんど使ったことないですが)。
ところが、ちょいちょい問題発生したのでそこらへんを書いときます。
Knowledgeにアップロードできるデータ量の上限が15MB
Difyが提供するクラウド上でchatbotを作ることもできるのですが、ローカルでも同じことができるみたいなのでローカルでやりました。
今回参照したAutowareのコードは、gpt-repository-loaderを使って1つのファイルにしました。
vcs importをしたあとのAutowareに対して実行したところ1GB弱のテキストファイルができました。
このテキストファイルをアップロードすればいいのかとおもいきや、Knowledgeのデータ量は15MBに制限されていて、15MB以上のファイルをアップロードすることができません。クラウド版は課金すれば上限を増やせます。
Difyのアップデート頻度が高く、ちょいちょい対処方法が変わっているみたいなのですが、
.envのUPLOAD_FILE_SIZE_LIMIT
とNGINX_CLIENT_MAX_BODY_SIZE
、nginx.confのclient_max_body_size
を変えればいけました(これは後ほど修正される?)。
参考:
各環境変数の設定は、ここに書いてあってわかりやすいです。
Knowledgeのアップロードが固まる
先程の手順で上限を1.5GB程度まで上げて、1GBのファイルのアップロードもできるようになったのですが、embedding processで固まってしまいました。ここちょっと時間を消費したのですが、
結論から言うと固まっているように見えるだけで、処理自体はしてくれているぽいです。
しかし、ここでSave&Processを連打したりするとその分処理が追加されて悪化します。そうなってしまった場合は、docker compose stop
して再起動したほうがいいです。
autoware.txt全体をembeddingしようとするとかなり時間がかかるので、とりあえずAutowareのPlanningコンポーネントだけを使いました。150MBぐらいです(わざわざ1つのファイルにまとめる必要はないのですが、なんとなくまとめていました)。これでもembedding processに2~3時間かかった気がします。
自分は落ち着けずがちゃがちゃやって、API呼び出しのレートリミットを超えちゃうことがあったので、焦らず落ち着いて待った方がいいです。
Knowledgeがエクスポートできない
AWSでデプロイしようとしてた自分にはこれが一番でかかったです。
つまり、embeddingの処理をクラウドでやる必要があるため、その分メモリも用意する必要があるわけです。さすがに安いプランの2GBのメモリで処理していたら、embedding processが全然終わらない気がしたのでここで、ローカルデプロイに変更しました(試したわけではないので、できるかもしれません)。
ローカルでデプロイする方法はこれが参考になります。
CloudFlare Tunnelを使ってやってできました。
localhost:80でうまくいかなくて、localhost:8080だとうまくいったので.envのEXPOSE_NGINX_PORT
を80から8080に変えておきます。
独自ドメイン経由でDifyを開くとこんな感じで、独自ドメインでアプリがデプロイできそうな感じになっていて、このリンクを共有すれば他の人でもchatbotにアクセスすることができるようになります。
それ以外の編集画面ではDifyログインが必要になるので外部の人はアクセスできなくなるわけですね。
こんな感じで、ちょいちょい躓きましたが無事にローカルでデプロイできました。終わってみれば以外と簡単にできたかもです。
Difyの限界として、上記以外にもループみたいなフローが組みづらいというのもあるっぽいです。
具体的にいうと、open interpreterみたいなエージェントを作ろうとすると結構難しいかもです。
open interpreterの構造
open interpreterはこちらが詳しいです(こちらの図をお借りしました)。
エージェントのテンプレートもそんなに多くないので、これからなのかもですね。
余談ですが、DifyのPRで動いているbot中々いい感じだなーと思いました。これ使ってみたいですね。
Discussion