Chunking, embeddings, and RAG pipeline integration
52
58%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Fix and improve this skill with Tessl
tessl review fix ./.ai-rulez/skills/chunking-embeddings/SKILL.mdText splitting, ONNX/static embedding generation, RAG pipeline integration
Locations: crates/xberg/src/chunking/ and crates/xberg/src/embeddings/ (both directories,
not single files).
ExtractionConfig.chunking: Option<ChunkingConfig> drives it. The standalone entry points are
chunking::chunk_text(text, &ChunkingConfig, page_boundaries) -> Result<ChunkingResult>
(chunking/core.rs) and chunking::rag::chunk_for_rag(text, &ChunkingConfig)
(chunking/rag.rs), which upgrades ChunkerType::Text to Markdown and fills each chunk's
heading_path.
ChunkingResult { chunks: Vec<Chunk>, chunk_count: usize }. Chunk carries content,
chunk_type, metadata, and the optional vectors embedding, sparse_embedding,
late_interaction (types/extraction.rs).
ChunkerType — there is no strategy enum beyond thisText (default), Markdown, Yaml, Semantic (core/config/processing.rs).
Semantic splits at embedding-based topic shifts when an EmbeddingConfig is present, and
falls back to a structural-boundary heuristic otherwise — topic_threshold has no effect on
the fallback path.
ChunkingConfig fields and their serde wire names| Field | Wire name (config file) | Default |
|---|---|---|
max_characters | max_chars (alias max_characters) | 1000 |
overlap | max_overlap (alias overlap) | 200 |
trim | trim | true |
chunker_type | chunker_type | Text |
preset | preset | none |
The renames are load-bearing: a config file that writes max_characters works only via the
alias, and a typo'd key is silently ignored (see config-loading-precedence).
ChunkingConfig.preset resolves through resolve_preset(), which is
#[cfg(feature = "embeddings")]-gated — without that feature it is a no-op and the preset
name does nothing. A preset overrides max_characters and overlap and, if no embedding
config was given, selects the model.
| Preset | chunk_size | overlap | dims | backend |
|---|---|---|---|---|
fast | 512 | 50 | 384 | ONNX |
balanced | 1024 | 100 | 768 | ONNX |
quality | 2000 | 200 | 1024 | ONNX |
multilingual | 1024 | 100 | 768 | ONNX |
gte-modernbert-base | 1024 | 100 | 768 | ONNX |
lightweight | 512 | 50 | 256 | static (model2vec) |
arctic-embed-m-v2.0 | 1024 | 100 | 768 | ONNX |
qwen3-embedding-0.6b | 2000 | 200 | 1024 | ONNX |
Source of truth: EMBEDDING_PRESETS in crates/xberg/src/embeddings/mod.rs.
There is no TextEmbeddingManager, no embed_chunks(), no ChunkWithEmbedding, no
RagDocument, and no fastembed dependency — do not write code against any of those.
Model selection is EmbeddingModelType, a tagged enum (core/config/processing.rs):
Preset { name } (recommended), Custom { … } (HuggingFace ONNX), Llm { … },
Plugin { … }.
Two defaults disagree and both are live: EmbeddingModelType::default() is the
gte-modernbert-base preset (what bindings and #[serde(default)] get), while
EmbeddingConfig::default() names balanced via default_balanced_embedding_model(). Read
the constructor you are actually going through before assuming which model runs.
EmbeddingConfig defaults: normalize = true, batch_size = 32,
max_embed_duration_secs = Some(60), max_sequence_length = None (falls back to 512, capped
at the model's own model_max_length).
embeddings = ["onnx-runtime", "dep:ndarray", "chunking", "tokio-runtime", "embedding-presets"]ort-bundled (the default ORT linkage) downloads ONNX Runtime at build time — no system
install, no ORT_DYLIB_PATH. That variable matters only under ort-dynamic.
static-embeddings is the pure-Rust model2vec path and the only dense embedder available on
no-ort-target (WASM/Android). embedding-presets carries preset metadata alone and is
WASM-safe.
embeddings feature is inert — resolve_preset() is compiled out.max_chars/max_overlap, not the Rust field names.EmbeddingConfig.normalize defaults to true; leave it on.ChunkingConfig is resolved and why typos are silentembeddings vs static-embeddings vs embedding-presets04336bd
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.