К обычному разбору
Тренировка по собеседованиюТехническое собеседованиеFairmarkit2025-09-23

Fairmarkit: ML System Design

Идите сверху вниз: сначала попробуйте сами, затем откройте разбор. Если шаг с кодом, пишите решение прямо здесь и запускайте проверки на странице.

Шагов
9
Вопросов
9
Задач
0
1Кейс10 мин

Как сформулировать ML System Design-задачу подбора поставщиков

Fairmarkit -- маркетплейс для корпоративных закупок: заказчик создает заявку, а система предлагает подходящих поставщиков. Как сформулировать ML-задачу подбора поставщиков перед выбором модели?

Ответьте без подсказки

Сначала проговорите ответ вслух или тезисами.

Запишите черновик

Формулы, план решения, риски и примеры.

Сравните с разбором

Откройте разбор только после своей попытки.

Показать разбор

Короткий ответ

Сначала нужно описать продуктовый сценарий: заказчик создает заявку, система предлагает поставщиков, заказчик редактирует список, поставщики отвечают bid/no-bid/ignore, затем выбирается победитель.

Подробный разбор

Начинать стоит не с "возьмем embeddings", а с границ решения. Fairmarkit управляет стартовым списком поставщиков для закупочной заявки. Дальше заказчик может удалить или добавить поставщиков, отправить приглашения, получить bid/no-bid/ignore и выбрать победителя.

Формулировка ML-задачи: по заказчику, заявке и доступной базе поставщиков вернуть top-K поставщиков, которые с высокой вероятностью окажутся релевантными для приглашения и дадут полезный результат закупки. При этом нужно учитывать обязательные поля заявки, категории заказчика, географию, сроки, количество/единицы измерения и историю взаимодействий.

Важно отделить цель продукта от proxy labels. Бизнес хочет экономить время заказчика и повышать качество закупки, а модель может оптимизировать recall подходящих поставщиков, вероятность ответа/ставки, вероятность не быть удаленной заказчиком и downstream winner signal. Эти сигналы не равнозначны, поэтому их нужно обсуждать явно.

Типичные ошибки

  • Сразу выбирать embedding model без описания сценария закупки.
  • Считать winner единственной истиной релевантности.
  • Не отделить поставщиков, которых заказчик удалил, добавил вручную или которые проигнорировали приглашение.

Как сказать на собеседовании

  • Начни с одного предложения: "мы ранжируем поставщиков до отправки приглашений".
  • Перечисли события процесса и скажи, какие из них могут стать labels.
2Кейс9 мин

Зачем рекомендательная система, если заказчик может вручную менять поставщиков

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

Ответьте без подсказки

Сначала проговорите ответ вслух или тезисами.

Запишите черновик

Формулы, план решения, риски и примеры.

Сравните с разбором

Откройте разбор только после своей попытки.

Показать разбор

Короткий ответ

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

Подробный разбор

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

Из этого следуют продуктовые метрики: доля предложенных поставщиков, оставшихся в списке приглашений; manual add/delete rate; response или bid rate среди рекомендованных поставщиков; coverage новых полезных поставщиков; время до отправки заявки; downstream success, например наличие хотя бы одного приемлемого предложения или победителя среди рекомендованных.

Для B2B важно не обещать только top-1 precision. У заказчика могут быть внутренние предпочтения и ограничения, поэтому хорошая рекомендательная система должна быть управляемой: filters, explanations, diversity, business rules и возможность ручного override остаются частью продукта.

Типичные ошибки

  • Сказать, что ручное редактирование делает ML ненужным.
  • Оптимизировать только winner rate и забыть про time saved.
  • Не использовать удаления и ручные добавления как feedback.

Как сказать на собеседовании

  • Объясни рекомендации как стартовый список, а ручное редактирование как feedback loop.
  • Назови хотя бы одну метрику friction: add/delete rate или time-to-submit.
3Кейс10 мин

Какие данные нужны для подбора поставщиков и что меняет масштаб

Есть исторические сделки, логи платформы, больше миллиона поставщиков и около 100 компаний-заказчиков. Какие данные использовать и как масштаб влияет на архитектуру?

Ответьте без подсказки

Сначала проговорите ответ вслух или тезисами.

Запишите черновик

Формулы, план решения, риски и примеры.

