L'IA pour corriger une question ouverte
Utiliser l’intelligence artificielle pour analyser une réponse libre à une question de cybersécurité
Notions théoriques
Pourquoi une question ouverte ?
Jusqu’à présent, notre quiz Cyber permettait de répondre à des questions à choix multiples (QCM).
Ce format est très pratique pour :
- Corriger automatiquement
- Donner un score rapide
- Proposer une expérience fluide
Mais il ne permet pas de vérifier la compréhension réelle de l’élève.
C’est pourquoi nous allons ajouter une question ouverte, où l’utilisateur doit écrire une réponse avec ses propres mots.
Comment corriger automatiquement ?
Corriger une réponse ouverte est plus complexe qu’un QCM.
Il faut :
- Analyser le sens de la réponse
- Déterminer si elle est correcte ou non
- Fournir un feedback personnalisé
Pour cela, nous allons faire appel à un modèle d’intelligence artificielle via une API.
Quelle API utiliser ?

Nous allons utiliser OpenRouter, une alternative gratuite à OpenAI.
- OpenRouter est gratuit dans sa version de base
- OpenRouter fonctionne avec une clé API que vous pouvez obtenir facilement
- OpenRouter permet d’accéder à des modèles comme GPT-3.5 ou Mistral
OpenRouter propose par exemple Mistral 7B Instruct, qui est très performants et gratuits à utiliser.
Voici la liste des modèles de génération de textes, gratuits, à faibles latences, disponibles sur OpenRouter :
Comment fonctionne l’API OpenRouter ?
L’API d’OpenRouter fonctionne comme celle d’OpenAI :
- Vous envoyez un prompt (texte d’instruction)
- Vous recevez une réponse générée par l’IA
Nous allons créer un prompt du type :
"Voici une question de cybersécurité. Évalue la réponse de l'utilisateur et dis-moi si elle est correcte. Puis donne un commentaire personnalisé."
Exemple pratique
Voici un exemple de composant React qui utilise OpenRouter pour analyser une réponse libre :
"use client";
import { useState } from "react";
export default function QuestionOuverte() {
const [reponse, setReponse] = useState("");
const [resultat, setResultat] = useState("");
async function analyserReponse() {
const prompt = `
Tu es un professeur de cybersécurité.
Voici la question : "Qu'est-ce qu'une attaque de phishing ?"
Voici la réponse de l'élève : "${reponse}"
Ta mission : dis si c'est correct ou non, et donne un commentaire personnalisé.
Réponds en une phrase.
`;
const response = await fetch("https://openrouter.ai/api/v1/chat/completions", {
method: "POST",
headers: {
"Authorization": "Bearer VOTRE_CLE_API_OPENROUTER",
"Content-Type": "application/json"
},
body: JSON.stringify({
model: "mistralai/mistral-7b-instruct", // ou "openai/gpt-3.5-turbo"
messages: [{ role: "user", content: prompt }]
})
});
const data = await response.json();
setResultat(data.choices[0].message.content);
}
return (
<div className="max-w-xl mx-auto mt-10">
<h2 className="text-2xl font-bold mb-4">Question ouverte</h2>
<p className="mb-2">Qu'est-ce qu'une attaque de phishing ?</p>
<textarea
className="w-full border p-2 rounded"
rows={4}
value={reponse}
onChange={(e) => setReponse(e.target.value)}
/>
<button
onClick={analyserReponse}
className="mt-4 px-4 py-2 bg-blue-600 text-white rounded"
>
Envoyer ma réponse
</button>
{resultat && (
<div className="mt-6 p-4 bg-gray-100 rounded border">
<strong>Analyse de l'IA :</strong>
<p>{resultat}</p>
</div>
)}
</div>
);
}
Quelques méthodes à connaître
1. fetch()
fetch()pour appeler une API externe
const response = await fetch("https://openrouter.ai/api/v1/chat/completions", { ... });
2. JSON.stringify()
JSON.stringify()pour envoyer un objet JSON
3. Authorization: Bearer ...
Authorization: Bearer <jeton>pour s’authentifier avec une clé d'API.
Le préfixe Bearer dans l'en-tête HTTP Authorization indique que le schéma d'authentification utilisé est un token d'accès de type Bearer.
Que signifie le terme Bearer en informatique ?
- Bearer signifie "porteur" en anglais.
En informatique, un bearer token est un jeton d'accès qui accorde des droits à quiconque le possède (le "porteur"), sans nécessiter de preuve supplémentaire de possession (comme une clé cryptographique).
Toute personne ou entité présentant ce jeton peut l'utiliser pour accéder aux ressources protégées.
Voici comment l'utiliser dans une requête HTTP :
Authorization: Bearer <jeton>
Exemple :
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.xxxxx
- Très répandu dans les API REST modernes (ex. : Google APIs, GitHub, etc.).
- Le token est généralement obtenu après une authentification (login), et transmis ensuite pour chaque requête protégée.
- Sécurité importante : Les bearer tokens doivent toujours être transmis via HTTPS (TLS), car quiconque intercepte le jeton peut l'utiliser.
Bonne pratique : sécuriser la clé API
- Il ne faut jamais afficher une clé API côté client, car le code exécuté dans le navigateur est visible par tous.
- Une clé exposée peut être copiée et utilisée par des personnes malveillantes, entraînant des frais ou des abus.
- Pour protéger cette clé, on doit l’utiliser uniquement dans du code exécuté côté serveur (comme une API route dans Next.js).
Test de mémorisation/compréhension
TP pour réfléchir et résoudre des problèmes
Objectif
Créer un composant QuestionOuverte qui :
- Affiche une question ouverte
- Permet à l’utilisateur d’écrire une réponse
- Envoie la réponse à une API route côté serveur
- Cette API appelle OpenRouter (GPT-3.5) pour analyser la réponse
- Affiche un commentaire personnalisé généré par l’IA
1. Créer un compte chez OpenRouter
Voici comment créer un compte gratuit sur https://openrouter.ai :
Phase n°1 – Accès à la plateforme
Rendez-vous sur https://openrouter.ai puis cliquez sur le bouton « Sign up » pour lancer la création du compte.