Hébergement personnel d'un LLM OpenSource pour DiscourseAI

Le plugin Discourse AI possède de nombreuses fonctionnalités qui nécessitent l’activation d’un LLM (Grand Modèle de Langage), comme, par exemple, la Synthèse (Summarization), l’Assistant IA (AI Helper), la Recherche IA (AI Search), le Bot IA (AI Bot). Bien que vous puissiez utiliser une API tierce, comme Configurer les clés d’API pour OpenAI ou Configurer les clés d’API pour Anthropic, nous avons conçu Discourse AI dès le premier jour pour ne pas en être enfermés dans ceux-ci.

Exécution avec HuggingFace TGI

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

Par exemple :

mkdir -p /opt/tgi-cache
docker run --rm --gpus all --shm-size 1g -p 8080:80 \
  -v /opt/tgi-cache:/data \
  ghcr.io/huggingface/text-generation-inference:latest \
  --model-id mistralai/Mistral-7B-Instruct-v0.2

Devrait vous permettre de démarrer une instance locale de Mistral 7B Instruct sur localhost au port 8080, qui peut être testée avec

curl http://localhost:8080/ \
    -X POST \
    -H 'Content-Type: application/json' \
    -d '{"inputs":"\u003cs\u003e[INST] Quel est votre condiment préféré ? [/INST] Eh bien, je suis plutôt adepte d'un bon filet de jus de citron frais. Il ajoute juste la bonne touche de saveur acidulée à tout ce que je cuisine dans la cuisine !\u003c/s\u003e [INST] Avez-vous des recettes de mayonnaise ? [/INST]","parameters":{"max_new_tokens":500, "temperature":0.5,"top_p": 0.9}}'

Exécution avec vLLM

Une autre option pour auto-héberger des LLM que Discourse AI prend en charge est vLLM, qui est un projet très populaire, sous licence Apache License.

Voici comment commencer avec un modèle :

mkdir -p /opt/vllm-cache
docker run --gpus all \
  -v /opt/vllm-cache:/root/.cache/huggingface \
  -e "MODEL=mistralai/Mistral-7B-Instruct-v0.2" \
  -p 8080:8000 --ipc=host vllm/vllm-openai:latest

Que vous pouvez tester avec

curl -X POST http://localhost:8080/v1/completions \
-H "Content-Type: application/json" \
-d '{
"model": "mistralai/Mistral-7B-Instruct-v0.2",
"prompt": "\u003cs\u003e [INST] Quel a été le dernier héros sorti pour Dota 2 ? [/INST] Le dernier héros sorti pour Dota 2 était", "max_tokens": 200}'

Exécution avec Ollama

Ollama est une autre option populaire pour exécuter des modèles open source localement. Il simplifie la gestion des modèles et fournit une API compatible OpenAI.

ollama pull mistral
ollama serve

Ceci démarre un serveur local à http://localhost:11434 auquel Discourse AI peut se connecter en utilisant le fournisseur Ollama.

Le rendre disponible pour votre instance Discourse

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

Configuration de Discourse AI

