Поиск с использованием NLP. Что действительно работает и почему

4 июля 2025
Поиск с использованием NLP. Что действительно работает и почему

Ключевые компоненты эффективного поиска документов на основе NLP

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

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

Для эффективного поиска по такому типу данных нам нужен метод, который одновременно масштабируем и лучше понимает язык. Обработка естественного языка (Natural Language Processing, NLP) — раздел искусственного интеллекта, специализирующийся на понимании человеческой речи. Существует несколько полезных инструментов, которые мы можем заимствовать из NLP для эффективного запроса любого типа данных.

Векторы слов

Сначала нам нужно понять, как современные NLP-модели понимают нас. Нейронные сети лежат в основе каждой модели ИИ, и многие люди рассматривают их как сложную или магическую технологию, которая «думает» и производит ответы. В действительности они намного проще. По сути, нейронная сеть (NN) — это машина для сопоставления образцов, которую до недавнего времени у нас не было достаточной вычислительной мощности для запуска в масштабе. Она была изобретена еще в 90-х годах, но получила широкое распространение только недавно. Нейронные сети — обширная тема, и для краткости мы не будем углубляться в нее здесь. Вы можете думать о них как о «черных ящиках», которые «обучаются», когда вы их «тренируете», а затем применяют эти изученные паттерны к данным, которые они никогда раньше не видели. Это может быть очень мощным, и с хорошим обучающим набором мы можем достичь точности предсказаний до 99%.

Как нейронные сети способны понимать человеческую речь? Это многоэтапный процесс. Сначала нам нужно обучить сеть, но на чем ее обучать? Некоторые умные люди пришли к идее обучить нейронную сеть предсказывать следующее слово в последовательности. По сути, обучающие данные — это большие объемы текста, разделенные на фрагменты (например, 11 слов). Вы убираете среднее слово и спрашиваете нейронную сеть: «Какое слово я убрал?» Она предсказывает слово на основе своей внутренней структуры, а затем мы показываем ей правильный ответ и говорим «настрой свои внутренние параметры, чтобы в следующий раз приблизиться к этому ответу».

Для справки, этот тип обучения называется обучением с подкреплением (Reinforced Learning), а самонастройка внутренних параметров называется обратным распространением. Внутренние параметры нейронной сети обычно называются весами, поскольку структура данных за сетью представляет собой взвешенный, однонаправленный граф или взвешенный DAG (Weighted DAG).

Мы можем визуализировать обучение!

Процесс обучения
Процесс обучения

Каждая точка представляет слово; для каждой итерации обучения мы обновляем его позицию на плоскости.

Чтобы прояснить этот процесс далее:

  1. Мы собираем наши обучающие данные, обычно очень большой корпус текста (терабайты).
  2. Мы разбиваем его на фрагменты предопределенного размера (11 в примере) как обучающие входы.
  3. Мы выбираем размер вектора. Это сложно: слишком маленькие векторы не могут захватить все вариации контекста слов; слишком большие векторы увеличивают потребление ресурсов и замедляют обучение с ограниченным улучшением качества. Для справки, популярная модель BERT использует размер вектора 768.
  4. Каждому слову изначально присваивается случайный вектор, и начинается обучение. Каждый вход в нейронную сеть — это векторы слов, и во время обратного распространения эти входные векторы слегка корректируются, чтобы «подогнать» контекст.
  5. В конце все векторы корректируются на основе корпуса, и происходит нечто удивительное: если мы рассматриваем эти векторы как математические векторы, слова, которые часто появляются в одном контексте, находятся близко друг к другу. Более того, векторная арифметика раскрывает отношения типа «King − Man + Woman = Queen» или «»Paris − France + Italy = Rome. Это также может использоваться для обнаружения опечаток.

Если мы увеличим результаты обучения, мы можем увидеть, как выглядят кластеры слов:

Диаграмма кластеров крупным планом
Диаграмма кластеров крупным планом

Это очень мощно и составляет основу каждой большой языковой модели.

Семантический поиск

Теперь, когда мы знаем, что можем делать математику со словами, пора применить это к предложениям и абзацам. Проще говоря, мы берем каждое слово в абзаце, загружаем его вектор из предыдущей модели и получаем массив векторов. Затем мы усредняем эти векторы, чтобы получить единый вектор, представляющий все предложение. (Есть более продвинутые способы сделать это, которые мы пока пропустим.) Этот вектор предложения разделяет схожие свойства с векторами слов: похожие абзацы будут ближе друг к другу при визуализации в 2D или 3D геометрическом пространстве. Вы, вероятно, уже догадываетесь, к чему это ведет.

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

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

Поиск похожих векторов математически дешев — это по сути просто умножение чисел. По сравнению с традиционным полнотекстовым поиском, этот метод значительно быстрее, даже в больших масштабах. Кроме того, он захватывает значение, поэтому если вы включите «красивый» в свой поиск, вы также получите результаты типа «прекрасный», «великолепный», «потрясающий» и так далее.

Фрагментирование

Последний недостающий элемент — как мы разделяем данные, чтобы их было легко искать. Если мы поместим весь документ в единый вектор, этот вектор будет слишком «нейтральным», что означает, что он будет близок к слишком многим вещам. Это нехорошо — нам нужны меньшие, точные фрагменты текста, которые можно идентифицировать между документами. Хороший подход — использовать общий структурированный формат, такой как HTML или Markdown. Мы можем преобразовать все документы в этот формат, а затем разделить их на осмысленные, контекстно-осведомленные абзацы. В качестве альтернативы мы можем просто разделить текст на фрагменты по 200–300 слов и работать с этим. Как и со всем в ИИ, ключом является экспериментирование.

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

Масштабирование

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

Существует класс баз данных, предназначенных для работы с семантическими векторами, называемых векторными базами данных (Vector Databases). Они позволяют нам эффективно хранить и извлекать векторы. Каждый вектор имеет ID, который мы можем использовать для ссылки на фактический текст и метаданные, хранящиеся для абзаца. Некоторые векторные базы данных даже позволяют хранить исходный текст и метаданные в том же элементе, что упрощает извлечение.

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

Инкрементальные обновления: Нам не нужно перегенерировать весь набор векторов — только абзацы, которые были обновлены.

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

Использование GPU вместо CPU: Поиск векторов идеально подходит для GPU. Векторы являются основной частью задач рендеринга, и GPU превосходно справляются с параллельными векторными операциями. Использование мощности GPU здесь может дать 2–3-кратное повышение производительности.


Эффективный поиск документов с использованием NLP основывается на объединении прочных фундаментальных методов — векторов слов и предложений, семантического фрагментирования и масштабируемых векторных баз данных — с практическими инженерными решениями, такими как инкрементальные обновления и горизонтальное масштабирование. Хотя базовые концепции просты, их реальная мощь проявляется при продуманном применении в масштабе к реальным данным.

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

Новости и обзоры

Читать все

Нейросети

смотреть все
Нейросеть MidJourney V6.1 - Генерация изображений

MidJourney V6.1

Мощный генератор изображений на основе текстового описания (Discord + Web)

Генерация изображений
Условно-бесплатно
17 млн
Нейросеть Kinetix - 3D и анимация

Kinetix

Нейросеть для создания 3D-анимации даже без каких-либо знаний

3D и анимация
Бесплатно
Платно — $0.10/emote generated
18 тыс
Нейросеть Veo 2 Google - Генерация видео

Veo 2 Google

Генератор HD-видео, создающий реалистичные сцены в разрешении до 4K. Управляйте движениями камеры и различными визуальными стилями с помощью подсказок

Генерация видео
Бесплатно