DiscourseAIのための自己ホスティング埋め込み

Discourse AI プラグインには、Related Topics、AI Search、AI Helper Category、Tag suggestion など、埋め込みを必要とする多くの機能があります。サードパーティの API を使用することもできますが、OpenAI の API キーの設定Cloudflare Workers AI の API キーの設定、または Google Gemini の API キーの設定 などですが、Discourse AI は初日からそれらにロックインされないように構築されています。

HuggingFace TEI を使用した実行

HuggingFace は、すぐに実行できる素晴らしいコンテナイメージを提供しています。

例:

mkd ir -p /opt/tei-cache
docker run --rm --gpus all --shm-size 1g -p 8081:80 \
  -v /opt/tei-cache:/data \
  ghcr.io/huggingface/text-embeddings-inference:latest \
  --model-id BAAI/bge-large-en-v1.5

これにより、非常にパフォーマンスの高いオープンソースモデルである BAAI/bge-large-en-v1.5 のローカルインスタンスをすぐに実行できるようになります。

以下を使用して動作を確認できます。

curl http://localhost:8081/ \
    -X POST \
    -H 'Content-Type: application/json' \
    "{ \"inputs\": \"Testing string for embeddings\" }"

通常どおり動作していれば、浮動小数点数の配列が返されるはずです。

Discourse インスタンスで利用可能にする

GPU の高速化のため、ほとんどの場合、専用サーバーで実行することになります。その場合、リバースプロキシを実行し、TLS 終端を行い、Discourse インスタンスのみが接続できるようにエンドポイントを保護することをお勧めします。

DiscourseAI の設定

Discourse AI には、オープンソースモデルの推論サーバーを設定するためのサイト設定が含まれています。AI プラグインの管理設定の Embeddings タブを使用して、サーバーを指定する必要があります。

「いいね!」 11

bge-m3 モデルは多言語(または英語以外の)サイトでも機能しますか?

はい、GitHubでサイレントに共有された週にそれを試しましたが、うまく機能しました。最後に確認したときにはMTEBリーダーボードに載っていなかったので、どのようにランクインするかまだ待っています。

とはいえ、多言語プラグインが出荷された大規模なホスト型Discourseインスタンスでe5を使用しており、非常にうまく機能しています。

「いいね!」 1

埋め込み用のオープンソースカスタムエンドポイントを有効にする予定はありますか? Huggingfaceでこれらのモデルを使用しようとしています。

申し訳ありませんが、何を伝えようとしているのか理解できません。このトピックは、Discourse AI の埋め込み用にオープンソースモデルを実行する方法に関するガイドです。

ああ、すみません。HuggingFace のカスタムエンドポイントからオープンソースモデルを使用しようとしていますが、それが可能かどうか、または近い将来に有効にする予定があるかどうか疑問に思っています :slight_smile:

動作を確認するには、次のコマンドが機能します(BAAI/bge-m3 モデルを使用)。

curl -X 'POST' \
  'http://localhost:8081/embed' \
  -H 'Content-Type: application/json' \
  -d '{ "inputs": "Testing string for embeddings"}'

