Зачем и когда вам нужна специально разработанная база данных векторов?
Эта статья была первоначально опубликована на сайте AIAI и публикуется здесь с разрешения автора.
Растущая популярность ChatGPT и других больших языковых моделей (LLM) способствовала развитию технологий векторного поиска, включая специально созданные векторные базы данных, такие как Milvus и Zilliz Cloud, библиотеки векторного поиска, такие как FAISS, и плагины векторного поиска, интегрированные с традиционными базами данных. Однако выбор наилучшего решения для ваших нужд может оказаться непростой задачей. Как при выборе между рестораном высокого класса и сетью ресторанов быстрого питания, выбор правильной технологии векторного поиска зависит от ваших потребностей и ожиданий.
В этой статье я расскажу о векторном поиске и его функционировании, сравню различные технологии векторного поиска и объясню, почему выбор в пользу специально созданной векторной базы данных имеет решающее значение.
Что такое векторный поиск и как он работает?
Векторный поиск, также известный как поиск векторного сходства, - это техника извлечения топ-к результатов, которые наиболее похожи или семантически связаны с заданным вектором запроса среди обширной коллекции плотных векторных данных.
Перед проведением поиска по сходству мы используем нейронные сети для преобразования неструктурированных данных, таких как текст, изображения, видео и аудио, в высокоразмерные числовые векторы, называемые векторами встраивания. Например, мы можем использовать предварительно обученную конволюционную нейронную сеть ResNet-50 для преобразования изображения птицы в коллекцию вкраплений с 2 048 измерениями. Здесь мы перечислим первые три и последние три элемента вектора: [0.1392, 0.3572, 0.1988, ..., 0.2888, 0.6611, 0.2909]
.
Изображение птицы от Патриса Бушара
После генерации векторов вкраплений векторные поисковые системы сравнивают пространственное расстояние между вектором входного запроса и векторами в векторных хранилищах. Чем ближе они находятся в пространстве, тем более похожи.
Арифметика встраивания
Популярные технологии векторного поиска
На рынке представлено множество технологий векторного поиска, включая библиотеки машинного обучения, такие как NumPy из Python, библиотеки векторного поиска, такие как FAISS, плагины векторного поиска, построенные на традиционных базах данных, и специализированные векторные базы данных, такие как Milvus и Zilliz Cloud.
Библиотеки машинного обучения
Использование библиотек машинного обучения - самый простой способ реализовать векторный поиск. Например, мы можем использовать NumPy из Python, чтобы реализовать алгоритм ближайшего соседа менее чем в 20 строках кода.
import numpy as np
# Function to calculate euclidean distance
def euclidean_distance(a, b):
return np.linalg.norm(a - b)
# Function to perform knn
def knn(data, target, k):
# Calculate distances between target and all points in the data
distances = [euclidean_distance(d, target) for d in data]
# Combine distances with data indices
distances = np.array(list(zip(distances, np.arange(len(data)))))
# Sort by distance
sorted_distances = distances[distances[:, 0].argsort()]
# Get the top k closest indices
closest_k_indices = sorted_distances[:k, 1].astype(int)
# Return the top k closest vectors
return data[closest_k_indices]
Мы можем сгенерировать 100 двумерных векторов и найти ближайшего соседа для вектора [0.5, 0.5].
# Define some 2D vectors
data = np.random.rand(100, 2)
# Define a target vector
target = np.array([0.5, 0.5])
# Define k
k = 3
# Perform knn
closest_vectors = knn(data, target, k)
# Print the result
print("The closest vectors are:")
print(closest_vectors)
Библиотеки машинного обучения, такие как NumPy в Python, предлагают большую гибкость при низкой стоимости. Однако у них есть некоторые ограничения. Например, они могут обрабатывать только небольшой объем данных и не обеспечивают их сохранность.
Я рекомендую использовать NumPy или другие библиотеки машинного обучения для векторного поиска только в том случае, если:
- Вам нужно быстро создать прототип.
- Вы не заботитесь о сохранности данных.
- Размер ваших данных меньше миллиона, и вам не требуется скалярная фильтрация.
- Вам не нужна высокая производительность.
Библиотеки векторного поиска
Библиотеки векторного поиска помогут вам быстро создать высокопроизводительный прототип системы векторного поиска. Типичным примером является FAISS. Она имеет открытый исходный код и разработана компанией Meta для эффективного поиска сходства и плотной кластеризации векторов. FAISS может работать с коллекциями векторов любого размера, даже с теми, которые не могут быть полностью загружены в память. Кроме того, FAISS предлагает инструменты для оценки и настройки параметров. Несмотря на то, что FAISS написан на C++, он имеет интерфейс Python/NumPy.
Ниже приведен код примера векторного поиска на основе FAISS:
import numpy as np
import faiss
# Generate some example data
dimension = 64 # dimension of the vector space
database_size = 10000 # size of the database
query_size = 100 # number of queries to perform
np.random.seed(123) # make the random numbers predictable
# Generating vectors to index in the database (db_vectors)
db_vectors = np.random.random((database_size, dimension)).astype('float32')
# Generating vectors for query (query_vectors)
query_vectors = np.random.random((query_size, dimension)).astype('float32')
# Building the index
index = faiss.IndexFlatL2(dimension) # using the L2 distance metric
print(index.is_trained) # should return True
# Adding vectors to the index
index.add(db_vectors)
print(index.ntotal) # should return database_size (10000)
# Perform a search
k = 4 # we want to see 4 nearest neighbors
distances, indices = index.search(query_vectors, k)
# Print the results
print("Indices of nearest neighbors: \n", indices)
print("\nL2 distances to the nearest neighbors: \n", distances)
Библиотеки векторного поиска, такие как FAISS, просты в использовании и достаточно быстры для работы с небольшими производственными средами с миллионами векторов. Вы можете повысить производительность запросов, используя квантование и графические процессоры, а также уменьшив размерность данных.
Однако у этих библиотек есть некоторые ограничения при использовании в производстве. Например, FAISS не поддерживает добавление и удаление данных в реальном времени, удаленные вызовы, несколько языков, скалярную фильтрацию, масштабируемость и аварийное восстановление.
Различные типы векторных баз данных
Векторные базы данных появились, чтобы устранить ограничения вышеупомянутых библиотек, обеспечивая более комплексное и практичное решение для производственных приложений.
На поле боя доступны четыре типа векторных баз данных:
- Существующие реляционные или колоночные базы данных, в которые встроен плагин векторного поиска. Примером может служить PG Vector.
- Традиционные поисковые системы с инвертированным индексом и поддержкой плотного векторного индексирования. Примером может служить ElasticSearch.
- Легкие векторные базы данных, построенные на основе библиотек векторного поиска. Пример - Chroma.
- Целевые векторные базы данных. Этот тип баз данных специально разработан и оптимизирован для векторного поиска снизу вверх. Векторные базы данных целевого назначения обычно предлагают более продвинутые функции, включая распределенные вычисления, аварийное восстановление и сохранение данных. В качестве примера можно привести Milvus.
Не все векторные базы данных созданы одинаковыми. Каждый стек обладает уникальными преимуществами и ограничениями, что делает их более или менее подходящими для различных приложений.
Я предпочитаю специализированные векторные базы данных другим решениям, поскольку они являются наиболее эффективным и удобным вариантом, предлагающим множество уникальных преимуществ. В следующих разделах я использую Milvus в качестве примера, чтобы объяснить причины моего предпочтения.
Ключевые преимущества специально созданных векторных баз данных
Milvus - это распределенная специализированная векторная база данных с открытым исходным кодом, которая может хранить, индексировать, управлять и извлекать миллиарды векторов встраивания. Это также одна из самых популярных векторных баз данных для расширенной генерации LLM-поиска. Являясь образцовым примером специально созданных векторных баз данных, Milvus обладает многими уникальными преимуществами по сравнению со своими аналогами.
Постоянство данных и экономически эффективное хранение
Хотя предотвращение потери данных является минимальным требованием к базе данных, многие одномашинные и легкие векторные базы данных не ставят во главу угла надежность данных. В отличие от них, в специально созданных распределенных векторных базах данных, таких как Milvus, приоритетом является устойчивость системы, масштабируемость и сохранение данных за счет разделения хранения и вычислений.
Более того, большинство векторных баз данных, использующих индексы приближенных ближайших соседей (ANN), нуждаются в большом количестве памяти для выполнения векторного поиска, поскольку они загружают индексы ANN исключительно в память. Однако Milvus поддерживает дисковые индексы, что делает их хранение более чем в десять раз более экономичным, чем индексы в памяти.
Оптимальная производительность запросов
Специализированная векторная база данных обеспечивает оптимальную производительность запросов по сравнению с другими вариантами векторного поиска. Например, Milvus в десять раз быстрее обрабатывает запросы, чем плагины векторного поиска. Milvus использует алгоритм ANN вместо алгоритма брутального поиска KNN для более быстрого поиска векторов. Кроме того, он разбивает свои индексы на части, сокращая время создания индекса при увеличении объема данных. Такой подход позволяет Milvus легко обрабатывать миллиарды векторов с добавлением и удалением данных в режиме реального времени. В отличие от этого, другие дополнения для векторного поиска подходят только для сценариев с количеством данных менее десятков миллионов и нечастыми добавлениями и удалениями.
Milvus также поддерживает GPU-ускорение. Внутреннее тестирование показало, что векторное индексирование с GPU-ускорением может достигать 10 000+ QPS при поиске десятков миллионов данных, что как минимум в десять раз быстрее традиционного индексирования на CPU при выполнении запросов одной машиной.
Надежность системы
Многие приложения используют векторные базы данных для онлайн-запросов, требующих низкой задержки запросов и высокой пропускной способности. Эти приложения требуют отказоустойчивости одной машины на минутном уровне, а некоторые даже требуют межрегионального аварийного восстановления для критических сценариев. Традиционные стратегии репликации на основе Raft/Paxos страдают от серьезных потерь ресурсов и нуждаются в помощи для предварительной сортировки данных, что приводит к низкой надежности. В отличие от них, Milvus имеет распределенную архитектуру, использующую очереди сообщений K8s для обеспечения высокой доступности, что сокращает время восстановления и экономит ресурсы.
Работоспособность и наблюдаемость
Чтобы лучше обслуживать корпоративных пользователей, векторные базы данных должны предлагать ряд функций корпоративного уровня для лучшей работоспособности и наблюдаемости. Milvus поддерживает различные методы развертывания, включая K8s Operator и Helm chart, docker-compose и pip install, что делает его доступным для пользователей с различными потребностями. Milvus также предоставляет систему мониторинга и оповещения на основе Grafana, Prometheus и Loki, что повышает его наблюдаемость. Благодаря распределенной облачной нативной архитектуре Milvus - первая в отрасли векторная база данных, поддерживающая многопользовательскую изоляцию, RBAC, ограничение квот и скользящие обновления. Все эти подходы значительно упрощают управление и мониторинг Milvus.
Начало работы с Milvus за 3 простых шага в течение 10 минут
Создание векторной базы данных - сложная задача, но ее использование так же просто, как использование Numpy и FAISS. Даже студенты, не знакомые с искусственным интеллектом, могут реализовать векторный поиск на базе Milvus всего за десять минут. Чтобы воспользоваться высокомасштабируемыми и высокопроизводительными сервисами векторного поиска, выполните следующие три шага:
- Разверните Milvus на своем сервере с помощью документа по развертыванию Milvus.
- Реализуйте векторный поиск с помощью всего 50 строк кода, обратившись к документу Hello Milvus.
- Изучите примеры документов Towhee, чтобы получить представление о популярных случаях использования векторных баз данных.
- Что такое векторный поиск и как он работает?
- Популярные технологии векторного поиска
- Ключевые преимущества специально созданных векторных баз данных
- Начало работы с Milvus за 3 простых шага в течение 10 минут
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word