RAG 파이프라인의 3단계 — 문서 청크를 의미 기반 벡터로 변환
임베딩은 텍스트 → 수치 벡터로 변환하는 과정입니다.
이 벡터는 LLM이 텍스트의 의미적 유사성을 이해하고 비교할 수 있게 해줍니다.
| 모델 | 차원 | 장점 | 단점 | 추천 상황 |
|---|---|---|---|---|
| OpenAI text-embedding-3-small | 1536(조정 가능) | 빠르고 저렴 | 다국어 약간 약함 | 대규모 데이터, 비용 절감 |
| OpenAI text-embedding-3-large | 3072(조정 가능) | 정확도↑ | 비용↑ | 정밀 검색, 품질 우선 |
| HuggingFace multilingual-e5-large-instruct | 1024 | 다국어, 오픈소스 | GPU 필요 | 오픈소스 RAG, 다국어 |
| BGE-M3 | 1024+ | Dense+Sparse+Multi-Vector | 설치·세팅 복잡 | 검색 정밀도 최우선 |
| Upstage Solar Embedding | 4096 | 한국어 최적화, query/passage 분리 | 국내 서비스 의존 | 한국어 중심 서비스 |
| Ollama Embeddings | 모델별 | 로컬 실행, 보안 | 로컬 자원 필요 | 오프라인 환경 |
| GPT4All Embeddings | 384 | 무료, 로컬 | 성능 제한 | 개인 프로젝트, 보안 필수 |
from langchain_openai import OpenAIEmbeddings
emb = OpenAIEmbeddings(
model="text-embedding-3-small",
dimensions=1024 # 차원 축소 가능
)
query_vector = emb.embed_query("텍스트")
doc_vectors = emb.embed_documents(["문서1", "문서2"])
from langchain.storage import LocalFileStore
from langchain.embeddings import CacheBackedEmbeddings
store = LocalFileStore("./cache/")
cached_emb = CacheBackedEmbeddings.from_bytes_store(
emb, store, namespace=emb.model
)
from langchain_community.embeddings import HuggingFaceEmbeddings
hf_emb = HuggingFaceEmbeddings(
model_name="intfloat/multilingual-e5-large-instruct"
)
from FlagEmbedding import BGEM3FlagModel
model = BGEM3FlagModel('BAAI/bge-m3', use_fp16=True)
dense_vecs = model.encode(["문서1", "문서2"])['dense_vecs']
from langchain_upstage import UpstageEmbeddings
query_emb = UpstageEmbeddings(model="solar-embedding-1-large-query")
passage_emb = UpstageEmbeddings(model="solar-embedding-1-large-passage")
from sklearn.metrics.pairwise import cosine_similarity
sim = cosine_similarity([vec1], [vec2])[0][0]
print(f"유사도: {sim:.4f}")
비용 vs 품질: 대규모 데이터 → small 모델, 고정밀 검색 → large 모델
언어: 한국어 중심 → Upstage, BGE-M3
환경: 로컬·오프라인 → Ollama, GPT4All
속도: 캐싱 필수
모델 선택 기준:
💬 "RAG의 검색 품질은 임베딩 품질이 좌우한다."
다음 글(CH09)에서는 **벡터스토어(Vector Store)**를 설정하고, 검색 쿼리를 최적화하는 방법을 다룹니다.