Python

[Python] 벡터 DB로 문장 검색하기 (Faiss 활용)

teamnova 2025. 9. 29. 23:08
728x90

안녕하세요
오늘은 요즘 AI 서비스에서 빠질 수 없는 두 가지 개념인 임베딩 데이터와 벡터 DB를 소개하고,
간단한 실습 예제로 직접 검색기를 만들어보겠습니다.

 

임베딩 데이터란?

임베딩(Embedding)은 텍스트, 이미지, 오디오 같은 데이터를 숫자 벡터로 바꾸는 과정입니다.
예를 들어,

  • "강아지" → [0.12, -0.98, 0.55, ...]
  • "고양이" → [0.10, -0.95, 0.57, ...]

이렇게 표현되면, 의미적으로 비슷한 데이터일수록 벡터 공간에서 가까운 위치에 있게 됩니다.
따라서, 문장 유사도 계산, 검색, 추천 등에 매우 유용합니다.

 

벡터 DB란?

벡터 DB(Vector Database)는 이렇게 만들어진 임베딩 데이터를 저장하고,
특정 쿼리와 가장 유사한 벡터를 빠르게 찾아주는 데이터베이스입니다.

일반 DB가 “정확히 같은 값”을 찾는 데 강하다면,
벡터 DB는 “의미적으로 가까운 값”을 찾는 데 특화되어 있습니다.

대표적인 구현체로는 FAISS(Facebook AI), Weaviate, Milvus, Postgres(pgvector) 등이 있습니다. 

 

 

 

1. 실행 환경 준비 

 

파이썬 버전

  • Python 3.8 이상 권장 (3.12까지 잘 동작 확인됨)
  • 필수 패키지 설치 
pip install sentence-transformers faiss-cpu numpy

 

  • sentence-transformers → 사전학습 임베딩 모델 로드용
  • faiss-cpu → 벡터 검색 엔진 (CPU 버전) 

 

 

2. 파이썬 예제 코드  - 벡터 DB로 문서 검색하기 (Faiss) 

from sentence_transformers import SentenceTransformer
import faiss
import numpy as np

# 1. 임베딩 모델 로드
model = SentenceTransformer("all-MiniLM-L6-v2")

# 2. 문서 저장소
documents = [
    "파이썬은 데이터 분석에 자주 쓰인다.",
    "자바는 객체지향 프로그래밍 언어이다.",
    "RAG는 검색과 생성을 결합한 인공지능 기법이다.",
    "벡터 데이터베이스는 유사한 정보를 빠르게 찾는 데 유용하다."
]

# 3. 문서를 임베딩(벡터화)
embeddings = model.encode(documents)

# 4. 벡터 DB(Faiss) 인덱스 생성
dimension = embeddings.shape[1]
index = faiss.IndexFlatL2(dimension)
index.add(np.array(embeddings))

# 5. 사용자 질문
query = "RAG가 뭐야?"
query_vector = model.encode([query])

# 6. 가장 가까운 문서 검색
k = 2
distances, indices = index.search(np.array(query_vector), k)

print("질문:", query)
for rank, idx in enumerate(indices[0]):
    print(f"Top {rank+1}:", documents[idx], "(distance:", distances[0][rank], ")")

 

정리하자면,

  • 임베딩 데이터: 문장·이미지를 숫자 벡터로 변환한 것
  • 벡터 DB: 이 벡터들을 저장하고, “가장 비슷한 것”을 빠르게 검색해주는 DB

오늘 실습에서는 Faiss로 간단히 구현했지만,
실제 서비스에서는 pgvector(Postgres 확장), Milvus, Weaviate 같은 전문 벡터 DB를 활용합니다.