Hébergement auto pour Embeddings pour DiscourseAI

Le plugin Discourse AI possède de nombreuses fonctionnalités qui nécessitent des embeddings pour fonctionner, telles que les sujets connexes, la recherche par IA, la suggestion de catégories et d’étiquettes par l’assistant IA, etc. Bien que vous puissiez utiliser une API tierce, comme Configurer les clés API pour OpenAI, Configurer les clés API pour Cloudflare Workers AI ou Configurer les clés API pour Google Gemini, nous avons conçu Discourse AI dès le premier jour pour ne pas être limité à ceux-ci.

Exécution avec HuggingFace TEI

HuggingFace fournit une image de conteneur impressionnante qui peut vous permettre de démarrer rapidement.

Par exemple :

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

Cela devrait vous permettre de démarrer rapidement une instance locale de BAAI/bge-large-en-v1.5, un modèle open-source très performant.
Vous pouvez vérifier si cela fonctionne avec

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

Ce qui devrait renvoyer un tableau de nombres flottants en fonctionnement normal.

Rendre disponible pour votre instance Discourse

La plupart du temps, vous exécuterez cela sur un serveur dédié en raison de l’accélération GPU. Lorsque vous le faites, je recommande d’exécuter un proxy inverse, de faire la terminaison TLS et de sécuriser le point de terminaison afin qu’il ne puisse être connecté que par votre instance Discourse.

Configuration de DiscourseAI

Discourse AI inclut des paramètres de site pour configurer le serveur d’inférence pour les modèles open-source. Vous devriez le pointer vers votre serveur en utilisant l’onglet Embeddings dans les paramètres d’administration du plugin AI.

11 « J'aime »

Le modèle bge-m3 devrait-il fonctionner pour les sites multilingues (ou non anglais) ?

Oui, j’ai joué avec la semaine où il a été partagé silencieusement sur GitHub et cela fonctionne bien. J’attends toujours de voir comment il atterrit dans les classements MTEB, car il n’y était pas la dernière fois que j’ai regardé.

Cela dit, nous avons de grandes instances Discourse hébergées qui utilisent le plugin multilingue qu’il expédie, e5, et il fonctionne très bien.

1 « J'aime »

Merci, avez-vous prévu d’activer des points d’accès personnalisés open-source pour les intégrations ? J’essaie d’utiliser ces modèles sur Huggingface.

Désolé, je ne comprends pas ce que vous essayez de communiquer ici. Ce sujet est un guide sur la façon d’exécuter des modèles open-source pour les intégrations Discourse AI.

Oh, désolé pour ça. J’essaie d’utiliser un modèle open-source à partir d’un point de terminaison personnalisé HuggingFace et je me demande si c’est possible ou si c’est prévu pour être activé dans un avenir proche :slight_smile:

Pour vérifier si cela fonctionne, la commande suivante fonctionne pour moi (avec le modèle BAAI/bge-m3) :

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

Au fait, vous pouvez également utiliser l’interface Web Swagger à l’adresse http://localhost:8081/docs/.

2 « J'aime »

Ceci est également un bon serveur d’intégration :

1 « J'aime »

Pour économiser de l’espace, est-il possible d’utiliser des embeddings quantifiés ? J’aimerais utiliser des embeddings quantifiés binaires pour réduire considérablement la taille de stockage. Après quelques tests, j’obtiens plus de 90 % des performances avec 32 fois moins de stockage !

1 « J'aime »

Nous stockons les embeddings en demi-précision (demi-espace de stockage) et utilisons la quantification binaire pour les index (32 fois plus petits) par défaut depuis quelques semaines, donc une simple mise à jour de votre site vers la dernière version devrait vous permettre de réduire considérablement l’utilisation du disque.

3 « J'aime »

Pourriez-vous également ajouter :

aux modèles d’intégration pris en charge ?

Nous prévoyons de rendre les embeddings configurables de la même manière que nous l’avons fait avec les LLM, de sorte que tout modèle sera bientôt compatible.

4 « J'aime »

Si d’autres personnes rencontrent des problèmes avec les points de terminaison sur le réseau local, par exemple 192.168.x.x, il semble qu’ils soient bloqués par Discourse (vraisemblablement pour des raisons de sécurité) et que le blocage doive être contourné. J’ai perdu quelques heures à comprendre cela !

