nomic-embed-text-v1.5 — Matryoshka로 차원 조절되는 임베딩

nomic-embed-text-v1.5

텍스트를 벡터로 바꿀 때 차원을 프로덕션 요구에 맞게 줄여 쓸 수 있으면 저장과 연산 비용이 확 달라져요. nomic-embed-text-v1.5는 Matryoshka Representation Learning을 적용해 임베딩 차원을 64부터 768까지 유연하게 선택할 수 있는 모델이에요. 기본 컨텍스트는 8192 토큰이고, 텍스트뿐 아니라 비전 임베딩과도 같은 공간을 공유해요.

출처: https://huggingface.co/nomic-ai/nomic-embed-text-v1.5

태스크 인스트럭션 프리픽스

텍스트 프롬프트는 반드시 태스크 인스트럭션 프리픽스를 포함해야 해요. 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)

더 알아보기