{"slug": "show-hn-fastembed-rs-rust-library-for-generating-vector-embeddings-reranking", "title": "Show HN: Fastembed-rs – Rust library for generating vector embeddings, reranking", "summary": "Fastembed-rs, a Rust library for generating vector embeddings and reranking, has been released. It supports synchronous usage without Tokio dependency, uses ONNX inference via pykeio/ort and fast encodings via HuggingFace tokenizers, and offers multiple embedding models. The library is part of a multi-language family including Python, Go, and JavaScript versions.", "body_md": "- Supports synchronous usage. No dependency on Tokio.\n- Uses\n[@pykeio/ort](https://github.com/pykeio/ort)for performant ONNX inference. - Uses\n[@huggingface/tokenizers](https://github.com/huggingface/tokenizers)for fast encodings.\n\n- Python:\n[fastembed](https://github.com/qdrant/fastembed) - Go:\n[fastembed-go](https://github.com/Anush008/fastembed-go) - JavaScript:\n[fastembed-js](https://github.com/Anush008/fastembed-js)\n\n## Click to list models\n\n- Default**BAAI/bge-small-en-v1.5****BAAI/bge-base-en-v1.5****BAAI/bge-large-en-v1.5****BAAI/bge-small-zh-v1.5****BAAI/bge-large-zh-v1.5****BAAI/bge-m3****sentence-transformers/all-MiniLM-L6-v2****sentence-transformers/all-MiniLM-L12-v2****sentence-transformers/all-mpnet-base-v2****sentence-transformers/paraphrase-MiniLM-L12-v2****sentence-transformers/paraphrase-multilingual-mpnet-base-v2****nomic-ai/nomic-embed-text-v1**- pairs with** nomic-ai/nomic-embed-text-v1.5**`nomic-embed-vision-v1.5`\n\nfor image-to-text search**intfloat/multilingual-e5-small****intfloat/multilingual-e5-base****intfloat/multilingual-e5-large****mixedbread-ai/mxbai-embed-large-v1****Alibaba-NLP/gte-base-en-v1.5****Alibaba-NLP/gte-large-en-v1.5****lightonai/ModernBERT-embed-large**- pairs with** Qdrant/clip-ViT-B-32-text**`clip-ViT-B-32-vision`\n\nfor image-to-text search**jinaai/jina-embeddings-v2-base-code****jinaai/jina-embeddings-v2-base-en****google/embeddinggemma-300m**- requires** nomic-ai/nomic-embed-text-v2-moe**`nomic-v2-moe`\n\nfeature (candle backend)- requires**Qwen/Qwen3-Embedding-0.6B**`qwen3`\n\nfeature (candle backend)- requires**Qwen/Qwen3-Embedding-4B**`qwen3`\n\nfeature (candle backend)- requires**Qwen/Qwen3-Embedding-8B**`qwen3`\n\nfeature (candle backend)- requires**Qwen/Qwen3-VL-Embedding-2B**`qwen3`\n\nfeature (candle backend, multimodal via`Qwen3VLEmbedding`\n\n)**snowflake/snowflake-arctic-embed-xs****snowflake/snowflake-arctic-embed-s****snowflake/snowflake-arctic-embed-m****snowflake/snowflake-arctic-embed-m-long****snowflake/snowflake-arctic-embed-l**\n\nQuantized versions are also available for several models above (append `Q`\n\nto the model enum variant, e.g., `EmbeddingModel::BGESmallENV15Q`\n\n). EmbeddingGemma additionally ships a 4-bit build as `EmbeddingModel::EmbeddingGemma300MQ4`\n\n.\n\n## Click to list models\n\n- Default**prithivida/Splade_PP_en_v1****BAAI/bge-m3**\n\n## Click to list models\n\n## Click to list models\n\nTo support the library, please donate to our primary upstream dependency, [ ort](https://github.com/pykeio/ort?tab=readme-ov-file#-sponsor-ort) - The Rust wrapper for the ONNX runtime.\n\nRun the following in your project directory:\n\n```\ncargo add fastembed\n```\n\nOr add the following line to your Cargo.toml:\n\n```\n[dependencies]\nfastembed = \"5\"\nuse fastembed::{TextEmbedding, TextInitOptions, EmbeddingModel};\n\n// With default options\nlet mut model = TextEmbedding::try_new(Default::default())?;\n\n// With custom options\nlet mut model = TextEmbedding::try_new(\n    TextInitOptions::new(EmbeddingModel::AllMiniLML6V2).with_show_download_progress(true).with_intra_threads(4),\n)?;\n\nlet documents = vec![\n    \"passage: Hello, World!\",\n    \"query: Hello, World!\",\n    \"passage: This is an example passage.\",\n    // You can leave out the prefix but it's recommended\n    \"fastembed-rs is licensed under Apache 2.0\"\n];\n\n // Generate embeddings with the default batch size, 256\n let embeddings = model.embed(documents, None)?;\n\n println!(\"Embeddings length: {}\", embeddings.len()); // -> Embeddings length: 4\n println!(\"Embedding dimension: {}\", embeddings[0].len()); // -> Embedding dimension: 384\nuse fastembed::{SparseEmbedding, SparseInitOptions, SparseModel, SparseTextEmbedding};\n\n// With default options\nlet mut model = SparseTextEmbedding::try_new(Default::default())?;\n\n// With custom options\nlet mut model = SparseTextEmbedding::try_new(\n    SparseInitOptions::new(SparseModel::SPLADEPPV1).with_show_download_progress(true),\n)?;\n\nlet documents = vec![\n    \"passage: Hello, World!\",\n    \"query: Hello, World!\",\n    \"passage: This is an example passage.\",\n    \"fastembed-rs is licensed under Apache 2.0\"\n];\n\n// Generate embeddings with the default batch size, 256\nlet embeddings: Vec<SparseEmbedding> = model.embed(documents, None)?;\nuse fastembed::{ImageEmbedding, ImageInitOptions, ImageEmbeddingModel};\n\n// With default options\nlet mut model = ImageEmbedding::try_new(Default::default())?;\n\n// With custom options\nlet mut model = ImageEmbedding::try_new(\n    ImageInitOptions::new(ImageEmbeddingModel::ClipVitB32).with_show_download_progress(true),\n)?;\n\nlet images = vec![\"assets/image_0.png\", \"assets/image_1.png\"];\n\n// Generate embeddings with the default batch size, 256\nlet embeddings = model.embed(images, None)?;\n\nprintln!(\"Embeddings length: {}\", embeddings.len()); // -> Embeddings length: 2\nprintln!(\"Embedding dimension: {}\", embeddings[0].len()); // -> Embedding dimension: 512\nuse fastembed::{TextRerank, RerankInitOptions, RerankerModel};\n\n// With default options\nlet mut model = TextRerank::try_new(Default::default())?;\n\n// With custom options\nlet mut model = TextRerank::try_new(\n    RerankInitOptions::new(RerankerModel::BGERerankerBase).with_show_download_progress(true),\n)?;\n\nlet documents = vec![\n    \"hi\",\n    \"The giant panda (Ailuropoda melanoleuca), sometimes called a panda bear, is a bear species endemic to China.\",\n    \"panda is animal\",\n    \"i dont know\",\n    \"kind of mammal\",\n];\n\n// Rerank with the default batch size, 256 and return document contents\nlet results = model.rerank(\"what is panda?\", documents, true, None)?;\nprintln!(\"Rerank result: {:?}\", results);\n```\n\nAlternatively, local model files can be used for inference via the `try_new_from_user_defined(...)`\n\nmethods of respective structs.\n\nHelpers in the [ similarity](https://docs.rs/fastembed/latest/fastembed/similarity/) module score and rank the vectors\n\n`embed`\n\nreturns, so a quick in-memory search needs no extra crate:\n\n```\nuse fastembed::similarity::{cosine_similarity, top_k};\n\n// `embeddings` is the Vec<Embedding> from model.embed(...)\nlet query = &embeddings[0];\n\n// Score two vectors directly ([-1.0, 1.0], higher = closer)\nlet score = cosine_similarity(query, &embeddings[1]);\n\n// Or rank the corpus: (index, score) pairs, best first\nlet hits = top_k(query, &embeddings, 5);\nprintln!(\"Closest: {:?}\", hits);\n```\n\nFor larger corpora or persistence, push the vectors to a vector search engine (e.g. [Qdrant](https://qdrant.tech/)) and query there.\n\nQwen3 embedding models are available behind the `qwen3`\n\nfeature flag (candle backend).\n\n```\n[dependencies]\nfastembed = { version = \"5\", features = [\"qwen3\"] }\njs\nuse candle_core::{DType, Device};\nuse fastembed::Qwen3TextEmbedding;\n\nlet device = Device::Cpu;\nlet model = Qwen3TextEmbedding::from_hf(\n    \"Qwen/Qwen3-Embedding-0.6B\",\n    &device,\n    DType::F32,\n    512,\n)?;\n\n// Text-only usage with the Qwen3-VL embedding checkpoint is also supported:\n// let model = Qwen3TextEmbedding::from_hf(\"Qwen/Qwen3-VL-Embedding-2B\", &device, DType::F32, 512)?;\n\nlet embeddings = model.embed(&[\"query: ...\", \"passage: ...\"])?;\nprintln!(\"Embeddings length: {}\", embeddings.len());\n```\n\nFor multimodal text/image usage with `Qwen/Qwen3-VL-Embedding-2B`\n\n:\n\n``` js\nuse candle_core::{DType, Device};\nuse fastembed::Qwen3VLEmbedding;\n\nlet device = Device::Cpu;\nlet model = Qwen3VLEmbedding::from_hf(\n    \"Qwen/Qwen3-VL-Embedding-2B\",\n    &device,\n    DType::F32,\n    2048,\n)?;\n\nlet image_embeddings = model.embed_images(&[\"tests/assets/image_0.png\", \"tests/assets/image_1.png\"])?;\nlet text_embeddings = model.embed_texts(&[\"query: blue cat\", \"query: red cat\"])?;\n\nprintln!(\"Image embeddings: {}\", image_embeddings.len());\nprintln!(\"Text embeddings: {}\", text_embeddings.len());\n```\n\nThe [nomic-embed-text-v2-moe](https://huggingface.co/nomic-ai/nomic-embed-text-v2-moe) model is available behind the `nomic-v2-moe`\n\nfeature flag (candle backend). First general-purpose MoE embedding model with 100+ language support.\n\n```\n[dependencies]\nfastembed = { version = \"5\", features = [\"nomic-v2-moe\"] }\njs\nuse candle_core::{DType, Device};\nuse fastembed::NomicV2MoeTextEmbedding;\n\nlet device = Device::Cpu;\nlet model = NomicV2MoeTextEmbedding::from_hf(\n    \"nomic-ai/nomic-embed-text-v2-moe\",\n    &device,\n    DType::F32,\n    512,\n)?;\n\nlet embeddings = model.embed(&[\"search_query: ...\", \"search_document: ...\"])?;\nprintln!(\"Embeddings length: {}\", embeddings.len());\n```\n\nThe BGE-M3 model produces dense, sparse, and ColBERT embeddings simultaneously in a single forward pass.\n\n```\nuse fastembed::{Bgem3Embedding, Bgem3InitOptions, Bgem3Model};\n\n// With default options\nlet mut model = Bgem3Embedding::try_new(Default::default())?;\n\n// With custom options (supporting custom max length up to 8192 tokens)\nlet mut model = Bgem3Embedding::try_new(\n    Bgem3InitOptions::new(Bgem3Model::BGEM3Q)\n        .with_max_length(1024)\n        .with_show_download_progress(true),\n)?;\n\nlet documents = vec![\n    \"Hello, World!\",\n    \"This is an example passage.\",\n    \"fastembed-rs is licensed under Apache 2.0\",\n    \"i dont know\"\n];\n\n// Generate all three representations in a single forward pass\nlet output = model.embed(documents, None)?;\n\nprintln!(\"Dense dimension: {}\", output.dense[0].len()); // -> Dense dimension: 1024\n\nlet sparse_emb = &output.sparse[0];\nprintln!(\"Sparse non-zero tokens: {}\", sparse_emb.indices.len());\n\nprintln!(\"ColBERT token count: {}\", output.colbert[0].len());\n```\n\nNote\n\nThe default quantized model (`BGEM3Q`\n\n) is optimized for CPUs; passing a GPU execution provider (like CUDA) will fail. For GPU inference or custom requirements, you can export your own custom model (FP32, FP16, or INT8) using the ONNX export script from hf `gpahal/bge-m3-onnx-int8`\n\nand load it via `try_new_from_path`\n\n.\n\nModels download on first use and load from cache afterwards (no network needed at runtime once cached).\n\n`FASTEMBED_CACHE_DIR`\n\n— cache location (default:`.fastembed_cache`\n\n). Equivalent to`TextInitOptions::with_cache_dir`\n\n.`HF_HOME`\n\n— if set, takes precedence over the above.`HF_ENDPOINT`\n\n— Hugging Face mirror base URL, for restricted networks.\n\nTo run models on a GPU via DirectML on Windows, enable the `directml`\n\nfeature:\n\n```\n[dependencies]\nfastembed = { version = \"5\", features = [\"directml\"] }\n```\n\nThen pass a DirectML execution provider when initializing a model:\n\n```\nuse fastembed::{TextEmbedding, TextInitOptions, EmbeddingModel};\nuse ort::ep::DirectML;\n\nlet model = TextEmbedding::try_new(\n    TextInitOptions::new(EmbeddingModel::AllMiniLML6V2)\n        .with_execution_providers(vec![DirectML::default().into()]),\n)?;\n```\n\nWhen DirectML is detected, fastembed automatically disables memory pattern optimization and parallel execution on the ONNX Runtime session, as required by the DirectML execution provider.", "url": "https://wpnews.pro/news/show-hn-fastembed-rs-rust-library-for-generating-vector-embeddings-reranking", "canonical_source": "https://github.com/Anush008/fastembed-rs", "published_at": "2026-06-15 09:47:32+00:00", "updated_at": "2026-06-15 10:16:26.143886+00:00", "lang": "en", "topics": ["developer-tools", "machine-learning", "natural-language-processing", "ai-tools"], "entities": ["Fastembed-rs", "pykeio/ort", "HuggingFace", "BAAI", "sentence-transformers", "nomic-ai", "Qdrant", "Alibaba-NLP"], "alternates": {"html": "https://wpnews.pro/news/show-hn-fastembed-rs-rust-library-for-generating-vector-embeddings-reranking", "markdown": "https://wpnews.pro/news/show-hn-fastembed-rs-rust-library-for-generating-vector-embeddings-reranking.md", "text": "https://wpnews.pro/news/show-hn-fastembed-rs-rust-library-for-generating-vector-embeddings-reranking.txt", "jsonld": "https://wpnews.pro/news/show-hn-fastembed-rs-rust-library-for-generating-vector-embeddings-reranking.jsonld"}}