Comment Créer une Application de Questions à Choix Multiple (QCM) Utilisant Wikipedia et RAG
Comment Créer une Application de QCM (Questions à Choix Multiple) Cette article présente comment développer une application qui génère des questions à choix multiple (QCM) sur n'importe quel sujet défini par l'utilisateur. L'application extrait des articles Wikipédia liés à la requête de l'utilisateur et utilise une méthode de génération augmentée par la récupération (RAG) pour interroger un modèle de conversation et créer les questions. Démonstration de l'Application L'animation ci-dessus montre comment l'utilisateur entre le contexte d'apprentissage, voit les QCM générés et reçoit des commentaires après avoir soumis une réponse. Écran de Début Au premier écran, l'utilisateur décrit le contexte des QCM qu'il souhaite générer. Après avoir cliqué sur "Soumettre le Contexte", l'application recherche des articles Wikipédia dont le contenu correspond à la requête de l'utilisateur. Écran de Question L'application divise chaque article Wikipédia en sections et les évalue en fonction de leur pertinence avec la requête de l'utilisateur. Les scores attribués permettent de sélectionner la section pour la prochaine question. Cette section est affichée avec quatre options de réponse. L'utilisateur peut sélectionner une option et la soumettre en cliquant sur "Soumettre la Réponse". Il est également possible de passer à la question suivante via "Prochaine Question" si la question ne répond pas aux attentes. L'application évite alors d'utiliser cette section pour générer des questions ultérieures. Pour terminer la session, l'utilisateur peut choisir "Terminer le QCM". Écran de Réponse Après avoir soumis une réponse, l'utilisateur découvre si sa réponse est correcte et reçoit une explication. Il peut ensuite obtenir une nouvelle question via "Prochaine Question" ou terminer la session avec "Terminer le QCM". Écran de Fin de Session À la fin de la session, l'écran affiche le nombre de questions correctement et incorrectement répondues, ainsi que le nombre de questions rejetées par le biais de "Prochaine Question". L'utilisateur peut débuter une nouvelle session en choisissant "Nouvelle Session", où il aura l'opportunité de définir un nouveau contexte. Concept Le but de cette application est de produire des questions de haute qualité et à jour sur n'importe quel sujet proposé par l'utilisateur. Les réponses des utilisateurs sont prises en compte pour s'assurer que les questions générées correspondent à leurs attentes. L'application utilise deux workflows principaux : Récupération du Contexte : Sélection d'articles Wikipédia en fonction de la requête utilisateur. Génération de Questions : Création de QCM basés sur les sections d'articles sélectionnées. Récupération du Contexte Extraction d'Articles Wikipédia L'extraction se fait en deux étapes : premièrement, une recherche est effectuée pour trouver les pages appropriées ; secondement, les pages filtrées sont lues et divisées en sections. Recherche : Des requêtes sont envoyées à l'URL de recherche Wikipédia, accompagnées d'un en-tête contenant les informations du demandeur et d'un dictionnaire de paramètres. Filtrage des Résultats : Lasimilarité vectorielle entre la requête de l'utilisateur et les extraits des pages est calculée pour éliminer les pages non pertinentes. Division en Sections : Les pages restantes sont lues et divisées en sections. Chaque section est évaluée en fonction de sa similarité avec la requête de l'utilisateur, permettant de conserver uniquement les sections les plus pertinentes. ```python Exemple de code pour la recherche et l'extraction des articles Wikipédia import wikipediaapi import os def get_wiki_page_sections_as_dict(page_title, sections_exclude=SECTIONS_EXCLUDE): wiki_wiki = wikipediaapi.Wikipedia(user_agent=os.getenv('WIKI_USER_AGENT'), language='en') page = wiki_wiki.page(page_title) if not page.exists(): return None def sections_to_dict(sections, parent_titles=[]): result = {'Summary': page.summary} for section in sections: if section.title in sections_exclude: continue section_title = ": ".join(parent_titles + [section.title]) if section.text: result[section_title] = section.text result.update(sections_to_dict(section.sections, parent_titles + [section.title])) return result return sections_to_dict(page.sections) ``` Attribution de Scores au Contexte Les sections plus pertinentes au contexte de l'utilisateur ont plus de chances d'être sélectionnées. Un score est attribué à chaque section, combinant la fréquence des rejets et la similarité sémantique : Score de Rejet : Calculé en tenant compte du nombre de rejets de la page et de la section. Score de Similarité : Calculé en fonction de la similarité sémantique de la section avec la requête de l'utilisateur. Calcul du Score Final : Combinaison pondérée des scores de rejet et de similarité. [ s_{section} = w_{rejection} \times s_{rejection} + (1 - w_{rejection}) \times s_{sim} ] Génération de Questions Ingénierie de Prompt Les prompts sont essentiels pour générer des questions pertinentes. Deux types de prompts sont utilisés : Génération de Mots-clés : Pour convertir la requête de l'utilisateur en mots-clés utilisables pour la recherche Wikipédia. Génération de QCM : Pour créer des questions, des options de réponse et des explications basées sur la section sélectionnée. Template pour la Génération de Mots-clés python KEYWORDS_TEMPLATE = """ Vous êtes un assistant pour générer des mots-clés afin de rechercher des articles Wikipédia contenant le contenu que l'utilisateur souhaite apprendre. Pour une requête utilisateur donnée, retournez au maximum {n_keywords} mots-clés. Assurez-vous que chaque mot-clé est un bon match avec la requête utilisateur. Retournez les mots-clés séparés par des virgules sans rien d'autre. """ Template pour la Génération de QCM ```python MCQ_TEMPLATE = """ Vous êtes une application d'apprentissage qui génère des questions à choix multiple basées sur du contenu éducatif. L'utilisateur a fourni la requête suivante pour définir le contenu d'apprentissage : "{user_query}" Sur la base de la requête de l'utilisateur, le contexte suivant a été récupéré : "{context}" Générez une question à choix multiple directement basée sur le contexte fourni. La réponse correcte doit être explicitement mentionnée dans le contexte et doit toujours être la première option de la liste de choix. Fournissez également une explication de pourquoi la réponse correcte est correcte. Nombre de choix de réponses : {n_choices} {previous_questions}{rejected_questions} La sortie JSON doit suivre cette structure (pour {n_choices} choix de réponses) : {"question": "Votre question générée basée sur le contexte", "choices": ["Réponse correcte (doit être le premier choix)", "Distracteur 1", "Distracteur 2", "Distracteur 3"], "explanation": "Une brève explication de pourquoi la réponse correcte est correcte."} Instructions : - Générez une question à choix multiple strictement basée sur le contexte. - Fournissez exactement {n_choices} choix de réponses, en vous assurant que la première est la réponse correcte. - Incluez une explication concise de pourquoi la réponse correcte est correcte. - N'ajoutez que le format JSON. - L'explication ne devrait pas supposer que l'utilisateur est déjà au courant du contexte. Évitez les formulations comme "Comme mentionné dans le texte...". - La réponse doit être lisible par une machine et ne contenir aucune rupture de ligne. - Vérifiez si il est possible de générer une question basée sur le contexte fourni qui est alignée avec la requête de l'utilisateur. Si ce n'est pas possible, indiquez la question générée comme {fail_keyword}. """ ``` Mécanisme de Génération Sélection de Section : Une section est choisie en fonction de son score. Génération de Prompt : Le texte de la section et la requête de l'utilisateur sont insérés dans un prompt pour lancer le modèle de conversation. Réponse du Modèle : Le modèle de conversation renvoie une réponse JSON contenant la question, les choix de réponse et une explication. Evaluation : La réponse de l'utilisateur est évaluée, et une explication est fournie. Feedback : Si le modèle échoue à générer une question pertinente ou si l'utilisateur rejette la question, le score de la section est abaissé. Application Streamlit L'application est construite en utilisant Streamlit, un cadre d'application open-source en Python. Streamlit permet d'ajouter facilement des éléments de page avec une seule ligne de code. Zone de Texte pour la Requête : context_text = st.text_area("Entrez le contexte pour les questions à choix multiple :") Boutons : st.button ou st.radio pour créer des boutons interactifs. Gestion d'État : st.session_state est utilisé pour conserver l'état de l'application entre les interactions. Améliorations Possibles Plusieurs améliorations peuvent être apportées : Charger des Documents Personnel : Les utilisateurs pourraient charger leurs propres fichiers PDF, comme des diapositives de cours ou des manuels, pour générer des questions à partir de documents personnalisés. Optimisation de la Sélection de Contexte : Utiliser un modèle d'apprentissage automatique pour prédire la probabilité que les questions soient rejetées, basé sur des caractéristiques comme la similarité avec les questions acceptées et rejetées. Enregistrement des Questions : Sauvegarder les questions générées pour une utilisation future, en mettant l'accent sur la répétition des questions mal répondues pour cibler les points faibles de l'apprenant. Conclusion Cet article illustre comment la génération augmentée par la récupération (RAG) peut être utilisée pour créer une application d'apprentissage interactive qui génère des QCM de haute qualité basés sur le contenu des articles Wikipédia. En combinant la recherche par mots-clés, le filtrage sémantique, l'ingénierie de prompts et un système de notation basé sur le feedback de l'utilisateur, l'application s'adapte dynamiquement aux préférences et aux objectifs d'apprentissage de l'utilisateur. Avec des améliorations telles que la possibilité de charger des documents personnalisés, la séquence adaptative des questions et la prédiction de rejet basée sur un modèle d'apprentissage, l'application pourrait devenir une plateforme polyvalente pour l'apprentissage personnalisé et l'auto-évaluation. Pour en savoir plus sur les RAG, consultez les articles de Shaw Talebi et Avishek Biswas. Les tutoriels de Harrison Hoffman sur les plongements (embeddings) et les bases de données vectorielles, ainsi que la construction d'un chatbot RAG, sont également recommandés. Plusieurs des illustrations de cet article ont été créées par l'auteur. Avis d'Experts Des professionnels de l'industrie louent cette initiative pour sa capacité à adapter le contenu aux besoins spécifiques des utilisateurs, en utilisant intelligemment des technologies de pointe comme RAG. Selon eux, cette approche offre un potentiel considérable pour une utilisation éducative et pourrait devenir un outil précieux pour les enseignants et les étudiants. Profil de l'Entreprise Cette application est développée par une entreprise spécialisée dans les technologies de l'éducation, visant à rendre l'apprentissage plus interactif et personnalisé. Avec des collaborations solides avec des institutions éducatives et des experts en pédagogie, l'entreprise continue d'innover pour offrir des solutions d'apprentissage de qualité.
