Реализация гибридного запроса векторных и структурированных данных на базе Milvus

искусственный интеллект

Обзор

С помощью нейросетевой модели глубокого обучения неструктурированные данные, такие как изображения, видео, голоса и тексты, могут быть преобразованы в векторы признаков. Помимо структурированных векторов, к этим данным часто нужно добавлять другие атрибуты. Например, для изображений лиц могут быть добавлены такие теги, как пол, необходимость носить очки и время захвата изображения; для текстов могут быть добавлены такие теги, как тип языка, классификация корпуса и время создания текста.

В прошлом люди обычно сохраняли векторы признаков в структурированной таблице атрибутов меток. Однако традиционные базы данных не могут эффективно искать массивные многомерные векторы признаков. В настоящее время необходима база данных векторов признаков для эффективного хранения и извлечения векторов признаков.

решение

Milvus — это векторный поисковик, с помощью которого можно легко добиться высокопроизводительного поиска массивных векторов. В сочетании с традиционными реляционными базами данных, такими как PostgreSQL, он используется для хранения уникального идентификатора Milvus для вектора и соответствующих атрибутов вектора. Результаты поиска вектора Milvus дополнительно запрашиваются в PostgreSQL, и можно быстро получить смешанные результаты запроса.Конкретные решения заключаются в следующем:

solution

Хранение векторов признаков

Сплошная синяя линия на приведенном выше рисунке представляет собой хранимую процедуру вектора признаков гибридного запроса Milvus. Сначала сохраните данные исходного вектора признаков в базе данных векторов признаков Milvus, и Milvus вернет идентификатор, соответствующий каждому исходному вектору данных. Затем сохраните уникальный идентификационный идентификатор и атрибуты меток каждого вектора признаков в реляционной базе данных, такой как PostgreSQL, чтобы завершить хранение векторов признаков и атрибутов меток.

Поиск вектора признаков

Оранжевая сплошная линия на приведенном выше рисунке представляет процесс поиска вектора признаков гибридного запроса Milvus. Введите данные вектора признаков, которые необходимо запросить, в Milvus, Milvus получит идентификатор результата запроса с наибольшим сходством с вектором поиска, использует идентификатор результата для запроса в PostgreSQL и, наконец, получит смешанный результат запроса вектора поиска.

Гибридный запрос Milvus

На этом этапе вам может быть интересно, почему бы не хранить векторы признаков и соответствующие атрибуты непосредственно в реляционной базе данных? Далее мы будем использовать Milvus (версия 0.6.0) дляANN_SIFT1B100 миллионов данных в тесте, чтобы ответить за вас,Ссылка на ссылку.

1. Набор данных собственных векторов

Вектор признаков гибридного запроса Mivus, реализованный на этот раз, извлекается из 100 миллионов данных (128 измерений) в файле базового набора в ANN_SIFT1B. Вектор признаков извлекается из набора запросов при извлечении, предполагая, что набор данных ANN_SIFT1B является вектором признаков лица, и добавляя метки пола, носить ли очки и время захвата изображения к каждому вектору:

# 提取 Base Set 文件中的一亿数据,以用于导入 Milvus
vectors = load_bvecs_data(FILE_PATH,10000000)

# 为向量随机生成性别、是否戴眼镜、图片抓取时间标签
sex = random.choice(['female','male'])
get_time = fake.past_datetime(start_date="-120d", tzinfo=None)
is_glasses = random.choice(['True','False'])

2. Хранение векторов признаков

Импортируйте 100 миллионов данных в Milvus, возвращенные идентификаторы — это уникальный идентификатор представления, соответствующий вектору, сохраните идентификаторы и метку вектора в PostgreSQL, конечно, исходный вектор признаков также можно сохранить в PostgreSQL (необязательно):

# 将一亿原始数据导入 Milvus
status, ids = milvus.add_vectors(table_name=MILVUS_TABLE, records=vectors)

# 将 ids 与向量的标签存入 PostgreSQL
sql = "INSERT INTO PG_TABLE_NAME VALUES(ids, sex, get_time, is_glasses);"
cur.execute(sql)

3. Поиск вектора признаков

Передайте вектор для поиска Милвусу. настраиватьTOP_K= 10 иDISTANCE_THRESHOLD= 1 (можно изменить по мере необходимости),TOP_Kпредставляет 10 лучших результатов с наибольшим сходством между поиском и вектором запроса,DISTANCE_THRESHOLDПредставляет пороговое значение расстояния между вектором запроса и вектором результатов поиска.

ANN_SIFT1B принимает вычисление евклидова расстояния.После того, как параметры установлены, Milvus возвращает идентификаторы результата запроса, использует идентификаторы для запроса в PostgreSQL и, наконец, смешивает результаты запроса.

# 根据 query_location 从 Query set 中提取需要搜索的向量
vector = load_query_list(QUERY_PATH,query_location)
# 向 Milvus 中传入需要搜索的向量 vectors
status, results = milvus.search_vectors(table_name = MILVUS_TABLE,query_records=vector, top_k=TOP_K)

# 利用 Milvus 返回的 results.ids 到 PostgreSQL 中进行查询
sql = "select * from PG_TABLE_NAME where ids = results.ids ;"

Поиск вектора признаков Milvus занимает всего 70 мс при выполнении гибридного запроса по 100 миллионам данных и не более 7 мс для запроса идентификаторов результатов поиска Milvus в PostgreSQL.

В целом, используя базу данных векторов признаков Milvus, можно быстро реализовать гибридный запрос векторных и структурированных данных. Если для векторного запроса используется только традиционная реляционная база данных, не только сложно хранить крупномасштабные векторные данные, но и невозможно выполнить поиск вектора признаков с высокой производительностью.

Время поиска собственного вектора Милвуса Время поисковых идентификаторов PostgreSQL
70 ms 1 ms ~ 7 ms

Суммировать

Эта демонстрация реализует гибридный запрос на основе Milvus. В случае набора данных из 100 миллионов векторов признаков время гибридного запроса не превышает 77 мс.

И на основе простых в использовании функций Milvus, через ссылкуСхема гибридных запросов MilvusПредоставленные инструменты могут легко реализовать смешанный запрос векторных и структурированных данных и лучше удовлетворить потребности бизнеса.

Milvus создает онлайн-сообщество разработчиков, если вы заинтересованы в технических дискуссиях и испытаниях Milvus, добро пожаловатьПрисоединяйтесь к нашему Slack-каналу, в групповое общение.