Векторные базы данных и системы поиска по эмбеддингам
Векторные базы данных — это специализированные базы данных, оптимизированные для хранения и выполнения поиска похожих объектов в пространствах высоких размерностей. Они являются фундаментальным компонентом современных AI-приложений, особенно систем RAG (Retrieval-Augmented Generation).
Что такое векторная база данных?
В то время как традиционные базы данных оптимизированы для точных запросов, векторные базы данных фокусируются на поиске Approximate Nearest Neighbor (ANN).
Ключевые концепции
Эмбеддинг: Числовое векторное представление данных (текст, изображение, аудио).
"Artificial intelligence" → [0.12, -0.45, 0.89, ..., 0.34] (e.g., 1536 dimensions)
Поиск по схожести: Нахождение векторов, наиболее близких к вектору запроса.
query_vector → Top-K most similar vectors
Метрики расстояния:
- Cosine Similarity: Направленная схожесть.
- Euclidean Distance (L2): Геометрическое расстояние.
- Dot Product: Скалярное произведение векторов.
Метрики схожести: подробный разбор
Cosine Similarity
cos(A, B) = (A · B) / (||A|| × ||B||)
Диапазон значений: [-1, 1]
- 1: То же направление (идентичны).
- 0: Ортогональны (несвязаны).
- -1: Противоположные направления.
Применение: Сходство текстов, семантический поиск.
Euclidean Distance (L2)
d(A, B) = √(Σ(Aᵢ - Bᵢ)²)
Диапазон значений: [0, ∞) Применение: Сходство изображений, кластеризация.
Dot Product
A · B = Σ(Aᵢ × Bᵢ)
Применение: Эквивалентно cosine для нормализованных эмбеддингов.
Алгоритмы индексирования
1. Brute Force (Flat Index)
Сравнение запроса со всеми векторами в базе данных.
Сложность: O(n × d)
- n: Количество векторов.
- d: Размерность.
Преимущество: 100% точность.
Недостаток: Очень медленно для больших наборов данных.
2. IVF (Inverted File Index)
Сужение пространства поиска путем разбиения векторов на кластеры.
Алгоритм:
- Создание центроидов с помощью K-means.
- Присвоение каждого вектора ближайшему центроиду.
- Во время поиска просматриваются только ближайшие 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)
Графовый подход и наиболее популярный метод сегодня.
Структура:
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)
Параметры:
- M: Максимальное число связей для каждой ноды.
- ef_construction: Количество кандидатов при построении индекса.
- ef_search: Количество кандидатов при выполнении запроса.
Преимущества:
- Очень быстрый поиск: O(log n).
- Высокие показатели recall.
- Поддержка динамического добавления/удаления.
4. Product Quantization (PQ)
Уменьшение использования памяти путем сжатия векторов.
Метод:
- Разделить вектор на M под-векторов.
- Отобразить каждый под-вектор на один из K центроидов.
- Сохранить ID центроидов вместо исходных компонент вектора.
1Original: 1536 dim × 4 bytes = 6KB 2PQ (M=96, K=256): 96 × 1 byte = 96 bytes 3Compression: ~64x
5. Scalar Quantization (SQ)
Преобразование представления Float32 в Int8.
1Original: 1536 × 4 bytes = 6KB 2SQ8: 1536 × 1 byte = 1.5KB 3Compression: 4x 4## Сравнение популярных векторных баз данных 5 6### Pinecone 7 8**Особенности:** 9- Полностью управляемый облачный сервис. 10- Автоматическое масштабирование. 11- Фильтрация по метаданным. 12- Изоляция пространств имён. 13 14**Использование:** 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
Особенности:
- Открытый исходный код.
- Встроенная векторизация.
- Поддержка GraphQL API.
- Гибридный поиск (векторный + ключевые слова).
Qdrant
Особенности:
- Написан на Rust для высокой производительности.
- Богатые возможности фильтрации.
- Индексация полезной нагрузки (payload).
- Поддержка распределённого развертывания.
Milvus
Особенности:
- Ускорение на GPU.
- Мультивекторный поиск.
- Time travel (версионирование).
- Архитектура, нативная для Kubernetes.
ChromaDB
Особенности:
- Удобен для разработчиков и прост в установке.
- Режимы in-memory + persistent.
- Подход Python-first.
- Идеален для прототипирования.
Таблица сравнения
| Особенность | Pinecone | Weaviate | Qdrant | Milvus |
|---|---|---|---|---|
| Хостинг | Cloud | Both | Both | Both |
| Масштабируемость | Auto | Manual | Manual | Auto |
| Гибридный поиск | ✓ | ✓ | ✓ | ✓ |
| Поддержка GPU | - | - | ✓ | ✓ |
| Ценообразование | Per vector | Free/Paid | Free/Paid | Free/Paid |
Фильтрация и метаданные
Предфильтрация vs Постфильтрация
Предфильтрация:
- Сначала применяется фильтр по метаданным.
- Выполняется векторный поиск в отфильтрованном наборе.
- Преимущество: Быстрее.
- Недостаток: Возможная потеря полноты (recall).
Постфильтрация:
- Выполняется поиск Top-K × множитель.
- К результатам применяется фильтр по метаданным.
- Возвращаются финальные Top-K.
- Преимущество: Лучшая полнота.
- Недостаток: Медленнее.
Гибридный поиск
Комбинация поиска по ключевым словам (BM25) + векторного поиска:
final_score = α × vector_score + (1-α) × keyword_score
Оптимизация производительности
Параметры индекса
Оптимальные настройки HNSW:
1High Recall: M=32, ef=200 2High Speed: M=16, ef=50 3Balanced: M=24, ef=100
Пакетная обработка
1# Плохо: вставка по одному 2for vec in vectors: 3 index.upsert([vec]) 4 5# Хорошо: пакетная вставка 6index.upsert(vectors, batch_size=100)
Пул соединений
1from pinecone import Pinecone 2 3pc = Pinecone( 4 api_key="xxx", 5 pool_threads=30 # Parallel connections 6)
Пример корпоративной архитектуры
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└─────────────────────────────────────────────────────┘
Мониторинг и наблюдаемость
Ключевые метрики
- Задержка запросов (p50, p95, p99)
- Recall
- QPS (Queries Per Second)
- Размер индекса
- Использование памяти
Пороги оповещений
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## Заключение 10 11Векторные базы данных являются незаменимыми компонентами современных AI‑приложений. С правильным выбором базы данных, стратегией индексирования и оптимизациями вы можете создать высокопроизводительные системы семантического поиска. 12 13В Veni AI мы предлагаем корпоративные решения для векторного поиска. Свяжитесь с нами, чтобы обсудить ваши требования.