ちなみに、Swagger Web インターフェイス(http://localhost:8081/docs/)も使用できます。

「いいね!」 2

これも良い埋め込みサーバーです。

「いいね!」 1

容量を節約するために、量子化された埋め込みを使用することは可能ですか?ストレージサイズを大幅に削減するために、バイナリ量子化された埋め込みを使用したいと思います。いくつかのテストを行ったところ、ストレージサイズが32分の1で90%以上のパフォーマンスが得られました!

「いいね!」 1

数週間前からデフォルトで、埋め込みを半精度(ストレージスペース半減)で保存し、インデックスにバイナリ量子化(32倍縮小)を使用しているため、サイトを最新の状態に更新するだけで、ディスク使用量を大幅に削減できます。

「いいね!」 3

サポートされている埋め込みモデルに以下を追加していただけますでしょうか。

埋め込みもLLMと同じように設定可能にする予定ですので、まもなくどのモデルでも互換性を持つようになります。

「いいね!」 4

ローカルネットワーク上のエンドポイント(例:192.168.x.x)で問題が発生している場合は、Discourseによってブロックされているようです(おそらくセキュリティ上の理由から)。このブロックを回避する必要があります。この問題の解決に数時間費やしました!

「いいね!」 1

@Falco それは素晴らしいでしょう。それまでの間、新しい埋め込みモデルを追加したい場合、追加する必要があるのは次のとおりですか?

 lib/embeddings/vector_representations/mxbai-embed-xsmall-v1.rb
 lib/tokenizer/mxbai-embed-xsmall-v1.rb
 tokenizers/mxbai-embed-xsmall-v1.json

そして、新しいモデルを含めるように lib/embeddings/vector_representations/base.rb を変更する必要がありますか、それとも他に何か変更する必要がありますか?

@Falco モデルを追加しようとプルリクエストを送信しました。SW開発者ではないので、何か間違っていたら申し訳ありません。確認して、含めるのに問題ないか見ていただけますでしょうか。

残念ながら、TEIで動作させることはできませんでした。all-mpnetはTEIで動作させることができましたが、mxbaiを動作させるために行ったことには何か問題があると思います。

ところで、https://github.com/michaelfeil/infinity を埋め込みサーバーとしてサポートする可能性はありますか?

編集:HNSWインデックスがデータベースにハードコードされているようで、順序を乱さないように新しいモデルは最後に追加する必要があり、各新しいモデルは独自のインデックスを追加する必要があるため、これは乱雑になりそうです。

設定可能な埋め込みのサポートが出荷されるまで、数週間待つことを 強く お勧めします。

これは、設定可能な埋め込みが出荷されると正常に機能するはずですが、好奇心から、GitHub - huggingface/text-embeddings-inference: A blazing fast inference solution for text embeddings models を超えるものは何をもたらしますか?

TEIについては最近まで把握していなかったので、最近テストしていない利点については言及しませんが、最近見たものの中では以下の点が挙げられます。

  • ハードウェアサポート:infinityはTEIよりも優れたGPUサポートを提供します。
  • infinityサーバーは、単一のサーバーで複数の埋め込みモデルをホストできます(TEIで見落とした場合を除く)。

これは非常に素晴らしいです。試したことがない場合は、ぜひ見てみてください!

「いいね!」 1

友人がこのスレッドをDMで送ってきました。

長所/短所:

  • Infinityはマルチモーダル埋め込み(画像/音声の送信)をサポートしています。
  • AMD GPUのサポート
  • 1つのコンテナで複数のモデルをサポート(modelパラメータでモデルを制御)。
  • より多くのデータ型、例えば重みのint8量子化(これはほとんどの場合無関係で、アクティベーションメモリの方が大きいです)。
  • Huggingfaceリポジトリで出荷される「カスタムモデリングコード」を通じて新しいモデルが頻繁にリリースされます。Infinityは必要に応じてこのPyTorchコードを読み取ります。これにより、「XYZモデルをサポートできますか」という問い合わせが継続的に発生するのを回避できます。
  • より多くのモデルをサポート(例:MixedBreadのdebertav2)。

短所:

  • TEIのコールドスタート時間は改善されました。
「いいね!」 3

こんにちは、Michaelさん :wave:

@roman が、以下の場所でエンベディング設定の再構築に取り組んでいます。

それが完了すれば、infinity のサポートを追加するのは非常に簡単になるはずです。

マルチモデルエンベディングについては、PDF で RAG を実行しようとする際に、PDF を画像に処理し、各画像をエンベッドすることで、OCR や高価な LLM による画像からテキストへの変換を回避できるため、ショートカットになると思っています。

この PR が完了したら、エンベディング設定に infinity サポート(およびマルチモデルサポート)を追加できることを嬉しく思います。

お立ち寄りいただきありがとうございます :hugs:

「いいね!」 4

litellm のサポートを構築することで、litellm を介してサポートされているすべてのモデルの恩恵を受けることができる近道になるのではないかと思います。他のプロジェクトでもこれを組み込んでいるようです。