RAG 100 % local

Library Brain

En prod SQLite FTS5sqlite-vecbge-m3

Ce que c'est

Réponses uniquement sourcées depuis les livres (zéro hallucination). 24 799 livres, 1,68 million de chunks, base de 21 Go, reranking cross-encodeur, 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 619 tests, 350 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

24 799livres indexés
1 699 549chunks vectorisés
1 619tests
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 ?

C'est exactement le problème que je résous. Un appel de 30 minutes suffit à cadrer un audit.