RAG 100 % local

Library Brain

En prod SQLite FTS5sqlite-vecbge-m3

Ce que c'est

Réponses sourcées depuis la bibliothèque locale. 25 376 documents, 1,82 million de chunks, base de 20,4 Go, reranking et recherche cross-lingue.

La décision d'architecte

Bascule des embeddings vers un backend in-process validée par cos = 1.0000 mesuré sur corpus réel → zéro ré-encodage des vecteurs. Le juge de paix est un gate de non-régression : couverture, taux de refus, 0 hallucination — un score sous baseline fait échouer la nuit. 1 968 tests déclarés, 404 commits.

Ce qui a mal tourné

Le classement par nombre brut d'occurrences. Il faisait gagner les romans-fleuves sur les manuels : un ouvrage de 900 pages contient mécaniquement plus d'occurrences de n'importe quel terme qu'une référence dense de 120 pages, sans être plus pertinent. Le tri se fait désormais par couverture de termes distincts. Même corpus, même requête, résultats sans rapport avec les précédents.

Des tests instables, et la tentation de les désactiver. Plusieurs suites échouaient par intermittence. La cause n'était pas le hasard mais des fuites de ressources — index vectoriel et plein-texte non refermés entre deux cas. Un test instable qu'on marque « à ignorer » est un bug qu'on décide de ne plus voir.

Une migration qui aurait coûté des jours pour rien. Avant de rebasculer 1,7 million de vecteurs vers un autre backend d'embeddings, j'ai mesuré la similarité cosinus entre l'ancien et le nouveau sur le corpus réel : cos = 1.0000. Zéro ré-encodage nécessaire. Sans cette mesure, c'était plusieurs jours de calcul dépensés par précaution.

Les chiffres

25 376documents indexés
1 824 420chunks vectorisés
1 968tests déclarés
0hallucination tolérée par le gate

Le code

Dépôt privé — visite commentée en visio

Compétences mobilisées

Projets liés

Vos données ne peuvent pas sortir ?

Décrivez le cas d'usage, les données concernées et le matériel disponible. Je réponds personnellement sous 48 h ouvrées.