1 « J'aime »

@Falco, ce serait formidable. Entre-temps, si je voulais essayer d’ajouter un nouveau modèle d’intégration, dois-je simplement ajouter :

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

et modifier lib/embeddings/vector_representations/base.rb pour inclure le nouveau modèle, ou y a-t-il autre chose que je doive changer ?

@Falco J’ai essayé d’ajouter le modèle et j’ai envoyé une pull request. Mes excuses si j’ai fait quelque chose de mal, car je ne suis pas vraiment un développeur logiciel. J’espérais que vous pourriez peut-être y jeter un œil et voir si c’est acceptable pour inclusion.

Malheureusement, je n’ai pas réussi à le faire fonctionner avec TEI. J’ai pu faire fonctionner all-mpnet avec TEI, mais je pense qu’il y a quelque chose qui ne va pas dans ce que j’ai fait pour faire fonctionner mxbai.

Au fait, y a-t-il une chance de supporter https://github.com/michaelfeil/infinity comme serveur d’intégration ?

EDIT : Je vois que cela va être compliqué car les index HNSW dans la base de données semblent être codés en dur, donc de nouveaux modèles doivent être ajoutés à la fin pour éviter de perturber l’ordre et chaque nouveau modèle doit ajouter son propre index.

Je recommande vraiment d’attendre quelques semaines jusqu’à ce que nous lancions la prise en charge des embeddings configurables.

Cela devrait fonctionner correctement lorsque nous lancerons les embeddings configurables, mais par curiosité, qu’apporterait cela par rapport à GitHub - huggingface/text-embeddings-inference: A blazing fast inference solution for text embeddings models ?

Je n’ai pas suivi TEI, donc je ne mentionnerai pas les avantages que je n’ai pas testés récemment, mais parmi les choses que j’ai vues récemment :

  • Prise en charge matérielle : infinity a une meilleure prise en charge GPU que TEI
  • Le serveur infinity peut héberger plusieurs modèles d’intégration sur un seul serveur (sauf si j’ai manqué cela dans TEI)

C’est très bien. Si vous ne l’avez pas essayé, vous devriez y jeter un coup d’œil !

1 « J'aime »

Un ami vient de m’envoyer ce fil de discussion par DM.

Quelques Pour/Contre :

  • infinity prend en charge les embeddings multimodaux (c’est-à-dire l’envoi d’images/audio)
  • prise en charge des GPU AMD
  • plusieurs modèles pris en charge dans le même conteneur (contrôlez le modèle via le paramètre model).
  • plus de dtypes, par exemple la quantification int8 des poids (principalement cela est sans importance, la mémoire d’activation est plus grande)
  • de nouveaux modèles sortent souvent via du “code de modélisation personnalisé” expédié dans le dépôt huggingface. Infinity lit ce code pytorch si nécessaire. Cela vous évitera d’avoir à demander en permanence “pouvez-vous prendre en charge les modèles xyz”)
  • plus de modèles pris en charge (par exemple, debertav2 pour mixedbread)

Contre :

  • le temps de démarrage à froid de TEI est meilleur
3 « J'aime »

Salut Michael :wave:

@roman a été occupé à restructurer notre configuration d’intégration à :

Nous devrions avoir terminé très, très bientôt, une fois cela fait, l’ajout du support pour infinity sera trivial.

Je pense toujours beaucoup à l’intégration multi-modèle, elle vous donne un raccourci lorsque vous essayez de faire du RAG sur des PDF car vous le traitez simplement en images et intégrez chaque image, évitant ainsi le besoin d’OCR ou d’un coûteux traitement d’image en texte alimenté par LLM.

Une fois que nous aurons terminé ce PR, nous serons plus qu’heureux d’ajouter le support infinity (et le support multi-modèle) à la configuration d’intégration.

Merci d’être passé :hugs:

4 « J'aime »

Je me demande si la prise en charge de litellm pourrait offrir un raccourci, car vous bénéficiez alors de tous les modèles pris en charge via litellm. D’autres projets semblent l’intégrer.