Скрытый мир (векторных) индексов

Тайный мир (векторных) индексов

Все, что вы всегда хотели знать о векторных индексах, но боялись спросить.

С момента публичного выпуска ChatGPT прошел едва ли не один день без нового контента, обсуждающего LLM, RAG и векторные базы данных. Мир технологий гудит от возможностей LLM, которые считаются последними технологиями, способными изменить наши жизни: наилучшим образом для кого-то, наихудшим образом для других. Вместе с ними Ретриивная Аугментированная Генерация (RAG) выступает в качестве динамического решения, способного адаптироваться к постоянно меняющейся обстановке области знаний. Но есть и ключевой игрок, находящийся за кулисами: векторные индексы и базы данных.

В то время как LLM, RAG и векторные базы данных активно обсуждаются, векторные (и векторные) индексы, которые делают эти инновации возможными, менее известны. В этой статье мы разъясним понятие индексов, чтобы помочь вам понять, как индекс облегчает поиск информации в обширных коллекциях.

1. Что такое индекс?

Мы все сталкивались с такой ситуацией. Вы встречаетесь с другом у нее дома. Единственная информация, которую она дала вам, звучит так: “Я живу в районе Метро-Таун”. Когда вы прибываете в этот самый район Метро-Таун:

Фотография Мэнсона Йима на Unsplash

Ну, без всякой помощи займет время найти ее место! Если бы только была карта у входа…

Вот в чем суть индексов: как быстро найти местонахождение людей (или данных).

Желтые страницы – это индекс, позволяющий найти дома людей по их именам.

Индекс – это структура данных, созданная для ускорения операций по извлечению данных. Другими словами, это то, как вы организуете информацию, чтобы можно было быстро найти то, что вы ищете.

Данные индексируются с помощью ключей. Порядок основан на ключах, и можно использовать несколько ключей. В желтых страницах первый ключ – это фамилия, а второй – имя.

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

Индекс в конце книги – хороший пример: он показывает вам, где найти страницы с использованием слова, поэтому он отображает каждое слово на номера страниц, а не на сами предложения.

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

Выбор способа организации ваших данных критически важен и зависит от контекста.

Например, в случае желтых страниц, если индексы были бы организованы по телефонным номерам, и вы знали только имена, то поиск их адресов был бы довольно сложным!

Информация есть; вы в конечном итоге ее найдете, но требуемое время помешает вам даже попробовать. С другой стороны, при использовании желтых страниц один взгляд на страницу позволяет точно определить, нужно ли вам смотреть назад или вперед! Лексикографический порядок позволяет сделать примерно логарифмический поиск. Вот почему выбор индекса является важным.

В общем, индекс имеет очень конкретную цель: он может быть разработан для выполнения быстрых вставок или извлечений данных или более экзотического запроса, такого как диапазонный запрос (“извлеките все данные, датированные с 1 мая по 15 августа текущего года”). Выбор операции для оптимизации определит внешний вид индекса.

Основное различие между онлайн-транзакционной обработкой (OLTP) и онлайн-аналитической обработкой (OLAP) баз данных заключается в выборе операций, которые они хотят оптимизировать: OLTP сосредоточен на операциях над строками (например, обновление записи), в то время как другой нацелен на операции над столбцами (вычисление среднего, например). Оба типа баз данных не будут использовать одни и те же индексы, так как они не целесообразны для одних и тех же операций.

1.1 В чем разница между индексами и структурами данных?

💡 Структура данных – это способ организации и хранения данных в компьютере таким образом, чтобы их можно было эффективно получать и обрабатывать. Если объяснить так, то иногда трудно увидеть разницу между индексами и структурами данных, поэтому в чем заключается разница? Индексы фокусируются на вставке, поиске, сортировке или фильтрации данных. Структуры данных более универсальны.

Индексы создаются с использованием структур данных, но обычно сами данные не хранят.

Если рассмотреть базу данных фильмов, вы не хотите перемещать большие файлы, когда индекс обновляется: вы храните указатель на файл, а не сам файл. Указатель можно рассматривать как адрес файла на диске.

Теперь, когда у вас есть общее представление о том, что такое индекс, давайте сосредоточимся на числовых примерах. Вот некоторые распространенные (числовые) индексы:

  • Обратный индекс
  • Хэш-индексы
  • B-деревья
  • Hashing с учетом локальности (LSH).

Чтобы лучше понять, как работают индексы, давайте рассмотрим один из самых базовых индексов: обратный индекс.

1.2 Обратный индекс

Обратный индекс – это стандартный индекс, используемый в поисковых системах.

Он предназначен для быстрого поиска информации: его цель – оптимизация времени получения данных.

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

Например, предположим, вы хотите узнать, кто живет в том же здании.

Сначала у вас должна быть таблица, в которой для каждого имени есть здание (таблица, которая помогла бы вам найти Алису):

Эта таблица обновляется, когда человек приезжает или уезжает из района.

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

Хотя это технически возможно, это не масштабируется, поскольку время вычисления будет линейно увеличиваться с размером таблицы.

Подумайте о количестве квартир в районе: если вы хотите найти всех людей, живущих в здании B, проверяя все профили один за другим, это займет некоторое время!

Другое решение – использовать обратный индекс: вы поддерживаете таблицу, где здания используются в качестве ключей и связываются с людьми, живущими в них:

Эта таблица поддерживается одновременно с предыдущей: стоимость добавления или удаления нового человека немного выше, чем раньше, но время получения данных сократилось до почти нуля!

Чтобы найти, кто живет в здании B, вам просто нужно получить доступ к строке “Здание B” в этой таблице и получить результат!

