source env/bin/activatedeactivate- Préparer les données : Charger et prétraiter le dataset MNIST.
- Construire le modèle : Définir une architecture de réseau de neurones en utilisant PyTorch.
- Entraîner le modèle : Utiliser une boucle d'entraînement pour ajuster les poids du modèle.
- Évaluer le modèle : Tester le modèle sur des données de test et évaluer sa performance.
- Visualiser les résultats : Afficher des exemples de prédictions du modèle.
-
Importation des bibliothèques :
- Importation de PyTorch et des modules nécessaires (
torch,torch.nn,torch.optim,torchvision).
- Importation de PyTorch et des modules nécessaires (
-
Préparation des données :
- Chargement et transformation du dataset MNIST en utilisant
torchvision.datasetsettorchvision.transforms. - Création des DataLoader pour les ensembles d'entraînement et de test.
- Chargement et transformation du dataset MNIST en utilisant
-
Construction du modèle :
- Définition d'un réseau de neurones simple avec des couches entièrement connectées en utilisant
torch.nn.
- Définition d'un réseau de neurones simple avec des couches entièrement connectées en utilisant
-
Entraînement du modèle :
- Définition de la fonction de perte (
CrossEntropyLoss) et de l'optimiseur (AdamW). - Implémentation de la boucle d'entraînement pour ajuster les poids du modèle.
- Définition de la fonction de perte (
-
Évaluation du modèle :
- Implémentation de la boucle de test pour évaluer la performance du modèle sur l'ensemble de test.
-
Visualisation des résultats :
- Affichage d'exemples de prédictions du modèle avec les labels réels et prédits en utilisant
matplotlib.
- Affichage d'exemples de prédictions du modèle avec les labels réels et prédits en utilisant
Créer un modèle LSTM (Long Short-Term Memory) qui apprend à générer du texte en s’appuyant sur une tokenisation avancée (BPE - Byte Pair Encoding). Cela permet de mieux gérer les mots inconnus et de réduire la taille du vocabulaire.
- Prétraitement des données : transformation du texte en une suite de nombres avec SentencePiece.
- Construction du modèle LSTM :
- Une première couche qui transforme chaque nombre en une représentation plus riche (embedding).
- Un réseau LSTM qui apprend à anticiper la suite des phrases.
- Une dernière couche qui prédit le mot suivant en lui attribuant une probabilité.
- Entraînement : le modèle s’ajuste en comparant ses erreurs et en les corrigeant à chaque passage.
- Génération de texte :
- On donne un début de phrase au modèle.
- Il devine progressivement les mots suivants.
- Lancer le notebook pour charger et préparer les données.
- Lancer l'entraînement du modèle LSTM.
- Tester la génération de texte avec
generate_text_bpe(). - Observer comment le modèle produit des phrases cohérentes au fil des entraînements.
Créer un modèle Transformer qui génère du texte en comprenant tout le contexte en même temps, contrairement à un LSTM qui lit le texte mot après mot.
- Compréhension du contexte global : Chaque mot de la phrase "regarde" tous les autres pour mieux comprendre sa place et son sens.
- Construction du Transformer :
- Une première couche qui transforme chaque mot en une représentation compréhensible (embedding).
- Un mécanisme d’attention qui fait le tri dans les mots importants pour construire la phrase.
- Un décodeur qui génère le texte, mot après mot, en prenant en compte tout ce qui a été écrit avant.
- Entraînement :
- Le modèle apprend en ajustant ses prédictions et en minimisant ses erreurs.
- Génération de texte :
- À partir d’un mot donné, il construit une phrase en choisissant à chaque étape le mot le plus logique.
- Lancer l'entraînement du Transformer sur les données tokenisées.
- Tester la génération avec
generate_text_transformer(). - Comparer la qualité des phrases générées avec celles du modèle LSTM.
✅ LSTM → Lit les mots un par un et mémorise ceux d’avant pour anticiper la suite.
- fonctionne de manière séquentielle : il traite un mot à la fois.
- utilise une mémoire interne pour retenir le contexte passé.
- chaque nouveau mot est influencé uniquement par les mots précédents.
- problème : Plus la phrase est longue, plus l'information des premiers mots est diluée → perte de contexte.
✅ Transformer → Comprend toute la phrase d’un coup et choisit le mot suivant en analysant l’ensemble du contexte
- fonctionne en parallèle grâce à l'attention multi-tête.
- chaque mot regarde tous les autres mots dans la phrase en même temps.
- l'attention permet de pondérer l’importance de chaque mot par rapport aux autres.
- avantage : il garde le contexte global, même pour les phrases longues.
par exemple :
- Dans "Le chat dort sous l'arbre et il rêve de souris.",
- Le mot "il" doit comprendre qu'il fait référence à "chat" et non à "arbre".
- L’attention multi-tête permet d’établir ce lien.
- chaque mot est transformé en un vecteur (représentation numérique).
- on calcule l’importance entre chaque mot et tous les autres mots grâce à des formules mathématiques basées sur des produits scalaires (dot product).
- on attribue un score d’attention à chaque paire de mots.
- chaque mot reçoit une nouvelle représentation enrichie du contexte en fonction des scores d’attention.
Globalement le Transformer est plus performant pour générer des phrases cohérentes, mais il est plus lent à apprendre.
Ce pipeline RAG (Retrieval-Augmented Generation) permet d'améliorer la précision des réponses d'un modèle de langage en le forçant à ne pas se baser uniquement sur sa donnée d'entraînement, mais à synthétiser des informations extraites de documents. Grâce à ce processus, les réponses sont plus précises, actualisées et adaptées aux documents fournis dans le fichier documents.zip et à mettre dans un dossier /data vous aurez donc deux fichiers connaissances.txt et document.pdf.
-
🔍 Recherche augmentée : interroge des documents locaux (
connaissances.txt,document.pdf) avant de générer une réponse. -
💡 Modèle de génération Mistral 7B (llama-cpp-python) exécuté en local.
-
📚 Stockage et recherche rapide d’informations avec ChromaDB pour récupérer les informations les plus pertinentes avant de générer une réponse.
- 1️⃣ Premier lancement → L’index est créé et sauvegardé dans
models/chromadb - 2️⃣ Exécutions suivantes → L’index est directement rechargé depuis
models/chromadb, sans tout recalculer. → L’index c'est simplement une base de données optimisée qui stocke les versions vectorisées deconnaissances.txtet dedocument.pdf, ce qui permet au modèle de rechercher rapidement des informations pertinentes avant de répondre et pas recalculer à chaque fois.
- 1️⃣ Premier lancement → L’index est créé et sauvegardé dans
-
🌐 API Flask (
/chat) qui gère la communication entre le modèle et l'interface web. -
🎤 Synthèse vocale Bark : une voix pour la question, une autre pour la réponse.
-
🖥️ Interface web (
index.html) pour interagir avec le chatbot.
- Lancer le Jupyter Notebook
- L'interface
index.htmlsera générée automatiquement - Ouvrir
index.htmldans un navigateur

- Poser une question (ex. : "Comment faire une tarte aux pommes ?")
- Le chatbot dans un premier temps répète la question après l'avoir intégrée,puis l'analyse des documents se lance, génère une réponse et la lit à voix haute également

Quelles sont les différentes variantes de la tarte aux pommes ?Comment faire une tarte aux pommes ?Quel est le secret d’une bonne tarte aux pommes ?
- 🔊 Utiliser une voix encore plus naturelle (XTTS, Coqui-TTS...)
- ☁️ Déployer l’API Flask en ligne pour l’utiliser à distance