Exercices IA & Data Science Pipeline RAG avec FAISS et évaluation
🎉

Bravo!

Avancé 🧠 Fondamentaux 30 XP 0 personnes ont réussi

Pipeline RAG avec FAISS et évaluation

Pour finir, on va construire un pipeline RAG de niveau production qui combine tout ce qu'on a appris : Documents LangChain, text splitting, TF-IDF, FAISS et évaluation.

Écris une classe ProductionRAG qui a :

- __init__(self, chunk_size=200, chunk_overlap=50)

- ingest(self, texts, sources)
Decoupe les textes en chunks, vectorise avec TF-IDF, et indexe dans FAISS.
Stocke aussi la correspondance entre index FAISS et chunks.

- search(self, query, k=3, filters=None)
Cherche les k chunks les plus proches dans FAISS.
Si filters est un dictionnaire, ne garde que les résultats dont les metadonnées correspondent (filtre applique APRES la recherche FAISS, sur un pool plus large).
Pour gerer le filtrage post-recherche, cherche k*3 résultats dans FAISS puis filtre et prend les k premiers.

- evaluate(self, queries_and_relevant)
Prend une liste de tuples (query, set_of_relevant_sources).
Pour chaque query, fait une recherche et compare les sources des résultats avec les sources pertinentes.
Renvoie {'mean_precision': float, 'mean_recall': float}.

Exemple :
rag = ProductionRAG(chunk_size=100)
rag.ingest(['texte Python...', 'texte Java...'], ['python.txt', 'java.txt'])
results = rag.search('Python', k=2)
metrics = rag.evaluate([('Python', {'python.txt'})])

Tests (1/1)

Tests
rag = ProductionRAG(chunk_size=100, chunk_overlap=20)
texts = [
    'Python est un langage de programmation populaire crée par Guido van Rossum en 1991. ' * 5,
    'Django est un framework web en Python utilise pour créer des applications web robustes. ' * 5,
    'Les bases de données SQL permettent de stocker et interroger des données structurees. ' * 5,
]
sources = ['python.txt', 'django.txt', 'sql.txt']
rag.ingest(texts, sources)
assert len(rag.chunks) > 3, 'Les textes doivent etre decoupes'
assert rag.index.ntotal == len(rag.chunks), 'L index FAISS doit contenir tous les chunks'
results = rag.search('programmation Python', k=2)
assert len(results) == 2, f'Attendu 2 résultats, obtenu {len(results)}'
results_filtered = rag.search('Python', k=2, filters={'source': 'django.txt'})
assert all(r.metadata['source'] == 'django.txt' for r in results_filtered), 'Le filtre doit etre respecte'
metrics = rag.evaluate([('Python programmation', {'python.txt'}), ('framework web', {'django.txt'})])
assert 'mean_precision' in metrics, 'Les metriques doivent contenir mean_precision'
assert 'mean_recall' in metrics, 'Les metriques doivent contenir mean_recall'
assert 0 <= metrics['mean_precision'] <= 1, 'Precision doit etre entre 0 et 1'

Indices (3 disponibles)

solution.py