벡터 데이터베이스와 임베딩 입문: 의미 검색은 어떻게 동작하나
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로 공부·글쓰기 잘하기 — 복붙용 프롬프트 레시피 모음
AI로 공부와 글쓰기 효율을 높이고 싶은 학생·직장인을 위한 상황별 프롬프트 레시피 모음입니다. 요약·암기·문제풀이·교정·구조잡기 템플릿을 복사해 바로 쓰세요.
AI 환각(할루시네이션)이란 — 왜 그럴듯한 거짓말을 하나, 줄이는 법
AI 환각은 모델이 사실이 아닌 내용을 자신 있게 말하는 현상이다. 원인과 위험 사례, 그리고 출처 요구·검증·RAG 등 실전 감소법을 정리했다.
멀티모달 AI란 무엇인가 — 텍스트·이미지·음성을 한 번에 이해하는 AI
멀티모달 AI는 텍스트뿐 아니라 사진, 음성, 문서를 동시에 이해하는 AI입니다. 개념부터 사진 분석·문서 이해·음성 대화 사례, 실전 활용 아이디어와 분명한 한계까지 정리했습니다.