Exercices IA & Data Science Filtrer les résultats par metadonnées
🎉

Bravo!

Intermédiaire 🧠 Fondamentaux 20 XP 0 personnes ont réussi

Filtrer les résultats par metadonnées

En RAG, on ne veut pas toujours chercher dans tous les documents. Parfois on veut filtrer par source, par date, par catégorie. C'est le concept de recherche hybride : recherche vectorielle + filtres sur les metadonnées.

Écris une fonction filtered_search(query, documents, filters, k) qui :
1. Filtre les documents dont les metadonnées correspondent aux filtres
2. Parmi les documents filtres, cherche les k plus pertinents avec TF-IDF + cosine
3. Renvoie la liste des k meilleurs Documents

filters est un dictionnaire {'clé': 'valeur'}. Un document passe le filtre si chaque clé du filtre est presente dans ses metadonnées avec la bonne valeur.

Si aucun document ne passe les filtres, renvoie une liste vide.

Exemple :
docs = [
Document(page_content='Python basique', metadata={'source': 'cours', 'niveau': 'debutant'}),
Document(page_content='Python avance', metadata={'source': 'cours', 'niveau': 'avance'}),
Document(page_content='Recette de cuisine', metadata={'source': 'blog'}),
]
filtered_search('Python', docs, {'source': 'cours'}, 1)
ne cherche que dans les 2 premiers documents

Tests (1/1)

Tests
from langchain_core.documents import Document
docs = [
    Document(page_content='Python pour debutants', metadata={'source': 'cours', 'niveau': 'debutant'}),
    Document(page_content='Python avance decorateurs', metadata={'source': 'cours', 'niveau': 'avance'}),
    Document(page_content='Recette de tarte aux pommes', metadata={'source': 'blog'}),
    Document(page_content='Python machine learning', metadata={'source': 'cours', 'niveau': 'avance'}),
]
result = filtered_search('Python', docs, {'source': 'cours'}, 2)
assert len(result) == 2, f'Attendu 2 résultats, obtenu {len(result)}'
assert all('source' in r.metadata and r.metadata['source'] == 'cours' for r in result)
result2 = filtered_search('Python', docs, {'niveau': 'avance'}, 1)
assert len(result2) == 1, 'Attendu 1 résultat pour niveau avance'
assert result2[0].metadata['niveau'] == 'avance'
result3 = filtered_search('test', docs, {'source': 'inexistant'}, 1)
assert result3 == [], 'Aucun filtre ne correspond, devrait renvoyer une liste vide'

Indices (3 disponibles)

solution.py