Embedding & Vector DB
텍스트를 숫자 벡터로 변환하고, 의미적으로 유사한 것을 찾는 기술 — RAG의 핵심 기반
1. 임베딩이란
1.1 핵심 개념
임베딩(Embedding)은 텍스트, 이미지 등을 **고정 크기의 밀집 벡터(dense vector)**로 변환하는 것. 의미가 유사한 것은 벡터 공간에서 가까이 위치함.
"서버 장애" → [0.12, -0.45, 0.78, ..., 0.33] (1536차원 벡터)
"시스템 다운" → [0.11, -0.44, 0.77, ..., 0.35] (유사 → 벡터가 가까움)
"맛있는 음식" → [-0.82, 0.56, -0.11, ..., 0.91] (다름 → 벡터가 멀음)
1.2 임베딩 진화
| 세대 | 대표 | 특징 |
|---|---|---|
| Word2Vec/GloVe | 단어 단위 고정 벡터 | "bank"가 금융/강둑 구분 못 함 |
| ELMo | 문맥 반영 벡터 (RNN 기반) | 같은 단어도 문맥에 따라 다른 벡터 |
| Sentence-BERT | 문장 단위 벡터 (Transformer) | ✅ 문장 유사도의 표준 |
| OpenAI Embeddings | API 기반, 고성능 | 편리, 유료 |
| E5 / BGE / GTE | 오픈소스 고성능 | ✅ 자체 호스팅 가능 |
1.3 유사도 측정
| 방법 | 수식 | 특성 |
|---|---|---|
| 코사인 유사도 | cos(θ) = A·B / (|A|×|B|) | ✅ 가장 많이 사용. 방향만 비교 |
| 유클리드 거리 | √Σ(aᵢ-bᵢ)² | 크기+방향 모두 반영 |
| 내적 | Σaᵢ×bᵢ | 크기 반영. 정규화된 벡터에서는 코사인과 동일 |
2. Vector DB
2.1 왜 Vector DB인가
수백만 개의 문서 벡터에서 "이 쿼리와 가장 유사한 상위 K개"를 밀리초 안에 찾아야 함. 일반 DB의 B-Tree 인덱스는 고차원 벡터 검색에 적합하지 않음.
2.2 ANN (Approximate Nearest Neighbor)
정확한 최근접 이웃 검색은 O(n)이라 느림. ANN은 약간의 정확도를 포기하고 속도를 얻음.
| 알고리즘 | 원리 | 특성 |
|---|---|---|
| HNSW | 계층적 그래프 탐색 | ✅ 가장 많이 사용. 빠르고 정확 |
| IVF | 벡터를 클러스터로 나누고, 관련 클러스터만 검색 | 대규모에 적합 |
| PQ | 벡터를 압축하여 메모리 절약 | IVF와 결합 |
2.3 주요 Vector DB 비교
| DB | 유형 | 특징 | 적합한 환경 |
|---|---|---|---|
| Chroma | 인메모리/로컬 | Python 네이티브, 간단, 개발용 | ✅ 프로토타입, 소규모 |
| Pinecone | 관리형 SaaS | 완전 관리, 빠른 시작, 유료 | 운영 부담 없이 사용 |
| Weaviate | 오픈소스 | 하이브리드 검색(벡터+키워드), GraphQL | 중규모, 하이브리드 |
| Milvus | 오픈소스 | 대규모 분산, GPU 가속 | 대규모 프로덕션 |
| Qdrant | 오픈소스 | Rust 기반, 빠름, 필터링 우수 | 중~대규모 |
| pgvector | PostgreSQL 확장 | 기존 PostgreSQL에 추가 | ✅ 이미 PG 사용 중이면 |
2.4 선택 기준
3. 임베딩 모델 선택
| 모델 | 차원 | 오픈소스 | 특징 |
|---|---|---|---|
| OpenAI text-embedding-3-small | 1536 | ❌ | 편리, 유료, 고성능 |
| OpenAI text-embedding-3-large | 3072 | ❌ | 최고 성능 |
| BGE-M3 | 1024 | ✅ | 다국어, 한국어 우수 |
| E5-mistral-7b | 4096 | ✅ | LLM 기반 임베딩 |
| GTE-Qwen2 | 가변 | ✅ | 최신 고성능 |
💡 한국어를 다룬다면 다국어 모델(BGE-M3, multilingual-e5)을 선택해야 함. 영어 전용 모델은 한국어 성능이 떨어짐.
4. 실전 파이프라인
이 파이프라인이 **RAG(#12)**의 인덱싱 + 검색 단계에 해당함.