Вопросы для собеседования ML-инженера
Готовый набор для интервьюера: 36 вопросов с тезисами эталонного ответа, задача, рубрика и план встречи.
На собеседовании ML-инженера хорошо работает схема на 60 минут: 3-4 устных вопроса по стеку, одна задача на live coding, проектирование для middle и выше и вопросы кандидата. Ниже вопросы по грейдам из базы Техпрогона: у каждого тезисы, которые должен назвать сильный кандидат.
Всего в базе по этой роли 253 устных вопросов с чек-листом ответа.
Как построить техсобес на 60 минут
0-5 мин
Знакомство
Кто вы, формат встречи, кандидат коротко о себе и последнем проекте.
5-20 мин
Вопросы по стеку
3-4 устных вопроса из набора ниже. Сверяйте ответ с тезисами.
20-45 мин
Live coding
Одна задача. Смотрите на процесс по рубрике, а не только на ответ.
45-55 мин
Проектирование
Для middle и выше: система или решение целиком. Для junior: ещё вопросы.
55-60 мин
Вопросы кандидата
Что спросил кандидат, тоже сигнал: интерес к задачам и команде.
Junior: 12 вопросов
Основы: как устроено и зачем. Хватит 3-4 вопросов на встречу.
Напишите вслух декоратор, который логирует время выполнения функции, и объясните каждую строку.
Что хотим услышать
- Внешняя функция принимает
func, возвращает обёртку - Обёртка принимает
*args, **kwargsи передаёт их дальше - Возвращает результат
func functools.wrapsсохраняет имя и docstring- Время через
time.perf_counter, вывод вfinallyили после вызова - Код декоратора выполняется при определении, обёртки при каждом вызове
Если ответил, копните глубже
Объясните, что такое регуляризация в линейных моделях, чем отличаются L1 и L2 и как выбирать коэффициент.
Что хотим услышать
- Регуляризация штрафует сложность (величину весов) и снижает переобучение
- L2 уменьшает веса равномерно, помогает при мультиколлинеарности
- L1 обнуляет часть весов, работает как отбор признаков
- Перед регуляризацией признаки нужно масштабировать
- λ подбирается кросс-валидацией по логарифмической сетке
Если ответил, копните глубже
Объясните, как обучается нейросеть: что происходит на прямом и обратном проходе и как обновляются веса.
Что хотим услышать
- Прямой проход: вычисление выходов слой за слоем и loss, сохранение активаций
- Обратный проход: цепное правило от loss к первому слою
- Для слоя: градиент по весам δ·xᵀ, по входу Wᵀδ
- Шаг оптимизатора по градиентам, обнуление градиентов
- Батчи и эпохи, повторение до сходимости
Если ответил, копните глубже
Объясните, как языковая модель превращает ваш вопрос в ответ.
Что хотим услышать
- Текст режется токенайзером на токены, у каждого номер в словаре
- Токены превращаются в векторы, проходят слои трансформера с вниманием
- На выходе распределение вероятностей следующего токена
- Токен выбирается сэмплированием и добавляется в контекст, цикл повторяется
- Состояния между запросами нет, всё знание о диалоге в контексте
- Галлюцинации: модель выдаёт правдоподобное, а не проверенное
Если ответил, копните глубже
Объясните теорему Байеса на примере медицинского теста. Почему положительный тест на редкую болезнь часто ложный?
Что хотим услышать
- Называет приор, правдоподобие и апостериор
- Различает P(+ | болен) и P(болен | +)
- Считает пример с числами, например через 10 000 человек
- Объясняет роль базовой частоты: здоровых намного больше
- Связь с ML: precision при редком классе
Если ответил, копните глубже
Объясни, что такое контейнер и чем он отличается от виртуальной машины. Какие механизмы Linux лежат в основе?
Что хотим услышать
- Контейнер это процесс (или группа) на ядре хоста, а не отдельная ОС
- Namespaces изолируют видимость: PID, сеть, ФС, hostname, пользователи
- Cgroups ограничивают ресурсы: память, CPU, число процессов
- Файловая система из слоёв образа плюс записываемый слой (overlay2, copy-on-write)
- ВМ эмулирует железо и запускает своё ядро: изоляция сильнее, старт медленнее, накладные расходы больше
- Следствия: общее ядро, быстрый старт, данные в контейнере эфемерны
Если ответил, копните глубже
ps?Объясните разницу между вертикальным и горизонтальным масштабированием и когда что выбирать.
Что хотим услышать
- Вертикальное: мощнее машина, код не меняется, есть предел и единая точка отказа
- Горизонтальное: больше узлов, нужен stateless или распределённое состояние
- Stateless-сервисы приложения масштабируют горизонтально в первую очередь
- БД часто сначала масштабируют вертикально и репликами, шардирование позже
- Горизонтальное даёт отказоустойчивость, но добавляет сложность
Если ответил, копните глубже
Объясни, как ты оцениваешь временную и пространственную сложность своего решения на собесе.
Что хотим услышать
- Называет, что такое n (и m, если входов несколько)
- Считает циклы: вложенные перемножаются, последовательные складываются
- Помнит скрытые циклы: includes, indexOf, slice, sort, spread
- Отдельно оценивает память, включая стек рекурсии
- Сравнивает с ограничениями: при n до 10⁵ O(n²) уже не годится
Если ответил, копните глубже
arr.slice() внутри цикла?Назовите ваши сильные стороны.
Что хотим услышать
- Две-три стороны, а не список из десяти
- Каждая подкреплена примером
- Стороны связаны с вакансией
- Нет пустых слов вроде «стрессоустойчивый, коммуникабельный» без доказательств
- Уверенно, без хвастовства
Если ответил, копните глубже
Как вы управляете зависимостями и окружениями в Python-проекте?
Что хотим услышать
- Отдельное виртуальное окружение на проект
- Зависимости в
pyproject.toml, разделение на основные и dev - Lock-файл с точными версиями для воспроизводимости
- Инструмент: uv, Poetry или pip-tools
- Обновления зависимостей контролируемо, проверка уязвимостей
- В Docker ставить по lock-файлу
Если ответил, копните глубже
requirements.txt отличается от lock-файла?Объясните, как строится ROC-кривая и что такое ROC-AUC.
Что хотим услышать
- Перебор порогов от высокого к низкому
- По осям FPR и TPR (recall)
- Диагональ это случайная модель, AUC 0.5
- AUC это вероятность правильно упорядочить случайную пару
- Не зависит от порога и монотонных преобразований скоров, но не видит калибровку
Если ответил, копните глубже
Опишите правильный цикл обучения и валидации на PyTorch: что и в каком порядке вызывается.
Что хотим услышать
- Модель и данные на одно устройство, оптимизатор и, если есть, scheduler
- Трейн: model.train(), shuffle, zero_grad, forward, loss, backward, step
- Валидация: model.eval(), torch.no_grad(), метрики по всем объектам
- Логирование loss.item(), сохранение лучшего чекпоинта
- Возврат в train() после валидации, сиды для воспроизводимости
Если ответил, копните глубже
Middle: 12 вопросов
Практика: почему так, какие компромиссы, что ломается.
Чем asyncio отличается от многопоточности? Когда вы выберете одно, а когда другое?
Что хотим услышать
- asyncio: один поток, кооперативная многозадачность, переключение на await
- Потоки: вытесняющая многозадачность ОС, переключение где угодно
- Корутины дешёвые, тысячи соединений; поток дороже по памяти
- asyncio требует асинхронных библиотек, блокирующий вызов стопорит всё
- Потоки для синхронных библиотек и небольшого числа задач
- Ни то, ни другое не ускоряет CPU-bound код
Если ответил, копните глубже
Задача с 0.2% положительных (например, мошенничество). Расскажите вашу стратегию от данных до порога.
Что хотим услышать
- Метрики: PR-AUC, recall при фиксированной precision, стоимость ошибок
- Разбиение со стратификацией и честное распределение в валидации
- Модель: бустинг с весами классов или без, сравнить
- Семплирование только внутри фолда, калибровка после
- Порог по бизнес-стоимости и ёмкости проверки, мониторинг
Если ответил, копните глубже
Loss не падает с первых шагов. Как вы будете искать причину?
Что хотим услышать
- Переобучиться на одном маленьком батче: если не получается, баг в коде
- Проверить данные и метки: соответствие, нормализация, перемешивание
- Проверить loss и выход: логиты против вероятностей, правильный reduction
- Проверить цикл: zero_grad, backward, step, режим train, requires_grad
- Подбор lr, нормы градиентов по слоям, инициализация
Если ответил, копните глубже
Вы делаете агента, который по просьбе сотрудников работает с CRM: ищет клиентов, меняет статусы сделок, отправляет письма. Как сделаете его безопасным?
Что хотим услышать
- Узкие инструменты вместо универсальных, минимальные права
- Идентичность и права из сессии, а не из аргументов модели
- Подтверждение человеком для отправки писем и массовых изменений
- Лимиты шагов, бюджета, частоты действий
- Защита от инъекций через данные CRM и письма
- Аудит и трейсинг всех действий, возможность отката
Если ответил, копните глубже
Сравните MLE и MAP. Когда разница существенна? Приведите пример из практики.
Что хотим услышать
- MLE смотрит только на данные, MAP добавляет приор
- MAP = MLE + регуляризация (гауссов приор ↔ L2, лапласов ↔ L1)
- Разница велика при малых данных, исчезает при больших
- Пример: CTR нового объявления с 1 кликом из 2 показов
- Оба дают точечную оценку, в отличие от полного байесовского вывода
Если ответил, копните глубже
Тебя просят провести ревью безопасности контейнеризованного сервиса. На что посмотришь?
Что хотим услышать
- Образ: минимальная база, multi-stage, нет лишних утилит, свежие патчи, скан на CVE в CI
- Пользователь: не root, числовой UID,
runAsNonRootв Kubernetes - Права:
cap-drop ALL, без--privileged, безdocker.sock,no-new-privileges - ФС: read-only корень, запись только в tmpfs и тома
- Секреты: не в образе и не в ENV в git, а через секреты оркестратора или хранилище
- Ресурсы и сеть: лимиты памяти, CPU, PID; не публиковать лишние порты
Если ответил, копните глубже
Расскажите, по какому плану вы будете вести секцию system design на 60 минут.
Что хотим услышать
- Начинаю с уточнения функциональных требований и явно фиксирую, что не делаем
- Уточняю нефункциональные требования: масштаб, задержка, доступность, консистентность
- Делаю грубую оценку RPS и объёмов и использую её в решениях
- Описываю API и модель данных, выбираю хранилище под паттерн доступа
- Рисую высокоуровневую схему и прохожу по ней путь запроса
- Оставляю время на узкие места, отказы, масштабирование и мониторинг
Если ответил, копните глубже
Объясни решение задачи «минимальное число монет для суммы» и его сложность. Почему тут не подходит жадность?
Что хотим услышать
- Показывает контрпример для жадности
- Формулирует состояние: dp[s] минимум монет для суммы s
- Переход: dp[s] = min(dp[s - c] + 1) по монетам
- База dp[0] = 0, остальные Infinity, недостижимо → -1
- O(S · k) времени, O(S) памяти
Если ответил, копните глубже
Почему вы ищете новую работу?
Что хотим услышать
- Причина через цель, а не через бегство
- Ни слова негатива о текущем работодателе
- Показано, что на текущем месте был рост и результаты
- Связка с этой вакансией
- Коротко: до минуты
Если ответил, копните глубже
Расскажите, как устроен dict и почему поиск в нём быстрый. Что будет при плохой хеш-функции?
Что хотим услышать
- Хеш-таблица: ключ -> hash -> слот
- Коллизии решаются открытой адресацией, ключи сравниваются через ==
- Среднее O(1), худшее O(n), расширение при заполнении
- Ключ должен быть хешируемым, хеш стабилен, равные объекты имеют равный хеш
- Порядок вставки гарантирован с 3.7, компактное хранение
- Рандомизация хеша строк защищает от атак на коллизии
Если ответил, копните глубже
Как вы выбираете метрику качества для новой задачи классификации? Приведите пример.
Что хотим услышать
- От бизнес-цели и цены ошибок FP и FN
- Учёт баланса классов: при редком классе PR-AUC, precision@k, recall при фиксированной precision
- Нужны ли вероятности: тогда log loss, Brier, калибровка
- Офлайн-метрика для сравнения моделей и решение по порогу отдельно
- Проверка связи офлайн-метрики с онлайн-эффектом
Если ответил, копните глубже
Объясните, как работает self-attention, зачем нужны Q, K, V, масштабирование, несколько голов и маски.
Что хотим услышать
- Каждый токен проецируется в запрос, ключ и значение
- Веса внимания: softmax от QKᵀ / √d_k по ключам; выход это взвешенная сумма V
- Масштаб √d_k против насыщения softmax
- Multi-head: разные подпространства и типы связей
- Маски: причинная в декодере, паддинг; позиционное кодирование, так как attention не видит порядок
- Сложность O(n²) и KV-кеш на генерации
Если ответил, копните глубже
Senior: 12 вопросов
Глубина и опыт: границы подходов, решения в продакшене.
Ваш Python-сервис стал отвечать медленно. Как вы будете искать причину и что можете сделать?
Что хотим услышать
- Метрики и трейсы: какой эндпоинт, p95/p99, где время (БД, внешние API, CPU)
- Профилирование: py-spy на живом процессе, cProfile локально
- Типичные причины: N+1 запросы, отсутствие индексов, синхронные вызовы в async, неверные структуры данных
- Исправления: батчи и prefetch, кеш, индексы, перенос тяжёлого в фон
- CPU-bound: алгоритм, встроенные функции, numpy, процессы
- Проверка результата нагрузочным тестом
Если ответил, копните глубже
Продакт просит «сделать ML, чтобы клиенты меньше уходили». Как вы превратите это в ML-задачу?
Что хотим услышать
- Уточнить бизнес-цель и действие: что сделаем с прогнозом (скидка, звонок)
- Определить целевую переменную и горизонт: отток за 30 дней, что считается оттоком
- Момент прогноза и признаки только из прошлого, без утечек
- Метрики: офлайн (PR-AUC, uplift) и бизнес (сохранённая выручка), бейзлайн
- Проверка эффекта экспериментом, подумать про uplift-модель
Если ответил, копните глубже
Расскажите, как менялись функции активации от сигмоиды до SwiGLU и чем каждая решала проблемы предыдущей.
Что хотим услышать
- Сигмоида и tanh: насыщение, затухание градиента, сигмоида не центрирована
- ReLU: нет насыщения справа, дёшево, но мёртвые нейроны
- LeakyReLU, ELU: ненулевой градиент слева
- GELU, SiLU: гладкие, стандарт в трансформерах
- Гейтированные (GLU, SwiGLU) в MLP-блоках LLM
Если ответил, копните глубже
Расскажите, как вы бы использовали LLM-as-judge для оценки чат-бота и как защититься от его ошибок.
Что хотим услышать
- Рубрика с конкретными критериями, лучше бинарные вопросы
- Эталон или контекст в промпте судьи
- Калибровка на ручной разметке, согласие с людьми
- Борьба с искажениями: перестановка, штраф за многословие, другая семья моделей
- Выборочная ручная проверка на масштабе
- Версии судьи как часть оценочного конвейера
Если ответил, копните глубже
Объясните, как MSE и кросс-энтропия выводятся из метода максимального правдоподобия.
Что хотим услышать
- MLE: максимизировать Σ log p(yᵢ | xᵢ, θ), то есть минимизировать отрицательный log-likelihood
- Регрессия: y ~ N(f(x), σ²) даёт MSE
- Классификация: y ~ Бернулли(p(x)) даёт binary cross-entropy
- Многоклассовая: категориальное распределение даёт softmax с кросс-энтропией
- Другое распределение шума даёт другую потерю (Лаплас: MAE, Пуассон: Poisson loss)
Если ответил, копните глубже
Под периодически перезапускается с OOMKilled. Как найдёшь причину и что предложишь?
Что хотим услышать
- Подтвердить:
describe(Reason OOMKilled, 137), не путать с Evicted - Посмотреть график памяти контейнера до падения: резкий пик или постоянный рост (утечка)
- Сравнить лимит с реальным пиком; проверить лимит кучи рантайма (JVM, Node, Go) относительно лимита контейнера
- Учесть всю память процесса: нативные буферы, потоки, page cache в cgroup
- Утечка: профилирование кучи, heap dump, сравнение снимков
- Решение: исправить утечку или ограничить кучу, выставить лимит по данным, requests = limits для памяти
Если ответил, копните глубже
Спроектируйте мессенджер с личными и групповыми чатами, доставкой в реальном времени и историей.
Что хотим услышать
- Требования: личные и групповые чаты до 1 000 участников, доставка онлайн и офлайн (push), история, статусы «доставлено» и «прочитано»; порядок сообщений в чате; медиа и сквозное шифрование вне рамок
- Оценка нагрузки: 50 млн DAU по 40 сообщений ≈ 2 млрд в сутки ≈ 20 000 RPS записи, в пике ~60 000; 10 млн одновременных соединений, ~100 000 на gateway → ~100 gateway; 2 млрд × 200 байт ≈ 400 ГБ в сутки, ~150 ТБ в год без реплик
- API: WebSocket: send {chat_id, client_msg_id, text}, ack {msg_id}, события new_message, read; HTTP: GET /chats/{id}/messages?before=...
- Данные: чаты и участники в PostgreSQL, сообщения в Cassandra/ScyllaDB с ключом партиции chat_id и сортировкой по msg_id, реестр user_id → gateway в Redis с TTL
- Компоненты: gateway-серверы с соединениями, сервис сообщений (сохранить, присвоить id, разослать), сервис присутствия, push-сервис для офлайн, очередь для фан-аута в группах
- Узкие места: большие группы (фан-аут через очередь), дубли при переотправке (client_msg_id для идемпотентности), переподключения и догрузка пропущенного, горячие чаты, падение gateway
Если ответил, копните глубже
Вы претендуете на senior. Расскажите о себе.
Что хотим услышать
- Назван масштаб: команда, нагрузка, пользователи или деньги
- Есть решения, которые повлияли дальше своего кода
- Есть метрики результата
- Упомянуто влияние на команду: менторинг, процессы, ревью
- Уложился в 2 минуты, не утонул в деталях
Если ответил, копните глубже
Чем typing.Protocol отличается от abc.ABC? Когда что выбрать?
Что хотим услышать
- ABC: номинальная типизация, нужно наследование или register
- ABC проверяет абстрактные методы при создании экземпляра в рантайме
- Protocol: структурная типизация, достаточно совпадения методов
- Protocol удобен для сторонних классов и фейков в тестах
@runtime_checkableдля isinstance, проверяет только наличие методов
Если ответил, копните глубже
isinstance с runtime_checkable протоколом?Спроектируйте систему обнаружения мошеннических платежей для банка: решение по платежу нужно за 100 мс.
Что хотим услышать
- Требования: латентность, цена пропуска и ложной блокировки, действия (блок, доп. проверка, разбор аналитиком)
- Данные и метки: задержка меток (чарджбэки), selective labels, дисбаланс
- Признаки: профиль клиента батчем, скоростные признаки в реальном времени, устройство и граф связей
- Модель: бустинг, правила как первая линия, пороги по стоимости, калибровка
- Валидация по времени, метрики recall при фиксированной доле блокировок, PR-AUC
- Прод: онлайн-инференс, feature store, мониторинг дрейфа, holdout для меток, быстрое переобучение
Если ответил, копните глубже
Объясните, как квантуют большие языковые модели до 4 бит и почему это работает с небольшими потерями.
Что хотим услышать
- Квантуются в основном веса, активации остаются в bf16 (weight-only)
- Групповое квантование с масштабом на группу (например 128 весов)
- Выбросы и чувствительные каналы: методы учитывают важность весов (GPTQ, AWQ и подобные)
- Выигрыш: память и скорость в memory-bound декодировании
- Проверка: перплексия и задачи, особенно рассуждения и длинный контекст
Если ответил, копните глубже
RAG-бот по внутренней документации отвечает плохо. Как будете искать причину и улучшать?
Что хотим услышать
- Собрать оценочный набор вопросов с релевантными чанками и эталонами
- Разделить метрики: recall@k и MRR поиска, верность и полнота ответа
- Если плох поиск: очистка, чанкинг, заголовки в чанках, гибрид, переписывание запроса, реранкер
- Если плоха генерация: промпт, объём и порядок контекста, цитаты, модель
- Разбирать конкретные провалы из логов, а не только средние
- Каждое изменение проверять на наборе, чтобы не сломать остальное
Если ответил, копните глубже
Задача для live coding
Сгруппировать анаграммы
Напишите group_anagrams(words): верните список групп слов-анаграмм. Слова внутри группы в порядке появления, группы в порядке первого появления. Регистр учитывается.
- Подсказка, если застрял: Что одинаково у всех анаграмм? Отсортированные буквы.
- Подсказка, если застрял: Словарь «ключ -> список слов» и
setdefault.
Эталон, тесты и таймер открываются интервьюеру в живом моке
Рубрика оценки: 1-4 балла
Те же критерии процесса, что в живом моке Техпрогона. Ставьте балл по каждому пункту, сумма показывает картину лучше, чем «понравился или нет».
Уточнил условие
Ограничения, формат входа, что вернуть при пустом вводе
Привёл примеры до кода
Обычный случай и хотя бы один краевой
Проговорил алгоритм словами
До того как писать код
Назвал сложность
По времени и по памяти
Написал рабочий код
Тесты прошли
Сам проверил краевые случаи
Прогнал в голове пустой ввод, один элемент, дубликаты
Нашёл и исправил ошибку сам
Или ошибок не было с первого раза
Мок-собес без регистрации для интервьюера
Хотите проверить кандидата на задаче с эталоном и рубрикой? Так работает живой мок в Техпрогоне.
Кандидат готовится в Техпрогоне и на задаче открывает ступень «Живой мок».
Он присылает вам ссылку. Вы открываете её без регистрации.
У вас условие, эталон, рубрика, уточняющие вопросы и таймер.
Вы ставите оценки и вердикт, кандидат сразу видит результат.
Для интервьюера бесплатно. Ссылку создаёт кандидат на тарифе Рывок
Наборы для других ролей
Готовитесь к собесу сами? Подготовка к собеседованию: ML/LLM-инженер