| Composant | Spécification |
|---|---|
| Serveur Moodle | Machine Linux (Debian/Ubuntu) avec Docker et Docker Compose |
| GPU / Serveur IA | GPU avec minimum 24 Go de VRAM. Nécessaire pour faire tourner le modèle de langage. |
| Réseau | Les deux machines doivent pouvoir communiquer (réseau local ou VPN type Tailscale). |
| Logiciel | Version minimale | Rôle |
|---|---|---|
| Moodle | 4.1+ | Plateforme LMS |
| PHP | 8.0+ | Exécution du plugin |
| vLLM | 0.19+ | Serveur d'inférence IA, API compatible OpenAI |
| pdftotext (optionnel) | -- | Extraction du contenu des fichiers PDF |
/local/dreamu_qcm/local/dreamu_qcm:generateLe QCM Generator est un plugin Moodle qui génère automatiquement des questions d'examen à partir du contenu d'un cours. L'enseignant sélectionne les ressources (pages, documents, fichiers PDF), choisit les types de questions et la difficulté, et l'IA produit des questions prêtes à être importées dans un quiz Moodle.
L'IA tourne entièrement en local sur l'infrastructure de l'IUT (DGX Spark). Aucune donnée n'est envoyée à un service externe.
Mme Yahi prépare un examen pour son cours Python. Plutôt que de rédiger 20 questions manuellement, elle ouvre le QCM Generator, sélectionne les chapitres concernés, et obtient 20 questions diversifiées en moins d'une minute. Elle les relit, modifie celles qui ne lui conviennent pas, et crée un quiz en un clic.
La génération de questions se fait via un assistant en 3 étapes qui guide l'enseignant.
L'enseignant sélectionne les ressources du cours à utiliser comme source. Toutes les ressources sont affichées par section avec des icônes : pages, documents, fichiers, devoirs. Un bouton "Prévisualiser le contenu" permet de voir exactement ce que l'IA recevra, avec le nombre de caractères, mots et tokens estimés.

L'enseignant choisit le nombre de questions par type, la difficulté, et peut ajouter des instructions spécifiques.
| Type de question | Description |
|---|---|
| Choix multiples (QCM) | 4 options A/B/C/D, une seule bonne réponse |
| Vrai / Faux | Affirmation à valider ou invalider |
| Réponse courte | L'étudiant tape une réponse texte (avec synonymes acceptés) |
| Correspondance | Associer des termes à leurs définitions (4 à 6 paires) |
| Numérique | L'étudiant entre un nombre (avec tolérance configurable) |
Niveaux de difficulté :

L'enseignant peut cibler précisément les compétences évaluées. Par exemple : "Génère des questions uniquement sur les statistiques descriptives (moyenne, médiane, écart-type). Ne pas inclure de probabilités."
Avant de lancer la génération, un résumé affiche : le nombre total de questions, les types choisis, la difficulté, le nombre de ressources sélectionnées, et les instructions spécifiques. L'enseignant confirme ou revient en arrière pour ajuster.

Pendant la génération, une barre de progression animée indique le type en cours de génération, le pourcentage et le temps restant estimé.
Avant de générer, l'enseignant peut prévisualiser exactement le texte que l'IA recevra. Une fenêtre modale affiche le contenu extrait avec des statistiques : nombre de caractères, de mots et estimation du nombre de tokens.
Cela permet de vérifier que le contenu est suffisant et pertinent. Si le cours contient des fichiers PDF, leur texte est extrait automatiquement (si pdftotext est installé).

Après la génération, les questions sont affichées dans une page de review organisée par sessions et par date. Chaque question affiche son type (badge coloré), sa difficulté, son statut (En attente / Approuvée / Importée) et son statut de vérification.

Les questions sont groupées par date ("Aujourd'hui", "Hier", ou la date complète) puis par session de génération (fenêtre de 5 minutes). Chaque session est repliable et affiche l'heure, le nombre de questions et les types générés.
L'enseignant peut modifier directement chaque question sans quitter la page de review. Un clic sur le texte le transforme en champ éditable. La modification est sauvegardée instantanément via AJAX (fond vert = sauvegardé).
Champs éditables :

