ChunkerOperator
Splits document text into overlapping chunks for embedding generation and vector storage.
- Short Name:
chunker - Category: Functional
Overview
ChunkerOperator breaks extracted document text into smaller, contextually coherent pieces
(chunks) that fit within embedding model token limits. It supports three strategies — simple
fixed-size, semantic content-aware, and hybrid Docling-based — and can optionally summarise
each chunk using an LLM.
Chunking can run locally (default) or be offloaded to a remote docling-serve instance for
distributed workloads.
Key Features
- Three chunking strategies:
simple,semantic,hybrid - Optional LLM-based chunk summarisation (LiteLLM or WatsonX)
- Remote chunking via
docling-serveAPI - Configurable chunk size and overlap
- Optionally retains the original content column alongside chunks
- Outputs
chunk_sequence_numberandstart_indexfor precise retrieval
Operator Configuration
{
"type": "chunker",
"name": "chunk_documents",
"config": {
"chunk_type": "hybrid",
"chunk_size": 512,
"chunk_overlap": 128,
"provider": "docling_library",
"doc_column": "content",
"retain_original_content": false
},
"depends_on": ["extract_documents"]
}
Parameters
Common parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
chunk_type |
string | No | "simple" |
Chunking strategy: simple, semantic, or hybrid |
chunk_size |
integer | No | 2048 |
Max chunk size — characters for simple, tokens for hybrid; ignored by semantic |
chunk_overlap |
integer | No | 200 |
Overlap between consecutive chunks (characters or tokens). Max 512. |
chunk_overlap_percentage |
integer | No | 20 |
Overlap expressed as a percentage of chunk_size (0–40). Validated for simple and hybrid only. Values above 20 produce a warning. |
doc_column |
string | No | "content" |
Input column containing text to chunk |
retain_original_content |
boolean | No | false |
Keep the original content column in the output table |
docling_tokenizer |
string | No | "sentence-transformers/all-MiniLM-L6-v2" |
HuggingFace tokenizer for hybrid chunking only |
Semantic chunking parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
semantic_embeddings_model |
string | Yes (semantic) | — | Ollama model for semantic boundary detection (e.g. nomic-embed-text) |
breakpoint_threshold_type |
string | No | "percentile" |
Split heuristic: percentile, standard_deviation, interquartile, gradient |
breakpoint_threshold_amount |
float | No | null | Threshold value for the chosen heuristic (e.g. 95.0 for percentile) |
Remote (docling-serve) chunking parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
provider |
string | No | null | "docling_library" (local) or "docling_serve" (remote) |
provider_config.api_base |
string | Yes (remote) | — | Base URL of docling-serve instance |
provider_config.api_key |
string | No | — | API key for docling-serve |
provider_config.timeout |
integer | No | 300 |
Request timeout in seconds |
provider_config.poll_interval |
integer | No | 2 |
Polling interval for async requests |
provider_config.max_retries |
integer | No | 3 |
Maximum retry attempts |
provider_config.verify_ssl |
boolean | No | true |
Set false for self-signed certificates |
Summarisation parameters (summarization object)
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
summarization.provider |
string | No | "litellm" |
LLM provider: litellm or watsonx |
summarization.provider_config |
object | Yes (if summarization) | — | Provider-specific config including model_id |
summarization.summary_sentences |
integer | No | 2 |
Target sentences per summary (1–5) |
summarization.summary_max_words |
integer | No | 20 |
Max words per summary (10–100) |
summarization.max_input_tokens |
integer | No | 8000 |
Max tokens per LLM request (1000–32000) |
Output Columns
All original columns (except content when retain_original_content: false) are preserved.
| Column | PyArrow Type | Description |
|---|---|---|
chunked_content |
list<struct<chunk: string, start_index: int64, summary: string?>> |
Array of chunk objects |
chunk_sequence_number |
int64 |
Sequential chunk index within the source document |
start_index |
int64 |
Token/character position of the chunk in the source document |
Each item in chunked_content:
- chunk — text content of the chunk
- start_index — position in the original text
- summary — present only when summarisation is enabled
Examples
Example 1 — Simple chunking
{
"type": "chunker",
"name": "simple_chunker",
"config": {
"chunk_type": "simple",
"chunk_size": 1000,
"chunk_overlap": 200,
"doc_column": "content"
},
"depends_on": ["extract"]
}
Example 2 — Semantic chunking
{
"type": "chunker",
"name": "semantic_chunker",
"config": {
"chunk_type": "semantic",
"semantic_embeddings_model": "nomic-embed-text",
"breakpoint_threshold_type": "percentile",
"breakpoint_threshold_amount": 95.0,
"doc_column": "content"
},
"depends_on": ["extract"]
}
Example 3 — Hybrid chunking with summarisation
{
"type": "chunker",
"name": "hybrid_chunker",
"config": {
"chunk_type": "hybrid",
"provider": "docling_library",
"chunk_size": 512,
"chunk_overlap": 50,
"docling_tokenizer": "sentence-transformers/all-MiniLM-L6-v2",
"summarization": {
"provider": "litellm",
"provider_config": {
"model_id": "llama3.2",
"api_base": "http://localhost:11434/v1",
"api_key": "<ollama>"
},
"summary_sentences": 2,
"summary_max_words": 30
}
},
"depends_on": ["extract"]
}
Example 4 — Remote chunking via docling-serve
{
"type": "chunker",
"name": "remote_chunker",
"config": {
"chunk_type": "hybrid",
"chunk_size": 512,
"chunk_overlap": 128,
"provider": "docling_serve",
"provider_config": {
"api_base": "https://docling-serve.example.com",
"timeout": 120,
"max_retries": 3
}
},
"depends_on": ["extract"]
}
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
Connection to docling-serve timed out |
Remote service unreachable | Verify api_base is correct and the service is running; increase timeout |
Docling-serve returned no chunks |
Empty or non-markdown input | Verify the doc_column column contains non-empty markdown text |
| SSL verification errors | Self-signed certificate on docling-serve | Set provider_config.verify_ssl: false for testing; use a valid cert in production |
| Semantic chunking hangs | Ollama not running | Start Ollama: ollama serve && ollama pull <model> |
| Very large number of tiny chunks | chunk_size is too small |
Increase chunk_size; recommend 512–1024 tokens for hybrid |
| Downstream embeddings fail | Input column name mismatch | Ensure the doc_column matches what ExtractOperator writes (default: content) |
Architecture
Strategy selection guide
| Strategy | Best for | Dependencies |
|---|---|---|
simple |
Quick prototyping, plain text | None |
semantic |
Narrative text where sentence boundaries matter | Ollama |
hybrid |
Structured documents (PDFs with sections, tables) | Docling library or docling-serve |
Chunk size guidance
- 512–1024 tokens: Better for precise retrieval
- 1024–2048 tokens: Better for preserving context
- Overlap: Recommend 10–25% of chunk size (e.g. 128 for 512)
Typical pipeline position
Ingest → Extract → Chunker → Embeddings → VectorDB