Un assistant intelligent basé sur RAG (Retrieval-Augmented Generation) pour les étudiants de l'INSA Centre Val de Loire. Ce système permet de poser des questions sur les cours et d'obtenir des réponses précises basées sur les documents pédagogiques.
- 🔍 Scraping automatique : Télécharge les documents depuis Celene
- 📄 Conversion intelligente : Transforme PDF, DOCX et autres formats en JSON
- 🧠 Embeddings vectoriels : Indexation sémantique avec Qdrant
- 💬 Chat interactif : Interface web moderne avec Streamlit
- 🤖 Génération de réponses : Utilise Ollama (Mistral, Phi, Llama2, etc.)
- 📚 Sources citées : Affiche les documents utilisés pour chaque réponse
- 🎨 Interface sombre : Design moderne et confortable
Documents Celene
↓
Scraper (celene_scraper.py)
↓
Documents locaux (Data/)
↓
Conversion (Convert/)
↓
JSON structuré (Data_json/)
↓
Embeddings (embed_to_qdrant.py)
↓
Qdrant Vector DB
↓
RAG System (rag_system.py)
↓
Web Interface (web_app.py)
- Python 3.8+
- Docker (pour Qdrant)
- Ollama (pour les LLM)
- Compte Celene INSA
git clone <repository-url>
cd INSAssistant# Pour le scraping et conversion
pip install -r Convert/requirements_embedding.txt
# Pour l'interface web
pip install -r requirements_web.txtdocker run -d -p 6333:6333 \
-v $(pwd)/qdrant_storage:/qdrant/storage:z \
--name qdrant \
qdrant/qdrantVérifier que Qdrant fonctionne :
curl http://localhost:6333/health# Installer Ollama
curl -fsSL https://ollama.com/install.sh | sh
# Télécharger un modèle (au choix)
ollama pull phi # Rapide et léger (recommandé)
ollama pull mistral # Équilibré qualité/vitesse
ollama pull llama2 # Haute qualité mais plus lent- Configurer vos identifiants :
cp celene.conf.sample celene.conf
# Éditer celene.conf avec vos identifiants- Lancer le scraper :
python3 celene_scraper.pyLes documents seront téléchargés dans Data/
cd Convert
python3 Convert_all_to_json.pyLes fichiers JSON seront dans Data_json/
cd Convert
python3 embed_to_qdrant.pyOptions utiles :
# Test avec 10 fichiers seulement
python3 embed_to_qdrant.py --limit 10
# Changer la taille des chunks
python3 embed_to_qdrant.py --chunk-size 1000
# Utiliser un modèle d'embedding différent
python3 embed_to_qdrant.py --model sentence-transformers/paraphrase-multilingual-mpnet-base-v2streamlit run web_app.pyL'application sera accessible sur : http://localhost:8501
Exemples de questions :
- "Qu'est-ce que la cryptographie ?"
- "Comment fonctionne le protocole TCP/IP ?"
- "Explique-moi les chaînes de Markov"
- "Comment installer Apache2 ?"
- Modèle LLM : Choisir entre phi (rapide), mistral (équilibré), llama2 (qualité)
- Nombre de documents : 1-10 documents à récupérer (moins = plus rapide)
- Afficher les sources : Voir les documents utilisés pour la réponse
- Connexion Qdrant : Modifier host/port si nécessaire
- 🔄 Réinitialiser : Efface le cache et redémarre
- 🗑️ Effacer l'historique : Nettoie la conversation
- 💡 Exemples de questions : Questions pré-remplies
INSAssistant/
├── celene_scraper.py # Scraper pour Celene
├── celene.conf # Configuration (à créer)
├── celene.conf.sample # Exemple de configuration
├── rag_system.py # Système RAG (retrieve + generate)
├── web_app.py # Interface web Streamlit
├── requirements_web.txt # Dépendances web
├── assets/
│ └── insa_logo.png # Logo INSA
├── Celene_parser/
│ ├── auth.py # Authentification CAS
│ ├── models.py # Modèles de données
│ ├── parser.py # Parseur HTML Celene
│ └── utils.py # Utilitaires
├── Convert/
│ ├── Convert_all_to_json.py # Conversion documents → JSON
│ ├── embed_to_qdrant.py # Création embeddings + indexation
│ ├── clean_json_text.py # Nettoyage du JSON
│ ├── requirements_embedding.txt
│ └── README_EMBEDDING.md # Documentation embedding
├── Data/ # Documents bruts (PDF, DOCX, etc.)
├── Data_json/ # Documents convertis en JSON
├── qdrant_storage/ # Base de données Qdrant
└── Logs/ # Logs du scraper
Pour améliorer la vitesse de réponse :
- Utiliser un modèle plus léger :
phiplutôt quemistral - Réduire le nombre de documents : 3 au lieu de 5
- Chunks plus petits :
--chunk-size 512(par défaut) - GPU : Configurer Ollama pour utiliser le GPU si disponible
| Modèle | Dimensions | Langues | Vitesse |
|---|---|---|---|
paraphrase-multilingual-mpnet-base-v2 (défaut) |
768 | Multi | Moyen |
dangvantuan/sentence-camembert-large |
1024 | FR | Lent |
all-MiniLM-L6-v2 |
384 | EN | Rapide |
| Modèle | Taille | Vitesse | Qualité | Usage |
|---|---|---|---|---|
| phi | 1.6 GB | ⚡⚡⚡ | ⭐⭐ | Rapide pour usage général |
| mistral | 4.4 GB | ⚡⚡ | ⭐⭐⭐ | Équilibré (recommandé) |
| llama2 | 7 GB | ⚡ | ⭐⭐⭐⭐ | Haute qualité |
| codellama | 7 GB | ⚡ | ⭐⭐⭐⭐ | Questions code/programmation |
| deepseek-coder | 6.7 GB | ⚡⚡ | ⭐⭐⭐⭐ | Spécialisé programmation |
docker ps # Vérifier le conteneur
docker logs qdrant # Voir les erreurs
docker restart qdrant # Redémarrerollama list # Vérifier les modèles installés
ollama pull phi # Télécharger un modèle
ollama serve # Démarrer le service (si nécessaire)# Lancer sur toutes les interfaces réseau
streamlit run web_app.py --server.address 0.0.0.0 --server.port 8501Accès depuis un autre PC : http://<server-ip>:8501
Modifier .streamlit/config.toml :
[server]
enableCORS = false
enableXsrfProtection = true
[browser]
gatherUsageStats = false# Via API
curl http://localhost:6333/collections | jq
# Dashboard web
firefox http://localhost:6333/dashboard- Les logs du scraper sont dans
Logs/ - Les logs de Streamlit s'affichent dans le terminal
- Les logs Ollama :
journalctl -u ollama(si installé en service)
Ce projet est développé pour un usage éducatif à l'INSA Centre Val de Loire.
Pour tout problème ou question :
- Créer une issue sur GitHub
- Consulter les README spécifiques :
- README_EMBEDDING.md - Guide des embeddings
- README_WEB.md - Guide de l'interface web
