Semantic Chunking
Replaces fixed-token chunking with sentence embeddings and cosine similarity to detect natural topic boundaries for better retrieval.
What this file does
Replaces fixed-token chunking with sentence embeddings and cosine similarity to detect natural topic boundaries for better retrieval.
When to use it
- Long memories with clear topic shifts
- Embedding API is available and affordable
- You want chunks that preserve topical coherence
- Recursive chunker produces poor retrieval results
Assumes this stack
Semantic Chunking
Issue #368 — Smoothing-based topic boundary detection for memory chunking.
Overview
Semantic chunking is an optional alternative to the existing recursive
chunker (chunking.ts). Instead of splitting text at fixed token counts, it
uses sentence embeddings and cosine similarity to detect natural topic
boundaries, producing chunks that preserve topical coherence.
How It Works
- Sentence tokenization — the input is split into sentences using punctuation-based boundaries.
- Embedding — each sentence is embedded via a caller-provided function
(
embedFn). Sentences are batched according toembeddingBatchSize. - Cosine similarity — pairwise cosine similarity is computed between adjacent sentence embeddings, producing a 1-D similarity series.
- Smoothing — a simple centered moving average (window size from config) smooths the similarity series to reduce noise.
- Boundary detection — local minima in the smoothed series that dip below
mean - boundaryThresholdStdDevs * stddevare identified as topic boundaries. - Segment merging — segments shorter than
minTokensare merged with their nearest neighbor. - Segment splitting — segments exceeding
maxTokensare recursively split using the existing recursive chunker.
When to Enable
| Scenario | Recommendation |
|---|---|
| Short memories (< 200 tokens) | Not needed — recursive chunker is sufficient |
| Long memories with clear topic shifts | Semantic chunking produces better retrieval |
| Embedding API unavailable or expensive | Stay with recursive; set fallbackToRecursive: true |
| Batch extraction of many memories | Consider cost of embedding each sentence |
Configuration Reference
All settings live under semanticChunkingConfig in the plugin config. The
top-level semanticChunkingEnabled flag gates the feature.
| Key | Type | Default | Description |
|---|---|---|---|
targetTokens | number | 200 | Target tokens per chunk |
minTokens | number | 100 | Minimum tokens before merging with neighbor |
maxTokens | number | 400 | Maximum tokens before recursive splitting |
smoothingWindowSize | number | 3 | Moving-average window (centered) |
boundaryThresholdStdDevs | number | 1.0 | Std devs below mean for boundary |
embeddingBatchSize | number | 32 | Sentences per embedding API call |
fallbackToRecursive | boolean | true | Fall back if embeddings unavailable |
Performance Considerations
- Embedding costs: every sentence in the input requires an embedding. For a 20-sentence memory, that is 1 API call (at batch size 32). Plan for this when processing large backlogs.
- Latency: the embedding round-trip adds latency compared to the purely
local recursive chunker. For real-time paths, keep
fallbackToRecursiveenabled. - Quality: the smoothing window and threshold parameters control sensitivity. A larger window (5-7) reduces false boundaries but may miss short topic segments. A smaller threshold (0.5 std devs) is more aggressive at splitting.
Architecture
The module (packages/remnic-core/src/semantic-chunking.ts) is self-contained
and imports only the existing chunkContent from chunking.ts for fallback
and segment splitting. It exports:
SemanticChunkingConfig/DEFAULT_SEMANTIC_CHUNKING_CONFIGSemanticChunk/SemanticChunkResultsemanticChunkContent()— the main entry point- Math utilities:
cosineSimilarity,movingAverage,findLocalMinima,mean,stddev
Callers (e.g., the orchestrator) choose which chunker to invoke based on the
semanticChunkingEnabled config flag and the availability of an embedding
function.
What's inside
7-step algorithm explanation, configuration table with 7 keys, performance considerations, architecture and exports list
Change this for your project
- Replace
packages/remnic-core/src/semantic-chunking.tswith your own module path - Replace
chunking.tsimport path with your recursive chunker location - Replace
semanticChunkingConfigandsemanticChunkingEnabledwith your config key names
Where it goes
Keep it in your repository where the agent or team that needs it will read it.
Worth borrowing
- Smoothing similarity series with a moving average to reduce noise before detecting boundaries
- Merging short segments with nearest neighbor and splitting long ones via fallback chunker
Related Documents
基于命题分块以增强RAG
Implements proposition chunking for RAG: decomposes documents into atomic facts, evaluates quality, and compares retrieval against standard chunking.
TileMap Chunk Manager
Divides a large tilemap into fixed-size chunks, loading and rendering only those visible to reduce memory and draw calls by over 99%.
Message Chunking for MCP stdio Transport
Explains macOS 64KB pipe write limit and provides a chunking layer for MCP stdio transport that splits and reassembles large messages transparently.
🤖 n8n AI Agent Mastery Course 2025
Serves as the main README for an n8n course repository, listing 10+ AI agent workflow projects with links to YouTube tutorials and Docker setup instructions.