주제: 6-2 Embedding Models (Contrastive Learning / SBERT / e5 / BGE)

분류: rag_agent

타입: concept

난이도: 중급

선수지식: 있음 — Transformer, Cosine Similarity, Vector Search

좋은 embedding model의 핵심은 "뜻이 비슷한 문장은 가까이, 관련 없는 문장은 멀리" 오도록 벡터 공간을 학습하는 것이다.

RAG 성능은 생성 모델보다 retrieval 품질에서 먼저 갈리는 경우가 많다. 그리고 retrieval 품질은 결국 embedding model이 질문과 문서를 얼마나 잘 같은 공간에 배치하느냐에 크게 좌우된다.

문제 설정

RAG 시스템에서는 질문과 문서를 벡터 공간으로 변환하여 유사도를 계산합니다.

embedding 함수:

e=f(x)

기호 의미

목표는 의미적으로 유사한 문장이 벡터 공간에서 가까워지도록 만드는 것입니다.

대표적인 학습 방식이 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:

L=logexp(sim(q,d+)/τ)/Σexp(sim(q,di)/τ)

기호 의미

왜 필요한가

관련 문서는 가까워지고 비관련 문서는 멀어지도록 학습합니다.

그래서 contrastive learning은 retrieval의 첫 단계라고 볼 수 있습니다. 여기서 공간이 잘못 만들어지면 뒤에서 아무리 좋은 검색 엔진을 써도 가까운 문서 후보 자체가 어긋날 수 있습니다.

주의점

negative sample 품질이 중요합니다.

2. Similarity 계산

embedding 기반 검색에서는 cosine similarity를 사용합니다.

sim(q,d)=(q·d)/(||q||||d||)

기호 의미

왜 필요한가

벡터 방향 기반 의미 유사도를 측정합니다.

즉 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 learningFAISS를 같은 계층의 기술로 보는 것입니다. 하지만 둘의 역할은 분명히 다릅니다.

즉 contrastive learning은 "벡터를 잘 만들기", FAISS는 "그 벡터를 빨리 찾기"에 가깝습니다. 둘은 연결되지만 서로 대체할 수는 없습니다.

3. SBERT

SBERT (Sentence-BERT)는 문장 embedding을 위한 모델입니다.

기존 BERT 문제:

SBERT 구조:

sentence1 → BERT → embedding1
sentence2 → BERT → embedding2

유사도:

sim(e1,e2)

왜 중요한가

문장 embedding을 빠르게 계산할 수 있습니다.

주의점

대규모 retrieval에서는 성능이 제한될 수 있습니다.

4. e5 Embedding

e5 모델은 retrieval 특화 embedding 모델입니다.

특징:

예:

query: "query: What is RAG?"
document: "passage: Retrieval Augmented Generation..."

학습 목표:

maximizesim(query,positivedoc)

왜 중요한가

검색 성능을 크게 개선합니다.

5. BGE Embedding

BGE (BAAI General Embedding)은 retrieval 성능이 높은 embedding 모델입니다.

특징:

loss:

L=logexp(sim(q,d+)/τ)/Σexp(sim(q,di)/τ)

왜 중요한가

RAG 시스템에서 높은 검색 성능을 제공합니다.

6. Bi-Encoder 구조

대부분 embedding 모델은 bi-encoder 구조를 사용합니다.

Query encoder
Document encoder

embedding:

q=fq(query)
d=fd(document)

왜 필요한가

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개

체크리스트 (스스로 설명 가능해야 하는 질문)