Сравните с разбором

Откройте разбор только после своей попытки.

Показать разбор

Короткий ответ

Нужны поля заявки, профиль заказчика, профиль поставщика, исторические приглашения, ручные правки, bid/no-bid/ignore, победители и история сделок; миллион поставщиков требует retrieval stage перед ranker.

Подробный разбор

Данные стоит разделить на сущности. Заявка: title, description, quantity, unit, category tree, close date, address, business unit. Заказчик: company, user, предпочитаемые поставщики, история, внутренние категории, география и ограничения. Поставщик: profile, categories, served regions, прошлые заявки, response behavior, win/bid history.

Логи процесса особенно важны: кого система показала, кого заказчик удалил, кого добавил, кому отправили приглашение, кто ответил bid/no-bid/ignore, кто стал победителем. Это дает не один label, а несколько сигналов релевантности и friction.

Масштаб больше миллиона поставщиков означает, что нельзя гонять дорогой ranker по всем. Нужен candidate generation: business filters, geo/category constraints, lexical search, vector search или precomputed candidate pools. Ranker работает только по top-N candidates и использует более богатые признаки заказчика, заявки и поставщика.

Типичные ошибки

  • Забыть логировать показанных, удаленных и добавленных поставщиков.
  • Предложить ранжировать миллион поставщиков одной тяжелой моделью online.
  • Считать компании-заказчики однородными и не учитывать их локальные таксономии.

Как сказать на собеседовании

  • Сначала перечисли events, потом features.
  • При словах "миллион поставщиков" сразу переходи к retrieval + ranking.
4Кейс14 мин

Двухэтапный retrieval/ranking для подбора поставщиков

Как спроектировать candidate generation и ranking для подбора поставщиков под закупочную заявку в маркетплейсе корпоративных закупок?

Ответьте без подсказки

Сначала проговорите ответ вслух или тезисами.

Запишите черновик

Формулы, план решения, риски и примеры.

Сравните с разбором

Откройте разбор только после своей попытки.

Показать разбор

Короткий ответ

Сначала собрать high-recall candidate pool через hard filters, lexical/vector retrieval и business constraints, затем rerank по признакам заказчика, заявки, поставщика и истории взаимодействий.

Подробный разбор

Candidate generation должен быть дешевым и recall-oriented. В него входят hard filters по availability, geography, category compatibility, compliance и ограничениям заказчика; lexical/full-text search по title/description/profile; vector retrieval по заявке и представлению поставщика; возможно несколько generators с merge/dedup.

Ranking stage получает top-N поставщиков из retrieval и считает более дорогие признаки: историю взаимодействий заказчика и поставщика, response rate поставщика, win/bid history, category similarity, geo distance, deadline fit, предпочтения заказчика, ручные удаления/добавления, freshness и diversity constraints. Модель может быть GBDT/LambdaMART/learning-to-rank или более сложный neural reranker, но baseline должен быть простым.

Serving: online-заявка идет в retrieval service, затем ranker, затем post-processing rules. Важно логировать exposure и decision context, чтобы offline evaluation и retraining не теряли, какие поставщики вообще были доступны и показаны.

Типичные ошибки

  • Делать один universal embedding и считать, что он решит все constraints.
  • Не объяснить merge/dedup нескольких candidate generators.
  • Забыть business rules после ranker.

Как сказать на собеседовании

  • Назови 3 источника candidates: filters, lexical search, vector search.
  • Отдельно проговори post-ranking constraints и logging.
5Кейс12 мин

Какие target и метрики выбрать для ранжирования поставщиков

В истории заявок можно использовать winner label, bid/no-bid, ручное удаление поставщика и другие события. Какие labels и метрики выбрать для candidate generator и ranker?

Ответьте без подсказки

Сначала проговорите ответ вслух или тезисами.

Запишите черновик

Формулы, план решения, риски и примеры.

Сравните с разбором

Откройте разбор только после своей попытки.

Показать разбор

Короткий ответ

Для retrieval важен recall@K по поставщикам, которые могли дать полезный ответ; для ranker лучше использовать graded labels из bid, no-bid, delete/add и winner, а не только binary winner.

Подробный разбор

