Профи.ру встроил LLM поверх Elasticsearch: 150 000 запросов в час без замены движка
Дмитрий, лид отдела семантики в Профи.ру, рассказал, как команда встроила языковую модель в поиск услуг поверх Elasticsearch, не выбрасывая классический алгоритм, а используя LLM как дополнительный слой нормализации и понимания запросов.
Профи.ру обрабатывает около 150 тысяч поисковых запросов в час, и большинство клиентов выбирают услугу, не набрав даже десяти символов. Связка Elasticsearch LLM решает задачи, с которыми чистый полнотекстовый поиск справляется плохо: опечатки с переключением раскладки, разговорные синонимы и нечёткие формулировки на русском языке.
Профи.ру публично поделился архитектурой своего поиска. Компания не стала менять Elasticsearch на что-то модное, а добавила языковую модель отдельным слоем. Опыт ценен тем, что показывает реальный, а не лабораторный путь: работающий продукт с живой нагрузкой, жёсткими требованиями к скорости ответа и российской спецификой языка.
Что понадобится
- Elasticsearch (полнотекстовый поисковый движок, который хранит каталог и выполняет базовый поиск по совпадениям)
- Языковая модель (LLM), развёрнутая как отдельный сервис, не вместо, а рядом с Elasticsearch
- Redis (быстрое хранилище для кеширования коротких и частотных запросов)
- Нормализатор запросов: модуль, который приводит слова к базовой форме, исправляет раскладку и снимает опечатки до отправки в поисковый индекс
- Мониторинг: Zabbix, Metabase или аналоги для отслеживания времени ответа и ошибок
- Каталог услуг с синонимами и частотностью, обновляемый через админку
Три режима поиска, которые должна покрывать архитектура
Прежде чем встраивать LLM, полезно понять, какие задачи поиск решает в Профи.ру. Их три, и каждая предъявляет свои требования.
Определить услугу. Клиент пишет «уроки английского», система должна понять, что речь об услуге «репетитор по английскому языку». После этого подключаются другие системы: формируют вопросы клиенту, собирают задачу и показывают её подходящим специалистам.
Найти конкретного специалиста. Клиент вводит имя или фамилию и ищет профиль. Здесь работает прямой поиск по индексу.
Распознать запрос вне каталога. Некоторые услуги Профи.ру не оказывает. Поиск должен вовремя это понять и не вести клиента по стандартному сценарию оформления заказа.
Поиск при этом вызывается не только на главной странице, но и внутри визардов (пошаговых сценариев создания задачи), где свободный текст клиента проверяется на лету.
Как устроен базовый поиск до LLM?
Архитектура выглядит так: веб, мобильный веб и приложения отправляют запрос через GraphQL-контур (корпоративную шину данных). Через шлюз он попадает в сервис поиска, а оттуда идёт обращение к Elasticsearch.
Индекс обновляется раз в сутки. Контентные менеджеры управляют значениями через внутреннюю админку. При необходимости переиндексацию можно запустить вручную, но в Профи.ру пользуются этим редко.
До отправки в Elasticsearch запрос проходит нормализацию:
- Слова приводятся к базовой форме
- Порядок слов учитывается для финального скоринга (оценки релевантности), но не является жёстким ограничением
- Исправляется неверная раскладка клавиатуры
- Игнорируется часть опечаток
- Подставляются синонимы и альтернативные написания услуг
- Запрос сравнивается с формулировками из каталога
После нормализации начинается алгоритмический скоринг. Каждый найденный вариант получает внутренний вес: чем ближе текст пользователя к услуге в каталоге, тем выше позиция. Полное совпадение даёт максимальный вес, частичное совпадение по отдельным словам даёт более низкий.
Если запрос неоднозначный (например, просто «репетитор»), в выдачу попадают разные направления. Тогда, помимо текстового соответствия, система учитывает частотность услуги: при прочих равных более востребованные варианты оказываются выше.
Цель: больше 90% выборов клиентов должны приходиться на первые пять результатов, а в идеале на первые три.
Почему Elasticsearch LLM, а не вместо?
Базовый поиск отвечает примерно за 150 миллисекунд. Порог, после которого команда считает, что с сервисом что-то не так: 250 миллисекунд на 95-м перцентиле (то есть 95 из 100 запросов должны уложиться быстрее). Ошибки отслеживаются с нулевой терпимостью: одна ошибка создаёт предупреждение, десять отправляют алерт в команду.
При таких требованиях полная замена Elasticsearch на LLM была бы рискованной: инференс (вычисление ответа языковой моделью) занимает больше времени и менее предсказуем по задержкам. Поэтому команда Профи.ру выбрала гибридную схему, где LLM работает дополнительным слоем.
Короткие частотные запросы (а большинство клиентов выбирают услугу, не набрав и десяти символов, пик приходится примерно на семь) хорошо кешируются в Redis и вообще не требуют обращения к языковой модели. LLM подключается там, где классический алгоритм буксует: нечёткие формулировки, разговорные описания потребности, смешение раскладок.
Нагрузку дополнительно снижает архитектура на фронтенде: дебаунс и тротлинг (механизмы, которые не отправляют запрос на каждый введённый символ, а ждут паузы в наборе) отсекают лишние обращения.
Клиент вводит «нужен электрик». Нормализатор приводит запрос к базовой форме. Elasticsearch находит совпадения в каталоге услуг. Если запрос нечёткий, например «пачинить стералку» (опечатка плюс разговорная форма), классический алгоритм может не справиться. Тогда LLM-слой распознаёт намерение: «ремонт стиральной машины», и передаёт нормализованный вариант обратно в поисковый скоринг. Клиент видит нужную услугу в первых строках выдачи, не догадываясь, что за кулисами работали два разных движка.
Заменять Elasticsearch на LLM целиком. Языковая модель медленнее и дороже на каждый запрос. При 150 тысячах запросов в час разница в стоимости и задержках становится критической. LLM как единственный движок поиска пока не выдерживает требований к скорости отклика, которые есть у продуктов с живым трафиком.
Отправлять каждый символ на инференс. Без дебаунса и кеширования нагрузка на LLM-слой вырастет на порядок, а пользователь не получит результат быстрее.
Игнорировать мониторинг. Профи.ру отслеживает время ответа по перцентилям, число ошибок, клики по позициям выдачи. Без этих метрик невозможно понять, помогает LLM-слой или мешает.
Забывать про русскоязычную специфику. Раскладка, падежные формы, разговорные сокращения («англ» вместо «английский язык») требуют нормализации до поиска, а не вместо него. LLM помогает, но ручной каталог синонимов никуда не уходит.
Что делать с этим прямо сейчас, по ролям
Автору на Дзене. Подход Профи.ру можно перенести на внутренний поиск по контенту: если у вас блог с сотнями статей, LLM-слой поверх обычного поиска по сайту поможет читателям находить материал по смыслу, а не только по точным словам. Начните с кеширования частотных запросов, это даст эффект без затрат на модель.
Маркетологу. Связка Elasticsearch LLM показывает, как снизить процент «нулевых» поисковых сессий (когда клиент ничего не нашёл и ушёл). Если ваш продукт теряет конверсию на этапе поиска, гибридная схема дешевле полной замены движка.
Предпринимателю в РФ. Опыт Профи.ру показывает, что для российского продукта с русскоязычными запросами не обязательно разворачивать дорогую инфраструктуру с нуля. Elasticsearch остаётся основой, LLM подключается точечно. Из доступных в РФ языковых моделей для слоя нормализации можно рассматривать YandexGPT и GigaChat, хотя выбор зависит от задачи и бюджета.
Подход Профи.ру подкупает честностью: команда не выбросила работающий стек ради хайпа вокруг LLM, а встроила модель туда, где классический алгоритм действительно слабеет. По моим наблюдениям, большинство российских продуктовых команд, которые пробуют LLM в поиске, начинают именно с такой гибридной схемы, и это разумно. Модель закрывает хвост нечётких запросов, а Elasticsearch держит скорость и предсказуемость на основном потоке. Честная оговорка: команда не раскрыла, какую именно языковую модель использует и сколько стоит инференс на их объёмах. Без этих цифр повторить схему один в один не получится, но архитектурный принцип «LLM как слой, а не замена» переносится на любой стек.
Главный урок из опыта Профи.ру: языковая модель в поиске работает не вместо инженерии, а поверх неё. Кеширование, нормализация, скоринг, мониторинг с нулевой терпимостью к ошибкам никуда не уходят. LLM закрывает щели, в которые проваливался классический алгоритм, и именно эта роль пока приносит реальную пользу живому продукту.
Попробуйте инструменты dzen.guru для авторов
Если вы создаёте контент на Дзене и хотите, чтобы читатели находили ваши статьи по смыслу, а не только по ключевым словам, протестируйте наши инструменты для работы с нейросетями.
Попробовать
Основатель dzen.guru. Эксперт по монетизации и продвижению на Дзен. Автор курса «Старт на Дзен 2026».
Читайте также

LLM-конвейер молча теряет записи: три бага, которые не видны в сводке
Конвейеры на базе больших языковых моделей (LLM, от англ. Large Language Model) часто теряют записи так, что итоговые проверки показывают успех, а пользователь…

Cursor отменяет подписки в России: как оплатить Cursor AI в России уже неважно, есть Codex за те же $20
Cursor начал отменять платные подписки пользователей из России: 5 сентября появились сообщения о письмах, в которых сервис ссылается на работу из запрещённого…
Нейросеть, вероятность и статистика расходов: как тратить миллиард токенов в день за $20
Текст содержит практический опыт русскоязычного разработчика по оптимизации расходов на подписки нейросетей. Автор описывает конкретные модели, цены, лайфхаки…
Комментарии