Hébergement local des Embeddings pour DiscourseAI

Le plugin Discourse AI possède de nombreuses fonctionnalités qui nécessitent des intégrations (embeddings) pour fonctionner, telles que Sujets similaires, Recherche IA, Aide IA, Suggestion de catégories et de tags, 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 lié à ceux-ci.

Exécuter avec HuggingFace TEI

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

Par exemple :

mkdir -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

Ceci devrait vous permettre de démarrer avec 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 -X POST \
  'http://localhost:8081/embed' \
  -H 'Content-Type: application/json' \
  -d '{ "inputs": "Testing string for embeddings" }'

Ce qui devrait retourner un tableau de flottants en fonctionnement normal.

Le rendre disponible pour votre instance Discourse

La plupart du temps, vous l’exécuterez sur un serveur dédié en raison de l’accélération par GPU. Lorsque vous le faites, je vous recommande d’exécuter un proxy inverse, d’effectuer 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 utilise désormais un système de définition d’intégration entièrement configurable, similaire à la façon dont les LLM sont configurés. Pour configurer votre point de terminaison auto-hébergé :

  1. Naviguez vers Admin → Plugins → Discourse AI → Embeddings.
  2. Cliquez sur New pour créer une nouvelle définition d’intégration.
  3. Sélectionnez un preset qui correspond à votre modèle (par exemple, bge-large-en, bge-m3, ou multilingual-e5-large), ou choisissez Configure manually pour tout autre modèle.
  4. Définissez l’URL pour pointer vers votre serveur TEI auto-hébergé (par exemple, https://your-tei-server:8081).
  5. Utilisez le bouton Test pour vérifier la connectivité avant d’enregistrer.
  6. Après l’enregistrement, définissez ai_embeddings_selected_model sur votre nouvelle définition d’intégration.

Une fois configuré, Discourse remplira automatiquement les intégrations pour les sujets existants via une tâche de fond planifiée. Si vous avez un grand nombre de sujets en attente, vous pouvez augmenter le paramètre masqué ai_embeddings_backfill_batch_size (par défaut : 250) pour traiter les sujets plus rapidement.

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.