CV-пайплайн для поиска разных авто в одном объявлении
Спроектируйте систему, которая по фото и метаданным объявления определяет, что в карточке или истории автомобиля появились разные машины.
Сначала проговорите ответ вслух или тезисами.
Формулы, план решения, риски и примеры.
Откройте разбор только после своей попытки.
Показать разбор
Короткий ответ
Сегментировать/кропнуть авто, определить тип фото, сравнить сопоставимые изображения embeddings-моделью, агрегировать distances и метаданные в финальный скоринг.
Подробный разбор
Хорошее решение разделяет CV extraction и decision layer. Сначала фильтруются невалидные фото и определяются ракурсы, затем для сопоставимых пар считаются embeddings и cosine distances. Финальный классификатор вроде CatBoost использует агрегаты расстояний вместе с табличными полями объявления.
В production нужны пороги под precision, очередь модерации, мониторинг drift и feedback loop из решений модераторов.
Типичные ошибки
- Сравнивать все фото без учета ракурса.
- Полагаться только на embedding threshold.
- Не калибровать precision под цену false positive.
Как сказать на собеседовании
- Сначала уточни business action и цену ошибки.
- Потом переходи к данным, модели, метрикам и эксплуатации.
Датасет и hard negatives для visual difference
Как собрать датасет для модели, которая отличает один и тот же автомобиль от визуально похожего другого?
Сначала проговорите ответ вслух или тезисами.
Формулы, план решения, риски и примеры.
Откройте разбор только после своей попытки.
Показать разбор
Короткий ответ
Нужны positives, easy negatives, hard negatives и явная разметка типов отличий; синтетика полезна как bootstrap, но реальные пары критичны.
Подробный разбор
Стартовать можно с истории объявлений, жалоб и эвристик по VIN/карточке, но пары нужно валидировать ассессорами. Hard negatives должны быть визуально близкими: та же модель, поколение и цвет, но другой автомобиль. Разметку лучше делать multi-label: цвет, колеса, кузов, салон, другие детали.
Важно контролировать leakage между train/test по объявлениям и источникам, иначе метрики будут завышены.
Типичные ошибки
- Считать синтетику полноценной заменой real-world data.
- Делать слишком легкие negatives.
- Не размечать тип отличия.
Как сказать на собеседовании
- Объясни, как будешь улучшать датасет итеративно после ошибок модели.
Обучение visual embeddings для сравнения объектов
Какие loss, backbone и augmentations уместны для embeddings-модели, сравнивающей изображения объектов?
Сначала проговорите ответ вслух или тезисами.
Формулы, план решения, риски и примеры.
Откройте разбор только после своей попытки.
Показать разбор
Короткий ответ
Подойдет EfficientNet/MobileNet/ConvNeXt backbone с contrastive/triplet loss, аккуратным pair mining и аугментациями, не меняющими целевой признак.
Подробный разбор
Backbone выбирают по latency/quality tradeoff. Triplet или contrastive loss требуют правильных positives и hard negatives. Аугментации должны сохранять label: crop, brightness, contrast и малые rotations допустимы, но flip может менять семантику. Для color-difference задач color jitter применяют синхронно к обеим картинкам пары или ограничивают.
Оценивать нужно не только embedding distance, но и downstream decision после агрегации по ракурсам.
Типичные ошибки
- Сделать модель инвариантной к признаку, который надо детектировать.
- Не майнить hard negatives.
- Оценивать только accuracy.
Как сказать на собеседовании
- Проговори invariance vs sensitivity.
- Отдельно скажи про hard negative mining.
Подмассив с заданной суммой
Реализуйте функцию find_subarray_with_sum(nums, target), которая возвращает любой непустой непрерывный подмассив, сумма которого равна target.
Если такого подмассива нет, верните None.
В массиве могут быть отрицательные числа, поэтому sliding window с двумя указателями в общем случае не подходит. Пустой подмассив не считается ответом, даже если target = 0.
Сигнатура
def find_subarray_with_sum(nums: list[int], target: int) -> list[int] | None:
Пример
find_subarray_with_sum([1, 2, 3, 7, 5], 12) -> [2, 3, 7]Решение прямо на странице
Напишите код, запустите проверки и только потом открывайте разбор.
Нажмите «Запустить проверки» или Ctrl+Enter.
Показать разбор
Подсказки
- Префиксная сумма
Сумма от j + 1 до i равна prefix[i] - prefix[j].
- Что хранить в словаре
Храните первую позицию, где встретилась каждая префиксная сумма.
- Нулевой индекс
Добавьте seen = {0: -1}, чтобы корректно находить подмассивы с начала массива.
Идея решения
Подход: используем префиксные суммы. Если текущая префиксная сумма равна prefix, то нужен предыдущий префикс prefix - target. Разница между этими двумя префиксами и есть сумма непрерывного подмассива.
Сохраняем первую позицию каждой префиксной суммы. Инициализация seen = {0: -1} позволяет находить подмассив, который начинается с нулевого индекса.
Почему не два указателя: в массиве могут быть отрицательные числа, поэтому при расширении окна сумма не обязана монотонно расти.
Эталонный код
def find_subarray_with_sum(nums: list[int], target: int) -> list[int] | None:
seen: dict[int, int] = {0: -1}
prefix = 0
for i, value in enumerate(nums):
prefix += value
need = prefix - target
if need in seen:
start = seen[need] + 1
if start <= i:
return nums[start:i + 1]
if prefix not in seen:
seen[prefix] = i
return NoneМетрики для ML-модерации и anti-фрод
Какими offline и product metrics оценивать модель, которая отправляет подозрительные объявления на модерацию?
Сначала проговорите ответ вслух или тезисами.
Формулы, план решения, риски и примеры.
Откройте разбор только после своей попытки.
Показать разбор
Короткий ответ
Offline: precision/recall/PR-AUC по размеченным кейсам; product: снижение жалоб, доля найденных fraud cases, нагрузка на модераторов, false positive rate.
Подробный разбор
В модерации precision часто важнее recall, потому что false positives тратят время или могут вредить легитимным продавцам. Полезны coverage по жалобам, hit rate в очереди модерации, latency и capacity. Online эффект лучше мерить staged rollout или A/B: жалобы, appeals, manual review acceptance rate.
Complaint dataset почти всегда biased, поэтому нужен отдельный audit sample и анализ tail-сегментов.
Типичные ошибки
- Оптимизировать accuracy на несбалансированном датасете.
- Игнорировать capacity модераторов.
- Считать complaint dataset unbiased.
Как сказать на собеседовании
- Привяжи метрику к действию: auto-reject, manual review или ranking.
Фильтрация web search результатов для brand protection
Спроектируйте систему, которая ищет в интернете потенциальные нарушения бренда и фильтрует массу нерелевантных результатов для 1000+ клиентов.
Сначала проговорите ответ вслух или тезисами.
Формулы, план решения, риски и примеры.
Откройте разбор только после своей попытки.
Показать разбор
Короткий ответ
Комбинировать keyword/image retrieval, дедупликацию, мультимодальный классификатор релевантности, brand/category/logo signals и human review queue.
Подробный разбор
Pipeline начинается со сбора кандидатов из web, marketplaces и social, нормализации и дедупликации. Затем модели оценивают бренд, категорию, наличие логотипа, похожесть продукта, текстовые признаки и риск нарушения. Результат ранжируется под модераторскую очередь и takedown workflow.
Ключевые метрики: precision@review, recall по known infringements, moderator throughput, appeal rate и стоимость обработки.
Типичные ошибки
- Путать retrieval и финальную классификацию нарушения.
- Не бороться с дубликатами.
- Не адаптировать модель под бренд.
Как сказать на собеседовании
- Сначала candidate generation, затем narrowing/ranking, потом enforcement.
Logo detection при ограниченной разметке
Как построить logo detection для множества брендов и вариантов логотипов, если ручная bbox-разметка дорогая?
Сначала проговорите ответ вслух или тезисами.
Формулы, план решения, риски и примеры.
Откройте разбор только после своей попытки.
Показать разбор
Короткий ответ
Нужен гибрид: foundation/grounding модель для bootstrap-разметки, небольшой gold set с bbox, active learning по ошибкам и detector/recognizer с per-brand метриками.
Подробный разбор
При дорогой bbox-разметке не стоит начинать с полной ручной разметки всех брендов. Сначала собираем реальные изображения из целевых источников: marketplace pages, web search, social, жалобы, known infringements. Для каждого бренда заводим taxonomy вариантов логотипа: старые версии, монохром, инверсия, частичные логотипы, упаковка, watermark, похожие символы.
Bootstrap можно сделать через open-vocabulary detector/grounding model или VLM-assisted annotation: модель предлагает bbox и brand label, человек проверяет выборку и спорные случаи. Обязательно нужен небольшой clean gold set, размеченный вручную, чтобы измерять качество авторазметки и не обучаться на систематическом шуме. Дальше обучается detector вроде YOLO/DETR-family или двухэтапная схема detection -> crop classifier/embedding matcher.
Для long-tail брендов полезны synthetic overlays, но только как augmentation: разные масштабы, perspective, blur, compression, occlusion, print на товаре. Синтетика не заменяет реальные фото из-за domain gap. Active learning выбирает изображения с низкой уверенностью, новыми доменами, похожими логотипами и ошибками модераторов. Метрики: mAP/recall по bbox, per-brand/per-variant recall, precision@review, false positives на похожих брендах и latency.
Типичные ошибки
- Считать synthetic overlays достаточными для продакшн-качества.
- Не разделять bbox localization, brand classification и final moderation decision.
- Мерить только aggregate mAP без per-brand и long-tail анализа.
Как сказать на собеседовании
- Начни с gold set и bootstrap-разметки.
- Обсуди active learning и hard negatives похожих брендов.
- Раздели detector, recognizer и human review workflow.