Представляем Milvus 2.5: полнотекстовый поиск, более мощная фильтрация метаданных и улучшения в удобстве использования!
Обзор
Мы рады представить вам последнюю версию Milvus, 2.5, в которой появилась новая мощная возможность: полнотекстовый поиск, также известный как лексический поиск или поиск по ключевым словам. Если вы новичок, то полнотекстовый поиск позволяет находить документы по определенным словам или фразам в них, подобно тому, как вы ищете в Google. Это дополняет наши существующие возможности семантического поиска, который понимает смысл вашего поиска, а не просто подбирает точные слова.
Мы используем стандартную для отрасли метрику BM25 для сходства документов, и наша реализация основана на разреженных векторах, что позволяет более эффективно хранить и извлекать информацию. Для тех, кто не знаком с этим термином, разреженные векторы - это способ представления текста, в котором большинство значений равны нулю, что делает их очень эффективными для хранения и обработки - представьте себе огромную электронную таблицу, в которой только несколько ячеек содержат числа, а остальные пусты. Такой подход хорошо вписывается в философию продукта Milvus, где вектор является основным объектом поиска.
Еще одним примечательным аспектом нашей реализации является возможность вставлять и запрашивать текст напрямую, а не заставлять пользователей вручную преобразовывать текст в разреженные векторы. Это еще на один шаг приближает Milvus к полноценной обработке неструктурированных данных.
Но это только начало. С выходом версии 2.5 мы обновили дорожную карту продуктов Milvus. В будущих итерациях Milvus мы сосредоточимся на развитии возможностей Milvus в четырех ключевых направлениях:
- Оптимизированная обработка неструктурированных данных;
- Повышение качества и эффективности поиска;
- Более простое управление данными;
- Снижение затрат за счет совершенствования алгоритмов и дизайна.
Наша цель - создать инфраструктуру данных, способную как эффективно хранить, так и эффективно извлекать информацию в эпоху ИИ.
Полнотекстовый поиск с помощью Sparse-BM25
Несмотря на то что семантический поиск, как правило, лучше понимает контекст и намерения, когда пользователю нужно найти конкретные имена существительные, серийные номера или полностью совпадающую фразу, полнотекстовый поиск с подбором ключевых слов часто дает более точные результаты.
Проиллюстрируем это на примере:
- Семантический поиск лучше, когда вы задаете вопрос: "Найти документы о решениях в области возобновляемых источников энергии".
- Полнотекстовый поиск лучше, когда вам нужно: "Найти документы, в которых упоминается Tesla Model 3 2024".
В нашей предыдущей версии (Milvus 2.4) пользователям приходилось предварительно обрабатывать текст с помощью отдельного инструмента (модуля BM25EmbeddingFunction к PyMilvus) на собственной машине, прежде чем они могли искать его. Этот подход имел несколько ограничений: он не мог хорошо обрабатывать растущие наборы данных, требовал дополнительных шагов по настройке и делал весь процесс сложнее, чем нужно. Для технически подкованных людей основными ограничениями были: возможность работы только на одной машине; невозможность обновления словарного запаса и другой статистики корпуса, используемой для оценки BM25, по мере изменения корпуса; преобразование текста в векторы на стороне клиента - менее интуитивная работа с текстом напрямую.
Milvus 2.5 все упрощает. Теперь вы можете работать с текстом напрямую:
- Хранить исходные текстовые документы в том виде, в каком они есть.
- Поиск с помощью запросов на естественном языке
- Получайте результаты в удобочитаемом виде.
За кулисами Milvus автоматически обрабатывает все сложные векторные преобразования, упрощая работу с текстовыми данными. Это то, что мы называем нашим подходом "Doc in, Doc out" - вы работаете с читаемым текстом, а мы делаем все остальное.
Техническая реализация
Для тех, кто интересуется техническими деталями, Milvus 2.5 добавляет возможность полнотекстового поиска через встроенную реализацию Sparse-BM25, включая:
- Токенизатор, построенный на tantivy: Milvus теперь интегрируется с процветающей экосистемой tantivy.
- Возможность вводить и получать необработанные документы: Поддержка прямого ввода и запроса текстовых данных
- Скоринг релевантности BM25: Интернализация скоринга BM25, реализованного на основе разреженного вектора
Мы решили работать с хорошо развитой экосистемой tantivy и построить текстовый токенизатор Milvus на базе tantivy. В будущем Milvus будет поддерживать больше токенизаторов и раскрывать процесс токенизации, чтобы помочь пользователям лучше понять качество поиска. Мы также будем изучать токенизаторы на основе глубокого обучения и стратегии стеммеров для дальнейшей оптимизации производительности полнотекстового поиска. Ниже приведен пример кода для использования и настройки токенизатора:
# Tokenizer configuration
schema.add_field(
field_name='text',
datatype=DataType.VARCHAR,
max_length=65535,
enable_analyzer=True, # Enable tokenizer on this column
analyzer_params={"type": "english"}, # Configure tokenizer parameters, here we choose the english template, fine-grained configuration is also supported
enable_match=True, # Build an inverted index for Text_Match
)
После настройки токенизатора в схеме коллекции пользователи могут зарегистрировать текст в функции bm25 с помощью метода add_function. Это будет выполняться внутри сервера Milvus. Все последующие потоки данных, такие как добавления, удаления, модификации и запросы, могут быть завершены путем работы с необработанной текстовой строкой, а не с векторным представлением. Ниже приведен пример кода для получения текста и проведения полнотекстового поиска с помощью нового API:
# Define the mapping relationship between raw text data and vectors on the schema
bm25_function = Function(
name="text_bm25_emb",
input_field_names=["text"], # Input text field
output_field_names=["sparse"], # Internal mapping sparse vector field
function_type=FunctionType.BM25, # Model for processing mapping relationship
)
schema.add_function(bm25_function)
...
# Support for raw text in/out
MilvusClient.insert('demo', [
{'text': 'Artificial intelligence was founded as an academic discipline in 1956.'},
{'text': 'Alan Turing was the first person to conduct substantial research in AI.'},
{'text': 'Born in Maida Vale, London, Turing was raised in southern England.'},
])
MilvusClient.search(
collection_name='demo',
data=['Who started AI research?'],
anns_field='sparse',
limit=3
)
Мы приняли реализацию скоринга релевантности BM25, которая представляет запросы и документы в виде разреженных векторов, под названием Sparse-BM25. Это открывает множество оптимизаций, основанных на разреженном векторе, таких как:
Milvus достигает гибридных возможностей поиска благодаря своей передовой реализации Sparse-BM25, которая интегрирует полнотекстовый поиск в архитектуру векторной базы данных. Представляя частоты терминов в виде разреженных векторов вместо традиционных инвертированных индексов, Sparse-BM25 позволяет использовать такие передовые оптимизации, как индексация графов, квантование по произведению (PQ) и скалярное квантование (SQ). Эти оптимизации минимизируют использование памяти и ускоряют производительность поиска. Подобно подходу с инвертированным индексом, Milvus поддерживает прием исходного текста и внутреннюю генерацию разреженных векторов. Благодаря этому он может работать с любым токенизатором и находить любые слова в динамически меняющемся корпусе.
Кроме того, эвристическая обрезка отбрасывает малозначимые разреженные векторы, что еще больше повышает эффективность без ущерба для точности. В отличие от предыдущего подхода, использующего разреженный вектор, он может адаптироваться к растущему корпусу, а не к точности оценки BM25.
- Построение графовых индексов на разреженном векторе, который работает лучше, чем инвертированный индекс, на запросах с длинным текстом, поскольку инвертированному индексу требуется больше шагов для завершения сопоставления лексем в запросе;
- Использование методов аппроксимации для ускорения поиска с незначительным влиянием на качество поиска, таких как квантование вектора и обрезка на основе эвристики;
- Унификация интерфейса и модели данных для выполнения семантического и полнотекстового поиска, что повышает удобство работы пользователя.
# Creating an index on the sparse column
index_params.add_index(
field_name="sparse",
index_type="AUTOINDEX", # Default WAND index
metric_type="BM25" # Configure relevance scoring through metric_type
)
# Configurable parameters at search time to speed up search
search_params = {
'params': {'drop_ratio_search': 0.6}, # WAND search parameter configuration can speed up search
}
В итоге Milvus 2.5 расширил возможности поиска за пределы семантического поиска, внедрив полнотекстовый поиск, что облегчает пользователям создание высококачественных приложений ИИ. Это лишь первые шаги в пространстве поиска Sparse-BM25, и мы ожидаем, что в будущем будут предприняты дополнительные меры по оптимизации.
Фильтры поиска по совпадению текста
Вторая функция текстового поиска, выпущенная в Milvus 2.5, - это Text Match, которая позволяет пользователю отфильтровать поиск по записям, содержащим определенную текстовую строку. Эта функция также построена на основе токенизации и активируется с помощью enable_match=True
.
Стоит отметить, что при использовании Text Match обработка текста запроса основана на логике ИЛИ после токенизации. Например, в приведенном ниже примере в результате будут возвращены все документы (по полю 'text'), содержащие либо 'vector', либо 'database'.
filter = "TEXT_MATCH(text, 'vector database')"
Если в вашем сценарии требуется найти и 'vector', и 'database', то вам нужно написать два отдельных текстовых совпадения и наложить на них AND, чтобы достичь цели.
filter = "TEXT_MATCH(text, 'vector') and TEXT_MATCH(text, 'database')"
Значительное повышение производительности скалярной фильтрации
Наш акцент на производительности скалярной фильтрации связан с тем, что мы обнаружили, что сочетание векторного поиска и фильтрации метаданных может значительно повысить производительность и точность запросов в различных сценариях. Эти сценарии варьируются от приложений для поиска изображений, таких как идентификация углов в автономном вождении, до сложных сценариев RAG в корпоративных базах знаний. Таким образом, эта технология очень удобна для корпоративных пользователей и может быть использована в сценариях применения крупномасштабных данных.
На практике на производительность может влиять множество факторов, таких как объем фильтруемых данных, их организация и способ поиска. Для решения этой проблемы в Milvus 2.5 представлены три новых типа индексов - индекс битовой карты, инвертированный индекс массива и инвертированный индекс после токенизации текстового поля Varchar. Эти новые индексы могут значительно повысить производительность в реальных сценариях использования.
В частности:
- BitMap Index может использоваться для ускорения фильтрации по тегам (общие операторы включают in, array_contains и т. д.) и подходит для сценариев с меньшим количеством данных категории полей (кардинальность данных). Принцип заключается в том, чтобы определить, имеет ли строка данных определенное значение в столбце, причем 1 означает "да", а 0 - "нет", а затем сохранить список BitMap. На следующей диаграмме показано сравнение тестов производительности, проведенное нами на основе бизнес-сценария заказчика. В этом сценарии объем данных составляет 500 миллионов, категория данных - 20, различные значения имеют разные пропорции распределения (1 %, 5 %, 10 %, 50 %), и производительность при различных объемах фильтрации также различается. При 50-процентной фильтрации мы можем добиться 6,8-кратного прироста производительности за счет BitMap Index. Стоит отметить, что при увеличении кардинальности, по сравнению с BitMap Index, Inverted Index демонстрирует более сбалансированную производительность.
- Text Match основан на инвертированном индексе после токенизации текстового поля. Его производительность значительно превосходит функцию Wildcard Match (т. е. like + %), которую мы представили в 2.4. Согласно результатам наших внутренних тестов, преимущества Text Match очень очевидны, особенно в сценариях одновременных запросов, где она позволяет добиться 400-кратного прироста QPS.
Что касается обработки данных JSON, то в последующих версиях 2.5.x мы планируем внедрить построение инвертированных индексов для заданных пользователем ключей и запись информации о местоположении по умолчанию для всех ключей для ускорения парсинга. Мы ожидаем, что оба этих направления значительно повысят производительность запросов в JSON и Dynamic Field. Мы планируем представить больше информации в будущих заметках о выпуске и технических блогах, так что следите за новостями!
Новый интерфейс управления
Управление базой данных не должно требовать степени по информатике, но мы знаем, что администраторам баз данных нужны мощные инструменты. Именно поэтому мы представили Cluster Management WebUI- новый веб-интерфейс, доступный по адресу вашего кластера через порт 9091/webui. Это средство наблюдения обеспечивает:
- панели мониторинга в реальном времени, отображающие метрики всего кластера
- Подробную аналитику памяти и производительности для каждого узла
- Информация о сегментах и отслеживание медленных запросов
- Индикаторы состояния системы и статус узла
- Простые в использовании средства устранения неисправностей для решения сложных системных проблем
Пока этот интерфейс находится в стадии бета-версии, но мы активно развиваем его на основе отзывов администраторов баз данных. Будущие обновления будут включать диагностику с помощью искусственного интеллекта, более интерактивные функции управления и расширенные возможности наблюдения за кластером.
Документация и опыт разработчиков
Мы полностью переработали нашу документацию и SDK/API, чтобы сделать Milvus более доступным, сохранив при этом глубину для опытных пользователей. Улучшения включают в себя:
- Реорганизованная система документации с более четким переходом от базовых к продвинутым концепциям
- Интерактивные учебные пособия и реальные примеры, демонстрирующие практическую реализацию
- Исчерпывающие ссылки на API с практическими примерами кода
- Более удобный дизайн SDK, упрощающий выполнение общих операций
- Иллюстрированные руководства, облегчающие понимание сложных концепций
- Помощник по работе с документацией на основе искусственного интеллекта (ASK AI) для быстрого получения ответов.
Обновленный SDK/API нацелен на улучшение работы разработчиков благодаря более интуитивно понятному интерфейсу и лучшей интеграции с документацией. Мы уверены, что вы заметите эти улучшения при работе с серией 2.5.x.
Однако мы знаем, что разработка документации и SDK - это непрерывный процесс. Мы продолжим оптимизировать структуру контента и дизайн SDK на основе отзывов сообщества. Присоединяйтесь к нашему каналу Discord, чтобы поделиться своими предложениями и помочь нам в дальнейшем совершенствовании.
Резюме
Milvus 2.5 содержит 13 новых функций и несколько оптимизаций на системном уровне, внесенных не только Zilliz, но и всем сообществом разработчиков. В этом посте мы затронули лишь некоторые из них и рекомендуем вам посетить наш релиз и официальные документы для получения более подробной информации!
- Обзор
- Полнотекстовый поиск с помощью Sparse-BM25
- Фильтры поиска по совпадению текста
- Значительное повышение производительности скалярной фильтрации
- Новый интерфейс управления
- Документация и опыт разработчиков
- Резюме
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