0Pricing
AI Engineering Academy · Lekcja

Wybór i benchmarkowanie magazynów wektorowych

Uczestnicy porównają Pinecone, pgvector, Chroma, Weaviate i Qdrant pod względem kosztu, opóźnienia, możliwości filtrowania i złożoności operacyjnej, aby wybrać narzędzie odpowiednie do swojego przypadku użycia.

Wybór i benchmarkowanie magazynów wektorowych to bezpłatna lekcja AI Engineering Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej AI Engineering Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs AI Engineering Academy zawiera 4 lekcji w sumie.

Ekosystem magazynów wektorowych

Ekosystem baz danych wektorowych rozrósł się gwałtownie w ciągu ostatnich kilku lat. Dostępne opcje obejmują tworzone specjalnie w tym celu usługi chmurowe, takie jak Pinecone, rozszerzenia PostgreSQL, takie jak pgvector, serwery open source, takie jak Chroma, Qdrant i Weaviate, oraz biblioteki działające w pamięci, takie jak FAISS. Wybór odpowiedniego narzędzia ma znaczenie, ponieważ późniejsza zmiana jest kosztowna, gdy dane zostały już zindeksowane.

Najważniejsze kryteria oceny

Porównując magazyny wektorowe, należy ocenić pięć aspektów: opóźnienie zapytań przy docelowej skali, przepustowość indeksowania podczas zbiorczego pozyskiwania danych, możliwości filtrowania na potrzeby wstępnego filtrowania według metadanych, złożoność operacyjną (rozwiązanie zarządzane czy hostowane samodzielnie) oraz koszt przechowywania i przeszukiwania miliona wektorów. Żadne pojedyncze narzędzie nie jest najlepsze pod każdym względem.

Pinecone: prostota zarządzanego rozwiązania

Pinecone to w pełni zarządzana chmurowa baza danych wektorowych, która nie wymaga zarządzania infrastrukturą. Doskonale sprawdza się w przypadku obciążeń o wysokiej współbieżności, oferuje natywne hybrydowe wyszukiwanie rzadko-gęste oraz zapewnia stały czas zapytań wynoszący jednocyfrową liczbę milisekund, niezależnie od skali. Kompromisem jest koszt: rozwiązanie jest droższe niż opcje hostowane samodzielnie i wiąże użytkownika z dostawcą, ponieważ wszystkie dane znajdują się w chmurze 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: embeddingi w PostgreSQL

pgvector rozszerza PostgreSQL o typ danych vector oraz indeksy przybliżonego wyszukiwania najbliższych sąsiadów (ANN), wykorzystujące algorytmy HNSW lub IVFFlat. Jest idealnym rozwiązaniem, jeśli już korzystają Państwo z PostgreSQL, ponieważ embeddingi znajdują się w tej samej bazie danych co dane relacyjne. Umożliwia to wykonywanie zaawansowanych złączeń SQL między wyszukiwaniem wektorowym a filtrami na danych strukturalnych bez dodatkowej infrastruktury.

-- 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: przyjazne programistom podejście lokalne

Chroma to open source'owa baza danych embeddingów zaprojektowana z myślą o szybkim prototypowaniu. Działa w procesie aplikacji podczas lokalnego programowania (bez potrzeby używania serwera) i obsługuje tryb trwałego serwera w środowisku produkcyjnym. Chroma jest popularna w samouczkach LangChain ze względu na niezwykle prosty interfejs API, ale przy dużej skali ma ograniczenia: nie obsługuje trybu rozproszonego i oferuje słabsze filtrowanie niż Pinecone lub 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: filtrowanie i wyszukiwanie po danych dodatkowych

Qdrant to napisana w języku Rust baza danych wektorowych typu open source, która doskonale radzi sobie ze złożonym filtrowaniem metadanych. W przeciwieństwie do baz danych stosujących filtry po wyszukiwaniu ANN, Qdrant wstępnie filtruje wektory kandydujące według pól danych dodatkowych przed obliczeniem ocen, znacznie zwiększając precyzję, gdy filtry są selektywne. Obsługuje indeksy HNSW przechowywane na dysku, dzięki czemu nadaje się do zbiorów danych, które nie mieszczą się w pamięci 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 i dane wielomodalne

Weaviate to baza danych wektorowych typu open source z unikatowym interfejsem GraphQL API i wbudowaną obsługą obiektów wielomodalnych (tekst, obrazy, dźwięk). Integruje się bezpośrednio z dostawcami modeli embeddingów za pomocą modułów, więc można pozyskiwać surowy tekst i pozwolić usłudze Weaviate automatycznie wywołać API embeddingów. Ta wygoda wiąże się z bardziej złożoną konfiguracją w porównaniu z Chroma lub 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: wyszukiwanie w pamięci przy dużej skali

