벡터 데이터베이스

벡터 데이터베이스 (Vector Database)

비정형 데이터를 임베딩 벡터로 변환하여 저장하고, 의미 기반 유사도 검색(k-NN)을 고속으로 수행하는 데이터베이스 시스템.


데이터 유형

유형 특징 예시
정형 (Structured) 엄격한 스키마, 테이블 구조 RDBMS, CSV
반정형 (Semi-structured) 스키마 포함하지만 유연 JSON, XML
비정형 (Unstructured) 구조 없음, 전체 데이터 80% 이상 텍스트, 이미지, 음성

벡터 DB는 비정형 데이터 처리에 특화.


벡터 임베딩 (Vector Embedding)

비정형 데이터를 AI 모델(LLM 등)로 고차원 숫자 벡터로 변환하는 과정.


벡터 인덱싱 (Vector Indexing)

전체 탐색(Exhaustive Search) 비효율 → 인덱스로 후보 추려냄.

주요 알고리즘

알고리즘 방식 특징
LSH (Locality-Sensitive Hashing) 유사한 벡터가 같은 버킷에 충돌하도록 설계된 해시 재현율 향상 위해 복수 해시 함수 사용
PQ (Product Quantization) 고차원 벡터를 저차원 조각으로 분할 → 코드북으로 압축 메모리 절감, 검색 속도 향상
HNSW (Hierarchical Navigable Small World) 벡터를 노드, 거리를 엣지로 하는 계층적 그래프 현재 가장 널리 사용되는 고성능 알고리즘

유사도 척도

유클리드 거리: d(p,q)=i=1n(piqi)2코사인 유사도: cos(θ)=ABAB

DB 유형 비교

구분 RDBMS 전문 검색 (Full-Text) 벡터 DB
검색 방식 일치값, 조건 검색 역색인 기반 키워드 (TF-IDF, BM25) k-NN 유사도 (ANN, HNSW)
실제 쿼리 SELECT * FROM ... MATCH(body) AGAINST('keyword') collection.search(query_vector, k=5)
유사성 판단 없음 (정확 일치) 어휘적 유사성 의미적·맥락적 유사성
주요 용도 정형 데이터, 트랜잭션 문서, 웹페이지 검색 이미지, 추천, 챗봇

주요 벡터 DB 비교

DB 유형 저장 방식 인덱싱
Pinecone 완전 관리형 클라우드 분산 Blob Storage 자체 ANN, 자동 최적화
Milvus 오픈소스 분산형 세그먼트 단위 객체 스토리지 HNSW/IVF_FLAT/IVF_PQ 수동 선택
Weaviate 오픈소스 분산형 로컬 디스크 (LSM Tree) HNSW 기본, RAM 상주
Chroma 오픈소스 인-프로세스 로컬 SQLite HNSW 기본, 자동 업데이트
Faiss 오픈소스 라이브러리 인메모리 (파일 저장 가능) Flat/IVF/HNSW/PQ 수동 제어

미니 벡터 DB 설계 (SQLite + LSH)

핵심 함수

init(vector_size)       // DB 초기화
add([(id, vector, metadata), ...])  // 벡터 추가
delete(ids)             // 삭제
query(vector, k)        // k-NN 검색

스키마 설계

-- 원본 벡터 저장
CREATE TABLE vectors (
  id TEXT PRIMARY KEY,
  vector_data BLOB,        -- 벡터 (바이너리)
  metadata TEXT            -- JSON
);

-- LSH 인덱스 (1:N 관계)
CREATE TABLE lsh_index (
  hash_value TEXT,
  vector_id TEXT REFERENCES vectors(id) ON DELETE CASCADE
);
CREATE INDEX idx_hash ON lsh_index(hash_value);

핵심: 하나의 벡터 → 여러 LSH 함수 → 여러 hash_value 생성
검색 시 hash 매칭 → 후보 추출 → 정확한 거리 계산


Node.js 프로파일링 도구

Chrome DevTools

node --inspect your_script.js
# chrome://inspect → inspect 클릭

코드 내 측정

import { performance } from 'perf_hooks';
const start = performance.now();
await task();
console.log(`${(performance.now() - start).toFixed(3)} ms`);

// 메모리
const before = process.memoryUsage().heapUsed;
// ... 작업 ...
const used = (process.memoryUsage().heapUsed - before) / 1024 / 1024;
console.log(`${used.toFixed(3)} MB`);

Clinic.js

npm install -g clinic
clinic flame -- node your_script.js
# → HTML 리포트 자동 생성

관련 개념