by Xenova
Open source · 153k downloads · 14 likes
The BGE Small v1.5 model is an optimized and lightweight version of the BAAI BGE model, specifically designed to generate high-quality English text embeddings. It excels in tasks such as information retrieval, text classification, and semantic comparison by finely capturing the nuances of language. Its main strengths lie in its efficiency and speed, while delivering performance comparable to larger models. Ideal for applications requiring compact yet powerful embeddings, it stands out for its compatibility with web environments through ONNX weights, facilitating integration into JavaScript projects. Its balanced approach between reduced size and precision makes it a versatile choice for developers and researchers.
https://huggingface.co/BAAI/bge-small-en-v1.5 with ONNX weights to be compatible with Transformers.js.
If you haven't already, you can install the Transformers.js JavaScript library from NPM using:
npm i @huggingface/transformers
You can then use the model to compute embeddings, as follows:
import { pipeline } from '@huggingface/transformers';
// Create a feature-extraction pipeline
const extractor = await pipeline('feature-extraction', 'Xenova/bge-small-en-v1.5');
// Compute sentence embeddings
const texts = ['Hello world.', 'Example sentence.'];
const embeddings = await extractor(texts, { pooling: 'mean', normalize: true });
console.log(embeddings);
// Tensor {
// dims: [ 2, 384 ],
// type: 'float32',
// data: Float32Array(768) [ -0.04314826801419258, -0.029488801956176758, ... ],
// size: 768
// }
console.log(embeddings.tolist()); // Convert embeddings to a JavaScript list
// [
// [ -0.04314826801419258, -0.029488801956176758, 0.027080481871962547, ... ],
// [ -0.03605496883392334, 0.01643390767276287, 0.008982205763459206, ... ]
// ]
You can also use the model for retrieval. For example:
import { pipeline, cos_sim } from '@huggingface/transformers';
// Create a feature-extraction pipeline
const extractor = await pipeline('feature-extraction', 'Xenova/bge-small-en-v1.5');
// List of documents you want to embed
const texts = [
'Hello world.',
'The giant panda (Ailuropoda melanoleuca), sometimes called a panda bear or simply panda, is a bear species endemic to China.',
'I love pandas so much!',
];
// Compute sentence embeddings
const embeddings = await extractor(texts, { pooling: 'mean', normalize: true });
// Prepend recommended query instruction for retrieval.
const query_prefix = 'Represent this sentence for searching relevant passages: '
const query = query_prefix + 'What is a panda?';
const query_embeddings = await extractor(query, { pooling: 'mean', normalize: true });
// Sort by cosine similarity score
const scores = embeddings.tolist().map(
(embedding, i) => ({
id: i,
score: cos_sim(query_embeddings.data, embedding),
text: texts[i],
})
).sort((a, b) => b.score - a.score);
console.log(scores);
// [
// { id: 1, score: 0.7995888037433755, text: 'The giant panda (Ailuropoda melanoleuca), sometimes called a panda bear or simply panda, is a bear species endemic to China.' },
// { id: 2, score: 0.6911046766159414, text: 'I love pandas so much!' },
// { id: 0, score: 0.39066192695524765, text: 'Hello world.' }
// ]
Note: Having a separate repo for ONNX weights is intended to be a temporary solution until WebML gains more traction. If you would like to make your models web-ready, we recommend converting to ONNX using 🤗 Optimum and structuring your repo like this one (with ONNX weights located in a subfolder named onnx).