Exercices IA & Data Science Decouper des Documents avec metadonnées
🎉

Bravo!

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

Decouper des Documents avec metadonnées

Quand on decoupe un texte en chunks, on veut garder la trace de l'origine de chaque morceau. RécursiveCharacterTextSplitter a une méthode split_documents qui prend une liste de Documents et renvoie une nouvelle liste de Documents, chacun avec les metadonnées preservees.

splitter = RécursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=20)
docs = [Document(page_content='long texte...', metadata={'source': 'a.txt'})]
chunks = splitter.split_documents(docs)
# Chaque chunk dans chunks a metadata={'source': 'a.txt'}

Écris une fonction split_documents(documents, chunk_size, chunk_overlap) qui :
1. Crée un RécursiveCharacterTextSplitter avec les paramètres donnes
2. Decoupe les documents avec split_documents
3. Ajoute dans les metadonnées de chaque chunk une clé 'chunk_index' avec son numéro (en partant de 0)
4. Renvoie la liste des chunks enrichis

Exemple :
doc = Document(page_content='Texte long...', metadata={'source': 'a.txt'})
result = split_documents([doc], 50, 10)
result[0].metadata contient {'source': 'a.txt', 'chunk_index': 0}
result[1].metadata contient {'source': 'a.txt', 'chunk_index': 1}

Tests (1/1)

Tests
from langchain_core.documents import Document
doc = Document(page_content='Bonjour le monde. ' * 30, metadata={'source': 'test.txt'})
result = split_documents([doc], 80, 10)
assert len(result) > 1, 'Le document devrait etre decoupe en plusieurs chunks'
assert all(isinstance(r, Document) for r in result), 'Chaque chunk doit etre un Document'
assert result[0].metadata['source'] == 'test.txt', 'La source doit etre preservee'
assert result[0].metadata['chunk_index'] == 0, 'Le premier chunk doit avoir chunk_index 0'
assert result[1].metadata['chunk_index'] == 1, 'Le deuxieme chunk doit avoir chunk_index 1'
for i, chunk in enumerate(result):
    assert chunk.metadata['chunk_index'] == i, f'chunk_index incorrect pour le chunk {i}'

Indices (3 disponibles)

solution.py