벡터 데이터베이스와 임베딩 입문: 의미 검색은 어떻게 동작하나
RAG, 추천 시스템, 의미 검색의 바탕에는 모두 임베딩과 벡터 데이터베이스가 있습니다. 키워드가 정확히 일치하지 않아도 '의미가 비슷한' 결과를 찾아내는 마법의 정체를 입문자 눈높이로 풀어봅니다.
임베딩이란 무엇인가
임베딩(embedding)은 텍스트·이미지 같은 데이터를 숫자 벡터로 바꾼 것입니다. 핵심은 의미가 비슷한 것끼리 벡터 공간에서 가까이 놓인다는 점입니다.
예를 들어 '강아지'와 '반려견'은 글자는 다르지만 벡터 거리가 가깝고, '강아지'와 '주식'은 멀리 떨어집니다. 덕분에 단어가 정확히 일치하지 않아도 의미로 검색할 수 있습니다.
from openai import OpenAI
client = OpenAI()
r = client.embeddings.create(
model="text-embedding-3-small",
input=["강아지", "반려견", "주식 투자"],
)
vecs = [d.embedding for d in r.data]
print(len(vecs[0])) # 예: 1536차원 벡터
유사도는 어떻게 재나
두 벡터가 얼마나 비슷한지는 보통 코사인 유사도로 잽니다. 두 벡터가 이루는 각도가 작을수록(방향이 비슷할수록) 1에 가깝습니다.
import numpy as np
def cosine(a, b):
a, b = np.array(a), np.array(b)
return a @ b / (np.linalg.norm(a) * np.linalg.norm(b))
print(cosine(vecs[0], vecs[1])) # 강아지-반려견: 높음
print(cosine(vecs[0], vecs[2])) # 강아지-주식: 낮음
벡터 데이터베이스가 필요한 이유
벡터가 수백만 개라면 매번 전체를 비교하는 건 너무 느립니다. 벡터 DB는 ANN(근사 최근접 이웃) 알고리즘으로 '충분히 가까운' 결과를 빠르게 찾아줍니다.
- 저장: 벡터와 원본 메타데이터를 함께 보관
- 인덱싱: HNSW 같은 구조로 검색 속도 최적화
- 검색: 질의 벡터와 가까운 top-k를 밀리초 단위로 반환
주요 벡터 DB 비교
| 제품 | 형태 | 특징 |
|---|---|---|
| pgvector | PostgreSQL 확장 | 기존 DB에 그대로 추가 |
| Chroma | 오픈소스 | 가볍고 프로토타입에 적합 |
| FAISS | 라이브러리 | 로컬·고성능, 직접 운영 |
| Pinecone | 매니지드 | 운영 부담 적은 클라우드 |
이미 PostgreSQL을 쓴다면 pgvector로 시작하는 게 가장 부담이 적습니다. 빠른 실험은 Chroma, 대규모 운영은 매니지드 서비스를 고려하세요.
마무리 체크리스트
- 검색 대상 데이터를 임베딩 벡터로 변환했는가
- 같은 임베딩 모델로 질의와 문서를 인코딩했는가 (모델 혼용 금지)
- 유사도 척도(보통 코사인)를 일관되게 적용했는가
- 데이터 규모에 맞는 벡터 DB를 골랐는가
임베딩과 벡터 DB는 현대 AI 검색의 기초 체력입니다. 작은 데이터셋으로 코사인 유사도부터 직접 찍어보면 원리가 한눈에 들어옵니다.
함께 보면 좋은 글
벡터 데이터베이스란? 임베딩 검색의 핵심 이해하기
AI 검색의 심장인 벡터 DB. 임베딩이 무엇이고 유사도 검색이 어떻게 동작하는지, 일반 DB와의 차이와 대표 도구를 정리합니다.
RAG 파이프라인 직접 이해하기: 검색증강생성의 모든 것
LLM의 환각과 최신성 한계를 보완하는 RAG. 문서 분할·임베딩·벡터검색·프롬프트 주입의 흐름을 단계별로 풀어 설명합니다.
프롬프트 엔지니어링 실전 기법 7가지
같은 모델도 프롬프트에 따라 결과가 천차만별입니다. 역할 지정·예시 제공·단계적 사고 등 결과 품질을 끌어올리는 검증된 기법을 정리합니다.