[AI] 임베딩(Embedding) 모델과 벡터 검색 정리
RAG나 검색 기능을 만들다 보면 임베딩 모델, 검색 모델, 리랭커, Dense/Sparse, HNSW 같은 용어가 한꺼번에 쏟아진다.
각각이 어디에 속하는 개념인지 헷갈려서, 임베딩 모델과 벡터 검색 전체 흐름을 기준으로 한 번 정리했다.
개념
임베딩(Embedding) 은 텍스트나 이미지 같은 데이터를 고차원 숫자 배열(벡터)로 바꾸는 것이다.
의미가 비슷한 데이터는 벡터 공간에서 가까운 위치에 놓이기 때문에, 벡터 사이의 거리만 계산하면 “비슷한 것”을 찾을 수 있다.
여기서 자주 섞여 쓰이는 두 용어를 먼저 구분해 두면 편하다.
| 구분 | 역할 | 예시 |
|---|---|---|
| 임베딩 모델 (엔진) | 데이터를 벡터로 변환하는 알고리즘 | bge-m3, OpenAI text-embedding-3 |
| 검색 모델/시스템 (시스템) | 벡터를 DB에 저장하고, 질문과 비교해 가장 유사한 결과를 뽑아내는 전체 프로세스 | Retriever + Vector DB(Milvus 등) + Reranker |
즉 임베딩 모델은 검색 시스템을 구성하는 부품 중 하나다.
임베딩 모델의 종류
임베딩 모델은 다루는 데이터의 종류(모달리티)에 따라 나눌 수 있다.
텍스트 임베딩 (Unimodal)
- 모델: OpenAI
text-embedding-3-small, BAAIbge-m3,Qwen-Embedding,ColBERT - 역할: 문장의 의미, 문맥, 키워드 유사도를 분석해 텍스트 사이의 거리를 계산한다.
멀티모달 임베딩 (Cross-modal)
- 모델:
CLIP(OpenAI),SigLIP(Google),ImageBind(Meta),Visualized-BGE - 역할: 이미지와 텍스트를 같은 벡터 공간에 매핑한다. 덕분에 “글자로 이미지 찾기”, “이미지로 비슷한 문구 찾기”가 가능해진다.
검색 모델의 종류
검색 단계에서는 질문과 문서를 어떻게 비교하느냐에 따라 크게 두 방식으로 나뉜다.
Bi-Encoder (Dual Encoder)
질문과 문서를 각각 따로 벡터로 만든 뒤, 마지막에 두 벡터의 유사도 점수만 비교한다.
입력이 두 개 들어가기 때문에 듀얼 인코더라고도 부른다.
문서 벡터는 미리 계산해서 DB에 넣어둘 수 있으므로 빠르지만, 질문과 문서의 단어를 직접 대조하지 않아 상대적으로 덜 정확하다.
이 방식으로 동작하는 것이 검색 모델(Retriever) 이다. 질문을 벡터로 바꿔 Vector DB(Milvus 등)에서 유사한 문서를 찾아온다.
Cross-Encoder (Single Encoder)
질문과 문서를 하나의 입력으로 합쳐서 모델에 넣고, 모든 단어를 서로 대조한다.
입력이 하나이기 때문에 싱글 인코더라고도 부른다.
정확하지만 문서마다 질문과 함께 다시 계산해야 해서 매우 느리다.
이 방식으로 동작하는 것이 리랭커(Reranker) 다. Retriever가 찾아온 후보들의 순서를 다시(Re) 매기는(Rank) 역할을 한다.
목적에 따른 벡터 표현 방식
희소 벡터 (Sparse Vector)
- 대부분의 차원이 0이고, 주요 키워드에 해당하는 차원만 값을 가진다.
- 어떤 단어가 들어 있는지가 중요하므로 키워드 기반 검색에 적합하다.
- 지원 모델: BAAI
bge-m3
밀집 벡터 (Dense Vector)
- 모든 차원이 값을 가진다.
- 문장 전체의 의미를 압축하므로 문맥 파악에 적합하다.
- 지원 모델: BAAI
bge-m3,Qwen
Multi-Vector
- 문장 하나를 벡터 하나로 압축하지 않고, 문장을 구성하는 모든 토큰마다 각각의 벡터를 만든다.
- 단어 단위의 세밀한 비교가 가능하다.
- 지원 모델:
bge-m3,ColBERT
검색 전략
임베딩을 만들었다면 이를 검색 엔진에 저장하고 어떻게 찾을지 전략을 세워야 한다.
인덱싱 전략, 벡터 압축, 캐싱, 성능 튜닝 같은 최적화 기법이 여기에 들어간다.
인덱싱 전략
HNSW (Hierarchical Navigable Small World)
여러 계층의 그래프를 위에서부터 타고 내려가며 쿼리와 유사한 벡터를 탐색하는 구조다.
위 계층은 노드가 적어 큰 보폭으로 이동하고, 아래 계층으로 갈수록 노드가 많아져 세밀하게 찾는다.
IVF (Inverted File Index)
데이터를 클러스터링해 여러 구역으로 나눈 뒤, 쿼리와 가까운 구역 안에서만 유사한 벡터를 찾는 방식이다.
HNSW vs IVF
| 구분 | HNSW | IVF |
|---|---|---|
| 개요 | 계층적 그래프 구조 기반 유사도 검색 | 클러스터 기반으로 검색 범위를 줄이는 인덱싱 |
| 구조 | 여러 계층의 그래프로 구성 하위 레이어로 갈수록 데이터 수가 많아진다 |
데이터셋을 클러스터링해 여러 그룹으로 분할 |
| 검색 속도 | 매우 빠름 | 빠름. HNSW보다 약간 느릴 수 있다 |
| 검색 정확도 | 매우 높음. 최적의 경로를 잘 찾아낸다 | 보통~높음. 탐색할 구역 개수에 따라 달라진다 |
| 메모리 사용량 | 매우 높음. 그래프 연결 정보를 RAM에 들고 있어야 한다 | 낮음. 클러스터 중심점과 소속 정보만 저장한다 |
| 인덱싱 속도 | 느림. 데이터가 추가될 때마다 연결을 갱신해야 한다 | 빠름. 데이터를 군집에 할당하기만 하면 된다 |
Dense 임베딩의 한계와 보완
일반적인 Dense 임베딩은 문장 전체를 하나의 점(벡터) 으로 압축한다.
- 문제점: 문장이 길어질수록 세부 정보가 뭉개진다. 예를 들어 “철수가 사과를 먹었다”와 “사과가 철수를 먹었다”처럼 단어 구성이 같은 문장을 비슷하게 처리할 위험이 있다.
- 보완:
bge-m3는 문장 전체 벡터(Dense)뿐만 아니라 토큰별 벡터(Multi-Vector) 도 함께 만들어, 이런 정보 손실을 줄인다.
ColBERT 방식의 토큰 단위 비교
ColBERT는 토큰(단어) 단위로 세밀하게 비교하는 방식의 대표 모델이다.
질문의 단어 ‘사과’ 가 문서의 단어 ‘부사’, ‘청과’, ‘과일’ 중 어디와 가장 관련이 깊은지 단어 대 단어로 매칭하고, 각 질문 토큰의 최대 유사도를 더해 점수를 낸다(MaxSim).
bge-m3는 이 ColBERT 방식을 모델 안에 내장하고 있다.
설명 가능한 검색
기존 검색은 “이게 제일 비슷해”라는 결과만 돌려주는 블랙박스에 가까웠다.
토큰 단위로 비교하면 “질문의 A라는 단어가 문서의 B 부분과 강하게 연결돼서 이 결과가 나왔다” 는 근거를 단어 간 연결 강도(Heatmap)로 보여줄 수 있다.
“왜 이 문서가 1등이지?”라는 질문에 답할 수 있으니, 개발자 입장에서 검색 품질을 디버깅하기도 훨씬 수월해진다.
정리
- 임베딩 모델은 데이터를 벡터로 바꾸는 엔진이고, 검색 시스템은 그 벡터를 저장하고 비교하는 전체 파이프라인이다.
- 검색은 보통 Bi-Encoder로 빠르게 후보를 추리고, Cross-Encoder(Reranker)로 정밀하게 다시 정렬한다.
- 키워드가 중요하면 Sparse, 문맥이 중요하면 Dense, 세밀한 단어 비교와 설명력이 필요하면 Multi-Vector를 고려한다.
- 인덱스는 메모리가 넉넉하고 정확도가 중요하면 HNSW, 데이터가 크고 메모리를 아껴야 하면 IVF가 무난하다.
bge-m3처럼 Dense, Sparse, Multi-Vector를 한 모델에서 모두 지원하는 모델을 쓰면 하이브리드 검색을 구성하기 쉽다.
댓글남기기