Cladèse documentation

Transcription et IA

Trois étapes qui s'enchaînent : transcrire, résumer, indexer. Chacune est un job du worker, et chacune est facultative.

La chaîne#

ÉtapeMoteurTourne oùProduit
TranscriptionWhisper (openai-whisper, modèle base)Worker, en localleçon.txt à côté du média
RésuméLLM compatible OpenAILà où pointe APP_OPENAI_BASE_URLleçon.md à côté du média
Indexationsentence-transformers ou API d'embeddingsWorker, en local par défautVecteurs dans Qdrant
QuestionEmbeddings + LLMAPIRéponse et citations

Une transcription ou un résumé réussi déclenche automatiquement l'indexation de la leçon. Le résumé exige une transcription prête.

Transcription#

Lancer un traitement est réservé aux administrateurs : les apprenants lisent transcriptions et résumés, et posent leurs questions à l'assistant, mais ne voient pas les boutons qui déclenchent un job.

Bouton Transcrire sous le lecteur ou dans le studio. La langue est détectée par Whisper. Le bouton affiche la progression du job ; la page se met à jour seule quand c'est fini.

En ligne de commande, avec plus de contrôle :

docker compose exec api e-learning-cli list-videos --formation "SQL"
docker compose exec api e-learning-cli transcribe -v <uuid> --model small --language fr --timecodes

Les modèles Whisper plus gros (small, medium) sont plus justes et nettement plus lents sur processeur. Ils sont téléchargés au premier usage.

Résumé#

Bouton Générer, puis Résumé pour l'afficher et Régénérer pour recommencer. Le modèle reçoit la transcription et une consigne : un résumé pédagogique, structuré en Markdown, en français. Un administrateur peut corriger le texte depuis le lecteur.

docker compose exec api e-learning-cli summary -v <uuid>

Assistant de formation#

Assistant : question de l'utilisateur, réponse structurée et sources citées sous la réponse.
  1. La question est transformée en vecteur.
  2. Qdrant renvoie les APP_RAG_TOP_K passages les plus proches, filtrés sur la formation : l'assistant ne voit jamais le contenu d'une autre.
  3. Le LLM reçoit ces passages avec la consigne de répondre uniquement à partir du contexte, et de le dire quand le contexte ne suffit pas.
  4. La réponse revient avec ses sources : titre, type (transcription, résumé, document) et extrait. Un clic ouvre la vidéo ou le document.

Sont indexés : transcriptions, résumés, et le texte des documents PDF, DOCX, Markdown, texte et CSV. Réindexer, dans le panneau de l'assistant, relance l'indexation de toute la formation ; utile après l'ajout de documents. Ou en ligne de commande :

docker compose exec api e-learning-cli index-rag                      # tout
docker compose exec api e-learning-cli index-rag --formation-id <uuid>

Limites à connaître#

Ce qui sort du serveur#

DonnéeConfiguration par défautAvec un fournisseur distant
Fichiers vidéo, audio, documentsRestent sur le serveurRestent sur le serveur
Transcription (Whisper)Calculée dans le workerCalculée dans le worker
EmbeddingsCalculés localement (sentence-transformers)Texte des passages envoyé si APP_EMBEDDING_BASE_URL est renseignée
RésuméTranscription envoyée à APP_OPENAI_BASE_URL (LM Studio local dans le template)Transcription envoyée au fournisseur
Question à l'assistantQuestion et passages retrouvés envoyés à APP_OPENAI_BASE_URLQuestion et passages envoyés au fournisseur

Avec un modèle local et les embeddings par défaut, aucun contenu ne quitte la machine. Seul le premier démarrage télécharge le modèle d'embeddings depuis Hugging Face.

Brancher un modèle#

Le template .env.template vise LM Studio avec openapi/gpt-oss-20b. Les autres lignes sont des exemples : choisissez un modèle adapté à votre machine.

# LM Studio sur l'hôte, serveur démarré sur :1234
APP_OPENAI_BASE_URL=http://host.docker.internal:1234/v1
APP_OPENAI_API_KEY=lm-studio
APP_OPENAI_MODEL=openapi/gpt-oss-20b

# Ollama sur l'hôte (exemple de modèle)
APP_OPENAI_BASE_URL=http://host.docker.internal:11434/v1
APP_OPENAI_API_KEY=ollama
APP_OPENAI_MODEL=qwen3:8b

# Fournisseur distant compatible OpenAI
APP_OPENAI_BASE_URL=https://api.fournisseur.example/v1
APP_OPENAI_API_KEY=…
APP_OPENAI_MODEL=nom-du-modele

Le nom du modèle doit être exactement celui qu'expose le serveur (GET /v1/models).

Dépannage#

Le bouton reste sur « Transcription… » sans avancer
Le worker ne tourne pas, ou ne joint pas RabbitMQ : docker compose logs -f worker. Le premier job télécharge aussi le modèle Whisper.
« Échec de la génération du résumé »
Le point d'accès du LLM est injoignable depuis le conteneur, ou le modèle n'est pas chargé. Testez depuis le conteneur : docker compose exec worker python -c "import os,urllib.request as u; print(u.urlopen(os.environ['APP_OPENAI_BASE_URL']+'/models').read()[:300])"
L'assistant répond qu'il ne trouve rien
La formation n'est pas encore indexée : transcrivez au moins une leçon, ou cliquez sur Réindexer. Après un changement de modèle d'embeddings, réindexez tout.