Chunking Strategies: Side-by-Side Comparison
Compare four chunking strategies for different content types and use cases.
Chunking determines how documents are split into pieces for embedding and search. The right strategy depends on your content type.
"""
Chunking Strategies: Side-by-Side Comparison
==============================================
Chunking determines how documents are split into pieces for embedding and search.
The right strategy depends on your content type.
Strategies compared:
- Fixed size: Simple, predictable chunk sizes. Good default.
- Recursive: Splits on natural boundaries (paragraphs, sentences). Better quality.
- Semantic: Groups related sentences by meaning. Best for mixed-topic docs.
- Document: Splits on document structure (pages, sections).
- Markdown: Splits on headers. Ideal for structured documentation.
- Code: Respects function/class boundaries. Use for source code.
- Agentic: LLM determines optimal boundaries. Most accurate, slowest.
See also: ../reference/chunking_decision_guide.md
"""
import asyncio
from agno.agent import Agent
from agno.knowledge.chunking.agentic import AgenticChunking
from agno.knowledge.chunking.document import DocumentChunking
from agno.knowledge.chunking.fixed import FixedSizeChunking
from agno.knowledge.chunking.markdown import MarkdownChunking
from agno.knowledge.chunking.recursive import RecursiveChunking
from agno.knowledge.chunking.semantic import SemanticChunking
from agno.knowledge.embedder.openai import OpenAIEmbedder
from agno.knowledge.knowledge import Knowledge
from agno.knowledge.reader.pdf_reader import PDFReader
from agno.models.openai import OpenAIResponses
from agno.vectordb.qdrant import Qdrant
from agno.vectordb.search import SearchType
# ---------------------------------------------------------------------------
# Setup
# ---------------------------------------------------------------------------
qdrant_url = "http://localhost:6333"
pdf_url = "https://agno-public.s3.amazonaws.com/recipes/ThaiRecipes.pdf"
def create_knowledge(table_name: str) -> Knowledge:
return Knowledge(
vector_db=Qdrant(
collection=table_name,
url=qdrant_url,
search_type=SearchType.hybrid,
embedder=OpenAIEmbedder(id="text-embedding-3-small"),
),
)
# ---------------------------------------------------------------------------
# Chunking Strategies
# ---------------------------------------------------------------------------
# 1. Fixed size: chunks of a set number of characters
fixed_reader = PDFReader(chunking_strategy=FixedSizeChunking(chunk_size=500))
# 2. Recursive: splits on paragraphs, then sentences, then characters
recursive_reader = PDFReader(chunking_strategy=RecursiveChunking(chunk_size=500))
# 3. Semantic: groups sentences by semantic similarity
semantic_reader = PDFReader(
chunking_strategy=SemanticChunking(
embedder=OpenAIEmbedder(id="text-embedding-3-small"),
)
)
# 4. Document: splits on document structure (pages)
document_reader = PDFReader(chunking_strategy=DocumentChunking())
# 5. Markdown: splits on headers (for markdown/docs content)
markdown_reader = PDFReader(chunking_strategy=MarkdownChunking())
# 6. Agentic: LLM decides where to split (slowest, most accurate)
agentic_reader = PDFReader(
chunking_strategy=AgenticChunking(
model=OpenAIResponses(id="gpt-5.2"),
)
)
# ---------------------------------------------------------------------------
# Run Demo
# ---------------------------------------------------------------------------
if __name__ == "__main__":
async def main():
strategies = [
("fixed_chunking", "Fixed Size", fixed_reader),
("recursive_chunking", "Recursive", recursive_reader),
("semantic_chunking", "Semantic", semantic_reader),
("document_chunking", "Document", document_reader),
]
for table_name, name, reader in strategies:
print("\n" + "=" * 60)
print("STRATEGY: %s" % name)
print("=" * 60 + "\n")
knowledge = create_knowledge(table_name)
await knowledge.ainsert(url=pdf_url, reader=reader)
agent = Agent(
model=OpenAIResponses(id="gpt-5.2"),
knowledge=knowledge,
search_knowledge=True,
markdown=True,
)
agent.print_response(
"How do I make pad thai?",
stream=True,
)
asyncio.run(main())The loop runs four strategies: fixed, recursive, semantic, and document. Markdown and agentic readers are constructed but are not used in that loop. DocumentChunking groups paragraphs and sentences within each reader document; it does not discover PDF page boundaries itself. The source’s accuracy rankings are illustrative claims, not measured results; compare retrieval on your own documents before choosing a strategy.
Run the Example
Set up your virtual environment
uv venv --python 3.12
source .venv/bin/activateInstall dependencies
uv pip install -U agno "chonkie[semantic]" fastembed markdown numpy openai pypdf qdrant-client rapidocr-onnxruntime unstructuredExport your OpenAI API key
export OPENAI_API_KEY="your_openai_api_key_here"Run Qdrant
docker run -d --name qdrant -p 6333:6333 qdrant/qdrant:latestRun the example
Save the code above as chunking_strategies.py, then run:
python chunking_strategies.pyFull source: cookbook/07_knowledge/02_building_blocks/01_chunking_strategies.py