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

Lamoda показала конкретный результат: время обработки данных Spark на сопоставимом объёме сократилось с десяти до пяти часов, то есть почти вдвое, без смены оркестратора и хранилищ.
Дата-инженер Lamoda Tech Дмитрий Иванов описал, как команда пришла к «llm_markup», Spark-приложению для массовой разметки текстов через вызовы к LLM API. Проблема знакомая: пока записей мало, хватает Python-скрипта, но на десятках тысяч строк нужны батчинг (объединение строк в пакеты для отправки одним запросом), параллельная отправка, контроль нагрузки на API, повторы при сбоях и сопоставление ответов с исходными данными. Всё это «llm_markup» берёт на себя, а бизнес-логику задаёт конфигурация: источник данных, промпт, формат ответа, лимиты и целевая таблица.
Какие задачи решили в Lamoda?
Два реальных сценария из e-commerce.
- Оценка качества поиска. В fashion-каталоге запросы бывают от «летнее платье» до «adidas rhjccjdrb» (это «adidas кроссовки» в неправильной раскладке клавиатуры). Модели нужно восстановить смысл запроса и определить, насколько каждый товар ему соответствует.
- Классификация негативных отзывов. Другая бизнес-задача, но та же инженерная механика: подать текст, получить метку из заданного словаря.
Оба сценария показали, что общую часть пайплайна (pipeline, последовательность шагов обработки данных) можно отделить от бизнес-логики и переиспользовать. Так и появился универсальный инструмент, в коде которого нет понятий «товар» или «отзыв».
Почему именно Spark, а не простой скрипт?
Вопрос напрашивается: зачем Spark для HTTP-вызовов, если можно написать скрипт на Python с «asyncio»? Команда Lamoda выделяет четыре причины.
- Объёмы. Десятки тысяч строк за один прогон требуют управляемого параллелизма и восстановления после сбоев.
- Источники данных. Инструмент читает из Hive, Feature Storage на HDFS (распределённая файловая система Hadoop) и внешних баз по JDBC. Spark работает с ними в уже настроенном контуре безопасности.
- Оркестрация. Airflow (планировщик задач, который управляет расписанием и зависимостями) уже запускает Spark-приложения. Отдельный сервис для LLM-батчей означал бы ещё один деплой и мониторинг.
- Распределённое исполнение. Spark параллельно выполняет задачи на «executor-ах» (исполняющих узлах) и собирает результат в DataFrame (табличную структуру данных).
Главная идея: Spark используется как распределённый движок для сетевого ввода-вывода, а не только для классических ETL-вычислений (извлечение, преобразование, загрузка данных). Партиции данных независимо обращаются к LLM API, результаты возвращаются в DataFrame.
Что понадобится
- Apache Spark с поддержкой «mapInPandas» (Spark 3.0+)
- Airflow для оркестрации DAG-ов (направленных графов задач)
- Доступ к LLM API (OpenAI-совместимый эндпоинт или аналог)
- Хранилище данных: Hive, HDFS или внешняя база по JDBC
- Python с библиотеками pandas, Jinja2, requests
- Конфигурационный файл: источник, промпт, формат ответа, лимиты, целевая таблица
- Время на первый запуск: по опыту Lamoda, настройка нового сценария не требует изменений в общем Spark-коде
Пошаговая инструкция
-
Подготовьте источник данных. Укажите в конфигурации, откуда читать: таблица Hive, файл на HDFS или внешняя база. Spark прочитает данные в DataFrame.
-
Опишите промпт. Задайте текстовую колонку или Jinja2-шаблон, который соберётся из нескольких колонок DataFrame. Шаблон позволяет передать модели контекст, например название товара и текст запроса одновременно.
-
Настройте батчинг. Если тексты короткие, несколько строк можно отправить в одном LLM-запросе, это сократит долю токенов (единиц текста, которые оплачиваются при вызове модели), уходящих на повторяющиеся инструкции. Для длинных уникальных промптов используйте
batch_size=1и масштабируйте через количество Spark-партиций.
# Пример параметров конфигурации
source: hive_table_name
prompt_template: "templates/search_quality.j2"
batch_size: 5
target_table: results_search_quality
rate_limit: 100 # запросов в минуту
-
Задайте формат ответа. На выходе «llm_markup» может вернуть метки из заданного словаря или типизированные данные по декларативной схеме. Оба варианта используют общий механизм обработки.
-
Запустите через Airflow. Spark-приложение запускается как задача в DAG-е. Конфигурация передаётся executor-ам как broadcast-переменная (копия только для чтения, которую Spark рассылает на исполняющие узлы).
-
Проверьте результат. Итоговая статистика собирается на driver-е (управляющем узле). Результат записывается в целевую таблицу и доступен для BI-дашбордов.
В поисковом сценарии Lamoda на вход подавался запрос пользователя (включая опечатки и неправильную раскладку) и карточка товара. Промпт просил модель восстановить смысл запроса и оценить релевантность товара. На выходе каждая пара «запрос плюс товар» получала метку соответствия. Обработка данных Spark на сопоставимом объёме заняла около пяти часов вместо прежних десяти, по данным Lamoda. Второй сценарий, классификация негативных отзывов, использовал тот же код с другой конфигурацией: сменился промпт и словарь меток, а пайплайн остался прежним.
Бесконечное увеличение батча. Чем больше строк в одном запросе, тем длиннее ответ и тем выше риск, что модель пропустит или перепутает отдельные элементы. Размер батча подбирается для каждого сценария отдельно, качество проверяется на контрольной выборке.
Иллюзия exactly-once. Spark не гарантирует однократное выполнение внешних HTTP-вызовов. Если executor падает после отправки запроса, задача переисполняется и LLM-вызов повторяется. Это нужно учитывать в стоимости и лимитах.
Игнорирование rate limit. Без контроля нагрузки на API обработка данных Spark быстро упрётся в ошибки 429 (слишком много запросов). Ограничение частоты запросов обязательно.
Динамическое масштабирование «из коробки». Автоматическое добавление executor-ов зависит от настройки конкретного Spark-кластера, а не появляется само из кода приложения.
Что с этого вам?
Авторам Дзена и копирайтерам. Если вы пишете о товарах или собираете отзывы, принцип тот же: массовая разметка текстов через LLM экономит часы ручной работы. Даже без Spark можно взять идею батчинга и промпт-шаблонов для своих задач с GPT или YandexGPT.
Маркетологам в e-commerce. Классификация отзывов и оценка поисковой выдачи напрямую влияют на конверсию. Кейс Lamoda показывает, что задачу можно решить внутри существующей инфраструктуры, без отдельного ML-сервиса.
Дата-инженерам и предпринимателям в РФ. Подход работает с любым OpenAI-совместимым API. Из доступных в России LLM: YandexGPT, GigaChat. Если у вас уже есть Spark и Airflow, добавить LLM-звено можно без перестройки пайплайна.
Кейс Lamoda ценен не архитектурой как таковой, а тем, что команда не стала строить отдельный ML-сервис, а встроила LLM в уже работающий контур. Для компаний в РФ с похожим стеком (Spark, Airflow, Hive) это готовый рецепт. Честная оговорка: повтор LLM-вызовов при сбоях executor-а может увеличить расходы на API, особенно если модель дорогая. Считайте бюджет заранее и закладывайте запас на переисполнения. Ещё одно: «пятикратное ускорение» получено на конкретном объёме и конкретном кластере Lamoda, ваши цифры будут другими, но направление верное.
Пишете про технологии и ИИ на Дзене?
Разберитесь, как нейросети меняют работу с контентом, и получите практические инструменты для авторов.
Попробовать dzen.guruПодход Lamoda показывает простую вещь: LLM не обязательно требует нового сервиса, если у вас уже есть распределённый движок. Промпт, конфиг, целевая таблица, и десятки тысяч строк размечены к утру.

Основатель dzen.guru. Эксперт по монетизации и продвижению на Дзен. Автор курса «Старт на Дзен 2026».
Читайте также

Искусственный интеллект съедает чипы памяти: Google ужесточает требования к Android-приложениям с 2027 года
Google с 2027 года ужесточает требования к памяти Android-приложений из-за дефицита чипов, который спровоцировал бум строительства дата-центров для…

Утечка данных Hugging Face: тестовая модель OpenAI сама нашла уязвимости и взломала чужую инфраструктуру
OpenAI 6 августа опубликовала официальный отчёт об инциденте с утечкой данных Hugging Face, где впервые раскрыла полную цепочку событий: как тестовая ИИ-модель…

Plaud выпустила ИИ наушники за $249,99: записывают и конспектируют встречи без смартфона
Plaud представила ИИ наушники Plaud One Explorer Edition, которые записывают, расшифровывают и конспектируют разговоры, а встроенный 4G-модуль в зарядном кейсе…
Комментарии