텍스트 임베딩 (Text Embedding)
텍스트 임베딩은 텍스트를 고차원 부동소수점 벡터로 변환하는 기술이다. 의미적으로 유사한 텍스트는 벡터 공간에서 가까운 위치에 놓이도록 학습된다. RAG 파이프라인의 핵심 구성 요소다.
개념
임베딩은 텍스트의 의미(semantics)를 수치 벡터로 표현한다. 동일한 의미를 다른 표현으로 나타내더라도 유사한 벡터를 생성한다.
"강아지가 뛰어논다" → [0.23, -0.41, 0.87, ...]
"개가 달린다" → [0.21, -0.39, 0.85, ...] (유사도 높음)
"주식 시장 폭락" → [-0.62, 0.33, -0.21, ...] (유사도 낮음)
Passage 임베딩 vs Query 임베딩
비대칭 임베딩 모델은 저장(passage)과 검색(query) 용도를 구분하여 다르게 처리한다. 이를 혼용하면 검색 품질이 저하된다.
Passage 임베딩
문서나 청크를 저장할 때 사용한다. 내용이 풍부하고 길이가 길 수 있다.
passage = "BGE M3 임베딩은 다국어를 지원하는 ..."
embedding = model.encode("passage: " + passage)Query 임베딩
검색 쿼리를 임베딩할 때 사용한다. 짧고 질문 형태인 경우가 많다.
query = "BGE M3 모델은 무엇인가요?"
embedding = model.encode("query: " + query)비대칭 임베딩을 쓰는 이유
질문과 답변은 표현 방식이 다르다. "파이썬 리스트 정렬하는 법"과 "Python list.sort() 메서드는 리스트를 제자리(in-place)에서 정렬한다"는 의미적으로 연결되지만 표현이 다르다. 비대칭 임베딩은 이 격차를 줄이도록 학습된다.
주요 임베딩 모델 비교
OpenAI text-embedding-3-small / large
OpenAI의 상업용 임베딩 API다.
| 항목 | small | large |
|---|---|---|
| 차원 | 1536 | 3072 |
| 비용 | 낮음 | 중간 |
| 성능 | 범용 우수 | 최고 수준 |
BGE-M3 (BAAI)
오픈소스 다국어 임베딩 모델로, 한국어를 포함한 100+ 언어를 지원한다.
- 차원: 1024
- 특징: Dense + Sparse + ColBERT 세 가지 검색 방식 동시 지원
- 한국어 성능: 우수
- 활용: 자체 호스팅 RAG 파이프라인, 비용 절감
Sentence-Transformers (SBERT)
다양한 사전 학습 모델을 제공하는 오픈소스 라이브러리다.
all-MiniLM-L6-v2: 경량, 영어에 최적화paraphrase-multilingual-mpnet-base-v2: 다국어 지원
KoSimCSE / KoE5
한국어 특화 임베딩 모델로, 한국어 전용 서비스에 적합하다.
임베딩 품질 평가
| 지표 | 설명 |
|---|---|
| 코사인 유사도 | -1 ~ 1 범위, 1에 가까울수록 유사 |
| MRR(Mean Reciprocal Rank) | 첫 번째 관련 문서의 순위 역수 평균 |
| Recall@K | 상위 K개 중 관련 문서 포함 비율 |
실무 고려사항
- 차원 수: 차원이 높을수록 표현력 증가, 저장 비용·검색 시간도 증가
- 컨텍스트 길이: 모델마다 처리 가능한 최대 토큰 수 제한
- 한국어 지원: 다국어 모델이라도 한국어 성능은 개별 확인 필요
RAG 파이프라인에서의 역할
- 인덱싱: 문서 청크 → Passage 임베딩 → 벡터 DB 저장
- 검색: 쿼리 → Query 임베딩 → 벡터 DB 유사도 검색 → 관련 청크 반환
- 품질 영향: 임베딩 모델 선택이 검색 품질에 직접적 영향