nomic-embed-vision — 텍스트와 이미지를 같은 공간으로
nomic-embed-vision
이미지 검색에서 "텍스트로 이미지를 찾는" 멀티모달 RAG를 구성하려면 텍스트와 이미지가 서로 비교 가능한 임베딩 공간을 공유해야 해요. nomic-embed-vision-v1.5는 nomic-embed-text-v1.5와 같은 임베딩 공간을 공유하는 비전 임베딩 모델이에요. 덕분에 어떤 텍스트 임베딩이든 멀티모달로 확장할 수 있어요.
성능 비교
| Name | Imagenet 0-shot | Datacomp (Avg. 38) | MTEB |
|---|---|---|---|
nomic-embed-vision-v1.5 |
71.0 | 56.8 | 62.28 |
nomic-embed-vision-v1 |
70.7 | 56.7 | 62.39 |
| OpenAI CLIP ViT B/16 | 68.3 | 56.3 | 43.82 |
| Jina CLIP v1 | 59.1 | 52.2 | 60.1 |
호스티드 API로 이미지 임베딩
from nomic import embed
import numpy as np
output = embed.image(
images=[
"image_path_1.jpeg",
"image_path_2.png",
],
model='nomic-embed-vision-v1.5',
)
print(output['usage'])
embeddings = np.array(output['embeddings'])
print(embeddings.shape)
이미지 임베딩 뽑기 (Transformers)
import torch
import torch.nn.functional as F
from transformers import AutoTokenizer, AutoModel, AutoImageProcessor
from PIL import Image
import requests
processor = AutoImageProcessor.from_pretrained("nomic-ai/nomic-embed-vision-v1.5")
vision_model = AutoModel.from_pretrained("nomic-ai/nomic-embed-vision-v1.5", trust_remote_code=True)
url = 'http://images.cocodataset.org/val2017/000000039769.jpg'
image = Image.open(requests.get(url, stream=True).raw)
inputs = processor(image, return_tensors="pt")
img_emb = vision_model(**inputs).last_hidden_state
img_embeddings = F.normalize(img_emb[:, 0], p=2, dim=1)
멀티모달 RAG에서는 텍스트 프롬프트에 search_query: 프리픽스를 붙여야 해요.