Expand description
Semantic search via embeddings.
This module provides embedding generation and vector similarity search for semantic code search. It supports multiple embedding providers:
- OpenAI: Uses text-embedding-3-small for high-quality embeddings
- Local: Uses fastembed for local, offline embeddings
§Architecture
Embeddings are stored in SQLite as JSON-encoded float arrays. Similarity search is performed in Rust using cosine similarity for accuracy and portability (no native vector extensions required).
§Usage
ⓘ
let provider = OpenAIProvider::new("sk-...")?;
let embedding = provider.embed("fn authenticate(user: &str)")?;
let results = search_similar(&db, "authentication functions", 10)?;Re-exports§
pub use local::LocalProvider;pub use ollama::OllamaProvider;pub use openai::OpenAIProvider;
Modules§
- local
- Local embedding provider using fastembed.
- ollama
- Ollama embedding provider.
- openai
- OpenAI embedding provider.
Structs§
- Embedding
- A vector embedding.
- Search
Result - Search result from similarity search.
Enums§
- Provider
- Which embedding backend to use.
Constants§
- LOCAL_
EMBEDDING_ DIM - OPENAI_
EMBEDDING_ DIM - Embedding dimension for different models
Traits§
- Embedding
Provider - Trait for embedding providers.
Functions§
- build_
provider - Build the embedding provider for the given backend, applying any
provider-specific settings from
.ctx/config.toml(embedding). This is the single place providers are constructed, so a new backend wires in once. - cosine_
similarity - Compute cosine similarity between two vectors.
- dot_
product - Compute dot product similarity between two vectors.
- embed_
missing_ symbols - Embed all symbols that don’t have embeddings yet.
- normalize
- Normalize a vector to unit length.
- semantic_
search - Perform semantic similarity search using embeddings.
- warn_
index_ mismatch - Warn (to stderr) when the query provider/dimension differs from what the index was embedded with. Embeddings from different providers/models occupy different vector spaces, so mixing them yields meaningless similarities — the fix is to re-embed. No-op when the index is empty or consistent.