Обратный поиск телефона – это обратный индекс номеров телефонов!

На практике обратные индексы немного сложнее, так как они обрабатывают более сложные данные, чем пара (пользователь, интерес). Индексы обычно хранятся в виде хэш-таблиц.

Несмотря на их относительную простоту, обратные индексы являются одними из наиболее распространенных индексов, используемых в поисковых системах.

1.3 Индексы и базы данных

Базы данных созданы на основе индексов. Индексы усиливают извлечение данных в базе данных, храня указатели или ссылки на данные базы данных. Они не хранят фактические данные, но служат средством быстрого доступа к ним, улучшая производительность запросов.

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

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

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

2. Векторные индексы и векторные базы данных

2.1 Что такое векторный индекс?

Вкратце, векторный индекс – это индекс, в котором ключи представляют собой векторы.

В нашем примере обратного индекса ключами были слова (хобби и имена). В векторных индексах мы оперируем векторами: последовательностями чисел фиксированного размера.

Two vectors of size 4.

Понимаю, понимаю, я слышу, как вы говорите: «Я плохо разбираюсь в математике, я не хочу использовать векторы».

Не беспокойтесь, чтобы понять векторные индексы, вам не нужно хорошо разбираться в математике.

Все, что вам нужно знать, это то, что использование векторов позволяет полагаться на мощные и оптимизированные операции.

Первый вопрос, который может возникнуть у вас, – «Что такого интересного в ваших векторах»?

Представьте, что вы наконец нашли Алису у себя дома и теперь хотите найти что-нибудь поесть. Возможно, вы захотите найти ближайший ресторан. Вы ищете список ресторанов и в результате получаете таблицу ресторанов, специальностей и адресов. Давайте взглянем на информацию, которую можно найти:

Похоже, это не помогает, верно? Ваш единственный вариант – просмотреть список, читая адреса один за другим и вручную определять, насколько он близок к вам. Мы можем попытаться автоматизировать ранжирование ближайшего места, но вычисление расстояний на основе сырых адресов сложно (две улицы могут быть рядом, но иметь разные названия).

Однако представьте себе, что у вас есть таблица с GPS-позициями, представляющими точные широту и долготу каждого ресторана:

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

Теперь вы легко можете найти ближайший ресторан к вам!

Интересный момент заключается в том, что, индексируя таблицу напрямую с использованием вектора (GPS-позиция в этом примере), мы можем оптимизировать индекс таким образом, чтобы поиск записей с наименьшим расстоянием был чрезвычайно быстрым.

Векторные индексы – это специализированные индексы, разработанные для эффективного поиска векторов, наиболее близких или похожих на заданный вектор. Эти индексы полагаются на оптимизированные математические операции для эффективной идентификации наиболее похожих векторов.

В нашем примере использовалось классическое расстояние, но существуют индексы для всех существующих расстояний или сходств, таких как косинусная метрика сходства.

Locality Sensitive Hashing (LSH) – один из наиболее широко используемых индексов для поиска k наиболее похожих точек данных в наборе данных, и он работает с разными расстояниями или сходствами.

«Это здорово, но я не использую векторы в своей базе данных».

Вот увлекательная часть: вы можете превратить вектором что угодно.

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

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

Например, если у вас есть набор изображений, и вы хотите иметь базу данных, где можно найти изображения, наиболее похожие на заданное, вы можете использовать дескриптор SIFT изображений.

2.2 В чем разница между векторными индексами и векторными базами данных?

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

Теперь, когда вы узнали о векторных индексах, вам может быть интересно, почему так много обсуждений LLM и RAG также затрагивают векторные индексы. Чтобы понять почему, давайте сперва быстро объясним, что такое Retrieval Augmented Generation, или RAG. АГ служит умной заплаткой для одного из внутренних ограничений LLM, а именно их ограниченного знания.

LLM знает только о данных, на которых он был обучен. Один из способов увеличить его знания – это инжиниринг запросов, где в запрос включаются дополнительные данные: “Имея эти данные {данные}, ответьте на этот вопрос: {вопрос}”.

Хотя эффективный, этот подход сталкивается с новым вызовом: масштабируемостью. Не только размер подсказки ограничен, но чем больше данных вы включаете, тем дороже становится запрос.

Чтобы преодолеть это, Retrieval Augmented Generation ограничивает количество данных, вставляя только самые похожие данные, и вот тут и приходят в игру векторные индексы!

Вот как это работает: все документы сначала преобразуются в векторы с использованием LLM (1). Более конкретно, используется часть кодировщика LLM.

Эти векторы используются в качестве ключей для индексации документов в векторном индексе (2).

При выполнении запроса запрос также векторизуется с помощью LLM (3). Полученный вектор затем запрашивается в векторном индексе для извлечения наиболее похожих документов (4). Затем эти документы используются для ответа на запрос с помощью инжиниринга запросов (5).

Вот и все!

Как видите, подобно LLM, векторный индекс занимает центральное положение в RAG.

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

Заключение

Поздравляю смелых, кто дочитал до конца! Я верю, что у вас теперь есть все фоновые знания, чтобы принимать участие в этих страстных обсуждениях о LLM и RAG.

Индексы занимают ключевую роль в поиске данных. Поскольку поиск данных, вероятно, останется ключевым компонентом технологий данных, важно понимать, о чем говорят индексы, включая векторные индексы.

Если вы хотите узнать о более продвинутых индексах, я бы порекомендовал прочитать мою статью о LSH. Если вы хотите узнать что-то более практическое и интересно попробовать реальное Retrieval Augmented Generation (RAG) в действии, рекомендуется изучить LLM-app, где вы можете самостоятельно ощутить силу этих технологий.