Comment transformer un pipeline de connaissances fragmenté en un système unifié capable de router intelligemment chaque requête vers la bonne source ? Retour sur la consolidation du RAG hybride ExploDev — du silo à l'orchestration.
Fragmentation et goulots d'étranglement
Deux silos de données, une ingestion limitée, un graphe inutilisable et un LLM local à 0,7 tok/s.
🔒 Problèmes identifiés
- Silos :
kimi_rag(PostgreSQL) etsg-rag(SQLite) sans pont. - Ingestion limitée : seuls les
.mdétaient indexés. Pas de.env,.yaml,.json,.sh,.py. - Graphe AGE mort :
LOAD 'age'échouait pour l'utilisateur (privilèges insuffisants). - Pas de routing IA : chaque requête passait par les mêmes moteurs, quelle que soit son intention.
- Cron basique : ingestion + embeddings toutes les 30 min, mais pas de peuplement graphe ni de classification.
Du silo à l'orchestration
| Étape | Action | Résultat |
|---|---|---|
| 1 | Migration SQLite → PostgreSQL | Base unique, déduplication SHA-256 |
| 2 | Qwen 2.5 3B sur serveur-ia | Classifier à ~10 tok/s |
| 3 | Reconfig Ollama (réseau + ctx 32k) | Exposition LAN, contexte étendu |
| 4 | Nouvel ingest ingest-hybrid.py | 7 formats, sanitization .env |
| 5 | Orchestrateur rag-orchestrator.py | Classifier → Router → Résultats JSON |
| 6 | Correction graphe AGE (droits fins) | Pas de SUPERUSER, graphe activé |
| 7 | Crons enrichis (4 tâches) | Ingest, embed, graphe, classify auto |
| 8 | CLI explodev-query | 1 commande = recherche hybride |
| 9 | Extraction d'entités améliorée | Stop-words FR + tri par longueur |
🔄 Le pipeline en action
Un système unifié et intelligent
🛡️ Sécurité : pas de SUPERUSER
Le graphe AGE fonctionne avec des droits minimaux : USAGE + SELECT sur les schémas kimi_graph et infrastructure. Aucun privilège élevé requis.
📂 Ingestion multi-formats
Les fichiers .env sont sanitizés : les valeurs sont masquées par *** avant indexation.
📈 Benchmark — Activation du graphe AGE
10 requêtes types. Avant : premier mot brut. Après : mots-clés filtrés (stop-words français + tri par longueur).
📊 Résultats détaillés
| Requête | Avant (résultats) | Après (résultats) |
|---|---|---|
| Quel serveur héberge Neo4j ? | 0 | 2 |
| Où sont stockés les credentials SSH ? | 0 | 2 |
| Quel est le mot de passe PostgreSQL ? | 0 | 7 |
| Quels ports ouverts sur serveur-sg ? | 0 | 3 |
| Comment configurer le serveur-io ? | 3 | 4 |
⌨️ Utilisation
# Recherche simple
explodev-query "Quel serveur héberge Neo4j ?"
# Sortie JSON
explodev-query --json "Mot de passe PostgreSQL ?"
⏰ Automatisation
# Ingestion hybride (toutes les 30 min)
*/30 * * * * ingest-hybrid.py
# Embeddings auto (toutes les 30 min)
*/30 * * * * auto-embed.py
# Peuplement graphe AGE (toutes les 2h)
0 */2 * * * populate-age-graph.py
# Classification auto (toutes les heures)
0 * * * * rag-orchestrator.py --classify-new-docs
📁 Fichiers clés
Document généré lors de la session de consolidation RAG hybride ExploDev — 4 juin 2026.