SemanticChunking wraps Chonkie’s semantic chunker and groups sentences using embedding similarity. See Chonkie Semantic Chunker.
1
Create a Python file
Save one of these variants as
semantic_chunking.py:from agno.agent import Agent
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.vectordb.pgvector import PgVector
db_url = "postgresql+psycopg://ai:ai@localhost:5532/ai"
embedder = OpenAIEmbedder(id="text-embedding-3-small")
knowledge = Knowledge(
vector_db=PgVector(
table_name="recipes_semantic_chunking", db_url=db_url, embedder=embedder
),
)
knowledge.insert(
url="https://agno-public.s3.amazonaws.com/recipes/ThaiRecipes.pdf",
reader=PDFReader(
name="Semantic Chunking Reader",
split_on_pages=False,
chunking_strategy=SemanticChunking(
embedder=embedder,
chunk_size=500,
),
),
)
agent = Agent(
knowledge=knowledge,
search_knowledge=True,
)
agent.print_response("How do I make Thai curry?", markdown=True)
from agno.agent import Agent
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.vectordb.pgvector import PgVector
from chonkie.embeddings import Model2VecEmbeddings
db_url = "postgresql+psycopg://ai:ai@localhost:5532/ai"
agno_embedder = OpenAIEmbedder(id="text-embedding-3-small")
chonkie_embedder = Model2VecEmbeddings(model="minishlab/potion-base-32M")
knowledge = Knowledge(
vector_db=PgVector(
table_name="recipes_semantic_chunking", db_url=db_url, embedder=agno_embedder
),
)
knowledge.insert(
url="https://agno-public.s3.amazonaws.com/recipes/ThaiRecipes.pdf",
reader=PDFReader(
name="Semantic Chunking Reader",
split_on_pages=False,
chunking_strategy=SemanticChunking(
embedder=chonkie_embedder,
chunk_size=500,
),
),
)
agent = Agent(
knowledge=knowledge,
search_knowledge=True,
)
agent.print_response("How do I make Thai curry?", markdown=True)
from agno.agent import Agent
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.vectordb.pgvector import PgVector
db_url = "postgresql+psycopg://ai:ai@localhost:5532/ai"
agno_embedder = OpenAIEmbedder(id="text-embedding-3-small")
knowledge = Knowledge(
vector_db=PgVector(
table_name="recipes_semantic_chunking", db_url=db_url, embedder=agno_embedder
),
)
knowledge.insert(
url="https://agno-public.s3.amazonaws.com/recipes/ThaiRecipes.pdf",
reader=PDFReader(
name="Semantic Chunking Reader",
split_on_pages=False,
chunking_strategy=SemanticChunking(
embedder="minishlab/potion-base-32M",
chunk_size=500,
),
),
)
agent = Agent(
knowledge=knowledge,
search_knowledge=True,
)
agent.print_response("How do I make Thai curry?", markdown=True)
2
Set up your virtual environment
uv venv --python 3.12
source .venv/bin/activate
uv venv --python 3.12
.venv\Scripts\activate
3
Install dependencies
uv pip install -U agno "chonkie[semantic]" openai pgvector psycopg pypdf sqlalchemy
4
Export your OpenAI API key
Set OpenAI Key
Set yourOPENAI_API_KEY as an environment variable. You can get one from OpenAI.export OPENAI_API_KEY=sk-***
setx OPENAI_API_KEY sk-***
5
Run PgVector
docker run -d \
-e POSTGRES_DB=ai \
-e POSTGRES_USER=ai \
-e POSTGRES_PASSWORD=ai \
-e PGDATA=/var/lib/postgresql \
-v pgvolume:/var/lib/postgresql \
-p 5532:5432 \
--name pgvector \
agnohq/pgvector:18
docker run -d `
-e POSTGRES_DB=ai `
-e POSTGRES_USER=ai `
-e POSTGRES_PASSWORD=ai `
-e PGDATA=/var/lib/postgresql `
-v pgvolume:/var/lib/postgresql `
-p 5532:5432 `
--name pgvector `
agnohq/pgvector:18
6
Run the script
python semantic_chunking.py
split_on_pages=False so PDFReader combines the pages before applying SemanticChunking. Keep the default value of True to chunk each page independently.
Choose an Embedder
Theembedder parameter accepts an Agno Embedder, a Chonkie BaseEmbeddings instance, or a string model identifier resolved by Chonkie. See Chonkie Embeddings.
| Embedder Value | Chunk Size Measurement |
|---|---|
Agno Embedder | Whitespace-separated words |
Chonkie BaseEmbeddings | Tokens from the embedder’s tokenizer |
| String model identifier | Tokens from the tokenizer selected by Chonkie |
Semantic Chunking Params
| Parameter | Type | Default | Description |
|---|---|---|---|
embedder | Optional[Union[str, Embedder, BaseEmbeddings]] | None | The embedder configuration. When None, an OpenAIEmbedder is created. Can be an Agno Embedder (e.g., OpenAIEmbedder, GeminiEmbedder), a Chonkie BaseEmbeddings instance (e.g., OpenAIEmbeddings), or a string model identifier (e.g., "text-embedding-3-small") for Chonkie's AutoEmbeddings. |
chunk_size | int | 5000 | Maximum tokens allowed per chunk. |
similarity_threshold | float | 0.5 | Similarity threshold for grouping sentences (0-1). Lower values create larger groups (fewer chunks). |
similarity_window | int | 3 | Number of sentences to consider for similarity calculation. |
min_sentences_per_chunk | int | 1 | Minimum number of sentences per chunk. |
min_characters_per_sentence | int | 24 | Minimum number of characters per sentence. |
delimiters | Optional[List[str]] | None | Delimiters to split sentences on. Defaults to [". ", "! ", "? ", "\n"] when not set. |
include_delimiters | Literal["prev", "next", None] | "prev" | Include delimiters in the chunk text. Specify whether to include with the previous or next sentence. |
skip_window | int | 0 | Number of groups to skip when looking for similar content to merge. 0 (default) uses standard semantic grouping; higher values enable merging of non-consecutive semantically similar groups. |
filter_window | int | 5 | Window length for the Savitzky-Golay filter used in boundary detection. |
filter_polyorder | int | 3 | Polynomial order for the Savitzky-Golay filter. |
filter_tolerance | float | 0.2 | Tolerance for the Savitzky-Golay filter boundary detection. |
chunker_params | Optional[Dict[str, Any]] | None | Additional parameters to pass directly to Chonkie's SemanticChunker. |