Semantic Chunking

Group sentences into chunks using embedding similarity and configurable boundary controls.

SemanticChunking wraps Chonkie's semantic chunker and groups sentences using embedding similarity. See Chonkie Semantic Chunker.

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)

Set up your virtual environment

uv venv --python 3.12
source .venv/bin/activate

Install dependencies

uv pip install -U agno "chonkie[semantic]" openai pgvector psycopg pypdf sqlalchemy

Export your OpenAI API key

Set OpenAI Key

Set your OPENAI_API_KEY as an environment variable. You can get one from OpenAI.

export OPENAI_API_KEY=sk-***

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

Run the script

python semantic_chunking.py

The example sets 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

The embedder parameter accepts an Agno Embedder, a Chonkie BaseEmbeddings instance, or a string model identifier resolved by Chonkie. See Chonkie Embeddings.

Embedder ValueChunk Size Measurement
Agno EmbedderWhitespace-separated words
Chonkie BaseEmbeddingsTokens from the embedder's tokenizer
String model identifierTokens from the tokenizer selected by Chonkie

Semantic Chunking Params

ParameterTypeDefaultDescription
embedderOptional[Union[str, Embedder, BaseEmbeddings]]NoneThe 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_sizeint5000Maximum tokens allowed per chunk.
similarity_thresholdfloat0.5Similarity threshold for grouping sentences (0-1). Lower values create larger groups (fewer chunks).
similarity_windowint3Number of sentences to consider for similarity calculation.
min_sentences_per_chunkint1Minimum number of sentences per chunk.
min_characters_per_sentenceint24Minimum number of characters per sentence.
delimitersOptional[List[str]]NoneDelimiters to split sentences on. Defaults to [". ", "! ", "? ", "\n"] when not set.
include_delimitersLiteral["prev", "next", None]"prev"Include delimiters in the chunk text. Specify whether to include with the previous or next sentence.
skip_windowint0Number 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_windowint5Window length for the Savitzky-Golay filter used in boundary detection.
filter_polyorderint3Polynomial order for the Savitzky-Golay filter.
filter_tolerancefloat0.2Tolerance for the Savitzky-Golay filter boundary detection.
chunker_paramsOptional[Dict[str, Any]]NoneAdditional parameters to pass directly to Chonkie's SemanticChunker.

Developer Resources