Cohere 임베딩 소개
Cohere 임베딩 소개
임베딩(embedding)은 텍스트·이미지·정보의 의미를 숫자 목록으로 바꾸는 방식이에요. 두 임베딩 벡터의 유사도를 계산하면 두 정보가 비슷한 이야기를 하는지 수치로 알 수 있어요. 의미 검색(semantic search), 클러스터링, 분류 같은 작업이 전형적인 임베딩 활용 사례예요. Cohere의 Embed API로는 모델 하나로 텍스트뿐 아니라 이미지까지 벡터로 만들 수 있어서 복잡한 ETL 없이도 검색·RAG 파이프라인을 꾸릴 수 있어요.
기본 사용법
embed-v4.0 모델로 여러 문장의 임베딩을 만들고, 내적(numpy dot) 기반 유사도 함수로 비교해 볼게요. 비슷한 의미의 두 문장은 높은 유사도를, 무관한 문장끼리는 낮은 유사도를 보여요.
import cohere
import numpy as np
co = cohere.ClientV2(api_key="YOUR_API_KEY")
phrases = ["i love soup", "soup is my favorite", "london is far away"]
res = co.embed(
texts=phrases,
model="embed-v4.0",
input_type="search_query",
output_dimension=1024,
embedding_types=["float"],
)
soup1, soup2, london = res.embeddings.float
def calculate_similarity(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
input_type 파라미터
Cohere 임베딩은 입력의 용도에 따라 최적화가 달라져요. input_type으로 이를 지정하면 돼요.
- 의미 검색 — 검색 질의(query)는
search_query, 검색 대상 텍스트는search_document로 임베딩해요. - 분류·클러스터링 —
classification또는clustering으로 지정해서 각 작업에 맞게 임베딩을 최적화할 수 있어요. - 이미지 —
embed-v3.0에서input_type='image'를 주면 이미지를 입력으로 받아요.embed-v4.0에서images를 쓰면 기본값은search_document예요.
다국어 지원
embed-v4.0은 100개 이상의 언어를 지원하는 다국어 모델이에요. 한국어, 일본어, 아랍어, 중국어, 스페인어, 프랑스어를 포함해요. 언어와 무관하게(language-agnostic) 의미 유사도 검색이 가능해지는 게 큰 장점이에요.
이미지 임베딩
embed-v4.0과 embed-v3.0 계열은 이미지 임베딩을 지원해요. 이미지는 base64로 인코딩한 뒤 Data URL 형태로 전달해요. 파일 형식은 png, jpeg, webp, gif 중 하나여야 하고 크기는 최대 5MB예요. input_type='image'를 쓸 때는 texts 필드가 비어 있어야 해요. 배치 이미지 임베딩은 embed-v3.0에서는 지원되지 않고, embed-v4.0에서는 한 번에 최대 96장까지 넣을 수 있어요.
혼합 콘텐츠 임베딩(Mixed Content)
embed-v4.0은 피규어, 슬라이드, 문서 스크린샷(예: PDF 페이지) 같은 이미지와 텍스트를 함께 처리할 수 있어요. 텍스트와 이미지를 하나의 벡터 표현으로 압축하므로, 복잡한 텍스트 추출이나 ETL 파이프라인이 필요 없어져요. embed-v3.0과 달리 이미지와 텍스트를 하나의 호출에서 같이 처리하는 게 특징이에요.
Matryoshka 임베딩
embed-v4.0은 하나의 벡터 안에 coarse-to-fine 표현을 담는 Matryoshka 학습을 지원해요. output_dimension 파라미터로 [256, 512, 1024, 1536] 중 원하는 차원을 고를 수 있어요. 이렇게 하면 저장 공간을 줄이면서도 필요에 따라 임베딩 정밀도를 조절할 수 있어요.
압축 수준(Compression)
Embed API의 embedding_types 파라미터로 출력 벡터를 다양한 방식으로 압축할 수 있어요. 지원되는 타입은 float, int8, unint8, binary, ubinary예요. 한 번의 호출에 여러 타입을 함께 요청해서(예: ["int8", "float"]) 동시에 받을 수도 있어요.