nomic-embed-text-v1 — 재현 가능한 장문맥 임베딩
nomic-embed-text-v1
OpenAI의 text-embedding-ada-002 수준 성능을 오픈웨이트로 내는 임베딩 모델이 필요했어요. nomic-embed-text-v1은 8,192 컨텍스트를 지원하며 단문·장문 태스크에서 OpenAI의 text-embedding-ada-002와 text-embedding-3-small을 능가하는 성능을 보여주는 오픈소스 모델이에요. 가중치뿐 아니라 학습 코드와 데이터까지 전부 공개해 재현 가능한 것이 핵심 가치예요.
벤치마크
| Name | SeqLen | MTEB | LoCo | Jina Long Context | Open Weights | Open Training Code | Open Data |
|---|---|---|---|---|---|---|---|
| nomic-embed-text-v1 | 8192 | 62.39 | 85.53 | 54.16 | ✅ | ✅ | ✅ |
| jina-embeddings-v2-base-en | 8192 | 60.39 | 85.45 | 51.90 | ✅ | ❌ | ❌ |
| text-embedding-3-small | 8191 | 62.26 | 82.40 | 58.20 | ❌ | ❌ | ❌ |
| text-embedding-ada-002 | 8191 | 60.99 | 52.7 | 55.25 | ❌ | ❌ | ❌ |
사용 (프리픽스 필수)
텍스트 프롬프트는 반드시 태스크 인스트럭션 프리픽스를 포함해야 해요. search_document, search_query, clustering, classification를 상황에 맞게 붙여요.
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("nomic-ai/nomic-embed-text-v1")
sentences = ['search_document: TSNE is a dimensionality reduction algorithm created by Laurens van Der Maaten']
embeddings = model.encode(sentences)
print(embeddings)
2048 토큰 너머로 확장
기본 토크나이저는 2048 토큰 제한이지만, 아래처럼 설정하면 네이티브로 8192까지 확장돼요.
tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased', model_max_length=8192)
rope_parameters = {"rope_theta": 1000.0, "rope_type": "dynamic", "factor": 2.0}
model = AutoModel.from_pretrained('nomic-ai/nomic-embed-text-v1', rope_parameters=rope_parameters)
학습 파이프라인
장문맥 BERT(nomic-bert-2048)에서 출발해, 첫 단계는 비지도 대비 학습(StackExchange·Quora의 질문-답변 쌍, Amazon 리뷰의 제목-본문 등), 두 번째 단계는 검색 질의-응답 같은 고품질 라벨 데이터로 파인튜닝해요.