Bazy wektorowe i systemy wyszukiwania osadzeń
Bazy wektorowe to specjalistyczne bazy danych zoptymalizowane do przechowywania i wykonywania wyszukiwania podobieństwa na wektorach o wysokiej wymiarowości. Stanowią one fundamentalny komponent nowoczesnych aplikacji AI, szczególnie systemów RAG (Retrieval-Augmented Generation).
Czym jest baza wektorowa?
Podczas gdy tradycyjne bazy danych są zoptymalizowane pod zapytania o dokładne dopasowania, bazy wektorowe skupiają się na wyszukiwaniu Approximate Nearest Neighbor (ANN).
Kluczowe pojęcia
Embedding: Numeryczna reprezentacja danych w formie wektora (tekst, obraz, dźwięk).
"Artificial intelligence" → [0.12, -0.45, 0.89, ..., 0.34] (np. 1536 wymiarów)
Similarity Search: Znajdowanie wektorów najbliższych względem wektora zapytania.
query_vector → Top-K najbardziej podobnych wektorów
Metryki odległości:
- Cosine Similarity: Podobieństwo kierunkowe.
- Euclidean Distance (L2): Odległość geometryczna.
- Dot Product: Iloczyn skalarny wektorów.
Metryki podobieństwa: szczegółowa analiza
Cosine Similarity
cos(A, B) = (A · B) / (||A|| × ||B||)
Zakres wartości: [-1, 1]
- 1: Ten sam kierunek (identyczne).
- 0: Ortogonalne (niepowiązane).
- -1: Przeciwny kierunek.
Zastosowanie: Podobieństwo tekstów, wyszukiwanie semantyczne.
Euclidean Distance (L2)
d(A, B) = √(Σ(Aᵢ - Bᵢ)²)
Zakres wartości: [0, ∞) Zastosowanie: Podobieństwo obrazów, klasteryzacja.
Dot Product
A · B = Σ(Aᵢ × Bᵢ)
Zastosowanie: Równoważne cosinusowi dla znormalizowanych osadzeń.
Algorytmy indeksowania
1. Brute Force (Flat Index)
Porównywanie zapytania z każdym wektorem w bazie.
Złożoność: O(n × d)
- n: Liczba wektorów.
- d: Wymiarowość.
Zaleta: 100% dokładności. Wada: Bardzo wolne dla dużych zbiorów danych.
2. IVF (Inverted File Index)
Zawężenie przestrzeni wyszukiwania poprzez podział wektorów na klastry.
Algorytm:
- Tworzenie centroidów za pomocą K-means.
- Przypisanie każdego wektora do najbliższego centroidu.
- Podczas wyszukiwania przeglądanie jedynie najbliższych klastrów nprobe.
1Parameters: 2- nlist: Number of clusters (typically √n) 3- nprobe: Number of clusters to search 4 5Trade-off: Higher nprobe → higher accuracy, lower speed.
3. HNSW (Hierarchical Navigable Small World)
Podejście oparte na grafach i najpopularniejsza metoda obecnie.
Struktura:
1Layer 2: o-------o-------o (sparse) 2 | | | 3Layer 1: o-o-o---o-o-o---o-o-o (medium) 4 | | | | | | | | | 5Layer 0: o-o-o-o-o-o-o-o-o-o-o-o (dense)
Parametry:
- M: Maksymalna liczba połączeń dla każdego węzła.
- ef_construction: Liczba kandydatów podczas budowy indeksu.
- ef_search: Liczba kandydatów podczas zapytania.
Zalety:
- Ekstremalnie szybkie wyszukiwanie: O(log n).
- Wysoki poziom recall.
- Obsługa dynamicznych operacji insert/delete.
4. Product Quantization (PQ)
Zmniejszanie wykorzystania pamięci poprzez kompresję wektorów.
Metoda:
- Podział wektora na M podwektorów.
- Mapowanie każdego podwektora na jeden z K centroidów.
- Przechowywanie identyfikatorów centroidów zamiast oryginalnych komponentów wektora.
1Original: 1536 dim × 4 bytes = 6KB 2PQ (M=96, K=256): 96 × 1 byte = 96 bytes 3Compression: ~64x
5. Scalar Quantization (SQ)
Konwersja reprezentacji Float32 do Int8.
1Original: 1536 × 4 bytes = 6KB 2SQ8: 1536 × 1 byte = 1.5KB 3Compression: 4x 4## Porównanie popularnych baz danych wektorowych 5 6### Pinecone 7 8**Funkcje:** 9- W pełni zarządzana usługa chmurowa. 10- Automatyczne skalowanie. 11- Filtrowanie metadanych. 12- Izolacja namespace. 13 14**Użycie:** 15```python 16import pinecone 17 18pinecone.init(api_key="xxx", environment="us-west1-gcp") 19index = pinecone.Index("my-index") 20 21# Upsert 22index.upsert(vectors=[ 23 {"id": "vec1", "values": [0.1, 0.2, ...], "metadata": {"category": "tech"}} 24]) 25 26# Query 27results = index.query(vector=[0.1, 0.2, ...], top_k=10, filter={"category": "tech"})
Weaviate
Funkcje:
- Open source.
- Wbudowana wektoryzacja.
- Wsparcie GraphQL API.
- Możliwość wyszukiwania hybrydowego (wektorowe + słów kluczowych).
Qdrant
Funkcje:
- Napisany w Rust dla wysokiej wydajności.
- Bogate opcje filtrowania.
- Indeksowanie payload.
- Wsparcie dla wdrożeń rozproszonych.
Milvus
Funkcje:
- Przyspieszenie GPU.
- Wyszukiwanie wielowektorowe.
- Time travel (wersjonowanie).
- Architektura natywna dla Kubernetes.
ChromaDB
Funkcje:
- Przyjazny dla deweloperów i łatwy w konfiguracji.
- Tryby in-memory + persistent.
- Podejście Python-first.
- Idealny do prototypowania.
Tabela porównawcza
| Funkcja | Pinecone | Weaviate | Qdrant | Milvus |
|---|---|---|---|---|
| Hosting | Cloud | Both | Both | Both |
| Skalowalność | Auto | Manual | Manual | Auto |
| Wyszukiwanie hybrydowe | ✓ | ✓ | ✓ | ✓ |
| Wsparcie GPU | - | - | ✓ | ✓ |
| Cennik | Per vector | Free/Paid | Free/Paid | Free/Paid |
Filtrowanie i metadane
Pre-filtering vs Post-filtering
Pre-filtering:
- Najpierw zastosuj filtr metadanych.
- Wykonaj wyszukiwanie wektorowe w przefiltrowanym zbiorze.
- Zaleta: Szybsze.
- Wada: Możliwa utrata recall.
Post-filtering:
- Znajdź wyniki Top-K × multiplier poprzez wyszukiwanie wektorowe.
- Zastosuj filtr metadanych do tych wyników.
- Zwróć finalne top K.
- Zaleta: Lepszy recall.
- Wada: Wolniejsze działanie.
Wyszukiwanie hybrydowe
Łączenie wyszukiwania słów kluczowych (BM25) + wektorowego:
final_score = α × vector_score + (1-α) × keyword_score
Optymalizacja wydajności
Parametry indeksu
Optymalne ustawienia HNSW:
1High Recall: M=32, ef=200 2High Speed: M=16, ef=50 3Balanced: M=24, ef=100
Przetwarzanie wsadowe
1# Poor: Singular insert 2for vec in vectors: 3 index.upsert([vec]) 4 5# Good: Batch insert 6index.upsert(vectors, batch_size=100)
Connection Pooling
1from pinecone import Pinecone 2 3pc = Pinecone( 4 api_key="xxx", 5 pool_threads=30 # Parallel connections 6)
Przykładowa architektura korporacyjna
1┌─────────────────────────────────────────────────────┐ 2│ Application │ 3└──────────────────────┬──────────────────────────────┘ 4 │ 5┌──────────────────────▼──────────────────────────────┐ 6│ Vector Search Service │ 7│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ 8│ │ Query │ │ Reranker │ │ Cache │ │ 9│ │ Engine │ │ Service │ │ (Redis) │ │ 10│ └─────────────┘ └─────────────┘ └─────────────┘ │ 11└──────────────────────┬──────────────────────────────┘ 12 │ 13┌──────────────────────▼──────────────────────────────┐ 14│ Vector Database Cluster │ 15│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ 16│ │ Shard 1 │ │ Shard 2 │ │ Shard 3 │ │ 17│ └─────────┘ └─────────┘ └─────────┘ │ 18└─────────────────────────────────────────────────────┘
Monitoring i obserwowalność
Kluczowe metryki
- Opóźnienie zapytań (p50, p95, p99)
- Recall Rate
- QPS (Queries Per Second)
- Rozmiar indeksu
- Użycie pamięci
Progi alertów
1alerts: 2 - name: high_latency 3 condition: p99_latency > 200ms 4 severity: warning 5 6 - name: low_recall 7 condition: recall < 0.9 8 severity: critical 9## Konkluzja 10 11Bazy wektorowe są niezbędnymi elementami nowoczesnych aplikacji AI. Wybierając odpowiednią bazę danych, strategię indeksowania oraz optymalizacje, możesz zbudować wysokowydajne systemy wyszukiwania semantycznego. 12 13W Veni AI oferujemy korporacyjne rozwiązania do wyszukiwania wektorowego. Skontaktuj się z nami, aby omówić swoje wymagania.
