기존 RAG는 텍스트밖에 못 넣었습니다. 제품 메뉴얼 스크린샷, 회의 녹화, 다이어그램 — 전부 그냥 버렸죠. gemini-embedding-2가 GA되면서 이게 바뀌었습니다.
한줄요약: gemini-embedding-2는 텍스트·이미지·영상·오디오·PDF를 단일 벡터 공간에 임베딩하는 구글 최초의 멀티모달 임베딩 모델로, 기존 embedding-001과 벡터 공간이 완전히 달라 전체 재임베딩이 필요합니다.
gemini-embedding-001과 뭐가 달라졌나요?
가장 먼저 알아야 할 건 이게 단순 업그레이드가 아니라는 점입니다. 아키텍처 자체가 다릅니다.
기존 embedding-001은 텍스트 전용 모델이었습니다. 이미지나 오디오를 검색에 넣으려면 별도의 CLIP 모델로 이미지 임베딩, Whisper로 오디오 텍스트 변환, 그리고 서로 다른 벡터 공간을 정렬하는 로직까지 세 개 이상의 시스템을 엮어야 했습니다.
gemini-embedding-2는 이 5가지 모달리티를 처음부터 하나의 벡터 공간에 넣어서 학습했습니다. "이 다이어그램과 관련된 코드 찾아줘" 같은 크로스모달 쿼리가 단일 API 엔드포인트로 가능해진 겁니다.
항목 embedding-001 gemini-embedding-2
───────────────────────────────────────────────────────────
지원 모달리티 텍스트만 텍스트+이미지+영상+오디오+PDF
컨텍스트 윈도우 2,048 토큰 8,192 토큰 (4배)
출력 차원 3,072 고정 128~3,072 (MRL 가변)
MTEB 영어 점수 - 68.32 (1위)
벡터 호환성 ❌ 완전 비호환 신규 공간
가격(텍스트) $0.20/M 토큰 $0.20/M 토큰 (배치 $0.10)
스펙 상세
입력 제한:
→ 텍스트: 최대 8,192 토큰
→ 이미지: 최대 6장 (PNG, JPEG)
→ 영상: 최대 120초 (MP4, MOV)
→ 오디오: 네이티브 수집 지원
→ PDF: 최대 6페이지
출력 차원 선택 (Matryoshka Representation Learning):
모델을 재학습 없이 벡터 크기를 줄일 수 있습니다. 구글 권장값은 다음과 같습니다.
3,072차원 → 최고 품질 (기본값)
1,536차원 → 품질 거의 동일, 스토리지 50% 절감
768차원 → 품질 근접, 스토리지 75% 절감 ← 대부분의 프로덕션에서 최적
128차원 → 저비용 프로토타입, 대규모 클러스터링
기본 사용 코드
from google import genai
from google.genai import types
client = genai.Client(api_key="YOUR_API_KEY")
# 텍스트 임베딩 (task instruction 명시 권장)
result = client.models.embed_content(
model="gemini-embedding-2",
contents="검색 쿼리: Antigravity CLI 마이그레이션 방법",
config=types.EmbedContentConfig(
task_type="RETRIEVAL_QUERY", # 쿼리용
output_dimensionality=768, # 스토리지 최적화
)
)
print(result.embeddings[0].values[:5]) # 벡터 확인
task_type 종류:
# 문서 저장(인덱싱)용
task_type="RETRIEVAL_DOCUMENT"
# 검색 쿼리용
task_type="RETRIEVAL_QUERY"
# 시맨틱 유사도 비교용
task_type="SEMANTIC_SIMILARITY"
# 코드 검색용
task_type="CODE_RETRIEVAL_QUERY"
텍스트 전용 태스크에서는 task_type 명시가 품질에 크게 영향을 줍니다. 구글이 공식적으로 강력히 권장합니다.
멀티모달 RAG 파이프라인 구성
이제 실제로 이미지, PDF, 텍스트를 섞어서 인덱싱하는 예시입니다.
import base64
from google import genai
from google.genai import types
client = genai.Client(api_key="YOUR_API_KEY")
def embed_text(text: str) -> list[float]:
result = client.models.embed_content(
model="gemini-embedding-2",
contents=text,
config=types.EmbedContentConfig(
task_type="RETRIEVAL_DOCUMENT",
output_dimensionality=768,
)
)
return result.embeddings[0].values
def embed_image(image_path: str) -> list[float]:
with open(image_path, "rb") as f:
image_data = base64.b64encode(f.read()).decode()
result = client.models.embed_content(
model="gemini-embedding-2",
contents=types.Part.from_bytes(
data=base64.b64decode(image_data),
mime_type="image/png"
),
config=types.EmbedContentConfig(
output_dimensionality=768,
)
)
return result.embeddings[0].values
# 텍스트 쿼리로 이미지 검색 (크로스모달)
def query_by_text(query: str) -> list[float]:
result = client.models.embed_content(
model="gemini-embedding-2",
contents=query,
config=types.EmbedContentConfig(
task_type="RETRIEVAL_QUERY",
output_dimensionality=768,
)
)
return result.embeddings[0].values
텍스트 쿼리로 임베딩한 벡터를, 이미지로 임베딩한 벡터와 코사인 유사도로 직접 비교할 수 있습니다. 같은 공간에 있기 때문입니다.
⚠️ embedding-001에서 마이그레이션할 때 반드시 알아야 할 것
가장 중요한 경고입니다.
두 모델의 벡터 공간은 완전히 비호환입니다. 기존 인덱스에 새 벡터를 섞으면 코사인 유사도 계산이 의미 없는 값을 반환합니다. 기존 데이터 전체를 다시 임베딩해야 합니다.
프로덕션 검색 시스템이 있다면 이 순서로 진행하세요.
1단계: 섀도 인덱스 생성
→ 프로덕션은 embedding-001 그대로 운영
→ 백그라운드 잡으로 전체 코퍼스를 gemini-embedding-2로 재임베딩
→ 별도 인덱스(예: Qdrant 새 컬렉션)에 저장
2단계: 코사인 유사도 임계값 재보정
→ 두 모델은 벡터 분포가 다름
→ A/B 테스트로 적절한 threshold 재설정 필요
3단계: 트래픽 점진적 전환
→ 1% → 10% → 50% → 100%
→ 검색 품질 지표(MRR, Recall@K) 모니터링
4단계: 구 인덱스 삭제
대용량 데이터셋은 배치 API($0.10/M 토큰, 50% 할인)로 재임베딩 비용을 절반으로 줄일 수 있습니다.
지원 벡터DB 및 프레임워크
현재 gemini-embedding-2를 공식 지원하는 생태계입니다.
벡터DB: Qdrant, Weaviate, ChromaDB, Pinecone, Vertex AI Vector Search
프레임워크: LangChain, LlamaIndex, Haystack
클라우드: Gemini API, Vertex AI
LangChain 연동 예시:
from langchain_google_genai import GoogleGenerativeAIEmbeddings
embeddings = GoogleGenerativeAIEmbeddings(
model="gemini-embedding-2",
task_type="retrieval_document",
google_api_key="YOUR_API_KEY"
)
# 벡터스토어에 바로 연결
from langchain_community.vectorstores import Qdrant
vectorstore = Qdrant.from_documents(
documents=docs,
embedding=embeddings,
url="http://localhost:6333",
collection_name="multimodal_rag"
)
언제 gemini-embedding-2를 써야 하나요?
✅ 이걸 쓰세요
- 이미지·영상·오디오·PDF를 함께 검색해야 할 때
- 크로스모달 검색이 필요할 때 ("이 다이어그램과 유사한 문서")
- 100개 이상 언어 지원이 필요할 때
- 멀티모달 데이터 있는 신규 프로젝트
❌ 다른 걸 쓰세요
- 텍스트 전용 RAG + 비용이 최우선 → OpenAI text-embedding-3-small ($0.02/M, 10배 저렴)
- 32K 토큰 이상 장문 문서 임베딩 → Voyage voyage-3.5 (32K 컨텍스트)
- 기존 embedding-001 인덱스 유지가 필요한 경우 → 재임베딩 전까지 병행 운영
✅ 텍스트 전용 RAG도 MTEB 1위 성능으로 업그레이드됩니다. 멀티모달 필요 없어도 신규 프로젝트라면 gemini-embedding-2가 기본 선택지입니다.
❌ 단, 기존 embedding-001 인덱스를 그대로 쓰면서 모델만 바꾸면 검색 결과가 완전히 망가집니다. 반드시 전체 재임베딩 후 전환하세요.
'Gemini' 카테고리의 다른 글
| Gemini 3.1 Flash TTS (Text-to-Speech) 음성 감정 표현 API 실전 가이드 (0) | 2026.06.12 |
|---|---|
| Deep Research API 실전 가이드 — Collaborative Planning, MCP, File Search 완전 연동 (0) | 2026.06.12 |
| 6월 18일이면 gemini 명령어가 멈춥니다 — Antigravity CLI 마이그레이션 실전 가이드 (0) | 2026.06.12 |
| DiffusionGemma 완전 분석: Gemma 4랑 뭐가 다른 거예요? (0) | 2026.06.11 |
| Gemma 4 E4B vLLM으로 서빙 with MTP (0) | 2026.06.10 |