En haut de la page review, trois filtres permettent d'afficher uniquement les questions souhaitées :
Les filtres agissent en temps réel (JavaScript) sans rechargement de page.
Quand l'option est activée (étape 2 du wizard), un second appel IA vérifie chaque question générée. Le vérificateur compare la question et sa réponse au contenu du cours pour détecter :
Résultat : chaque question reçoit un badge Vérifié ou Non vérifié. Les questions non vérifiées affichent la raison du rejet en rouge sous la question.
L'IA génère la question "Quelle est la médiane de {2, 4, 6} ?" avec la réponse "3".
Le vérificateur détecte l'erreur : "La médiane de {2, 4, 6} est 4, pas 3. La médiane est la valeur centrale de la série ordonnée."
La question est marquée Non vérifié et l'enseignant peut la corriger ou la régénérer.
Chaque question générée inclut une explication pédagogique. Quand la question est importée dans un quiz Moodle, cette explication apparaît automatiquement :
Question : "Quel indicateur mesure la dispersion des données autour de la moyenne ?"
Étudiant répond : "La médiane" (faux)
Feedback : "Incorrect. La bonne réponse était : L'écart-type. L'écart-type mesure la dispersion des valeurs autour de la moyenne arithmétique. La médiane, elle, mesure la tendance centrale."
Si une question ne convient pas, l'enseignant peut la régénérer individuellement en un clic (bouton "Régénérer"). L'IA génère une nouvelle question du même type et remplace l'ancienne. Cela évite de devoir relancer toute la génération pour corriger une seule question.
Pour améliorer la qualité des questions, le plugin utilise le few-shot prompting : chaque type de question inclut 2 exemples concrets dans le prompt envoyé à l'IA. Ces exemples montrent le format attendu et le niveau de qualité souhaité.
Résultat : les questions générées sont mieux formatées, avec des distracteurs plus plausibles et des explications plus détaillées.
Le plugin génère des questions adaptées au contexte :
La température du modèle IA est automatiquement adaptée par type : basse (0.2-0.3) pour les questions factuelles (Vrai/Faux, Numérique), plus haute (0.7) pour les questions créatives (QCM).
Quand le contenu du cours est trop long pour tenir dans une seule requête IA, le plugin découpe automatiquement le texte en sections logiques (par séparateurs de section). Chaque type de question reçoit un segment différent, ce qui garantit une couverture équilibrée de tout le contenu.
Une fois les questions approuvées, l'enseignant peut :
quiz_add_quiz_question)
Le plugin est conçu pour être accessible :
aria-label descriptifsrole="status"| Aspect | Mesure |
|---|---|
| Données | 100% local -- aucune donnée ne quitte l'IUT. Le modèle IA tourne sur le DGX Spark. |
| Permissions | Seuls les enseignants avec local/dreamu_qcm:generate peuvent générer des questions. |
| Validation | Toutes les requêtes vérifient le sesskey Moodle (protection CSRF). |
| Contenu | Le contenu du cours n'est jamais stocké en dehors de Moodle -- il est extrait à la volée pour chaque génération. |
| Fonctionnalité | Description |
|---|---|
| Wizard 3 étapes | Sélection du contenu > Configuration > Confirmation avant génération |
| 5 types de questions | QCM, Vrai/Faux, Réponse courte, Correspondance, Numérique |
| 3 niveaux de difficulté | Facile, Moyen, Difficile avec température adaptée par type |
| Preview du contenu | Voir le texte extrait avec stats (caractères, mots, tokens) |
| Vérification multi-modèles | Second appel IA pour détecter les erreurs et hallucinations |
| Feedback IA | Explication pédagogique sur chaque mauvaise réponse |
| Édition inline | Modifier les questions directement dans la page review (AJAX) |
| Régénération individuelle | Remplacer une question sans relancer toute la génération |
| Filtres | Filtrer par type, statut et vérification en temps réel |
| Few-shot prompting | Exemples dans le prompt pour améliorer la qualité |
| Instructions spécifiques | Ciblage par compétence (textarea libre) |
| Chunking intelligent | Découpage du contenu long en sections équilibrées |
| Sessions groupées par date | Organisation "Aujourd'hui", "Hier", date dans la page review |
| Création de quiz | Import dans la banque de questions + création de quiz Moodle en un clic |
| Extraction PDF | Extraction automatique du texte des fichiers PDF |
| Accessibilité ARIA | Labels, focus, navigation clavier |
| Fichier | Rôle |
|---|---|
generate.php | Wizard 3 étapes + formulaire de génération |
review.php | Review, filtres, édition inline, actions approuver/rejeter |
create_quiz.php | Création de quiz Moodle + import banque de questions |
classes/qcm_generator.php | Générateur IA, parsing JSON, vérification, import banque |
classes/course_content.php | Extraction du contenu du cours (pages, PDF, fichiers) |
ajax_edit.php | Sauvegarde AJAX des modifications inline |
ajax_preview.php | Extraction du contenu pour la prévisualisation |
ajax_regenerate.php | Régénération individuelle d'une question |