Winner label полезен, но слишком узкий. Поставщик мог быть релевантным, сделать bid и проиграть по цене или срокам. Заказчик мог удалить поставщика до приглашения, что является сильным негативным feedback. No-bid и ignore тоже разные сигналы: no-bid может значить нерелевантность или временную недоступность, ignore может быть проблемой attention.

Для candidate generation главная offline-метрика - recall@K по множеству потенциально релевантных поставщиков: поставщики с bid, вручную добавленные поставщики, historical winners в похожих заявках, поставщики, которых заказчик не удалил. Precision на retrieval stage вторична, если ranker справляется.

Для ranker можно использовать graded relevance: winner > bid responder > not deleted/invited > shown only; удаление заказчиком и explicit no-bid ниже. Метрики: NDCG@K или MAP/MRR, если есть graded/order labels; hit rate winner/bid@K; delete rate; manual add rate; online - time-to-submit, bid rate, успешная закупка, customer satisfaction и retention.

Типичные ошибки

  • Обучаться только на winner=1, all others=0.
  • Называть NDCG, но не объяснить, откуда берется порядок релевантности.
  • Смешать offline ranking metrics и business metrics.

Как сказать на собеседовании

  • Скажи, что losing bid не равен hard negative.
  • Для retrieval сначала говори recall@K, для ranker - graded relevance/NDCG.
6Кейс10 мин

Инференс-пайплайн и cold start в подборе поставщиков

Как обработать новый закупочный запрос и что делать с новыми закупщиками, новыми поставщиками и редкими категориями?

Ответьте без подсказки

Сначала проговорите ответ вслух или тезисами.

Запишите черновик

Формулы, план решения, риски и примеры.

Сравните с разбором

Откройте разбор только после своей попытки.

Показать разбор

Короткий ответ

Runtime: разобрать заявку, нормализовать признаки, достать candidates, ранжировать, применить rules/diversity и залогировать exposure; cold start закрывается content/profile features, category text, geography, defaults и exploration.

Подробный разбор

Inference pipeline: заказчик создает заявку, сервис нормализует поля и таксономию заказчика, строит признаки/embedding заявки, применяет hard filters, запускает несколько retrievers, объединяет candidates, считает online/precomputed features, вызывает ranker, применяет business rules и возвращает top-K поставщиков. После показа обязательно логируется exposure и контекст решения.

Новый заказчик: меньше персональной истории, поэтому больше веса на content заявки, metadata компании, category text и global priors. Новый поставщик: использовать profile, self-declared categories, geo, external/vendor attributes и exploration slots. Редкая категория: fallback на parent category, текстовое описание, похожие категории и human/customer rules.

Нужны graceful fallbacks: если embedding service или feature store недоступны, система должна вернуть rule-based или lexical candidates, а не пустой список. Для B2B-продукта empty recommendations могут быть хуже менее точных recommendations.

Типичные ошибки

  • Описать обучение, но не сказать, как запрос обслуживается online.
  • Не иметь fallback при отсутствии истории.
  • Забыть логировать candidates и ranking context.

Как сказать на собеседовании

  • Дай pipeline в 5-6 шагов и отдельно cold start/fallbacks.
  • Для B2B подчеркни, что пустой ответ часто неприемлем.
7Кейс12 мин

Как работать с деревьями категорий заказчиков

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

Ответьте без подсказки

Сначала проговорите ответ вслух или тезисами.

Запишите черновик

Формулы, план решения, риски и примеры.

Сравните с разбором

Откройте разбор только после своей попытки.

Показать разбор

Короткий ответ

Нельзя слепо embedding-ить category id: нужно использовать hierarchy, category text/description, локальные mappings заказчика, historical co-occurrence и fallback на parent/global taxonomy.

Подробный разбор

Проблема в том, что category name не всегда семантически полезен. У одного заказчика это "laptops", у другого внутренний код "A-16", у третьего дерево другой глубины. Поэтому sentence embedding category name может работать только на части данных.

Практичный подход: хранить category id заказчика как categorical feature; использовать hierarchy path и parent categories; добавлять category description, если она есть; маппить локальные категории в global taxonomy там, где возможно; строить статистики по историческим заявкам и поставщикам внутри категории; использовать text/item description как независимый сигнал.

