From 7faaef196a147f15094ffaa37c4fafea98c6db93 Mon Sep 17 00:00:00 2001 From: Anush008 <46051506+Anush008@users.noreply.github.com> Date: Sun, 8 Oct 2023 23:03:50 +0530 Subject: [PATCH] docs: README.md update --- README.md | 143 ++++++++++++++++++++++++++++++++++++++++++++++++++- fastembed.go | 5 +- 2 files changed, 146 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b37f6c2..88c53b4 100644 --- a/README.md +++ b/README.md @@ -1 +1,142 @@ -## WIP \ No newline at end of file +
+ +## đ Features + +- Supports batch embeddings with parallelism using go-routines. +- Uses [@sugarme/tokenizer](https://github.com/sugarme/tokenizer) for fast tokenization. +- Optimized embedding models. + +The default embedding supports "query" and "passage" prefixes for the input text. The default model is Flag Embedding, which is top of the [MTEB](https://huggingface.co/spaces/mteb/leaderboard) leaderboard. + +## đ Not looking for Go? + +- Python đ: [fastembed](https://github.com/qdrant/fastembed) +- Rust đĻ: [fastembed-rs](https://github.com/Anush008/fastembed-rs) +- JavaScript đ: [fastembed-js](https://github.com/Anush008/fastembed-js) + +## đ¤ Models + +- [**BAAI/bge-base-en-v1.5**](https://huggingface.co/BAAI/bge-base-en-v1.5) +- [**BAAI/bge-small-en-v1.5**](https://huggingface.co/BAAI/bge-small-en-v1.5) - Default +- [**sentence-transformers/all-MiniLM-L12-v2**](https://huggingface.co/sentence-transformers/all-MiniLM-L12-v2) + +## đ Installation + +Run the following Go CLI command in your project directory: + +```bash +go get -u github.com/Anush008/fastembed-go +``` + +## âšī¸ Notice: + +The Onnx runtime path is automatically loaded on most environments. However, if you encounter +```sh +panic: Platform-specific initialization failed: Error loading ONNX shared library +``` +Set the `ONNX_PATH` env to your Onnx installation. +For eg, on MacOS: +```sh +export ONNX_PATH="/path/to/onnx/lib/libonnxruntime.dylib" +``` +On Linux: +```sh +export ONNX_PATH="/path/to/onnx/lib/libonnxruntime.so" +``` +You can find the Onnx runtime releases [here](https://github.com/microsoft/onnxruntime/releases). + +## đ Usage + +```go +import "github.com/anush008/fastembed-go" + +// With default options +model, err := fastembed.NewFlagEmbedding(nil) +if err != nil { + panic(err) +} + +// With custom options +options := fastembed.InitOptions{ + Model: fastembed.BGEBaseEN, + CacheDir: "model_cache", + MaxLength: 200, +} + +model, err = fastembed.NewFlagEmbedding(&options) +if err != nil { + panic(err) +} + +documents := []string{ + "passage: Hello, World!", + "query: Hello, World!", + "passage: This is an example passage.", + // You can leave out the prefix but it's recommended + "fastembed-go is licensed under MIT", +} + +// Generate embeddings with a batch-size of 25, defaults to 256 +embeddings, err := model.Embed(documents, 25) // -> Embeddings length: 4 +if err != nil { + panic(err) +} +``` + +### Supports passage and query embeddings for more accurate results + +```go +// Generate embeddings for the passages +// The texts are prefixed with "passage" for better results +// The batch size is set to 1 for demonstration purposes +passages := []string{ + "This is the first passage. It contains provides more context for retrieval.", + "Here's the second passage, which is longer than the first one. It includes additional information.", + "And this is the third passage, the longest of all. It contains several sentences and is meant for more extensive testing.", +} + +embeddings, err := model.PassageEmbed(passages, 1) // -> Embeddings length: 3 +if err != nil { + panic(err) +} + +// Generate embeddings for the query +// The text is prefixed with "query" for better retrieval +query := "What is the answer to this generic question?"; + +embeddings, err := model.QueryEmbed(query) +if err != nil { + panic(err) +} +``` + +## đ Under the hood + +### Why fast? + +It's important we justify the "fast" in FastEmbed. FastEmbed is fast because: + +1. Quantized model weights +2. ONNX Runtime which allows for inference on CPU, GPU, and other dedicated runtimes + +### Why light? + +1. No hidden dependencies via Huggingface Transformers + +### Why accurate? + +1. Better than OpenAI Ada-002 +2. Top of the Embedding leaderboards e.g. [MTEB](https://huggingface.co/spaces/mteb/leaderboard) + +## đ LICENSE + +MIT Š [2023](https://github.com/Anush008/fastembed-go/blob/main/LICENSE) diff --git a/fastembed.go b/fastembed.go index 5717d8f..c9bf2d0 100644 --- a/fastembed.go +++ b/fastembed.go @@ -70,6 +70,10 @@ type ModelInfo struct { // Function to initialize a FastEmbed model func NewFlagEmbedding(options *InitOptions) (*FlagEmbedding, error) { + if options == nil { + options = &InitOptions{} + } + if options.CacheDir == "" { options.CacheDir = "local_cache" } @@ -290,7 +294,6 @@ func ListSupportedModels() []ModelInfo { } } -// TODO: Configure the from model config files func loadTokenizer(modelPath string, maxLength int) (*tokenizer.Tokenizer, error) { tknzer, err := pretrained.FromFile(filepath.Join(modelPath, "tokenizer.json"))