source env/bin/activate
deactivate
- 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.datasets
ettorchvision.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.txt
et 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.html
sera générée automatiquement - Ouvrir
index.html
dans 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