FAISS (Facebook AI Similarity Search) to biblioteka C++ z powiązaniami dla języka Python, zapewniająca niezwykle szybkie wyszukiwanie wektorowe w pamięci. Nie jest bazą danych (nie zapewnia trwałości danych ani serwera), ale dzięki akceleracji GPU obsługuje wyszukiwanie podobieństwa w skali miliardów elementów na pojedynczej maszynie. FAISS jest właściwym wyborem w przypadku obciążeń związanych z wyszukiwaniem wsadowym offline, z przewagą odczytów, gdy mają Państwo kontrolę nad całym stosem.

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

Tworzenie testu porównawczego

Jedynym sposobem na dokonanie świadomego wyboru jest przeprowadzenie testów porównawczych na własnych danych. Dobry test porównawczy mierzy: (1) czas indeksowania pełnego zbioru danych, (2) opóźnienie zapytań przy percentylach p50, p95 i p99 pod obciążeniem współbieżnym, (3) recall@K, porównując wyniki ANN z dokładnymi wynikami uzyskanymi metodą brute force, oraz (4) zużycie pamięci i koszt przy docelowej skali. Te same zapytania należy uruchomić w każdym rozważanym magazynie.

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')

Pomiar kompromisu między skutecznością odtwarzania wyników a opóźnieniem

Indeksy ANN stanowią kompromis między skutecznością odtwarzania wyników a szybkością. Wyższa wartość parametru HNSW ef_search pozwala znaleźć dokładniejszych sąsiadów, ale wydłuża działanie. Należy zmierzyć recall@10 (odsetek rzeczywistych 10 najbliższych sąsiadów zwróconych w wynikach) przy różnych ustawieniach parametrów i wykreślić zależność skuteczności odtwarzania wyników od opóźnienia. Większość systemów produkcyjnych dąży do skuteczności na poziomie 95–99%. Spadek poniżej 90% oznacza, że użytkownicy otrzymują nieistotne fragmenty, nawet jeśli zapytania są szybkie.

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}')

Schemat decyzyjny wyboru

Skorzystaj z następującego drzewa decyzyjnego: jeśli potrzebujesz braku konieczności zarządzania infrastrukturą, a budżet nie jest ograniczeniem, wybierz Pinecone. Jeśli już korzystasz z PostgreSQL, a zbiór danych obejmuje mniej niż 10 mln wektorów, dodaj pgvector. W przypadku hostowanego samodzielnie rozwiązania open source ze złożonym filtrowaniem danych dodatkowych wybierz Qdrant. Do szybkiego prototypowania i lokalnego programowania zacznij od Chroma, a później przeprowadź migrację. W przypadku zadań wsadowych offline w skali miliardów elementów użyj FAISS.

Szybki sprawdzian

Sprawdź swoją znajomość zagadnień z dziedziny inżynierii AI omówionych w tej lekcji.

Podsumowanie lekcji

W tej lekcji nauczył się Pan / nauczyła się Pani, jak wygląda ekosystem magazynów wektorowych, obejmujący Pinecone, pgvector, Chroma, Qdrant, Weaviate i FAISS, jakie jest pięć kryteriów oceny: opóźnienie, przepustowość, filtrowanie, złożoność i koszt, oraz jak stosować praktyczny schemat decyzyjny do wyboru właściwego magazynu na podstawie wymagań dotyczących infrastruktury i skali. Następnie omówimy problem, który doprowadził do powstania RAG.

Często zadawane pytania

Czy lekcja „Wybór i benchmarkowanie magazynów wektorowych” jest bezpłatna?

Tak — pełny tekst „Wybór i benchmarkowanie magazynów wektorowych” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu AI Engineering Academy, przejdź na CoddyKit PRO. Kurs AI Engineering Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Wybór i benchmarkowanie magazynów wektorowych”?

Uczestnicy porównają Pinecone, pgvector, Chroma, Weaviate i Qdrant pod względem kosztu, opóźnienia, możliwości filtrowania i złożoności operacyjnej, aby wybrać narzędzie odpowiednie do swojego przypa… Ćwiczysz AI Engineering Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć AI Engineering Academy?

Nie wymagamy żadnego doświadczenia. AI Engineering Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Wybór i benchmarkowanie magazynów wektorowych”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji AI Engineering Academy?

Tak. Każda lekcja AI Engineering Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Dlaczego potrzebują Państwo wektorowej bazy danych
  2. Pierwsze kroki z Pinecone
  3. pgvector: embeddingi w PostgreSQL
  4. Wybór i benchmarkowanie magazynów wektorowych
← Powrót do AI Engineering Academy