0Pricing
AI Engineering Academy · 강의

벡터 저장소 선택 및 벤치마킹

Pinecone, pgvector, Chroma, Weaviate, Qdrant를 비용, 지연 시간, 필터링 기능, 운영 복잡성 측면에서 비교해 사용 사례에 맞는 도구를 선택합니다.

벡터 저장소 선택 및 벤치마킹은(는) CoddyKit의 무료 AI Engineering Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 AI Engineering Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. AI Engineering Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

벡터 저장소 생태계

벡터 데이터베이스 생태계는 지난 몇 년 동안 폭발적으로 성장했습니다. 옵션으로는 Pinecone과 같은 목적에 특화된 클라우드 서비스, pgvector와 같은 PostgreSQL 확장, Chroma, Qdrant, Weaviate와 같은 오픈 소스 서버, FAISS와 같은 메모리 내 라이브러리가 있습니다. 데이터를 인덱싱한 후에는 전환 비용이 커지므로 올바른 도구를 선택하는 것이 중요합니다.

평가할 주요 기준

벡터 저장소를 비교할 때는 다섯 가지 기준을 평가하세요. 목표 규모에서의 쿼리 지연 시간, 일괄 입력을 위한 인덱싱 처리량, 메타데이터 기반 사전 필터링을 위한 필터링 기능, 운영 복잡성(관리형 또는 자체 호스팅), 그리고 저장 및 쿼리되는 벡터 100만 개당 비용입니다. 모든 기준에서 가장 뛰어난 단일 도구는 없습니다.

Pinecone: 간편한 관리형 서비스

Pinecone은 인프라를 전혀 관리하지 않아도 되는 완전 관리형 클라우드 벡터 데이터베이스입니다. 높은 동시성 작업 부하에 뛰어나고, 희소-밀집 하이브리드 검색을 기본 지원하며, 어떤 규모에서도 한 자릿수 밀리초 수준의 일관된 쿼리 성능을 제공합니다. 단점은 비용입니다. 자체 호스팅 옵션보다 비싸고, 모든 데이터가 Pinecone의 클라우드에 저장되므로 공급업체 종속이 발생합니다.

import pinecone

pc = pinecone.Pinecone(api_key='YOUR_API_KEY')
index = pc.Index('my-index')

# Query with metadata filter
results = index.query(
    vector=[0.1, 0.2, 0.3],
    top_k=10,
    filter={'category': {'$eq': 'finance'}},
    include_metadata=True
)

pgvector: PostgreSQL의 임베딩

pgvector는 HNSW 또는 IVFFlat 알고리즘을 사용하는 벡터 데이터 유형과 근사 최근접 이웃(ANN) 인덱스로 PostgreSQL을 확장합니다. 이미 PostgreSQL을 실행 중이라면 임베딩이 관계형 데이터와 동일한 데이터베이스에 저장되므로 특히 적합합니다. 이를 통해 추가 인프라 없이 벡터 검색과 구조화된 필터 간에 강력한 SQL 조인을 수행할 수 있습니다.

-- Create table with embedding column
CREATE TABLE documents (
    id SERIAL PRIMARY KEY,
    content TEXT,
    category TEXT,
    embedding vector(1536)
);

-- Create HNSW index for fast ANN search
CREATE INDEX ON documents
USING hnsw (embedding vector_cosine_ops);

-- Query nearest neighbors with SQL filter
SELECT content, 1 - (embedding <=> '[0.1,0.2,...]')
FROM documents
WHERE category = 'finance'
ORDER BY embedding <=> '[0.1,0.2,...]'
LIMIT 10;

Chroma: 개발자 친화적인 로컬 우선 방식

Chroma는 빠른 프로토타이핑을 위해 설계된 오픈 소스 임베딩 데이터베이스입니다. 로컬 개발에서는 프로세스 내부에서 실행되므로 서버가 필요 없고, 운영 환경에서는 영속 서버 모드를 지원합니다. 매우 간단한 API 덕분에 Chroma는 LangChain 튜토리얼에서 인기가 높지만, 규모가 커지면 한계가 있습니다. 분산 모드를 지원하지 않고 Pinecone이나 Qdrant보다 필터링 기능이 약합니다.

