Files
fastembed/docs/Getting Started.ipynb
T
GeorgeandNirant Kasliwal e11f66bb55 refactoring: update imports in notebooks (#173)
* new: simplify imports

* refactoring: update import

* refactoring: update imports in notebooks

* fix: fix notebook output

* Re-run notebook with revised imports

---------

Co-authored-by: Nirant Kasliwal <nirant.bits@gmail.com>
2024-04-01 17:02:13 +05:30

7.4 KiB

🚶🏻‍♂️ Getting Started

Here you will learn how to use the fastembed package to embed your data into a vector space. The package is designed to be easy to use and fast. It is built on top of the ONNX standard, which allows for fast inference on a variety of hardware (called Runtimes in ONNX).

Quick Start

The fastembed package is designed to be easy to use. We'll be using TextEmbedding class. It takes a list of strings as input and returns an generator of vectors. If you're seeing generators for the first time, don't worry, you can convert it to a list using list().

💡 You can learn more about generators from Python Wiki

In [1]:
!pip install -Uqq fastembed # Install fastembed
In [2]:
import numpy as np
from fastembed import TextEmbedding
from typing import List

# Example list of documents
documents: List[str] = [
    "This is built to be faster and lighter than other embedding libraries e.g. Transformers, Sentence-Transformers, etc.",
    "fastembed is supported by and maintained by Qdrant.",
]

# This will trigger the model download and initialization
embedding_model = TextEmbedding()
print("The model BAAI/bge-small-en-v1.5 is ready to use.")

embeddings_generator = embedding_model.embed(documents)  # reminder this is a generator
embeddings_list = list(embeddings_generator)
# you can also convert the generator to a list, and that to a numpy array
len(embeddings_list[0])  # Vector of 384 dimensions
Out [2]:
Fetching 9 files:   0%|          | 0/9 [00:00<?, ?it/s]
The model BAAI/bge-small-en-v1.5 is ready to use.
384

💡 Why do we use generators?

We use them to save memory mostly. Instead of loading all the vectors into memory, we can load them one by one. This is useful when you have a large dataset and you don't want to load all the vectors at once.

In [3]:
embeddings_generator = embedding_model.embed(documents)  # reminder this is a generator

for doc, vector in zip(documents, embeddings_generator):
    print("Document:", doc)
    print(f"Vector of type: {type(vector)} with shape: {vector.shape}")
Document: This is built to be faster and lighter than other embedding libraries e.g. Transformers, Sentence-Transformers, etc.
Vector of type: <class 'numpy.ndarray'> with shape: (384,)
Document: fastembed is supported by and maintained by Qdrant.
Vector of type: <class 'numpy.ndarray'> with shape: (384,)
In [4]:
embeddings_list = np.array(
    list(embedding_model.embed(documents))
)  # you can also convert the generator to a list, and that to a numpy array
embeddings_list.shape
Out [4]:
(2, 384)

We're using BAAI/bge-small-en-v1.5 a state of the art Flag Embedding model. The model does better than OpenAI text-embedding-ada-002. We've made it even faster by converting it to ONNX format and quantizing the model for you.

Format of the Document List

  1. List of Strings: Your documents must be in a list, and each document must be a string
  2. For Retrieval Tasks with our default: If you're working with queries and passages, you can add special labels to them:
  • Queries: Add "query:" at the beginning of each query string
  • Passages: Add "passage:" at the beginning of each passage string

Beyond the default model

The default model is built for speed and efficiency. If you need a more accurate model, you can use the TextEmbedding class to load any model from our list of available models. You can find the list of available models using TextEmbedding.list_supported_models().

In [5]:
multilingual_large_model = TextEmbedding("intfloat/multilingual-e5-large")  # This can take a few minutes to download
Fetching 8 files:   0%|          | 0/8 [00:00<?, ?it/s]
In [6]:
np.array(
    list(multilingual_large_model.embed(["Hello, world!", "你好世界", "¡Hola Mundo!", "नमस्ते!"]))
).shape  # Vector of 1024 dimensions
Out [6]:
(4, 1024)

Next: Checkout how to use FastEmbed with Qdrant for similarity search: FastEmbed with Qdrant