When you split a large document into smaller parts, you want to keep important extra information (metadata) with each part. This helps you remember details like the source or author for each piece.
Metadata preservation during splitting in LangChain
from langchain.text_splitter import RecursiveCharacterTextSplitter text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=100) docs = text_splitter.split_documents(documents)
split_documents takes a list of documents with metadata and returns smaller documents keeping the metadata.
You can customize chunk_size and chunk_overlap to control how big each piece is and how much they share.
from langchain.schema import Document from langchain.text_splitter import RecursiveCharacterTextSplitter # Original document with metadata original_doc = Document(page_content="Hello world! This is a test.", metadata={"source": "file1.txt"}) # Splitter setup splitter = RecursiveCharacterTextSplitter(chunk_size=5, chunk_overlap=0) # Split document chunks = splitter.split_documents([original_doc])
from langchain.schema import Document from langchain.text_splitter import RecursiveCharacterTextSplitter # Document with author metadata doc = Document(page_content="This is a longer text that will be split.", metadata={"author": "Alice"}) splitter = RecursiveCharacterTextSplitter(chunk_size=10, chunk_overlap=2) chunks = splitter.split_documents([doc])
This program splits a document into smaller parts, each keeping the original metadata like source and page number. It prints each chunk's text and metadata.
from langchain.schema import Document from langchain.text_splitter import RecursiveCharacterTextSplitter # Create a document with metadata text = "Langchain helps you build apps with language models." metadata = {"source": "example.txt", "page": 1} doc = Document(page_content=text, metadata=metadata) # Setup splitter splitter = RecursiveCharacterTextSplitter(chunk_size=20, chunk_overlap=5) # Split document chunks = splitter.split_documents([doc]) # Print each chunk's content and metadata for i, chunk in enumerate(chunks, 1): print(f"Chunk {i} content: {chunk.page_content}") print(f"Chunk {i} metadata: {chunk.metadata}\n")
Always check that metadata is preserved after splitting to avoid losing important info.
Metadata can include anything like source, author, date, or tags.
Adjust chunk size and overlap to balance between chunk length and context preservation.
Splitting documents keeps metadata so you don't lose context.
Use split_documents method to split while preserving metadata.
Customize chunk size and overlap to fit your needs.
Practice
Solution
Step 1: Understand what metadata means in this context
Metadata is extra information about the document, like source or tags, that helps keep context.Step 2: Recognize why preserving metadata is useful
When splitting, keeping metadata ensures each chunk still knows where it came from and what it relates to.Final Answer:
It keeps important context linked to each chunk. -> Option DQuick Check:
Metadata preservation = keeps context [OK]
- Thinking metadata speeds splitting
- Confusing metadata with chunk size
- Believing metadata removes text
Solution
Step 1: Recall the method name for splitting with metadata
The method designed to split documents and keep metadata is calledsplit_documents.Step 2: Eliminate incorrect options
Other options likepreserve_metadata,chunk_text, andsplit_textare not valid Langchain methods for this purpose.Final Answer:
split_documents -> Option AQuick Check:
Method to split with metadata = split_documents [OK]
- Using split_text instead of split_documents
- Assuming preserve_metadata is a method
- Confusing chunk_text with splitting
docs = [Document(page_content='Hello world', metadata={'source': 'file1'})]
splitter = RecursiveCharacterTextSplitter(chunk_size=5, chunk_overlap=0)
chunks = splitter.split_documents(docs)
print(chunks[0].metadata)Solution
Step 1: Understand the input document metadata
The original document has metadata {'source': 'file1'}.Step 2: Check if splitting preserves metadata
Thesplit_documentsmethod keeps metadata for each chunk, so the first chunk keeps {'source': 'file1'}.Final Answer:
{'source': 'file1'} -> Option CQuick Check:
Metadata preserved = {'source': 'file1'} [OK]
- Expecting empty metadata after split
- Assuming metadata is lost or null
- Thinking chunk index is added to metadata
docs = [Document(page_content='Test text', metadata={'id': 123})]
splitter = RecursiveCharacterTextSplitter(chunk_size=4, chunk_overlap=1)
chunks = splitter.split_texts(docs)
print(chunks[0].metadata)Solution
Step 1: Identify the method used for splitting
The code usessplit_textswhich only splits text strings, not Document objects with metadata.Step 2: Understand consequence on metadata
Sincesplit_textsworks on strings, metadata is lost. The correct method to preserve metadata issplit_documents.Final Answer:
Using split_texts instead of split_documents loses metadata. -> Option AQuick Check:
split_texts loses metadata [OK]
- Thinking chunk size affects metadata
- Believing metadata keys cause loss
- Assuming overlap affects metadata
Solution
Step 1: Set chunk size and overlap correctly
The question asks for 100 characters chunk size and 20 characters overlap, so chunk_size=100 and chunk_overlap=20.Step 2: Use the correct splitting method to preserve metadata
To keep metadata, usesplit_documentsmethod, notsplit_texts.Final Answer:
splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=20) chunks = splitter.split_documents(docs) -> Option BQuick Check:
Correct chunk size, overlap, and method = splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=20) chunks = splitter.split_documents(docs) [OK]
- Using split_texts instead of split_documents
- Setting wrong chunk size or overlap
- Using zero overlap when asked for 20
Ready to prove it?
Pass the test and this pattern moves unknown
