nomic-embed-text-v1.5 — Matryoshka로 차원 조절되는 임베딩
nomic-embed-text-v1.5
텍스트를 벡터로 바꿀 때 차원을 프로덕션 요구에 맞게 줄여 쓸 수 있으면 저장과 연산 비용이 확 달라져요. nomic-embed-text-v1.5는 Matryoshka Representation Learning을 적용해 임베딩 차원을 64부터 768까지 유연하게 선택할 수 있는 모델이에요. 기본 컨텍스트는 8192 토큰이고, 텍스트뿐 아니라 비전 임베딩과도 같은 공간을 공유해요.
태스크 인스트럭션 프리픽스
텍스트 프롬프트는 반드시 태스크 인스트럭션 프리픽스를 포함해야 해요. RAG를 만든다면 문서는 search_document:로, 사용자 질의는 search_query:로 임베딩해요.
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("nomic-ai/nomic-embed-text-v1.5", trust_remote_code=True)
sentences = [
"That is a happy person",
"That is a happy dog",
"That is a very happy person",
"Today is a sunny day"
]
embeddings = model.encode(sentences)
similarities = model.similarity(embeddings, embeddings)
print(similarities.shape)
# [4, 4]
사용 가능한 프리픽스: search_document, search_query, clustering, classification.
차원 조절 (Matryoshka)
임베딩 후 레이어노름과 정규화를 거쳐 앞부분 차원만 잘라 쓰는 식이에요.
import torch.nn.functional as F
from sentence_transformers import SentenceTransformer
matryoshka_dim = 512
model = SentenceTransformer("nomic-ai/nomic-embed-text-v1.5")
sentences = ['search_query: What is TSNE?', 'search_query: Who is Laurens van der Maaten?']
embeddings = model.encode(sentences, convert_to_tensor=True)
embeddings = F.layer_norm(embeddings, normalized_shape=(embeddings.shape[1],))
embeddings = embeddings[:, :matryoshka_dim]
embeddings = F.normalize(embeddings, p=2, dim=1)
print(embeddings)
차원별 MTEB 성능은 아래와 같아요.
| 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 |
Nomic API
nomic 파이썬 클라이언트로도 간단히 호출할 수 있어요.
from nomic import embed
output = embed.text(
texts=['Nomic Embedding API', ''],
model='nomic-embed-text-v1.5',
task_type='search_document',
dimensionality=256,
)
print(output)