xz-embed
Vector embedding and vector store abstraction layer for the XiaoZhu AI ecosystem.
xz-embed provides a unified trait-based interface for generating text embeddings and storing/searching vectors. It decouples your application from any specific embedding provider or vector database backend, making it easy to swap implementations without changing business logic.
Features
- Trait-based abstraction:
EmbeddingModelfor embedding providers,VectorStorefor storage backends. Swap OpenAI for a mock or local model with one type change. - OpenAI integration (feature
openai):OpenAiEmbeddersupportstext-embedding-3-small/text-embedding-3-largewith configurable dimensions (512, 1536, 3072). - Mock embedder:
MockEmbedderfor deterministic testing without network calls or API keys. - Vector stores:
InMemoryVectorStorefor testing and lightweight use,SqliteVecStore(featuresqlite-vec) for persistent storage. - Metadata filtering: Rich filter expressions (Eq, Ne, In, Range, And/Or/Not) for precise vector search.
- Dimension reduction: Native (API-side) or truncation-based reduction via
DimensionReducer. - Batch management:
ConcurrentBatchManagerfor high-throughput embedding with configurable concurrency. - Indexing:
IndexBuilderfor background index construction with configurable rebuild triggers (count-based, interval-based, manual). - Quantization:
ProductQuantizerandScalarQuantizerfor reducing vector storage footprint. - Fusion: RRF (Reciprocal Rank Fusion) for combining results from multiple searches.
- No unsafe code:
forbid(unsafe_code)enforced workspace-wide.
Quick Start
use ;
use HashMap;
// 1. Create a mock embedder that returns 4-dimensional vectors
let embedder = new;
// 2. Generate embeddings
let texts = vec!;
let vectors = embedder.embed.await?;
// 3. Store vectors in memory
let store = new;
for in vectors.iter.enumerate
// 4. Search
let query = embedder.embed_single.await?;
let results = store.search.await?;
for r in &results
Usage with OpenAI
use ;
// Create from environment (OPENAI_API_KEY, OPENAI_EMBED_MODEL)
let embedder = from_env?;
// Or configure dimensions explicitly
let embedder = from_env?
.with_dimensions?;
// Embed and search (same VectorStore interface)
let vec = embedder.embed_single.await?;
Key Traits
| Trait | Purpose | Key Methods |
|---|---|---|
EmbeddingModel |
Text to vector conversion | embed(), embed_single(), model_info() |
VectorStore |
Vector storage and similarity search | insert(), insert_batch(), search(), search_with_filter(), delete(), count() |
StoreLifecycle |
Lifecycle management for stores | initialize(), close(), checkpoint(), health_check() |
KeywordSearch |
BM25 keyword retrieval | search(query, limit) |
VectorQuantizer |
Vector quantization | quantize(), dequantize() |
Feature Flags
| Feature | Default | Description |
|---|---|---|
openai |
No | Enable OpenAiEmbedder (requires reqwest) |
sqlite-vec |
No | Enable SqliteVecStore (persistent vector store) |
Crate Status
Part of the xz-modules workspace. Dual-licensed under MIT OR Apache-2.0.