ExFastembed is an Elixir wrapper around the fastembed-rs crate. It provides a simple interface to load text embedding models and reranker models, generate embeddings for a list of texts, and rerank documents based on a query.
Add ex_fastembed to your list of dependencies in mix.exs:
def deps do
[
{:ex_fastembed, github: "elchemista/ex_fastembed", branch: "master"}
]
endRequirements:
- Elixir 1.18 or later
- Rust 1.91 or later
- clang (e.g.,
sudo apt install clang)
Compile the dependency:
export CC=/usr/bin/clang CXX=/usr/bin/clang++ RUSTLER_PRECOMPILATION_EXAMPLE_BUILD=1 && mix compileBefore generating embeddings, you must load one of the supported text embedding models. For example, to load the BAAI/bge-small-en-v1.5 model:
iex> ExFastembed.load("BAAI/bge-small-en-v1.5")
{:ok, 384}Calling load/1 again replaces the active embedding model.
After loading the embedding model, you can generate embeddings for a list of texts:
iex> ExFastembed.embed_text(["Hello, world!", "Elixir is awesome"])
{:ok, [[...], [...]]}An empty input returns {:ok, []} without running inference.
To load a reranker model, use the load_reranker/1 function. For example, to load jinaai/jina-reranker-v1-turbo-en:
iex> ExFastembed.load_reranker("jinaai/jina-reranker-v1-turbo-en")
{:ok, true}Calling load_reranker/1 again replaces the active reranker model.
Once the reranker model is loaded, you can rerank documents based on a query:
iex> ExFastembed.rerank("search query", ["Document 1", "Document 2"], true)
{:ok, [{0, 0.95, "Document 1"}, {1, 0.90, "Document 2"}]}An empty document list returns {:ok, []} without running inference.
The runtime source is ExFastembed.embed_models/0 and ExFastembed.reranker_models/0.
These lists are generated from the bundled fastembed-rs 5.17.3 metadata, with legacy ExFastembed aliases retained. Quantized variants whose repository name is ambiguous are exposed by their enum-style variant names.
"Alibaba-NLP/gte-base-en-v1.5""Alibaba-NLP/gte-large-en-v1.5""AllMiniLML12V2Q""AllMiniLML6V2Q""BAAI/bge-base-en-v1.5""BAAI/bge-large-en-v1.5""BAAI/bge-large-zh-v1.5""BAAI/bge-m3""BAAI/bge-small-en-v1.5""BAAI/bge-small-zh-v1.5""BGEBaseENV15Q""BGELargeENV15Q""BGESmallENV15Q""EmbeddingGemma300MQ""EmbeddingGemma300MQ4""GTEBaseENV15Q""GTELargeENV15Q""intfloat/multilingual-e5-base""intfloat/multilingual-e5-large""intfloat/multilingual-e5-small""jinaai/jina-embeddings-v2-base-code""jinaai/jina-embeddings-v2-base-en""lightonai/ModernBERT-embed-large""lightonai/modernbert-embed-large""mixedbread-ai/mxbai-embed-large-v1""MxbaiEmbedLargeV1Q""nomic-ai/nomic-embed-text-v1""nomic-ai/nomic-embed-text-v1.5""NomicEmbedTextV15Q""onnx-community/embeddinggemma-300m-ONNX""ParaphraseMLMiniLML12V2Q""Qdrant/all-MiniLM-L6-v2-onnx""Qdrant/bge-base-en-v1.5-onnx-Q""Qdrant/bge-large-en-v1.5-onnx-Q""Qdrant/bge-small-en-v1.5-onnx-Q""Qdrant/clip-ViT-B-32-text""Qdrant/multilingual-e5-large-onnx""Qdrant/paraphrase-multilingual-MiniLM-L12-v2-onnx-Q""sentence-transformers/all-MiniLM-L12-v2""sentence-transformers/all-MiniLM-L6-v2""sentence-transformers/all-mpnet-base-v2""sentence-transformers/paraphrase-MiniLM-L12-v2""sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2""sentence-transformers/paraphrase-multilingual-mpnet-base-v2""snowflake/snowflake-arctic-embed-l""Snowflake/snowflake-arctic-embed-m""snowflake/snowflake-arctic-embed-m""snowflake/snowflake-arctic-embed-m-long""snowflake/snowflake-arctic-embed-s""snowflake/snowflake-arctic-embed-xs""SnowflakeArcticEmbedLQ""SnowflakeArcticEmbedMLongQ""SnowflakeArcticEmbedMQ""SnowflakeArcticEmbedSQ""SnowflakeArcticEmbedXSQ""Xenova/all-MiniLM-L12-v2""Xenova/all-MiniLM-L6-v2""Xenova/all-mpnet-base-v2""Xenova/bge-base-en-v1.5""Xenova/bge-large-en-v1.5""Xenova/bge-large-zh-v1.5""Xenova/bge-small-en-v1.5""Xenova/bge-small-zh-v1.5""Xenova/paraphrase-multilingual-MiniLM-L12-v2""Xenova/paraphrase-multilingual-mpnet-base-v2"
"BAAI/bge-reranker-base""BAAI/bge-reranker-v2-m3""jinaai/jina-reranker-v1-turbo-en""jinaai/jina-reranker-v2-base-multiligual""jinaai/jina-reranker-v2-base-multilingual""rozgo/bge-reranker-v2-m3"
ExFastembed is released under the Apache License 2.0. See LICENSE for details.
ExFastembed is a wrapper around fastembed-rs, a fast Rust-based text embedding library.