Views
No views yet
nomic-embed-text-v1.5 is now multimodal! nomic-embed-vision-v1.5 is aligned to the embedding space of nomic-embed-text-v1.5, meaning any text embedding is multimodal!search_document: <text here> and embed your user queries as search_query: <text here>.trust_remote_code=True will no longer be necessary. This will only be possible with the text-only series as of now.search_document1from sentence_transformers import SentenceTransformer
2
3model = SentenceTransformer("nomic-ai/nomic-embed-text-v1.5")
4sentences = ['search_document: TSNE is a dimensionality reduction algorithm created by Laurens van Der Maaten']
5embeddings = model.encode(sentences)
6print(embeddings)search_query1from sentence_transformers import SentenceTransformer
2
3model = SentenceTransformer("nomic-ai/nomic-embed-text-v1.5")
4sentences = ['search_query: Who is Laurens van Der Maaten?']
5embeddings = model.encode(sentences)
6print(embeddings)clustering1from sentence_transformers import SentenceTransformer
2
3model = SentenceTransformer("nomic-ai/nomic-embed-text-v1.5")
4sentences = ['clustering: the quick brown fox']
5embeddings = model.encode(sentences)
6print(embeddings)classification1from sentence_transformers import SentenceTransformer
2
3model = SentenceTransformer("nomic-ai/nomic-embed-text-v1.5")
4sentences = ['classification: the quick brown fox']
5embeddings = model.encode(sentences)
6print(embeddings)1import torch.nn.functional as F
2from sentence_transformers import SentenceTransformer
3
4matryoshka_dim = 512
5
6model = SentenceTransformer("nomic-ai/nomic-embed-text-v1.5")
7sentences = ['search_query: What is TSNE?', 'search_query: Who is Laurens van der Maaten?']
8embeddings = model.encode(sentences, convert_to_tensor=True)
9embeddings = F.layer_norm(embeddings, normalized_shape=(embeddings.shape[1],))
10embeddings = embeddings[:, :matryoshka_dim]
11embeddings = F.normalize(embeddings, p=2, dim=1)
12print(embeddings)1import torch
2import torch.nn.functional as F
3from transformers import AutoTokenizer, AutoModel
4
5def mean_pooling(model_output, attention_mask):
6 token_embeddings = model_output[0]
7 input_mask_expanded = attention_mask.unsqueeze(-1).expand(token_embeddings.size()).float()
8 return torch.sum(token_embeddings * input_mask_expanded, 1) / torch.clamp(input_mask_expanded.sum(1), min=1e-9)
9
10sentences = ['search_query: What is TSNE?', 'search_query: Who is Laurens van der Maaten?']
11
12tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased')
13model = AutoModel.from_pretrained('nomic-ai/nomic-embed-text-v1.5')
14model.eval()
15
16encoded_input = tokenizer(sentences, padding=True, truncation=True, return_tensors='pt')
17
18+ matryoshka_dim = 512
19
20with torch.no_grad():
21 model_output = model(**encoded_input)
22
23embeddings = mean_pooling(model_output, encoded_input['attention_mask'])
24+ embeddings = F.layer_norm(embeddings, normalized_shape=(embeddings.shape[1],))
25+ embeddings = embeddings[:, :matryoshka_dim]
26embeddings = F.normalize(embeddings, p=2, dim=1)
27print(embeddings)1- tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased')
2+ tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased', model_max_length=8192)
3
4- model = AutoModel.from_pretrained('nomic-ai/nomic-embed-text-v1.5')
5+ rope_parameters = {"rope_theta": 1000.0, "rope_type": "dynamic", "factor": 2.0}
6+ model = AutoModel.from_pretrained('nomic-ai/nomic-embed-text-v1.5', rope_parameters=rope_parameters)1import { pipeline, layer_norm } from '@huggingface/transformers';
2
3// Create a feature extraction pipeline
4const extractor = await pipeline('feature-extraction', 'nomic-ai/nomic-embed-text-v1.5');
5
6// Define sentences
7const texts = ['search_query: What is TSNE?', 'search_query: Who is Laurens van der Maaten?'];
8
9// Compute sentence embeddings
10let embeddings = await extractor(texts, { pooling: 'mean' });
11console.log(embeddings); // Tensor of shape [2, 768]
12
13const matryoshka_dim = 512;
14embeddings = layer_norm(embeddings, [embeddings.dims[1]])
15 .slice(null, [0, matryoshka_dim])
16 .normalize(2, -1);
17console.log(embeddings.tolist());nomic Python client is as easy as1from nomic import embed
2
3output = embed.text(
4 texts=['Nomic Embedding API', '#keepAIOpen'],
5 model='nomic-embed-text-v1.5',
6 task_type='search_document',
7 dimensionality=256,
8)
9
10print(output)1docker run --gpus all -v $PWD/data:/app/.cache -e HF_TOKEN=$HF_TOKEN -p "7997":"7997" \
2michaelf34/infinity:0.0.70 \
3v2 --model-id nomic-ai/nomic-embed-text-v1.5 --revision "main" --dtype float16 --batch-size 8 --engine torch --port 7997 --no-bettertransformernomic-embed-text-v1.5 is an improvement upon Nomic Embed that utilizes Matryoshka Representation Learning which gives developers the flexibility to trade off the embedding size for a negligible reduction in performance.| Name | SeqLen | Dimension | MTEB |
|---|---|---|---|
| nomic-embed-text-v1 | 8192 | 768 | 62.39 |
| nomic-embed-text-v1.5 | 8192 | 768 | 62.28 |
| nomic-embed-text-v1.5 | 8192 | 512 | 61.96 |
| nomic-embed-text-v1.5 | 8192 | 256 | 61.04 |
| nomic-embed-text-v1.5 | 8192 | 128 | 59.34 |
| nomic-embed-text-v1.5 | 8192 | 64 | 56.10 |

contrastors repository1@misc{nussbaum2024nomic,
2 title={Nomic Embed: Training a Reproducible Long Context Text Embedder},
3 author={Zach Nussbaum and John X. Morris and Brandon Duderstadt and Andriy Mulyar},
4 year={2024},
5 eprint={2402.01613},
6 archivePrefix={arXiv},
7 primaryClass={cs.CL}
8}