Préparer des Tests pour Élea avec Chat GPT et Mistral création de QCM assistée par une IA


Activité Test dans Éléa

Dans l’application Élea (disponible dans l’ENT de Normandie), il est possible de créer des tests : ce sont des questionnaires auto-corrigés, composés de questions de types variés : QCM, réponses courtes, appariements...

Pour construire une activité test, vous pouvez vous référer à la documentation Élea.

Une fois l’activité créée, il est possible d’utiliser des LLMs (grands modèles de langage) pour vous aider à concevoir les questions du test. L’ensemble des prompts présentés par la suite ont été testés sur ChatGPT d’Open AI et Le Chat de Mistral.

Lorsque vous ajoutez des questions dans Élea, vous pouvez soit les saisir de toute pièce, soit les importer d’une banque de questions. Il est donc possible d’importer des questions préparées par un LLM.

De manière générale, il faut avoir en tête que les LLMs sont une aide mais ne remplacent en rien l’expertise de l’enseignant.e, il est toujours essentiel de relire les questions proposées par l’IA.

Préparation des questions par un LLM

Les questions importées devront au préalable être enregistrées dans un fichier texte :

  • si vous êtes connecté au LLM, celui-ci peut vous le préparer directement et vous n’aurez qu’à le télécharger.
  • si vous n’êtes pas connecté, il suffira de copier-coller les questions dans un fichier texte de type bloc-note. Mistral ne permet de poser qu’entre 5 et 10 questions en version non connectée, ensuite il faut attendre un jour pour continuer la conversation.

Remarque : les versions connectées sont plus puissantes et gardent un historique de votre travail. Avec une version connectée, le LLM « comprendra » à chaque utilisation mieux vos demandes.

Vous allez alors fournir un prompt au LLM lui indiquant :

  • le niveau de vos élèves
  • le sujet sur lequel vous voulez travailler (listes, dictionnaires, variables, conditions ...)
  • la difficulté des questions
  • le type de questions (QCM, textes à trous, appariements, Cloze ...)

Il ne faut pas hésiter à spécifier la demande, changer de thème, de niveau de difficulté, demander à ne pas utiliser certaines fonctions.

Exemple : Le prompt demandait des questions de niveau intermédiaire pour des premières NSI sur les listes et les dictionnaires. Voici un exemple de question proposée :
Slicing de liste :

Que vaut liste[1:3] si liste = [0, 1, 2, 3, 4] ?  
a. [1, 2]  
b. [1, 3]  
c. [2, 3]  
d. [0, 1, 2]

Les slice n’étant pas au programme, vous pouvez lui demander de ne pas en utiliser dans ses questions.

Il est aussi possible :

  • d’augmenter le niveau de difficulté. Dans cet exemple, le LLM pourra proposer des listes ou des dictionnaires construits par compréhension ou en utilisant des boucles bornées.
  • d’utiliser une méthode en particulier, par exemple .key() ou .values() pour les dictionnaires
  • de demander d’autres types de questions : appariement, réponses courtes...

Il est préférable de demander plus de questions que ce dont vous avez besoin afin de pouvoir choisir celles qui vous correspondent le mieux.

Les LLMs peuvent avoir tendance à mettre la bonne réponse en première position, vous pouvez les laisser ainsi, en paramétrant votre test pour que les réponses soient mélangées.

Mise au format GIFT

Lorsque suffisamment de questions vous conviennent, il faut maintenant les convertir en GIFT (précisions sur le format).
Commencez par donner au LLM l’adresse du site ci-dessus pour lui fournir les éléments du format GIFT.

Si les questions ne comportent pas de code, le LLM n’a aucun problème à vous fournir des questions au format GIFT. Dans le cas où les questions comporteraient du code, il y a certains points de vigilance à respecter, notamment sur les caractères à échapper pour obtenir une interprétation correcte du fichier GIFT par Éléa. En cas de problème d’échappement ou d’indentation, il suffira de lui rappeler les règles.

