Le problème : enseigner ce qu’on a pas encore enseigné
J’ai un cours de programmation avec 47 classes. Chaque classe a des notes (où j’explique des trucs) et des labs (où l’étudiant pratique). Et j’ai un problème : parfois j’utilise des concepts dans les labs que j’ai pas encore expliqués dans les notes.
“Bon, dans cet exercice utilise map pour transformer la liste.”
Le problème ? J’ai pas expliqué c’est quoi map avant trois classes plus tard.
Ça arrive plus souvent qu’on croit. T’as le matériel dans la tête, tu sautes d’un endroit à l’autre, et sans t’en rendre compte tu assumes que l’étudiant sait des trucs que tu lui as pas encore racontés. Le résultat : frustration, confusion, et des étudiants qui pensent qu’ils sont nuls alors que le nul c’est toi.
La solution manuelle serait de réviser chaque lab, noter quels concepts il utilise, et vérifier qu’ils ont été expliqués avant. Mais j’ai 47 classes avec plusieurs notebooks chacune. Ça va pas le faire.
La solution : recherche sémantique avec ChromaDB
L’idée est simple :
- Extraire les concepts de chaque notebook (ce qui est enseigné, ce qui est utilisé)
- Les sauvegarder dans une base de données qui comprend le sens, pas juste le texte
- Pour chaque concept utilisé dans un lab, vérifier qu’il existe dans des notes précédentes
Ce truc de “comprendre le sens” est crucial. Si dans les notes je dis “fonction d’ordre supérieur” et dans le lab j’utilise “higher-order function”, un grep trouvera rien. Mais sémantiquement c’est pareil.
C’est là qu’entre ChromaDB : une base de données de vecteurs qui convertit le texte en embeddings et permet de chercher par similarité. Dit en français : tu sauvegardes du texte, et après tu peux demander “y a-t-il quelque chose de semblable à ça ?” et ça te retourne les plus similaires.
ChromaDB en 5 minutes
ChromaDB c’est comme SQLite mais pour les embeddings. Un seul fichier (ou dossier), sans serveur, sans configuration. Tu installes, tu utilises, et ça roule.
| |
Le concept de base
Dans une base de données normale tu sauvegardes des lignes avec des colonnes. Dans ChromaDB tu sauvegardes des documents avec des embeddings :
| |
C’est tout. ChromaDB automatiquement :
- Génère des embeddings des documents (par défaut utilise
all-MiniLM-L6-v2) - Les indexe pour recherche rapide
- Les persiste sur disque
Chercher par similarité
| |
Tu vois ? J’ai cherché “higher-order function” et ça a trouvé “fonction d’ordre supérieur” même si le texte est complètement différent. C’est ça la magie des embeddings.
Le système complet : validation curriculaire
Maintenant on va construire le système qui valide que je me plante pas. Le code réel est dans mon projet, mais voici la version simplifiée pour que tu comprennes le concept.
Étape 1 : Extraire les concepts des notebooks
D’abord on doit sortir les concepts de chaque notebook. Je fais ça avec un LLM (Gemini Flash via OpenRouter), mais tu pourrais le faire avec des regexes si t’es courageux :
| |
Le LLM classe chaque concept comme :
- introduces : Est enseigné avec explication
- uses : Est utilisé en assumant une connaissance préalable
Étape 2 : Sauvegarder dans ChromaDB
Maintenant on sauvegarde les concepts avec leurs métadonnées :
| |
Étape 3 : Valider la progression
Voici le truc intéressant. Pour chaque concept “utilisé” dans un lab, on vérifie qu’il existe quelque chose de similaire dans des notes précédentes :
| |
La fonction is_concept_known c’est là qu’entre ChromaDB. On fait pas de match exact, on fait de la recherche sémantique :
| |
Étape 4 : Le rapport
En exécutant la validation sur mon cours, j’obtiens un joli rapport :
| |
Maintenant je sais exactement ce que je dois réparer.
Détails qui comptent
Modèle d’embeddings multilingue
Si ton contenu est en français, utilise un modèle multilingue :
| |
Le modèle par défaut (all-MiniLM-L6-v2) est entraîné principalement en anglais et peut donner des résultats bizarres avec le français.
Distance cosinus vs euclidienne
Pour le texte, utilise distance cosinus :
| |
La distance cosinus mesure l’angle entre vecteurs, en ignorant la magnitude. C’est ce que tu veux pour la similarité sémantique.
Convertir distance en similarité
ChromaDB retourne distance (plus petit = plus similaire). Si tu veux similarité (plus grand = plus similaire) :
| |
Avec distance cosinus, l’intervalle est [0, 2], donc la similarité reste dans [-1, 1]. En pratique, pour des textes similaires c’est souvent dans [0.5, 1].
Persistance
ChromaDB a deux modes :
| |
Pour un système de validation que tu vas exécuter à répétition, utilise persistant. Comme ça tu recalcules pas les embeddings à chaque fois.
Filtres avec where
Tu peux filtrer les résultats par métadonnées :
| |
C’est crucial pour la validation : on veut chercher seulement dans des concepts qui ont déjà été enseignés.
Alternatives à ChromaDB
ChromaDB c’est pas la seule option. Voici d’autres :
| Outil | Pros | Contras |
|---|---|---|
| ChromaDB | Simple, sans serveur, bonne documentation | Limité à millions de vecteurs |
| Pinecone | Scalable, géré | Payant, vendor lock-in |
| Weaviate | Puissant, API GraphQL | Plus complexe à configurer |
| Qdrant | Rapide, Rust | Moins connu |
| pgvector | Si tu utilises déjà PostgreSQL | Nécessite PostgreSQL |
Pour un projet comme ça (milliers de concepts, pas millions), ChromaDB est parfait. Si tu dois scaler à milliards de vecteurs ou haute disponibilité, regarde les alternatives.
Le hook de pre-commit
Pour que ce soit vraiment utile, je l’ai intégré dans le workflow git :
| |
Maintenant, chaque fois que j’essaie de faire un commit, le système vérifie que je me plante pas. S’il y a des violations, le commit se bloque et ça me dit quoi réparer.
Conclusion
ChromaDB c’est un de ces outils que quand tu le découvres tu penses “comment j’ai vécu sans ça ?”. C’est SQLite pour embeddings : simple, local, et ça marche.
Le cas d’usage que je t’ai montré (validation curriculaire) c’est juste un exemple. Les bases de données vectorielles servent pour :
- Recherche sémantique dans documents
- RAG (Retrieval-Augmented Generation) pour LLMs
- Détection de doublons sémantiques
- Recommandations basées sur similarité
- Clustering de contenu
Et le mieux : la barrière d’entrée est minimale. Tu installes, tu sauvegardes des documents, tu cherches. Rien de configurer serveurs, schémas, ou index compliqués.
Si t’as un problème où tu dois trouver “des trucs semblables à ça”, essaie ChromaDB. Le pire qui peut arriver c’est que ça marche trop bien et tu te demandes pourquoi tu l’as pas utilisé avant.
TL;DR : ChromaDB c’est une base de données vectorielle locale et simple. On l’utilise pour vérifier qu’un cours de programmation n’utilise pas des concepts avant de les enseigner, en utilisant la recherche sémantique pour détecter des concepts similaires même si le texte est différent.