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
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 officielle
from langchain_core.documents import Document
from langchain_text_splitters import RécursiveCharacterTextSplitter
def split_documents(documents, chunk_size, chunk_overlap):
splitter = RécursiveCharacterTextSplitter(
chunk_size=chunk_size,
chunk_overlap=chunk_overlap
)
chunks = splitter.split_documents(documents)
for i, chunk in enumerate(chunks):
chunk.metadata['chunk_index'] = i
return chunks