В модели category features лучше комбинировать с текстом заявки, географией, историей поставщика и предпочтениями заказчика. Для cold или бессмысленных category codes fallback идет на parent category, text description заявки и historical behavior. Важно измерять качество отдельно по компаниям-заказчикам, потому что taxonomy drift может быть локальным.

Типичные ошибки

  • Считать, что любой category name можно корректно embedding-ить.
  • Потерять hierarchy path и локальный category id заказчика.
  • Не оценивать качество по компаниям-заказчикам отдельно.

Как сказать на собеседовании

  • Сразу скажи: category text может быть несемантическим.
  • Предложи комбинацию global taxonomy mapping, hierarchy и behavioral stats.
8Кейс12 мин

Как строить эмбеддинги поставщиков и чем опасна многошаговая агрегация

Поставщика можно представить через прошлые заявки, профиль и категории. Как построить представление поставщика и какие проблемы есть у averaging request embeddings?

Ответьте без подсказки

Сначала проговорите ответ вслух или тезисами.

Запишите черновик

Формулы, план решения, риски и примеры.

Сравните с разбором

Откройте разбор только после своей попытки.

Показать разбор

Короткий ответ

Представление поставщика лучше строить из profile, category/geo distributions, response history и агрегированных сигналов по заявкам; простое среднее embeddings теряет интерпретируемость и быстро устаревает.

Подробный разбор

Простая идея - взять все заявки, где поставщик участвовал, и усреднить request embeddings. Это может дать baseline, но у него много проблем: embedding меняется после новых событий, смешивает разные домены и категории, плохо объясняется заказчику, теряет multimodal/structured признаки и может переусреднить поставщика, который работает в нескольких нишах.

Более надежное representation: признаки профиля поставщика, served geographies, category distribution, response/bid/win rates, recency, история по конкретным заказчикам, price/service constraints, textual description и агрегаты по successful requests. Можно иметь несколько vectors или feature blocks вместо одного "super embedding".

Для retrieval можно использовать вектор поставщика, но для final ranker стоит сохранить interpretable features. В B2B важна debuggability: почему поставщик показан, почему он подходит закупочной заявке, какие constraints сработали.

Типичные ошибки

  • Считать average request embedding полноценным профилем поставщика.
  • Не учитывать recency и поставщиков, работающих в нескольких нишах.
  • Не продумать объяснимость и debug.

Как сказать на собеседовании

  • Назови average embeddings как baseline, но сразу перечисли его риски.
  • Предложи structured aggregates для ranker и explanations.
9Кейс12 мин

Как бороться с selection bias и неоднозначными negatives

Исторические данные есть только по поставщикам, которых уже показывали или приглашали. Как понять и уменьшить selection bias, и как обращаться с losing bids?

Ответьте без подсказки

Сначала проговорите ответ вслух или тезисами.

Запишите черновик

Формулы, план решения, риски и примеры.

Сравните с разбором

Откройте разбор только после своей попытки.

Показать разбор

Короткий ответ

Selection bias видно по coverage и повторному показу одних поставщиков; снижать его можно exploration slots, counterfactual logging, stratified sampling и осторожными labels для losing bids.

Подробный разбор

Bias возникает потому, что модель обучается на поставщиках, которых старая система уже выбрала для показа или приглашения. Поставщики вне exposure почти не получают labels, и новая модель начинает усиливать старые предпочтения.

Диагностика: coverage поставщиков, category/geography coverage, доля повторно показанных поставщиков, long-tail exposure, add/delete rate по компаниям-заказчикам, качество на exploration buckets. Нужно логировать propensities или хотя бы policy/version/context, чтобы понимать, почему поставщик был показан.

Mitigation: controlled exploration slots, diversity constraints, randomization внутри безопасных buckets, active learning для редких категорий, debiased/off-policy evaluation там, где хватает данных. Labels должны быть аккуратными: winner - сильный positive; bid responder, который проиграл, не hard negative; no-bid и ignore имеют разный смысл; удаление заказчиком может быть сильнее negative, но тоже зависит от контекста.

Типичные ошибки

  • Всех поставщиков без winner label пометить нулями.
  • Не измерять coverage и long-tail exposure.
  • Предложить exploration без guardrails для B2B customers.

Как сказать на собеседовании

  • Скажи: losing bid не равен плохой поставщик.
  • Назови coverage, exploration slots и exposure logging вместе.