홈으로
🔍

RAG 검색 증강 생성

문서 기반 AI 시스템 구축의 모든 것

12시간
intermediate
6개 챕터
중급 과정으로 돌아가기

Chapter 1: 고급 벡터 데이터베이스

프로덕션 환경을 위한 벡터 DB 선택과 최적화

1.1 주요 벡터 데이터베이스 비교

각 벡터 DB의 특징과 사용 사례

벡터 DB특징장점단점적합한 사례
Pinecone완전 관리형 SaaS설치 불필요, 자동 스케일링비용 높음, 종속성빠른 MVP, 스타트업
Chroma오픈소스, 임베디드간단한 설치, 개발 친화적스케일링 제한프로토타입, 소규모
WeaviateGraphQL API, 모듈형다양한 모듈, 하이브리드 검색복잡한 설정엔터프라이즈, 복잡한 쿼리
QdrantRust 기반, 고성능빠른 속도, 메모리 효율상대적으로 새로움고성능 요구사항
Milvus클라우드 네이티브대규모 확장성, GPU 지원리소스 집약적대규모 엔터프라이즈

1.2 성능 벤치마크

실제 워크로드 기반 성능 비교

테스트 환경

  • 데이터셋: 100만개 벡터 (768차원)
  • 하드웨어: 16 vCPU, 64GB RAM, NVMe SSD
  • 인덱스 타입: HNSW (Hierarchical Navigable Small World)
  • 측정 지표: QPS, Latency, Recall@10

쿼리 성능 (QPS)

Qdrant
12,000
Pinecone
11,000
Milvus
10,000
Weaviate
8,000
Chroma
5,000

레이턴시 (P99, ms)

Qdrant
2ms
Pinecone
2.5ms
Milvus
3.5ms
Weaviate
4ms
Chroma
6ms

1.3 인덱스 타입과 최적화

검색 성능과 정확도의 균형 맞추기

주요 인덱스 알고리즘

1. HNSW (Hierarchical Navigable Small World)

계층적 그래프 구조로 빠른 근사 최근접 이웃 검색

# Qdrant에서 HNSW 인덱스 설정
from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams, HnswConfig

client.create_collection(
    collection_name="my_collection",
    vectors_config=VectorParams(
        size=768,
        distance=Distance.COSINE
    ),
    hnsw_config=HnswConfig(
        m=16,  # 각 노드의 연결 수
        ef_construct=200,  # 인덱스 구축 시 검색 깊이
        full_scan_threshold=10000
    )
)

2. IVF (Inverted File Index)

벡터를 클러스터로 분할하여 검색 공간 축소

# Milvus에서 IVF_FLAT 인덱스 설정
index_params = {
    "metric_type": "L2",
    "index_type": "IVF_FLAT",
    "params": {
        "nlist": 1024  # 클러스터 수
    }
}

collection.create_index(
    field_name="embeddings",
    index_params=index_params
)

3. Product Quantization (PQ)

벡터를 압축하여 메모리 사용량 감소

# Weaviate에서 PQ 설정
{
    "class": "Document",
    "vectorIndexConfig": {
        "pq": {
            "enabled": true,
            "trainingLimit": 100000,
            "segments": 768  # 차원을 나눌 세그먼트 수
        }
    }
}

최적화 팁

  • 배치 처리: 개별 쿼리보다 배치로 처리하면 처리량 3-5배 향상
  • 프리필터링: 메타데이터 필터를 먼저 적용하여 검색 공간 축소
  • 인덱스 파라미터 튜닝: 데이터 크기와 쿼리 패턴에 맞춰 조정
  • 캐싱 전략: 자주 사용되는 쿼리 결과는 Redis 등에 캐싱

1.4 벡터 DB 운영 및 유지보수

안정적인 벡터 데이터베이스 운영 방법

벡터 DB 클러스터 구성

┌─────────────────┐     ┌─────────────────┐
│   Load Balancer │     │   API Gateway   │
└────────┬────────┘     └────────┬────────┘
         │                       │
         ├───────────┬───────────┤
         │           │           │
    ┌────▼────┐ ┌───▼────┐ ┌───▼────┐
    │ Primary │ │Replica 1│ │Replica 2│
    │  Node   │ │  Node   │ │  Node   │
    └─────────┘ └─────────┘ └─────────┘
         │           │           │
    ┌────▼────────────▼───────────▼────┐
    │         Persistent Storage        │
    │        (S3, GCS, NFS, etc)       │
    └──────────────────────────────────┘

벡터 데이터 분산 전략

  • 벡터 샤딩: 차원별 또는 클러스터별 분산
  • 인덱스 복제: 검색 성능과 가용성 향상
  • 쿼리 라우팅: 효율적인 검색 경로
  • 핫 데이터 관리: 자주 검색되는 벡터 캐싱

벡터 DB 성능 최적화

  • GPU 가속: CUDA/OpenCL 기반 벡터 연산
  • 메모리 최적화: 벡터 압축과 메모리 맵핑
  • 인덱스 튜닝: 정확도-속도 트레이드오프
  • 배치 처리: 벡터 임베딩 배치 업데이트

벡터 DB 모니터링 지표

# 벡터 데이터베이스 모니터링 체크리스트
✅ 벡터 검색 레이턴시 (P50, P95, P99)
✅ 벡터 인덱싱 처리량 (Vector/s)
✅ 인덱스 크기와 압축률
✅ 검색 정확도 (Recall@K)
✅ 벡터 캐시 히트율
✅ 임베딩 모델 응답시간
✅ 벡터 데이터 일관성
✅ 인덱스 재구축 상태

실습 과제

벡터 DB 성능 비교 실습

  1. 1. Chroma와 Qdrant를 로컬에 설치하고 동일한 데이터셋 적재
  2. 2. 각각에서 1000개의 쿼리를 실행하고 성능 측정
  3. 3. 인덱스 파라미터를 조정하여 성능 최적화
  4. 4. 메타데이터 필터링을 추가하여 하이브리드 검색 구현
  5. 5. 결과를 그래프로 시각화하고 비교 분석 리포트 작성

💡 힌트: locust나 k6 같은 부하 테스트 도구를 사용하면 더 정확한 벤치마크가 가능합니다.