embeddings

Milvus 임베딩 (Embedding Overview)

임베딩(Embedding)은 데이터를 고차원 공간에 매핑해, 의미가 비슷한 데이터끼리 가까이 위치하게 하는 머신러닝 개념이에요. 보통 BERT나 Transformer 계열의 딥러닝 모델이 텍스트·이미지 등 데이터의 의미를 일련의 숫자, 즉 **벡터(Vector)**로 표현해요. 이 벡터들 사이의 수학적 거리가 원본의 의미 유사도를 나타낸다는 점이 검색·추천·RAG 같은 응용을 가능하게 합니다.

이 페이지는 소스 문서 Milvus — Embedding Overview 를 바탕으로, 임베딩의 종류와 PyMilvus의 model 서브패키지로 임베딩을 생성하는 방법을 정리해 드려요.

임베딩의 두 가지 종류

임베딩은 출력되는 벡터의 형태에 따라 크게 두 가지로 나뉩니다.

  • 조밀 임베딩(Dense embedding) — 대부분의 모델이 수백~수천 차원의 실수 벡터로 정보를 표현해요. 대부분의 차원이 0이 아닌 값을 가지므로 "조밀한" 벡터라고 불러요. 예를 들어 오픈소스 모델 BAAI/bge-base-en-v1.5는 768차원 실수 벡터를 출력합니다.
  • 희소 임베딩(Sparse embedding) — 반대로 출력 벡터의 대부분 차원이 0인 "희소한" 벡터예요. 토큰 어휘 크기에 따라 차원이 수만 개 이상으로 훨씬 커요. 딥러닝 네트워크나 말뭉치 통계 분석으로 생성하며, 해석 가능성과 도메인 외 일반화 성능이 좋아 조밀 임베딩을 보완하는 용도로 점점 많이 쓰입니다.

Milvus와 임베딩 통합

Milvus는 벡터 데이터의 관리·저장·검색을 위한 벡터 DB예요. 주류 임베딩과 리랭킹 모델을 통합해, 원본 텍스트를 검색 가능한 벡터로 쉽게 바꾸거나 강력한 모델로 결과를 재정렬할 수 있습니다. 이 통합 덕분에 별도 임베딩·리랭킹 컴포넌트를 추가할 필요가 없어져 RAG 개발과 검증이 간결해져요.

PyMilvus의 임베딩 함수는 조밀·희소·하이브리드 형태로 여러 모델을 지원합니다.

임베딩 함수 형태 API / 오픈소스
openai Dense API
sentence-transformer Dense 오픈소스
Splade Sparse 오픈소스
bge-m3 Hybrid 오픈소스
voyageai Dense API
jina Dense API
cohere Dense API
Instructor Dense 오픈소스
Mistral AI Dense API
Nomic Dense API
mGTE Hybrid 오픈소스
Model2Vec Hybrid 오픈소스
Gemini Hybrid 독점(Private)

PyMilvus로 임베딩 생성하기

임베딩 함수를 쓰려면 먼저 model 서브패키지가 포함된 PyMilvus를 설치해야 해요.

pip install "pymilvus[model]"

model 서브패키지는 OpenAI, Sentence Transformers, BGE M3, SPLADE 등 다양한 사전학습 모델을 감쌉니다. 가장 간단한 예시로, DefaultEmbeddingFunctionall-MiniLM-L6-v2 문장 트랜스포머 모델을 쓰는데, 크기 약 70MB로 첫 사용 시 다운로드됩니다.

from pymilvus import model

# all-MiniLM-L6-v2, a light weight model (downloaded on first use)
ef = model.DefaultEmbeddingFunction()

docs = [
    "Artificial intelligence was founded as an academic discipline in 1956.",
    "Alan Turing was the first person to conduct substantial research in AI.",
    "Born in Maida Vale, London, Turing was raised in southern England.",
]

embeddings = ef.encode_documents(docs)
print("Embeddings:", embeddings)
print("Dim:", ef.dim, embeddings[0].shape)
# Dim: 384 (384,)

ef.dim은 모델이 출력하는 벡터 차원(여기서 384)을 보여줘요. 이 차원은 Milvus 컬렉션의 벡터 필드를 만들 때 그대로 맞춰야 합니다.

BGE-M3로 조밀·희소 벡터 함께 생성하기

BGE-M3는 한 번의 호출로 텍스트를 조밀(dense) 벡터와 희소(sparse) 벡터 모두로 임베딩하는 하이브리드 모델이에요. 이 두 벡터를 컬렉션에 저장하고 검색에 활용하는 흐름은 다음과 같아요. (흐름을 보여주는 개요 코드예요.)

from pymilvus.model.hybrid import BGEM3EmbeddingFunction

# BGE-M3 is included in the optional `model` module
bge_m3_ef = BGEM3EmbeddingFunction(use_fp16=False, device="cpu")

docs_embeddings = bge_m3_ef(docs)          # dense + sparse
query_embeddings = bge_m3_ef([query])

이렇게 만든 조밀·희소 벡터를 Milvus 컬렉션에 함께 저장하면, 의미 검색과 키워드 검색을 결합한 하이브리드 검색의 기반이 됩니다.

실제 적용 (데이터스케쳐스)

  • 임베딩 모델 기준 컬렉션 설계 — 임베딩 모델이 출력하는 차원에 맞춰 벡터 필드 크기를 정합니다.
  • 조밀 벡터 기반 의미 검색 — 기본적으로 조밀 임베딩으로 의미 유사도를 계산합니다.
  • 하이브리드 확장 — BGE-M3 같은 하이브리드 모델로 조밀·희소 벡터를 함께 만들어, 의미+키워드 검색 조합을 준비할 수 있습니다.

더 알아보기