Int8 dynamically quantized ONNX conversion of
Voyage AI's voyage-4-nano embedding model for use with Transformers.js and ONNX Runtime.
1import { pipeline } from '@huggingface/transformers';
2
3const extractor = await pipeline(
4 'feature-extraction',
5 'YOUR_USERNAME/voyage-4-nano-ONNX-int8'
6);
7
8// Document embedding (for indexing)
9const docPrefix = "Represent the document for retrieval: ";
10const docEmbedding = await extractor(docPrefix + "Your document text", {
11 pooling: 'mean',
12 normalize: true
13});
14
15// Query embedding (for search)
16const queryPrefix = "Represent the query for retrieving supporting documents: ";
17const queryEmbedding = await extractor(queryPrefix + "Your search query", {
18 pooling: 'mean',
19 normalize: true
20});
1import onnxruntime as ort
2from transformers import AutoTokenizer
3import numpy as np
4
5tokenizer = AutoTokenizer.from_pretrained("YOUR_USERNAME/voyage-4-nano-ONNX-int8")
6session = ort.InferenceSession("model.onnx")
7
8text = "Represent the document for retrieval: Your text here"
9inputs = tokenizer(text, return_tensors="np", padding=True, truncation=True)
10
11# Create position_ids
12seq_len = inputs["input_ids"].shape[1]
13position_ids = np.arange(seq_len).reshape(1, -1).astype(np.int64)
14
15outputs = session.run(None, {
16 "input_ids": inputs["input_ids"],
17 "attention_mask": inputs["attention_mask"],
18 "position_ids": position_ids
19})
20
21# Mean pooling
22embeddings = outputs[0]
23mask = inputs["attention_mask"]
24pooled = (embeddings * mask[:, :, None]).sum(1) / mask.sum(1, keepdims=True)
25
26# L2 normalize
27normalized = pooled / np.linalg.norm(pooled, axis=1, keepdims=True)