Выбор и сравнительное тестирование векторных хранилищ
Сравните Pinecone, pgvector, Chroma, Weaviate и Qdrant по стоимости, задержке, возможностям фильтрации и сложности эксплуатации, чтобы выбрать подходящий инструмент для своей задачи.
«Выбор и сравнительное тестирование векторных хранилищ» — бесплатный урок AI Engineering Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения AI Engineering Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс AI Engineering Academy содержит 4 уроков всего.
Ландшафт векторных хранилищ
За последние несколько лет экосистема векторных баз данных стремительно расширилась. Среди вариантов есть специализированные облачные сервисы, такие как Pinecone, расширения PostgreSQL, такие как pgvector, серверы с открытым исходным кодом, такие как Chroma, Qdrant и Weaviate, а также библиотеки для работы в памяти, такие как FAISS. Правильный выбор инструмента важен, потому что последующая миграция обходится дорого после индексации данных.
Ключевые параметры оценки
При сравнении векторных хранилищ оценивайте пять параметров: задержку запросов при целевом масштабе, пропускную способность индексации для пакетной загрузки, возможности фильтрации для предварительной фильтрации по метаданным, операционную сложность (управляемый сервис или самостоятельное размещение) и стоимость хранения и поиска миллиона векторов. Ни один инструмент не является лучшим по всем параметрам.
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 расширяет PostgreSQL типом данных vector и индексами приближённого поиска ближайших соседей (ANN), использующими алгоритмы HNSW или IVFFlat. Это идеальный вариант, если вы уже используете 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 — это база данных эмбеддингов с открытым исходным кодом, предназначенная для быстрого прототипирования. При локальной разработке она работает внутри процесса (сервер не требуется), а для рабочей среды поддерживает режим постоянного сервера. Chroma популярна в учебных материалах по LangChain благодаря своему чрезвычайно простому API, но при масштабировании у неё есть ограничения: отсутствует распределённый режим, а фильтрация слабее, чем в 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) — это библиотека C++ с привязками для Python, обеспечивающая чрезвычайно быстрый поиск векторов в памяти. Это не база данных (в ней нет постоянного хранения или сервера), но с ускорением 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) полноту поиска recall@K путём сравнения результатов ANN с точными результатами полного перебора и (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, а ваш набор данных содержит менее 10 млн векторов, добавьте pgvector. Для самостоятельного размещения решения с открытым исходным кодом и сложной фильтрацией данных выберите Qdrant. Для быстрого прототипирования и локальной разработки начните с Chroma, а позже выполните миграцию. Для автономных пакетных задач в масштабе миллиардов векторов используйте FAISS.
Быстрая проверка
Проверьте своё понимание концепций инженерии ИИ из этого урока.
Итоги урока
В этом уроке вы изучили ландшафт векторных хранилищ, включающий Pinecone, pgvector, Chroma, Qdrant, Weaviate и FAISS, пять параметров оценки: задержку, пропускную способность, фильтрацию, сложность и стоимость, а также практическую систему выбора подходящего хранилища на основе требований к инфраструктуре и масштабу. Далее мы рассмотрим проблему, для решения которой был создан RAG.
Часто задаваемые вопросы
Урок «Выбор и сравнительное тестирование векторных хранилищ» бесплатный?
Да — полный текст урока «Выбор и сравнительное тестирование векторных хранилищ» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс AI Engineering Academy, подпишись на CoddyKit PRO. Курс AI Engineering Academy содержит 4 уроков всего.
Чему я научусь в уроке «Выбор и сравнительное тестирование векторных хранилищ»?
Сравните Pinecone, pgvector, Chroma, Weaviate и Qdrant по стоимости, задержке, возможностям фильтрации и сложности эксплуатации, чтобы выбрать подходящий инструмент для своей задачи. Ты практикуешь AI Engineering Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать AI Engineering Academy?
Предыдущий опыт не требуется. AI Engineering Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Выбор и сравнительное тестирование векторных хранилищ»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке AI Engineering Academy?
Да. Каждый урок AI Engineering Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Зачем нужна векторная база данных
- Начало работы с Pinecone
- pgvector: эмбеддинги в PostgreSQL
- Выбор и сравнительное тестирование векторных хранилищ