Les connexions LLM sont désormais configurées via l’interface d’administration plutôt que par les paramètres du site. Naviguez vers /admin/plugins/discourse-ai/ai-llms et ajoutez un nouveau LLM :

  1. Cliquez sur Nouveau (New) pour ajouter un modèle
  2. Sélectionnez un Fournisseur (Provider) — choisissez vLLM, Hugging Face, ou Ollama selon votre serveur d’inférence
  3. Entrez l’URL de votre point de terminaison d’inférence (par exemple, http://votre-serveur:8080)
  4. Entrez une clé d’API (API key) si votre point de terminaison en nécessite une
  5. Remplissez le nom du modèle, le tokenizer, les jetons de prompt maximum (max prompt tokens), et les autres détails du modèle

Une fois votre LLM ajouté, définissez-le comme défaut via le paramètre de site ai_default_llm_model, ou assignez-le à des fonctionnalités spécifiques via sa configuration d’agent dans /admin/plugins/discourse-ai/ai-features.

17 « J'aime »

Pour toute personne recherchant ce sujet avec/pour :
#Llava-Api-keys

J’utilise également vLLM. Je recommanderais également le modèle openchat v3.5 0106, qui est un modèle de 7 milliards de paramètres et qui fonctionne très bien.

Je l’exécute en fait en 4 bits quantifiés pour qu’il s’exécute plus rapidement.

J’attribue cette tâche à un stagiaire. Y a-t-il des recommandations de qui que ce soit sur le service spécifique à souscrire ? Ceci est pour un test. Le stagiaire a actuellement un test configuré avec OpenAI. Cela fonctionne bien. Il/elle souhaite essayer le TGI HuggingFace, mais il semble que je doive lui fournir un serveur dédié avec GPU ? Quelles sont les spécifications minimales pour un test ?

Existe-t-il des liens que je peux donner au stagiaire ?

Je n’ai pas encore examiné ce projet en profondeur. J’anticipe simplement que le stagiaire aura besoin de certaines ressources et j’essaie de faire des recommandations raisonnables sur les services pour que le stagiaire fasse des recherches.

Salut, en exposant avec un certificat auto-signé dans un conteneur vllm sur une boîte GPU sur site, je n’ai pas trouvé de bon moyen d’ajouter le CA racine au conteneur discourse afin qu’il puisse accéder en toute sécurité à ce service sur site via HTTPS.

Par exemple :

./launcher enter app
curl -L https://vllm.infra.example.com/v1/models
curl: (60) Problème de certificat SSL : impossible d'obtenir le certificat de l'émetteur local
Plus de détails ici : https://curl.se/docs/sslcerts.html

curl n'a pas pu vérifier la légitimité du serveur et n'a donc pas pu
établir de connexion sécurisée avec lui. Pour en savoir plus sur cette situation et
comment la résoudre, veuillez visiter la page Web mentionnée ci-dessus.

Existe-t-il un bon moyen d’ajouter un certificat racine auto-signé dans le conteneur discourse qui survivrait aux mises à jour de l’image du conteneur ?

Pour autant que je sache, l’ajouter dans le fichier app.yml

run:
  - exec: wget ... && update-ca-certificates

ne fonctionnerait bien que lors de la construction/reconstruction de l’application.

Toute suggestion est la bienvenue.

14 messages ont été déplacées vers un nouveau sujet : Faire fonctionner discourse ai avec ollama localement

Y aurait-il un moyen d’ajouter un en-tête HTTP personnalisé aux requêtes Discourse AI ? Nous avons un serveur équipé de GPU que nous utilisons à diverses fins, il dispose d’une API compatible avec OpenAI, mais pour des raisons de sécurité, nous l’avons placé derrière une passerelle de gestion d’API, qui nécessite un en-tête HTTP personnalisé (quelque chose comme SubscriptionKey) et nous fournissons notre clé d’authentification ici.

Il est à noter que cette clé d’authentification sert à passer par l’APIM et est différente de la clé d’API que l’on fournirait pour un service tel que l’API OpenAI.

Ce serait formidable s’il existait un moyen d’ajouter des en-têtes personnalisés lors de la configuration de chaque LLM sur la page de configuration admin/plugins/discourse-ai/ai-llms. Peut-être une option « Personnalisée » dans le menu déroulant « Fournisseur », avec des options supplémentaires pour des cas d’utilisation comme celui-ci ?

1 « J'aime »

La réponse rapide est un plugin pour ajouter cet en-tête. Une solution de contournement pourrait être un serveur proxy local que vous atteindriez depuis Discourse et qui ajouterait l’en-tête et renverrait les données à Discourse. Une source non fiable suggère que vous pourriez être en mesure de demander à NGINX de faire cela pour vous avec quelque chose comme

server {
    listen 80;
    
    location / {
        proxy_pass https://api.example.com;
        proxy_set_header SubscriptionKey xyz;
        proxy_set_header Host $host;
    }
}

Il pourrait y avoir une façon astucieuse d’ajouter cela à la configuration nginx de Discourse à un chemin secret (qui n’écouterait également que votre serveur).

1 « J'aime »

Bonjour,

Je ne parviens pas à trouver ces paramètres :

Avez-vous des suggestions pour tester la fonctionnalité de traduction IA avec un backend Ollama ?

Créez un nouveau LLM à /admin/plugins/discourse-ai/ai-llms/new?llmTemplate=none, sélectionnez OpenAI comme fournisseur car Ollama prend en charge la compatibilité avec l’API OpenAI : OpenAI compatibility - Ollama.

1 « J'aime »

Merci ! J’ai également remarqué que l’URL ne fonctionne que lorsque le plugin IA est activé :person_facepalming:

Pour le fournisseur nouvellement ajouté, avez-vous des suggestions sur ce qu’il faut choisir/configurer pour les paramètres obligatoires suivants ?

  1. Tokenizer
  2. Fenêtre de contexte

Pour le modèle, je pensais peut-être utiliser stablelm2:1.6b ou translategemma:4b, mais je ne suis pas encore sûr.
Dans le README de ce dernier, il y a une description d’un prompt d’entrée. Je me demande quelle est la requête que la fonctionnalité de traduction IA envoie à Ollama. cf. /admin/plugins/discourse-ai/ai-agents/-28/edit

:sweat_smile:

Le plus proche du modèle que vous choisirez. Pour Gemma, vous pouvez choisir celui de Gemini.

Ici, vous définissez le contexte maximal de votre déploiement.

S’il vous plaît, ne le faites pas. Ce modèle est très très très très très ancien. C’est le pire choix que vous puissiez faire.

Ce modèle est d’une génération en retard et a des exigences de prompt très strictes qui ne sont pas compatibles avec Discourse. Nous attendons un LLM d’utilisation générale plus standard.

Pour ces tailles, je recommande soit Qwen 3.5, soit Gemma 4.

3 « J'aime »

Merci encore. J’ai configuré les paramètres, récupéré le modèle, ajusté l’agent et activé la fonctionnalité de traduction IA. On verra bien ce que ça donne.

Autre question. Nous utilisions auparavant le plugin de traduction avec une instance LibreTranslate mise à disposition de manière très généreuse. Est-il impossible de connecter la fonctionnalité de traduction IA de Discourse à ce point de terminaison LibreTranslate ? Au final, ce serait bien plus simple que d’héberger une instance Ollama sur un serveur sans véritables capacités de LLM.

Pourquoi ne pas continuer à l’utiliser ? Nous ne le mettons plus à jour, mais il continuera de fonctionner tel quel.

La traduction de Discourse AI fonctionne avec un ensemble de contraintes entièrement différent de celui du plugin de traduction original, nous l’avons donc reconstruite de zéro pour répondre à ce nouveau monde, où les traductions basées sur les LLM sont meilleures et moins chères que ce qui était possible auparavant avec les API de traduction ML.

1 « J'aime »