Model or dataset
qdrant/fastembed avatar
qdrant/fastembed

FastEmbed: five embedding families, one runtime choice

Fast, Accurate, Lightweight Python library to make State of the Art Embedding

3,294 stars302 forksPythonApache-2.0

At a glance

What is it?
A Python library for generating embeddings that runs models on a lighter inference runtime instead of a deep learning framework, which is what makes it a candidate for serverless deployment. The dependency matrix and the extension points are where the practical detail sits.
Who is it for?
FastEmbed fits a retrieval service that has to start fast, run small, or deploy somewhere without a GPU, and the range of model families means you can keep one client library as your retrieval needs grow from text to images to reranking. Two things to check before you commit.
Can I use it commercially?
Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 1 day ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on November 13, 2026, and from our analysis. They are not legal advice.

From daily snapshots

Star history

  • qdrant/fastembed3,294 ★ · +99
Star history
Repository2026-09-112026-11-13
qdrant/fastembed3.2k3.3k

99 Stars in the last 63 days, measured from the daily GitHub snapshot. Compare with other projects

Editorial analysis

Five families, one class each

The library covers more than text vectors, and each family has its own entry class with a worked example naming a real model. Dense text embeddings are the default path, instantiated with a model name such as a small bilingual encoder from a well known model repository. Sparse text embeddings produce indices and values rather than fixed-width vectors, and the live example uses a SPLADE-style model. Late interaction models, described in the documentation as the ColBERT approach, return a matrix per document rather than a single vector. Image embeddings run over image files, with a CLIP vision model in the example. Late interaction multimodal models take page screenshots and a text query separately, and the example prints a different shape for each, which is the clearest hint that these are not interchangeable with the dense ones. A sixth class sits apart from the rest: cross-encoder rerankers, which score query and document pairs instead of producing embeddings at all.

The runtime choice is the whole design argument

Three reasons are given for choosing this library, and the first two are the same decision seen from two angles. It is described as lightweight with few external dependencies, and the specific consequence is named: no GPU is required and gigabytes of framework dependencies are not downloaded, because inference goes through a lighter runtime instead. That is also the reason it is put forward as a candidate for serverless environments, where a cold start and a package size are hard constraints. The second reason is speed, attributed to the same runtime choice rather than to any trick in the library, with data parallelism used for encoding large datasets. Only the third reason is about quality, and it is the one to treat carefully: the comparison offered is against a single named embedding API, not against the field.

embed is a generator, and the first call downloads the model

The quickstart is worth reading as a sequence because two of its details are easy to miss. Constructing the model is what triggers the download and initialisation, which means the first call is slow and the rest are not. And the embed method returns a generator, not a list: the example assigns it to a variable described as a reminder of that, and separately wraps the same call in a list to materialise the vectors. Consuming the generator twice would therefore embed nothing the second time.

bash
pip install fastembed

# or with GPU support

pip install fastembed-gpu

That last detail matters for deployments: the accelerated build is a separate distribution rather than an extra on the same one, so a container image that needs a GPU has to be built against the other package. The quickstart initializes `BAAI/bge-small-en-v1.5` by default; the documentation also demonstrates adding `intfloat/multilingual-e5-small` as a custom model.

Models outside the shipped list are a supported path

If the model you want is not in the list, the library offers a documented registration call rather than making you fork. Registering a dense model takes a model identifier, a pooling strategy drawn from an enum, a normalisation flag, the expected dimension, the path of the model file inside the repository, and a source describing where to fetch it. Two details make this practical rather than theoretical. The source can be a repository identifier or a URL, which is how you would load a model from private storage. And the model file path is yours to choose, so you can point at a differently optimised or differently quantised build of a model that is already supported, such as an alternative file in the same repository. Cross-encoders have the same registration call, and they also expose a paired scoring method for when you already have the query and document pairs assembled.

One sparse model is written down and commented out

The README demonstrates SPLADE++ sparse embeddings as index and value pairs. Consult the supported-model list for other available sparse models and their requirements.

The dependency matrix excludes specific runtime versions

The packaging file is the most technical document in the repository and the one most worth reading before an install. Dependencies are declared with markers, so the constraint on the numeric array library, the inference runtime, and the imaging library changes with the Python version, and the Python floor is 3.10. The inference runtime is the interesting one: rather than a simple lower bound, several specific versions are excluded outright, and the exclusion list itself differs by interpreter version. That pattern is the practical takeaway, because it means a resolver can fail on a combination that looks permitted. The rest of the list is short and tells you what the library does: a progress bar, an HTTP client, a tokenizer, a model hub client, a logger, and two dependencies whose presence only makes sense once you look at the sparse output, a hashing library and a stemmer implementation. Test, development, and documentation dependency groups are declared separately, so a runtime install does not pull in the test framework or the documentation toolchain.

The accuracy claim names one comparison, not a benchmark

The documentation's quality argument deserves a careful reading rather than a summary. The claim is that the library is better than a specific named commercial embedding API, and separately that the default text model appears on a public benchmark leaderboard. Neither of those is a statement about the other models it ships, most of which are open weights of varying size and quality. What the documentation does commit to is breadth: an expanding set of supported models including a few multilingual ones, and a stated route for adding more, which is to open an issue. That makes the library a catalogue as much as an implementation, and the practical consequence is that the choice of model matters more than the choice of library for most of the work, since you can register an unsupported one yourself.

Editorial conclusion

FastEmbed fits a retrieval service that has to start fast, run small, or deploy somewhere without a GPU, and the range of model families means you can keep one client library as your retrieval needs grow from text to images to reranking. Two things to check before you commit. Read the version matrix in the packaging file rather than assuming a plain install resolves cleanly, because specific inference runtime versions are excluded per Python version. And decide early whether you will need models the library does not ship, since adding one is a supported path but does require naming the pooling and dimension yourself.

Frequently asked questions

Which models are supported by FastEmbed?

The documentation maintains a list of supported models, covering dense text embeddings, sparse text embeddings, late interaction models, image embeddings, and late interaction multimodal models. Models outside that list can be registered directly, and the project asks for an issue when you want a model added.

how to install fastembed

With pip: pip install fastembed for the CPU build, or pip install fastembed-gpu for GPU support, which is a separate package. Python 3.10 or newer is required, and the dependency constraints on the inference runtime change with the interpreter version.

what is fastembed

A lightweight, fast Python library for embedding generation that runs models on a lighter inference runtime instead of a deep learning framework. It needs no GPU, avoids downloading gigabytes of framework dependencies, and is put forward as a candidate for serverless runtimes.

is fastembed free

Yes. The library is published under the Apache 2.0 licence, and the package metadata records that licence along with a notice file at the repository root. Model weights themselves come from their own sources, which carry their own terms.

Official sources

  1. License: Apache-2.0
  2. Project website
  3. qdrant/fastembed on GitHub
  4. README
  5. Releases
Community

Where developers are discussing it

Posts on Hacker News, dev.to and Lobsters that link to this repository, found by our scan of those communities. 1 in the last 30 days; newest first.

Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/qdrant-fastembed.svg)](https://hysenlabs.com/projects/qdrant-fastembed)

Star history chart for your README

markdown
[![Star history](https://hysenlabs.com/chart/qdrant-fastembed.svg)](https://hysenlabs.com/projects/qdrant-fastembed)

Was this useful?