import chromadb

client = chromadb.PersistentClient(path='./chroma_db')
collection = client.get_or_create_collection('my_docs')

# Add documents
collection.add(
    documents=['text one', 'text two'],
    metadatas=[{'source': 'doc1'}, {'source': 'doc2'}],
    ids=['id1', 'id2']
)

# Query
results = collection.query(
    query_texts=['search query'],
    n_results=5
)

Qdrant: 필터링과 페이로드 검색

Qdrant는 Rust로 작성된 오픈 소스 벡터 데이터베이스로, 복잡한 메타데이터 필터링에 뛰어납니다. ANN 검색 후 필터를 적용하는 데이터베이스와 달리, Qdrant는 점수를 계산하기 전에 페이로드 필드로 후보 벡터를 사전 필터링합니다. 필터가 선택적일 때 정밀도가 크게 향상됩니다. 디스크에 저장하는 HNSW 인덱스를 지원하므로 RAM에 들어가지 않는 데이터 세트에도 적합합니다.

from qdrant_client import QdrantClient
from qdrant_client.models import Filter, FieldCondition, MatchValue

client = QdrantClient(url='http://localhost:6333')

# Search with payload filter
results = client.search(
    collection_name='documents',
    query_vector=[0.1, 0.2, 0.3],
    query_filter=Filter(
        must=[
            FieldCondition(
                key='category',
                match=MatchValue(value='finance')
            )
        ]
    ),
    limit=10
)

Weaviate: GraphQL과 멀티모달

Weaviate는 고유한 GraphQL API와 멀티모달 객체(텍스트, 이미지, 오디오)에 대한 기본 지원을 제공하는 오픈 소스 벡터 데이터베이스입니다. 모듈을 통해 임베딩 모델 제공업체와 직접 통합되므로, 원시 텍스트를 입력하면 Weaviate가 자동으로 임베딩 API를 호출하도록 할 수 있습니다. 이러한 편리함은 Chroma나 Qdrant보다 설정이 복잡해지는 대가로 제공됩니다.

import weaviate

client = weaviate.Client('http://localhost:8080')

# Near-text search using built-in vectorizer
result = client.query.get(
    'Document', ['content', 'category']
).with_near_text(
    {'concepts': ['financial analysis']}
).with_where({
    'path': ['category'],
    'operator': 'Equal',
    'valueString': 'finance'
}).with_limit(10).do()

FAISS: 대규모 메모리 내 검색

FAISS(Facebook AI Similarity Search)는 Python 바인딩을 제공하는 C++ 라이브러리로, 매우 빠른 메모리 내 벡터 검색을 지원합니다. 데이터베이스가 아니므로 영속성이나 서버는 없지만, GPU 가속을 사용하여 단일 시스템에서 수십억 규모의 유사도 검색을 처리할 수 있습니다. 전체 기술 스택을 직접 제어하면서 읽기 작업이 많고 오프라인 일괄 검색을 수행하는 경우 FAISS가 적합합니다.

import faiss
import numpy as np

dimension = 1536
vectors = np.random.random((100000, dimension)).astype('float32')

# Normalize for cosine similarity
faiss.normalize_L2(vectors)

# Build HNSW index
index = faiss.IndexHNSWFlat(dimension, 32)  # M=32 neighbors
index.add(vectors)

# Search
query = np.random.random((1, dimension)).astype('float32')
faiss.normalize_L2(query)
D, I = index.search(query, k=10)  # top-10 results

벤치마크 테스트 만들기

확신을 갖고 선택하는 유일한 방법은 자체 데이터로 벤치마크를 수행하는 것입니다. 좋은 벤치마크는 다음을 측정합니다. (1) 전체 데이터 세트를 인덱싱하는 데 걸리는 시간, (2) 동시 부하에서 p50, p95, p99 백분위수의 쿼리 지연 시간, (3) ANN 결과와 완전 탐색 방식의 정확한 결과를 비교한 recall@K, (4) 목표 규모에서의 메모리와 비용입니다. 각 후보 저장소에 동일한 쿼리를 실행하세요.

