Сопоставление фраз со слопом в Milvus 2.6: как повысить точность полнотекстового поиска на уровне фраз
Поскольку объемы неструктурированных данных продолжают расти, а модели ИИ становятся все умнее, векторный поиск стал стандартным уровнем поиска для многих систем ИИ - конвейеров, ИИ-поиска, агентов, рекомендательных систем и т. д. Это работает, потому что он улавливает смысл: не просто слова, которые вводят пользователи, а намерение, стоящее за ними.
Однако после запуска этих приложений в производство команды часто обнаруживают, что семантическое понимание - это только одна сторона проблемы поиска. Многие рабочие нагрузки также зависят от строгих текстовых правил, таких как соответствие точной терминологии, сохранение порядка слов или выявление фраз, имеющих техническое, юридическое или оперативное значение.
Milvus 2.6 устраняет это разделение, внедряя встроенный полнотекстовый поиск непосредственно в векторную базу данных. Благодаря встроенным в основной механизм маркерным и позиционным индексам Milvus может интерпретировать семантический смысл запроса, обеспечивая при этом точные ограничения на уровне ключевых слов и фраз. В результате получается единый поисковый конвейер, в котором смысл и структура усиливают друг друга, а не живут в отдельных системах.
Фразовое соответствие - ключевая часть этой полнотекстовой возможности. Оно определяет последовательности терминов, которые встречаются вместе и по порядку, что крайне важно для обнаружения шаблонов журналов, сигнатур ошибок, названий продуктов и любого текста, в котором порядок слов определяет смысл. В этом посте мы расскажем, как работает Phrase Match в Milvus, как slop добавляет гибкость, необходимую для работы с реальным текстом, и почему эти функции делают гибридный векторно-полнотекстовый поиск не только возможным, но и практичным в рамках одной базы данных.
Что такое Phrase Match?
Phrase Match - это тип полнотекстового запроса в Milvus, который фокусируется на структуре - в частности, на том, появляется ли последовательность слов в одном и том же порядке в документе. Когда гибкость не допускается, запрос ведет себя строго: термины должны встречаться рядом друг с другом и в той же последовательности. Поэтому запрос типа "robotics machine learning" будет соответствовать запросу только в том случае, если эти три слова встречаются в виде непрерывной фразы.
Проблема в том, что реальный текст редко ведет себя так же аккуратно. Естественный язык вносит шум: в него вкрадываются лишние прилагательные, журналы перестраивают поля, названия продуктов обрастают модификаторами, а авторы пишут не с оглядкой на поисковые системы. Строгое совпадение фраз легко нарушается - одно вставленное слово, одна перефразировка или один подмененный термин могут привести к промаху. А во многих системах искусственного интеллекта, особенно в производственных системах, пропуск релевантной строки журнала или фразы, запускающей правило, недопустим.
Milvus 2.6 решает эту проблему с помощью простого механизма: slop. Slop определяет степень свободы действий между терминами запроса. Вместо того чтобы рассматривать фразу как хрупкую и негибкую, slop позволяет вам решить, допустимо ли одно лишнее слово, или два, или даже незначительное изменение порядка слов должно считаться совпадением. Таким образом, поиск по фразе превращается из двоичного теста "прошел-не прошел" в контролируемый, настраиваемый инструмент поиска.
Чтобы понять, почему это важно, представьте, что вы ищете в журналах все варианты знакомой сетевой ошибки "соединение было сброшено одноранговой сетью". На практике ваши журналы могут выглядеть следующим образом:
connection reset by peer
connection fast reset by peer
connection was suddenly reset by the peer
peer reset connection by ...
peer unexpected connection reset happened
На первый взгляд, все они представляют собой одно и то же событие. Но обычные методы поиска не справляются с этой задачей:
BM25 борется со структурой.
Он рассматривает запрос как пакет ключевых слов, игнорируя порядок их появления. Если где-то появляются слова "связь" и "равный", BM25 может высоко проранжировать документ, даже если фраза обратная или не имеет отношения к концепции, которую вы ищете.
Векторный поиск борется с ограничениями.
Вкрапления отлично справляются с передачей смысла и семантических связей, но они не могут обеспечить соблюдение правила "эти слова должны встречаться в такой-то последовательности". Вы можете получить семантически связанные сообщения, но при этом не найти точную структурную схему, необходимую для отладки или соответствия требованиям.
Фразовое соответствие заполняет промежуток между этими двумя подходами. Используя отклонение, вы можете точно определить, насколько допустимы отклонения:
slop = 0- Точное совпадение (Все термины должны встречаться рядом и по порядку).slop = 1- Разрешить одно дополнительное слово (Охватывает распространенные вариации естественного языка с одним вставленным термином).slop = 2- Разрешить несколько вставленных слов (Для более описательных или многословных формулировок).slop = 3- Разрешить переупорядочивание (Поддерживает перевернутые или слабо упорядоченные фразы, что часто является самым сложным случаем в реальном тексте).
Вместо того чтобы надеяться, что алгоритм подсчета "поймет все правильно", вы прямо заявляете о структурной допустимости, которая требуется вашему приложению.
Как работает подбор фраз в Milvus
Работает на основе библиотеки поисковой системы Tantivy, Phrase Match в Milvus реализован на основе инвертированного индекса с позиционной информацией. Вместо того чтобы проверять, встречаются ли термины в документе, он проверяет, что они появляются в правильном порядке и на контролируемом расстоянии.
Приведенная ниже диаграмма иллюстрирует процесс:
1. Токенизация документа (с позициями)
Когда документы вставляются в Milvus, текстовые поля обрабатываются анализатором, который разбивает текст на лексемы (слова или термины) и записывает позицию каждой лексемы в документе. Например, doc_1 разбивается на лексемы как: machine (pos=0), learning (pos=1), boosts (pos=2), efficiency (pos=3).
2. Создание инвертированного индекса
Далее Milvus создает инвертированный индекс. Вместо того чтобы сопоставлять документы с их содержимым, инвертированный индекс сопоставляет каждую лексему с документами, в которых она встречается, вместе со всеми записанными позициями этой лексемы в каждом документе.
3. Сопоставление фраз
При выполнении фразового запроса Milvus сначала использует инвертированный индекс для поиска документов, содержащих все лексемы запроса. Затем он проверяет каждого кандидата, сравнивая позиции лексем, чтобы убедиться, что термины появляются в правильном порядке и в пределах допустимого расстояния slop. В качестве совпадений возвращаются только документы, удовлетворяющие обоим условиям.
На приведенной ниже диаграмме кратко показано, как работает сквозной поиск фраз.
Как включить поиск фраз в Milvus
Подбор фраз работает с полями типа VARCHARстроковый тип в Milvus. Чтобы использовать его, вы должны настроить схему коллекции таким образом, чтобы Milvus выполнял анализ текста и сохранял позиционную информацию для поля. Это делается путем включения двух параметров: enable_analyzer и enable_match.
Установите enable_analyzer и enable_match
Чтобы включить функцию Phrase Match для конкретного поля VARCHAR, при определении схемы поля установите оба параметра в значение True. Вместе они указывают Milvus:
токенизировать текст (через
enable_analyzer), ипостроить инвертированный индекс с позиционными смещениями (через
enable_match).
Фразовое соответствие опирается на оба шага: анализатор разбивает текст на лексемы, а индекс соответствия хранит места появления этих лексем, обеспечивая эффективные запросы на основе фраз и слоупоков.
Ниже приведен пример конфигурации схемы, включающей функцию Phrase Match для поля text:
from pymilvus import MilvusClient, DataType
schema = MilvusClient.create_schema(enable_dynamic_field=False)
schema.add_field(
field_name=“id”,
datatype=DataType.INT64,
is_primary=True,
auto_id=True
)
schema.add_field(
field_name=‘text’, # Name of the field
datatype=DataType.VARCHAR, # Field data type set as VARCHAR (string)
max_length=1000, # Maximum length of the string
enable_analyzer=True, # Enables text analysis (tokenization)
enable_match=True # Enables inverted indexing for phrase matching
)
schema.add_field(
field_name=“embeddings”,
datatype=DataType.FLOAT_VECTOR,
dim=5
)
Поиск с помощью фразового соответствия: Как слоп влияет на набор кандидатов
После того, как вы включили соответствие для поля VARCHAR в схеме коллекции, вы можете выполнять фразовые соответствия, используя выражение PHRASE_MATCH.
Примечание: Выражение PHRASE_MATCH не зависит от регистра. Вы можете использовать либо PHRASE_MATCH, либо phrase_match.
При поиске совпадение фраз обычно применяется перед ранжированием по векторному сходству. Сначала он фильтрует документы на основе явных текстовых ограничений, сужая набор кандидатов. Оставшиеся документы затем повторно ранжируются с помощью векторных вкраплений.
В примере ниже показано, как различные значения slop влияют на этот процесс. Настраивая параметр slop, вы напрямую контролируете, какие документы проходят фразовый фильтр и переходят к этапу векторного ранжирования.
Предположим, у вас есть коллекция с именем tech_articles, содержащая следующие пять сущностей:
| doc_id | текст |
|---|---|
| 1 | Машинное обучение повышает эффективность анализа крупномасштабных данных |
| 2 | Освоение машинного подхода жизненно важно для развития современного ИИ |
| 3 | Архитектуры машин глубокого обучения оптимизируют вычислительную нагрузку |
| 4 | Машина быстро улучшает производительность модели для непрерывного обучения |
| 5 | Изучение передовых машинных алгоритмов расширяет возможности ИИ |
slop=1
Здесь мы допускаем отклонение в 1. Фильтр применяется к документам, содержащим фразу "обучающаяся машина", с небольшой гибкостью.
# Example: Filter documents containing "learning machine" with slop=1
filter_slop1 = "PHRASE_MATCH(text, 'learning machine', 1)"
result_slop1 = client.search(
collection_name=“tech_articles”,
anns_field=“embeddings”,
data=[query_vector],
filter=filter_slop1,
search_params={“params”: {“nprobe”: 10}},
limit=10,
output_fields=[“id”, “text”]
)
Результаты поиска:
| doc_id | текст |
|---|---|
| 2 | Обучение машинному подходу жизненно важно для современного прогресса ИИ |
| 3 | Архитектуры машин глубокого обучения оптимизируют вычислительную нагрузку |
| 5 | Изучение передовых машинных алгоритмов расширяет возможности ИИ |
slop=2
В данном примере допускается отклонение 2, то есть между словами "машина" и "обучение" допускается до двух дополнительных лексем (или обратных терминов).
# Example: Filter documents containing "machine learning" with slop=2
filter_slop2 = "PHRASE_MATCH(text, 'machine learning', 2)"
result_slop2 = client.search(
collection_name=“tech_articles”,
anns_field=“embeddings”, # Vector field name
data=[query_vector], # Query vector
filter=filter_slop2, # Filter expression
search_params={“params”: {“nprobe”: 10}},
limit=10, # Maximum results to return
output_fields=[“id”, “text”]
)
Результаты поиска:
| doc_id | текст |
|---|---|
| 1 | Машинное обучение повышает эффективность анализа крупномасштабных данных |
| 3 | Архитектуры машин глубокого обучения оптимизируют вычислительную нагрузку |
slop=3
В этом примере значение slop, равное 3, обеспечивает еще большую гибкость. Фильтр ищет "машинное обучение", при этом между словами допускается не более трех позиций лексем.
# Example: Filter documents containing "machine learning" with slop=3
filter_slop3 = "PHRASE_MATCH(text, 'machine learning', 3)"
result_slop2 = client.search(
collection_name=“tech_articles”,
anns_field=“embeddings”, # Vector field name
data=[query_vector], # Query vector
filter=filter_slop3, # Filter expression
search_params={“params”: {“nprobe”: 10}},
limit=10, # Maximum results to return
output_fields=[“id”, “text”]
)
Результаты поиска:
| doc_id | текст |
|---|---|
| 1 | Машинное обучение повышает эффективность анализа крупномасштабных данных |
| 2 | Освоение машинного подхода жизненно важно для развития современного ИИ |
| 3 | Архитектуры машин глубокого обучения оптимизируют вычислительную нагрузку |
| 5 | Изучение передовых машинных алгоритмов расширяет возможности ИИ |
Быстрые советы: Что нужно знать перед включением функции поиска фраз в Milvus
Функция Phrase Match обеспечивает поддержку фильтрации на уровне фраз, но ее включение требует не только настройки во время запроса. Прежде чем применять эту функцию в производственных условиях, необходимо ознакомиться с соответствующими соображениями.
Включение функции Phrase Match для поля создает инвертированный индекс, что увеличивает расход памяти. Точные затраты зависят от таких факторов, как длина текста, количество уникальных лексем и конфигурация анализатора. При работе с большими текстовыми полями или данными с высокой кардинальностью эти накладные расходы следует учитывать заранее.
Конфигурация анализатора - еще один важный выбор при проектировании. Как только анализатор определен в схеме коллекции, его нельзя изменить. Для последующего перехода на другой анализатор требуется удалить существующую коллекцию и создать ее заново с новой схемой. По этой причине к выбору анализатора следует относиться как к долгосрочному решению, а не как к эксперименту.
Поведение Phrase Match тесно связано со способом токенизации текста. Прежде чем применять анализатор ко всей коллекции, рекомендуется использовать метод
run_analyzer, чтобы проверить результат токенизации и убедиться, что он соответствует вашим ожиданиям. Этот шаг поможет избежать тонких несоответствий и неожиданных результатов запроса в дальнейшем. Для получения дополнительной информации см. раздел Обзор анализаторов.
Заключение
Phrase Match - это основной тип полнотекстового поиска, который обеспечивает ограничения на уровне фразы и позиции, выходящие за рамки простого сопоставления ключевых слов. Оперируя порядком и близостью лексем, он обеспечивает предсказуемый и точный способ фильтрации документов на основе того, как термины на самом деле встречаются в тексте.
В современных поисковых системах фразовое соответствие обычно применяется перед векторным ранжированием. Сначала он ограничивает набор кандидатов документами, которые явно удовлетворяют требуемым фразам или структурам. Затем векторный поиск используется для ранжирования этих результатов по семантической релевантности. Эта схема особенно эффективна в таких сценариях, как анализ журналов, поиск технической документации и конвейеры RAG, где текстовые ограничения должны быть соблюдены до того, как будет рассмотрено семантическое сходство.
С введением параметра slop в Milvus 2.6, Phrase Match стал более терпимым к вариациям естественного языка, сохранив при этом свою роль механизма полнотекстовой фильтрации. Это облегчает применение ограничений на уровне фраз в производственных поисковых процессах.
👉 Попробуйте это с помощью демонстрационных скриптов и изучите Milvus 2.6, чтобы понять, как поиск с учетом фразы вписывается в ваш стек.
У вас есть вопросы или вы хотите получить подробную информацию о любой функции последней версии Milvus? Присоединяйтесь к нашему каналу Discord или создавайте проблемы на GitHub. Вы также можете записаться на 20-минутную индивидуальную сессию, чтобы получить знания, рекомендации и ответы на свои вопросы в Milvus Office Hours.
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word