Voici un prompt détaillé à fournir au modèle de langage (LLM) pour préciser les exigences du format GIFT :

Prompt détaillé (cliquer pour déplier/replier)

Contexte :
Je travaille sur la création de questions pour un quiz en utilisant le format GIFT pour l’importation dans Moodle/Éléa. Est-il possible de modifier les questions précédentes au format GIFT, en respectant les consignes suivantes :

1. Échappement des accolades ({ et }) :

  • Les accolades doivent être échappées : on mettra un antislash ( \{ ou \} ) devant, dans le texte de la question ou des réponses, justes ou fausses, pour que Moodle ne les interprète pas comme des blocs spéciaux.
    Par exemple : les réponses à la question « Comment créer un dictionnaire vide en python » seront : {=dict() =\{\} ~\{1: 'a'\}}
  • Seules les accolades encadrant l’ensemble de toutes les réponses ne doivent pas être échappées.

2. Problème avec le caractère égal (=) :

  • Le caractère égal = est utilisé pour marquer la bonne réponse dans GIFT. Cependant, lorsque ce caractère est inclus dans une réponse, il doit être échappé avec un antislash (\=) afin que Moodle ne le prenne pas pour un délimiteur de la bonne réponse.
    Par exemple : les réponses à la question « Comment créer un dictionnaire vide, appelé dico, en python », seront : {=dico \= dict() =dico \=\{\}}

3. Comportement duprint() en Python :

  • Je souhaite que les réponses simulent le comportement de la fonction print() en Python. En d’autres termes, chaque élément renvoyé parprint() doit être affiché sur une nouvelle ligne.
  • Cela doit être simulé en utilisant\n dans les réponses. Il est également important d’ajouter un espace après chaque\n dans les réponses pour simuler correctement l’affichage (comme dans le vrai comportement de print() en Python).

4. Caractères à ne pas échapper dans les réponses :

  • Certains caractères ne doivent pas être échappés dans les réponses, comme les crochets [] et les underscores_. Ces caractères doivent apparaître tels quels dans les réponses.
  • En particulier, les crochets dans les dictionnaires ou les listes ne doivent pas être échappés, et les underscores dans les noms de variables ou autres éléments de code doivent être utilisés tels quels sans échappement.

5. Indentation et structure du code :

  • le format GIFT ne comprend pas les lignes de code, il n’est pas nécessaire de le mettre entre backticks ``, il est par contre nécessaire de respecter les règles d’échappement dans le code.
  • L’indentation doit être correcte dans le code des questions. Chaque ligne après une boucle ou une structure de code doit être indentée avec 4 espaces :     , pour simuler correctement un bloc de code Python.

6. Formatage des réponses :

  • Les réponses doivent respecter la syntaxe GIFT : la bonne réponse doit commencer par un = et les mauvaises réponses doivent commencer par un ~.
  • Les éléments dans les réponses doivent être séparés par un retour à la ligne (\n), et les erreurs dans les réponses doivent être explicitement indiquées pour que Moodle reconnaisse correctement les mauvaises options.
  • (Mistral) Chaque réponse peut être renvoyée à la ligne mais les lignes ne pourront pas commencer ni finir par des espaces.