import time
import numpy as np

def benchmark_store(store, queries, k=10):
    latencies = []
    for q in queries:
        start = time.perf_counter()
        store.search(q, k)
        latencies.append(time.perf_counter() - start)
    latencies.sort()
    n = len(latencies)
    print(f'p50: {latencies[n//2]*1000:.1f}ms')
    print(f'p95: {latencies[int(n*0.95)]*1000:.1f}ms')
    print(f'p99: {latencies[int(n*0.99)]*1000:.1f}ms')

재현율과 지연 시간의 상충 관계 측정하기

ANN 인덱스는 속도와 재현율을 맞바꿉니다. HNSW의 ef_search 매개변수를 높이면 더 정확한 이웃을 찾지만 시간이 더 오래 걸립니다. 다양한 매개변수 설정에서 recall@10(반환된 실제 상위 10개 이웃의 비율)을 측정하고 재현율과 지연 시간을 그래프로 표시하세요. 대부분의 운영 시스템은 95~99%의 재현율을 목표로 합니다. 재현율이 90% 아래로 떨어지면 쿼리가 빠르더라도 사용자에게 관련 없는 청크가 제공됩니다.

def compute_recall(approx_ids, exact_ids):
    '''Compute recall@K for one query'''
    return len(set(approx_ids) & set(exact_ids)) / len(exact_ids)

def benchmark_recall(index, brute_force, queries, k=10):
    recalls = []
    for q in queries:
        approx = index.search(q, k)
        exact = brute_force.search(q, k)
        recalls.append(compute_recall(approx, exact))
    print(f'Mean recall@{k}: {sum(recalls)/len(recalls):.3f}')

선택을 위한 의사 결정 체계

다음 의사 결정 트리를 사용하세요. 인프라를 전혀 관리하고 싶지 않고 예산이 제약이 아니라면 Pinecone을 선택하세요. 이미 PostgreSQL을 실행 중이고 데이터 세트가 1,000만 개 미만의 벡터로 구성되어 있다면 pgvector를 추가하세요. 복잡한 페이로드 필터링을 지원하는 오픈 소스 자체 호스팅 솔루션이 필요하다면 Qdrant를 선택하세요. 빠른 프로토타이핑과 로컬 개발이 목적이라면 Chroma로 시작한 후 나중에 이전하세요. 수십억 규모의 오프라인 일괄 작업에는 FAISS를 사용하세요.

빠른 확인

이 레슨에서 배운 AI 엔지니어링 개념을 이해했는지 확인해 보세요.

레슨 요약

이 레슨에서는 Pinecone, pgvector, Chroma, Qdrant, Weaviate, FAISS를 포함한 벡터 저장소 생태계, 지연 시간·처리량·필터링·복잡성·비용이라는 다섯 가지 평가 기준, 그리고 인프라와 규모 요구 사항에 따라 적합한 저장소를 선택하는 실용적인 의사 결정 체계를 배웠습니다. 다음 레슨에서는 RAG가 해결하기 위해 고안된 문제를 살펴봅니다.

자주 묻는 질문

“벡터 저장소 선택 및 벤치마킹” 강의는 무료인가요?

네 — “벡터 저장소 선택 및 벤치마킹” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 AI Engineering Academy 강의 전체를 잠금 해제할 수 있습니다. AI Engineering Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“벡터 저장소 선택 및 벤치마킹”에서 뭘 배우나요?

Pinecone, pgvector, Chroma, Weaviate, Qdrant를 비용, 지연 시간, 필터링 기능, 운영 복잡성 측면에서 비교해 사용 사례에 맞는 도구를 선택합니다. 브라우저에서 직접 실행하는 실습 코드로 AI Engineering Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

AI Engineering Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 AI Engineering Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“벡터 저장소 선택 및 벤치마킹” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 AI Engineering Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 AI Engineering Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 벡터 데이터베이스가 필요한 이유
  2. Pinecone 시작하기
  3. pgvector: PostgreSQL의 임베딩
  4. 벡터 저장소 선택 및 벤치마킹
← AI Engineering Academy(으)로 돌아가기