임베딩 개요
임베딩은 비슷한 의미의 데이터를 서로 가깝게 배치해 데이터를 고차원 공간에 매핑하는 머신 러닝 개념입니다. 일반적으로 BERT 또는 다른 Transformer 제품군의 심층 신경망인 임베딩 모델은 텍스트, 이미지 및 기타 데이터 유형의 의미를 벡터로 알려진 일련의 숫자로 효과적으로 나타낼 수 있습니다. 이 모델의 주요 특징은 고차원 공간에서 벡터 사이의 수학적 거리가 원본 텍스트나 이미지의 의미론적 유사성을 나타낼 수 있다는 것입니다. 이 속성은 Google이나 Bing과 같은 웹 검색 엔진, 이커머스 사이트의 제품 검색 및 추천, 그리고 최근 인기를 끌고 있는 제너레이티브 AI의 검색 증강 생성(RAG) 패러다임 등 다양한 정보 검색 애플리케이션에 활용되고 있습니다.
임베딩에는 크게 두 가지 범주가 있으며, 각각 다른 유형의 벡터를 생성합니다:
고밀도 임베딩: 대부분의 임베딩 모델은 정보를 수백에서 수천 차원의 부동 소수점 벡터로 표현합니다. 대부분의 차원이 0이 아닌 값을 갖기 때문에 이러한 결과를 "고밀도" 벡터라고 합니다. 예를 들어, 널리 사용되는 오픈 소스 임베딩 모델인 BAAI/bge-base-en-v1.5는 768개의 부동 소수점 숫자(768차원 부동 소수점 벡터)로 이루어진 벡터를 출력합니다.
스파스 임베딩: 이와 대조적으로, 스파스 임베딩의 출력 벡터는 대부분의 차원이 0, 즉 "스파스" 벡터입니다. 이러한 벡터는 토큰 어휘의 크기에 따라 결정되는 훨씬 더 높은 차원(수만 개 이상)을 갖는 경우가 많습니다. 스파스 벡터는 심층 신경망이나 텍스트 말뭉치의 통계 분석을 통해 생성될 수 있습니다. 희소 임베딩은 해석 가능성이 높고 도메인 외부 일반화 기능이 더 뛰어나기 때문에 개발자들이 밀도 임베딩을 보완하기 위해 점점 더 많이 채택하고 있습니다.
Milvus는 벡터 데이터 관리, 저장 및 검색을 위해 설계된 벡터 데이터베이스입니다. 주류 임베딩 및 재랭크 모델을 통합함으로써 원본 텍스트를 검색 가능한 벡터로 쉽게 변환하거나 강력한 모델을 사용하여 결과를 재랭크하여 RAG에 대한 보다 정확한 결과를 얻을 수 있습니다. 이러한 통합은 텍스트 변환을 간소화하고 추가적인 임베딩 또는 재랭크 구성 요소가 필요하지 않으므로 RAG 개발 및 검증을 간소화합니다.
실제로 임베딩을 생성하려면 PyMilvus의 모델을 사용하여 텍스트 임베딩 생성하기를 참조하세요.
임베딩 함수 | 유형 | API 또는 오픈 소스 |
---|---|---|
openai | Dense | API |
문장 변환기 | Dense | 오픈 소스 |
bm25 | Sparse | 오픈 소스 |
Splade | Sparse | 오픈 소스 |
bge-m3 | Hybrid | 오픈 소스 |
voyageai | Dense | API |
jina | Dense | API |
cohere | Dense | API |
Instructor | Dense | 오픈 소스 |
미스트랄 AI | Dense | API |
Nomic | Dense | API |
mGTE | 하이브리드 | 오픈 소스 |
예제 1: 기본 임베딩 함수를 사용하여 고밀도 벡터 생성하기
Milvus에서 임베딩 함수를 사용하려면 먼저 임베딩 생성을 위한 모든 유틸리티를 래핑하는 model
서브패키지와 함께 PyMilvus 클라이언트 라이브러리를 설치하세요.
pip install "pymilvus[model]"
model
서브 패키지는 OpenAI, Sentence Transformers, BGE M3, BM25부터 SPLADE 사전 훈련 모델에 이르기까지 다양한 임베딩 모델을 지원합니다. 단순화를 위해 이 예제에서는 전체 MiniLM-L6-v2 문장 트랜스포머 모델인 DefaultEmbeddingFunction
을 사용하며, 이 모델은 약 70MB로 처음 사용할 때 다운로드됩니다:
from pymilvus import model
# This will download "all-MiniLM-L6-v2", a light weight model.
ef = model.DefaultEmbeddingFunction()
# Data from which embeddings are to be generated
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
print("Embeddings:", embeddings)
# Print dimension and shape of embeddings
print("Dim:", ef.dim, embeddings[0].shape)
예상 출력은 다음과 유사합니다:
Embeddings: [array([-3.09392996e-02, -1.80662833e-02, 1.34775648e-02, 2.77156215e-02,
-4.86349640e-03, -3.12581174e-02, -3.55921760e-02, 5.76934684e-03,
2.80773244e-03, 1.35783911e-01, 3.59678417e-02, 6.17732145e-02,
...
-4.61330153e-02, -4.85207550e-02, 3.13997865e-02, 7.82178566e-02,
-4.75336798e-02, 5.21207601e-02, 9.04406682e-02, -5.36676683e-02],
dtype=float32)]
Dim: 384 (384,)
예 2: BGE M3 모델을 사용하여 한 번의 호출로 고밀도 및 스파스 벡터 생성하기
이 예에서는 BGE M3 하이브리드 모델을 사용하여 텍스트를 고밀도 및 스파스 벡터에 모두 임베드하고 관련 문서를 검색하는 데 사용합니다. 전체 단계는 다음과 같습니다:
BGE-M3 모델을 사용하여 텍스트를 고밀도 및 스파스 벡터로 임베드합니다;
밀도 및 희소 벡터를 저장할 Milvus 컬렉션을 설정합니다;
Milvus에 데이터를 삽입합니다;
결과를 검색하고 검사합니다.
먼저 필요한 종속 요소를 설치해야 합니다.
from pymilvus.model.hybrid import BGEM3EmbeddingFunction
from pymilvus import (
utility,
FieldSchema, CollectionSchema, DataType,
Collection, AnnSearchRequest, RRFRanker, connections,
)
임베딩 검색을 위한 문서와 쿼리를 인코딩하기 위해 BGE M3를 사용합니다.
# 1. prepare a small corpus to search
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.",
]
query = "Who started AI research?"
# BGE-M3 model can embed texts as dense and sparse vectors.
# It is included in the optional `model` module in pymilvus, to install it,
# simply run "pip install pymilvus[model]".
bge_m3_ef = BGEM3EmbeddingFunction(use_fp16=False, device="cpu")
docs_embeddings = bge_m3_ef(docs)
query_embeddings = bge_m3_ef([query])
예 3: BM25 모델을 사용하여 스파스 벡터 생성하기
BM25는 단어 발생 빈도를 사용하여 쿼리와 문서 간의 관련성을 결정하는 잘 알려진 방법입니다. 이 예에서는 BM25EmbeddingFunction
을 사용하여 쿼리와 문서 모두에 대한 스파스 임베딩을 생성하는 방법을 보여 드리겠습니다.
먼저 BM25EmbeddingFunction 클래스를 가져옵니다.
from pymilvus.model.sparse import BM25EmbeddingFunction
BM25에서는 문서의 통계를 계산하여 문서의 패턴을 나타낼 수 있는 IDF(역문서 빈도)를 구하는 것이 중요합니다. IDF는 단어가 얼마나 많은 정보를 제공하는지, 즉 모든 문서에서 공통적인지 또는 드문지를 측정하는 척도입니다.
# 1. prepare a small corpus to search
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.",
]
query = "Where was Turing born?"
bm25_ef = BM25EmbeddingFunction()
# 2. fit the corpus to get BM25 model parameters on your documents.
bm25_ef.fit(docs)
# 3. store the fitted parameters to disk to expedite future processing.
bm25_ef.save("bm25_params.json")
# 4. load the saved params
new_bm25_ef = BM25EmbeddingFunction()
new_bm25_ef.load("bm25_params.json")
docs_embeddings = new_bm25_ef.encode_documents(docs)
query_embeddings = new_bm25_ef.encode_queries([query])
print("Dim:", new_bm25_ef.dim, list(docs_embeddings)[0].shape)
예상 출력은 다음과 비슷합니다:
Dim: 21 (1, 21)