주제: 6-2 Embedding Models (Contrastive Learning / SBERT / e5 / BGE)
RAG 성능은 생성 모델보다 retrieval 품질에서 먼저 갈리는 경우가 많다. 그리고 retrieval 품질은 결국 embedding model이 질문과 문서를 얼마나 잘 같은 공간에 배치하느냐에 크게 좌우된다.
문제 설정
RAG 시스템에서는 질문과 문서를 벡터 공간으로 변환하여 유사도를 계산합니다.
embedding 함수:
기호 의미
- x : 텍스트
- e : embedding vector
- f : embedding model
목표는 의미적으로 유사한 문장이 벡터 공간에서 가까워지도록 만드는 것입니다.
대표적인 학습 방식이 contrastive learning입니다.
즉 embedding model은 단순 인코더가 아니라 의미 공간 설계자라고 볼 수 있다. SBERT, e5, BGE 같은 모델 차이도 결국 어떤 데이터와 어떤 contrastive objective로 그 공간을 만들었는지에서 나온다.
1. Contrastive Learning
contrastive learning은 긍정 쌍과 부정 쌍을 사용하여 embedding을 학습합니다.
Positive pair:
(query, relevant document)
Negative pair:
(query, irrelevant document)
이 단계의 핵심은 단순히 loss를 줄이는 것이 아니라, 검색에 쓰기 좋은 의미 공간을 만드는 것입니다. 즉 관련 있는 query-document 쌍은 가깝게, 무관한 쌍은 멀어지도록 벡터 공간 자체를 훈련합니다.
대표적인 loss:
기호 의미
- q : query embedding
- d+ : positive document
- d_i : negative documents
- τ : temperature
왜 필요한가
관련 문서는 가까워지고 비관련 문서는 멀어지도록 학습합니다.
그래서 contrastive learning은 retrieval의 첫 단계라고 볼 수 있습니다. 여기서 공간이 잘못 만들어지면 뒤에서 아무리 좋은 검색 엔진을 써도 가까운 문서 후보 자체가 어긋날 수 있습니다.
주의점
negative sample 품질이 중요합니다.
2. Similarity 계산
embedding 기반 검색에서는 cosine similarity를 사용합니다.
기호 의미
- q · d : 내적
- ||q|| : 벡터 노름
왜 필요한가
벡터 방향 기반 의미 유사도를 측정합니다.
즉 contrastive learning이 "벡터를 잘 만드는 단계"라면, similarity 계산은 "그 벡터들 중 누가 더 가까운지 읽는 규칙"입니다. 학습 단계와 검색 단계가 여기서 이어집니다.
2.5 Contrastive Learning에서 FAISS까지 전체 흐름
1) query-document pair 준비
2) contrastive learning으로 embedding model 학습
3) 문서 전체를 embedding vector로 변환
4) 문서 vector를 FAISS index에 저장
5) 사용자 query를 embedding으로 변환
6) cosine / inner product 기준 최근접 문서 검색
7) top-k 문서를 reranker 또는 generator로 전달
초심자가 가장 자주 헷갈리는 지점은 contrastive learning과 FAISS를 같은 계층의 기술로 보는 것입니다. 하지만 둘의 역할은 분명히 다릅니다.
- contrastive learning: 좋은 임베딩 공간을 학습하는 단계
- FAISS: 이미 만들어진 임베딩 공간에서 최근접 이웃을 빠르게 찾는 검색 엔진
즉 contrastive learning은 "벡터를 잘 만들기", FAISS는 "그 벡터를 빨리 찾기"에 가깝습니다. 둘은 연결되지만 서로 대체할 수는 없습니다.
3. SBERT
SBERT (Sentence-BERT)는 문장 embedding을 위한 모델입니다.
기존 BERT 문제:
- 문장 비교 시 cross-encoder 필요
- 검색에 매우 느림
SBERT 구조:
sentence1 → BERT → embedding1
sentence2 → BERT → embedding2
유사도:
왜 중요한가
문장 embedding을 빠르게 계산할 수 있습니다.
주의점
대규모 retrieval에서는 성능이 제한될 수 있습니다.
4. e5 Embedding
e5 모델은 retrieval 특화 embedding 모델입니다.
특징:
- instruction 기반 embedding
- query/document 구분
예:
query: "query: What is RAG?"
document: "passage: Retrieval Augmented Generation..."
학습 목표:
왜 중요한가
검색 성능을 크게 개선합니다.
5. BGE Embedding
BGE (BAAI General Embedding)은 retrieval 성능이 높은 embedding 모델입니다.
특징:
- contrastive training
- hard negative mining
- large dataset
loss:
왜 중요한가
RAG 시스템에서 높은 검색 성능을 제공합니다.
6. Bi-Encoder 구조
대부분 embedding 모델은 bi-encoder 구조를 사용합니다.
Query encoder
Document encoder
embedding:
왜 필요한가
query와 document embedding을 독립적으로 계산할 수 있습니다.
7. Bi-Encoder vs Cross-Encoder
| 모델 | 특징 |
|---|---|
| Bi-Encoder | 빠른 retrieval |
| Cross-Encoder | 높은 정확도 |
8. Embedding 모델 비교
| 모델 | 특징 |
|---|---|
| SBERT | 문장 embedding 초기 모델 |
| e5 | instruction 기반 retrieval |
| BGE | 강력한 검색 성능 |
코드-수식 연결
| 개념 | 코드 | 설명 |
|---|---|---|
| embedding | model.encode(text) |
문장 embedding 생성 |
| cosine similarity | sklearn.metrics.pairwise.cosine_similarity |
벡터 유사도 계산 |
| vector search | faiss.search() |
유사 문서 검색 |
여기서도 역할 분리가 분명합니다. model.encode()는 contrastive objective로 학습된 표현 함수를 호출하는 것이고, faiss.search()는 그 결과 벡터를 대상으로 빠른 검색을 수행하는 단계입니다.
자주 하는 오해 5개
- embedding은 항상 의미를 완벽하게 표현한다고 생각한다
- cosine similarity가 항상 최적이라고 생각한다
- SBERT와 BGE는 같은 구조라고 생각한다
- retrieval은 cross-encoder만 사용한다고 생각한다
- embedding 모델은 task와 무관하다고 생각한다
체크리스트 (스스로 설명 가능해야 하는 질문)
- contrastive learning은 어떤 방식으로 embedding을 학습하는가?
- SBERT는 기존 BERT와 무엇이 다른가?
- e5 embedding은 왜 query/passages prefix를 사용하는가?
- BGE embedding의 성능이 높은 이유는 무엇인가?
- bi-encoder와 cross-encoder의 차이는 무엇인가?