Step 2: Text Chunking
Text chunking splits loaded documents into smaller pieces that are suitable for embedding and retrieval. The chunking strategy significantly impacts the quality of your RAG system.
Key Parameters:
• Chunk Size: The maximum size of each chunk (typically 200-1500 characters or tokens). Smaller chunks are more precise but lose context; larger chunks provide more context but may include irrelevant information.
• Chunk Overlap: How much text is shared between consecutive chunks (typically 50-200 characters). Overlap helps preserve context at chunk boundaries.
• Splitting Strategy: How the text is actually divided — by characters, sentences, paragraphs, or semantic boundaries.
Common Strategies:
• RecursiveCharacterTextSplitter: Tries to split by paragraphs, then sentences, then characters, preserving the most natural boundaries. This is the most commonly recommended approach.
• SentenceTextSplitter: Splits at sentence boundaries, ensuring each chunk contains complete sentences.
• SemanticChunker: Uses embeddings to identify topic boundaries and split at semantically meaningful points.
Start with 500-1000 characters and 100-200 character overlap. Test with your actual queries and adjust based on retrieval quality. There is no universally optimal chunk size — it depends on your documents and questions.
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=1000, # Maximum chunk size in characters
chunk_overlap=200, # Overlap between consecutive chunks
length_function=len,
separators=["\n\n", "\n", ". ", " ", ""] # Try these separators in order
)
chunks = splitter.split_documents(pdf_docs)
print(f"Created {len(chunks)} chunks from {len(pdf_docs)} pages")
# Inspect a chunk
print(f"Chunk size: {len(chunks[0].page_content)} chars")
print(f"Content preview: {chunks[0].page_content[:200]}...")
print(f"Metadata: {chunks[0].metadata}")