Moteur de question-réponse sur un corpus de documents, fonctionnant entièrement en local : aucune donnée n'est envoyée à un service externe.
Documents (txt/md/pdf) → découpage en morceaux avec chevauchement → embeddings (sentence-transformers, 384 dimensions) → index vectoriel (numpy) → recherche par similarité cosinus → génération ancrée sur les extraits (Ollama) → réponse avec citation des sources.
| Fichier | Rôle |
|---|---|
rag_core.py |
lecture, découpage, embeddings, index, recherche |
llm.py |
construction du prompt et appel au modèle |
ingest.py |
construction de l'index |
ask.py |
interrogation |
evaluate.py |
mesure de la qualité |
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
ollama pull llama3.2:3bpython ingest.py # construire l'index
python ask.py "quelle est la durée de la garantie ?"
python evaluate.py --with-llm # mesurer la qualitéLe projet inclut un protocole de mesure, souvent absent des démonstrations RAG :
- Recall@k : la recherche ramène-t-elle le passage attendu ?
- Taux de citation : la réponse s'appuie-t-elle sur une source identifiée ?
- Refus correct : sur des questions hors corpus, le système répond-il « je ne trouve pas » au lieu d'inventer ?
Cette dernière mesure est la plus révélatrice : sans autorisation explicite de refuser, un modèle préfère produire une réponse plausible plutôt que rien.
Pas de base vectorielle externe. L'index est une matrice numpy, la recherche un produit scalaire. Sur quelques milliers de morceaux, c'est instantané. Une base dédiée (FAISS, Chroma, Azure AI Search) devient nécessaire à partir de centaines de milliers de vecteurs : c'est une question de volume, pas de principe.
Chevauchement entre morceaux. Une information à cheval sur deux morceaux serait coupée et deviendrait introuvable ; le chevauchement garantit qu'elle apparaît entière quelque part.
Température à 0,1. Sur un usage documentaire, la variabilité est un défaut.
La recherche est purement sémantique : elle retrouve mal les références exactes (numéros d'article, codes produit). Une recherche hybride, combinant score vectoriel et score lexical BM25, serait la prochaine étape.
- Recherche hybride (vectoriel + BM25) et reranking
- Journalisation des requêtes, latences et coûts
- Interface web de démonstration