nomic-embed-vision — 텍스트와 이미지를 같은 공간으로

nomic-embed-vision

이미지 검색에서 "텍스트로 이미지를 찾는" 멀티모달 RAG를 구성하려면 텍스트와 이미지가 서로 비교 가능한 임베딩 공간을 공유해야 해요. nomic-embed-vision-v1.5는 nomic-embed-text-v1.5같은 임베딩 공간을 공유하는 비전 임베딩 모델이에요. 덕분에 어떤 텍스트 임베딩이든 멀티모달로 확장할 수 있어요.

출처: https://huggingface.co/nomic-ai/nomic-embed-vision-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: 프리픽스를 붙여야 해요.

더 알아보기