Problèmes rencontrés avec le LLM
  • Il a échappé par erreur des caractères qui ne devraient pas être échappés, comme les crochets [] et les underscores _ dans les réponses ou n’a pas échappé les {} et les =. Comme indiqué dans le lien, les seuls symboles à devoir être échappés dans ce contexte sont : ~ = # { }
    Exemple :
    ::Q2 - Syntaxe de liste::
    Quelle est la bonne syntaxe pour créer une liste en Python ?
    {
    ~ma\_liste = \(1, 2, 3\)
    ~ma\_liste = \{1, 2, 3\}
    =ma\_liste = \[1, 2, 3\]
    ~ma\_liste = 1, 2, 3
    }

    ou

    ::Q2 - Syntaxe de liste::
    Quelle est la bonne syntaxe pour créer une liste en Python ?
    {
    ~ma_liste = (1, 2, 3)
    ~ma_liste = {1, 2, 3}
    =ma_liste = [1, 2, 3]
    ~ma_liste = 1, 2, 3
    }

    au lieu de :

    ::Q2 - Syntaxe de liste::
    Quelle est la bonne syntaxe pour créer une liste en Python ?
    {
    ~ma_liste \= (1, 2, 3)
    ~ma_liste \= \{1, 2, 3\}
    =ma_liste \= [1, 2, 3]
    ~ma_liste \= 1, 2, 3
    }
  • Les questions à choix multiples (QCM) avec du code Python ont besoin de respecter le comportement de print() avec un retour à la ligne après chaque valeur affichée. Les réponses avec des retours à la ligne \n ne s’affichaient pas correctement dans Moodle à cause de la mauvaise gestion des espaces après \n.
    Exemple :
     ::Q3 - Parcours des paires clé-valeur::
    Quel est le résultat du code suivant ?\n\n
    mon_dico = \{ "nom": "Alice", "age": 17 \}\n
    for key, value in mon_dico.items() :\n
        print(key, value)
    {
    =nom Alice
    =age 17
    ~Erreur
    ~nom 17
    }

    au lieu de :

    ::Q3 - Parcours des paires clé-valeur::
    Quel est le résultat du code suivant ?\n\n
    mon_dico = \{ "nom": "Alice", "age": 17 \}\n
    for key, value in mon_dico.items() :\n
        print(key, value)
    {
    =nom Alice\n age 17
    ~Erreur
    ~nom 17
    }
  • Mistral a rencontré un problème de présentation des réponses, il écrivait :
    ::Q1::Quelle est la syntaxe correcte pour créer une liste vide en Python ?
    {
        =[]
        =list()
        ~{}
        ~()
    }

    au lieu de :

    ::Q1::Quelle est la syntaxe correcte pour créer une liste vide en Python ?
    {
    =[]
    =list()
    ~\{\}
    ~()
    }

    Il y avait un problème d’échappement et d’espaces ; en lui fournissant la correction pour une question, il a pu corriger l’ensemble.

  • Pour les questions à réponses courtes, les LLMs respectent la norme PEP 8. Comme les caractères sont vérifiés un à un, une réponse avec un espace en moins sera comptée fausse. Pour les réponses courtes, préférer les réponses avec un mot.
    Exemple :
    • sera compté faux (espaces manquants après les virgules) :
    • sera compté juste :
Cas particulier : Questions au format cloze

La question de type cloze à réponses intégrées permet de construire un texte troué ou lacunaire dans lequel les réponses sont intégrées. Le type de réponse peut être un choix multiple, une réponse courte ou une réponse numérique. (lien de la documentation Moodle)

Ce type de question peut être demandé au LLM mais ne peut pas être importé au format GIFT. Une seule paire d’accolades étant autorisée pour le format GIFT, il ne prendrait qu’une seule des questions.
Il est cependant tout à fait possible de faire écrire quelques questions cloze au LLM. Dans ce cas, il faudra choisir lors de l’importation : Questions Cloze à réponses intégrées.
Un exemple de question au format cloze est :

Complétez ce texte avec le bon vocabulaire Python.
Pour définir une fonction en Python, on utilise le mot-clé {1:MC:=def#Correct~function~define}. Pour afficher un message, on utilise la fonction {1:SA :=print#Bonne réponse}. Le mot-clé {1:MC:=if#Bonne réponse~when~test} permet de faire un test conditionnel, et on peut gérer l'alternative avec {1:MCS:=else~elseif~otherwise}. 

et son rendu :

Partager

Imprimer cette page (impression du contenu de la page)