Embedding과 벡터 검색
서문
컴퓨터는 어떻게 "고양이와 개는 비슷하지만, 자동차와는 다르다"는 것을 이해할까요? 인간에게는 상식이지만, 컴퓨터에게 "고양이", "개", "자동차"는 아무 관련 없는 세 개의 문자열일 뿐입니다. Embedding(임베딩) 기술은 이 문제를 해결하는 핵심입니다——문자를 숫자 벡터로 변환하여 컴퓨터도 의미적 "거리 관계"를 이해할 수 있게 합니다.
이 글에서 무엇을 배울 수 있나요?
이 장을 마치면 다음을 얻을 수 있습니다:
- 직관적 이해: Embedding이 무엇인지, 왜 "고양이"와 "개"의 벡터가 가까워지는지 이해
- 유사도 계산: 코사인 유사도, 유클리드 거리 등 핵심 측정 방법 파악
- 인덱스 원리: 벡터 데이터베이스가 어떻게 백만 건 데이터에서 밀리초 단위로 검색하는지 이해
- 기술 선택: 주요 벡터 데이터베이스의 특징과 적용 시나리오 파악
- 엔드투엔드 흐름: 텍스트에서 벡터, 검색까지의 완전한 파이프라인 파악
| 장 | 내용 | 핵심 개념 |
|---|---|---|
| 제1장 | Embedding 개념 | 의미 공간, 벡터 표현 |
| 제2장 | 유사도 계산 | 코사인 유사도, 유클리드 거리 |
| 제3장 | 벡터 인덱스 | 완전 탐색 vs ANN |
| 제4장 | 벡터 데이터베이스 | Pinecone, Milvus, Chroma |
| 제5장 | 엔드투엔드 파이프라인 | 텍스트→벡터→저장→쿼리 |
0. 전체 그림: 문자에서 숫자로의 다리
자연어 처리 세계에는 근본적인 도전이 있습니다: 컴퓨터는 숫자만 인식하고 문자는 인식하지 못합니다.
초기에는 각 단어에 번호를 할당했습니다(One-Hot 인코딩), 예를 들어 "고양이"=001, "개"=010, "자동차"=100. 하지만 이 방식에는 치명적인 문제가 있습니다: 모든 단어 간 거리가 똑같이 멀다는 것입니다. "고양이"에서 "개"까지의 거리와 "고양이"에서 "자동차"까지의 거리가 완전히 동일합니다——이는 분명히 우리의 직관과 맞지 않습니다.
Embedding의 혁명성은: 각 단어를 밀집된 저차원 벡터 공간에 매핑하여, 의미적으로 가까운 단어가 자연스럽게 모이도록 합니다. 이 공간에서 "고양이"와 "개"는 매우 가깝고, "자동차"는 멀리 떨어져 있습니다——컴퓨터가 마침내 의미를 "이해"할 수 있게 된 것입니다.
One-Hot에서 Embedding으로의 도약
- One-Hot: 차원 = 어휘 크기(수만 차원 가능), 각 벡터는 하나의 1만 있고 나머지는 모두 0, 희소하고 의미 없음
- Embedding: 차원은 보통 768~1536, 각 숫자는 모두 의미가 있음, 밀집되고 풍부한 의미 정보 포함
- 핵심 돌파구: Word2Vec(2013)이 "단어의 의미는 문맥으로 정의할 수 있다"는 것을 증명하며 Embedding 시대를 열었음
1. Embedding 개념: 문자를 좌표로 변환하기
Embedding의 핵심 아이디어는 한 문장으로 요약할 수 있습니다: 일련의 숫자(벡터)로 단어나 문장의 의미를 표현하는 것.
2차원 좌표계를 상상해 보세요. "고양이"를 좌표 (0.2, 0.7)에, "개"를 (0.3, 0.6)에, "자동차"를 (0.9, 0.1)에 배치합니다. "고양이"와 "개"의 좌표가 매우 가깝고 "자동차"는 멀리 떨어져 있음을 알 수 있습니다. 이것이 Embedding의 직관입니다——의미적 유사도가 공간적 거리로 변환됩니다.
Word Embedding Space Visualization
Semantically similar words stay closer in vector space and form natural clusters
💡 Embedding models map text into high-dimensional vector spaces, often 768 to 1536 dimensions. This demo simplifies that into 2D to show the core idea: semantically similar words have shorter vector distances。
Embedding의 세 가지 핵심 특성
- 의미적 클러스터링: 유사한 의미의 단어가 자동으로 모임(동물 클러스터, 음식 클러스터, 기술 클러스터)
- 유추 관계: 벡터 연산으로 의미 관계 표현 가능, 고전적 예: king - man + woman ≈ queen
- 차원의 의미: 각 차원은 암묵적으로 특정 의미 특징을 인코딩("동물 여부", "크기", "감정 성향" 등)
| 인코딩 방식 | 차원 | 의미 정보 | 대표적 응용 |
|---|---|---|---|
| One-Hot | 어휘 크기(~50000) | 없음 | 전통 NLP |
| Word2Vec | 100~300 | 단어 수준 의미 | 단어 유사도, 유추 추론 |
| BERT Embedding | 768 | 문맥 의미 | 문장 이해, Q&A |
| OpenAI text-embedding-3 | 1536~3072 | 심층 의미 | RAG, 의미적 검색 |
2. 유사도 계산: 벡터 간 "가까움" 측정하기
벡터 표현이 있으면 다음 질문은 자연스럽게: 두 벡터가 얼마나 유사한지 어떻게 측정할까? 이는 지도에서 두 도시가 얼마나 가까운지 측정하는 것과 같습니다——직선 거리를 측정할 수도 있고, 방향이 일치하는지 볼 수도 있습니다.
Vector Similarity Calculator
Drag vector endpoints to observe similarity metrics in real time
💡Cosine similarityfocuses only on direction and is useful for semantic text comparison; Euclidean distanceconsiders both direction and magnitude and fits absolute-distance scenarios.
두 가지 핵심 측정 방법
- 코사인 유사도(Cosine Similarity): 두 벡터의 방향이 일치하는지 측정, 값 범위 [-1, 1]. 1은 방향이 완전히 동일, 0은 직교(무관), -1은 완전 반대. 벡터 길이에 영향을 받지 않아 텍스트 의미 비교의 첫 번째 선택지.
- 유클리드 거리(Euclidean Distance): 두 벡터 끝점 간의 직선 거리 측정, 값 범위 [0, ∞). 0은 완전히 일치, 값이 클수록 덜 유사. "절대 크기"를 고려해야 하는 시나리오에 적합.
| 측정 방식 | 공식 직관 | 값 범위 | 적용 시나리오 |
|---|---|---|---|
| 코사인 유사도 | 방향을 보고, 길이는 무시 | [-1, 1] | 텍스트 의미 검색, 추천 시스템 |
| 유클리드 거리 | 끝점 직선 거리 | [0, ∞) | 이미지 특징, 클러스터링 분석 |
| 내적 | 방향 × 길이 | (-∞, +∞) | 정규화 벡터의 빠른 계산 |
| 맨해튼 거리 | 좌표축을 따라 이동한 거리 | [0, ∞) | 고차원 희소 벡터 |
3. 벡터 인덱스: 백만 벡터에서 밀리초 검색 방법?
100만 개의 문서가 있고 각각 1536차원 벡터로 변환되었다고 가정해 보세요. 사용자가 질문을 하면 가장 유사한 10개를 찾아야 합니다. 가장 직접적인 방법은 하나씩 유사도를 계산하는 것입니다——하지만 이는 100만 번의 1536차원 벡터 연산을 의미하며, 너무 느립니다.
이것이 벡터 인덱스가 해결하려는 문제입니다: 공간으로 시간을 교환하여, 전처리로 인덱스 구조를 구축해 검색 속도를 O(n)에서 근사 O(log n)으로 낮추는 것.
Vector Index Strategy Comparison
Compare brute-force search with approximate nearest neighbor search
| Strategy | Time complexity | Accuracy | Use case |
|---|---|---|---|
| Brute force | O(n) | 100% | Small datasets (<10K) |
| ANN (IVF) | O(n/k) | ~95% | Large datasets (>100K) |
| HNSW | O(log n) | ~98% | High-performance retrieval |
완전 탐색 vs 근사 최근접 이웃(ANN)
- 완전 탐색(Flat): 하나씩 비교, 100% 정확하지만 속도 느림. 데이터 양이 적을 때(< 10만) 적합.
- IVF(역파일 인덱스): 먼저 벡터 공간을 여러 영역으로 분할(클러스터링), 쿼리 시 가장 가까운 몇 개 영역만 검색. 도서관을 주제별로 나누어 책을 찾을 때 관련 구역만 가는 것과 같음.
- HNSW(계층적 탐색 가능 소세계 그래프): 다층 그래프 구조 구축, 거친 단위에서 세밀한 단위로 계층적 탐색. 세계 지도로 국가를 찾고, 성 단위 지도로, 마지막으로 거리 지도로 보는 것과 같음.
- PQ(곱셈 양자화): 고차원 벡터를 짧은 코드로 압축, 약간의 정확도를 희생하여 대폭적인 메모리 절약. 초대규모 데이터셋에 적합.
| 인덱스 유형 | 구축 속도 | 쿼리 속도 | 재현율 | 메모리 사용량 | 적용 규모 |
|---|---|---|---|---|---|
| Flat(완전 탐색) | 구축 불필요 | 느림 | 100% | 높음 | < 10만 |
| IVF | 중간 | 빠름 | 95%+ | 중간 | 10만~1000만 |
| HNSW | 느림 | 매우 빠름 | 99%+ | 높음 | 10만~1000만 |
| PQ | 중간 | 빠름 | 90%+ | 매우 낮음 | > 1000만 |
| IVF-PQ | 중간 | 빠름 | 92%+ | 낮음 | > 1억 |
4. 벡터 데이터베이스: 벡터를 위해 태어난 스토리지 엔진
벡터와 인덱스 알고리즘이 있으면 저장하고 관리할 장소가 필요합니다. 전통적 데이터베이스(MySQL, PostgreSQL)는 구조화된 데이터 처리에 능하지만, 고차원 벡터의 유사도 검색에는 역부족입니다. 벡터 데이터베이스는 바로 이 시나리오를 위해 특별히 설계되었습니다.
Mainstream Vector Database Comparison
Click a card to see details and compare use cases across vector databases
Scenario recommendations
벡터 데이터베이스의 핵심 능력
- 효율적 저장: 고차원 부동소수점 벡터에 최적화된 저장 형식
- ANN 검색: 여러 근사 최근접 이웃 인덱스 알고리즘 내장(HNSW, IVF 등)
- 메타데이터 필터링: 벡터 검색과 동시에 태그, 시간 등 조건으로 필터링 지원
- 실시간 업데이트: 벡터 동적 추가/삭제/수정 지원, 전체 인덱스 재구축 불필요
- 수평 확장: 분산 아키텍처로 억 단위 벡터 규모 지원
| 데이터베이스 | 유형 | 특징 | 적용 시나리오 |
|---|---|---|---|
| Pinecone | 완전 관리형 클라우드 | 제로 운영, 즉시 사용 가능 | 빠른 프로토타입, 중소규모 프로덕션 |
| Milvus | 오픈소스 분산 | 고성능, 확장 가능 | 대규모 프로덕션 환경 |
| Chroma | 오픈소스 경량 | 임베디드, 간결한 API | 로컬 개발, 소규모 프로젝트 |
| Weaviate | 오픈소스 클라우드 네이티브 | 내장 벡터화, GraphQL | 자동 벡터화가 필요한 시나리오 |
| Qdrant | 오픈소스 고성능 | Rust 구현, 강력한 필터링 | 복잡한 필터링이 필요한 시나리오 |
| pgvector | PG 확장 | 기존 PG 인프라 재사용 | 이미 PostgreSQL 사용 중인 팀 |
5. 엔드투엔드 파이프라인: 텍스트에서 검색까지의 완전한 흐름
각 컴포넌트를 이해했으니, 이들을 연결하여 완전한 벡터 검색 시스템이 어떻게 작동하는지 살펴보겠습니다.
전체 흐름은 두 갈래로 나뉩니다: 오프라인 쓰기(문서를 벡터로 변환하여 저장)와 온라인 쿼리(질문을 벡터로 변환하여 검색).
Embedding Generation Pipeline
Step through the full conversion from text to vector
오프라인 쓰기 흐름
- 문서 로딩: 다양한 출처(PDF, 웹페이지, 데이터베이스)에서 원본 텍스트 읽기
- 텍스트 전처리: 정제, 노이즈 제거, 표준화(HTML 태그, 특수 문자 제거 등)
- 텍스트 청크 분할: 전략에 따라 긴 텍스트를 적절한 크기로 분할(200~500 토큰)
- 벡터화: 임베딩 모델(OpenAI text-embedding-3-small 등)을 호출하여 각 청크를 벡터로 변환
- 벡터 데이터베이스에 저장: 벡터와 원본 텍스트, 메타데이터를 함께 데이터베이스에 쓰기
온라인 쿼리 흐름
- 쿼리 수신: 사용자가 자연어 질문 입력
- 쿼리 벡터화: 동일한 임베딩 모델로 질문을 벡터로 변환
- 유사도 검색: 벡터 데이터베이스에서 Top-K 가장 유사한 문서 청크 검색
- 후처리: 재정렬, 중복 제거, 메타데이터 필터링
- 결과 반환: 가장 관련성 높은 문서 청크를 호출자에게 반환(또는 LLM에 전달하여 답변 생성)
| 단계 | 핵심 선택 | 추천 방안 |
|---|---|---|
| 임베딩 모델 | 정확도 vs 비용 vs 속도 | OpenAI text-embedding-3-small(가성비 우수) |
| 청크 전략 | 세분성 vs 의미적 완전성 | 재귀적 청크, 200~500 토큰 |
| 벡터 데이터베이스 | 규모 vs 운영 비용 | 소규모 프로젝트는 Chroma, 프로덕션은 Pinecone/Milvus |
| 유사도 측정 | 의미 vs 정확도 | 코사인 유사도(텍스트 시나리오 첫 선택) |
| Top-K 값 | 재현율 vs 노이즈 | 먼저 20개 검색, 재정렬 후 Top 5 추출 |
요약
Embedding과 벡터 검색은 "인간의 언어"와 "기계의 이해"를 연결하는 다리이며, RAG, 의미적 검색, 추천 시스템 등 AI 애플리케이션의 기반 인프라입니다.
이 장의 핵심 포인트를 되돌아보면:
- Embedding의 본질: 텍스트를 고차원 벡터 공간에 매핑하여 의미적 유사도를 공간적 거리로 변환
- 유사도 측정: 코사인 유사도는 방향에 주목(텍스트에 적합), 유클리드 거리는 절대 거리에 주목
- 인덱스가 성능의 핵심: HNSW와 IVF로 백만 단위 벡터 검색을 밀리초 수준으로 단축
- 벡터 데이터베이스 선택: 소규모 프로젝트는 Chroma/pgvector, 프로덕션 환경은 Pinecone/Milvus
- 엔드투엔드 사고: 문서 로딩부터 최종 검색까지, 각 단계의 선택이 최종 결과에 영향
더 읽어보기
- OpenAI Embeddings 문서 - 공식 임베딩 모델 사용 가이드
- Pinecone Learning Center - 벡터 데이터베이스와 검색의 체계적 튜토리얼
- FAISS Wiki - Facebook 오픈소스 벡터 검색 라이브러리 문서
- Word2Vec 원본 논문 - Embedding 시대의 개척작
- MTEB 리더보드 - 임베딩 모델 성능 비교 리더보드