Skip to main content

Module embeddings

Module embeddings 

Source
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.
SearchResult
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§

EmbeddingProvider
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.