Middle · продуктовая аналитика генеративного поиска и чата с Алисой — SQL, A/B, Python, метрики качества AI-ответов
Фишка: Общая аналитическая секция уникальна для Яндекса: задача на реальном датасете в Yandex Cloud DataSphere с Jupyter Notebook — проверяют не синтаксис, а умение быстро работать с данными и формулировать продуктовые выводы. Для команды Поиска с Алисой дополнительно оценивают понимание воронки SERP → быстрый ответ → чат и метрик качества генеративных ответов.
| Этап | Длительность | Что проверяют |
|---|---|---|
| Знакомство с рекрутером | 30–40 мин | Опыт, стек, мотивация, интерес к AI/поиску, зарплатные ожидания, рассказ о роли и процессе найма |
| Общая аналитическая секция | 60 мин | Python в Jupyter Notebook на реальном датасете в DataSphere: обработка данных, валидация, формализация продуктовых требований в метрики, генерация гипотез |
| Секция по направлению (продуктовый аналитик) | 60 мин | Бизнес-метрики (DAU, MAU, LTV), A/B-тесты, SQL, продуктовые кейсы, придумать метрику под задачу, статистика и теорвер |
| Алгоритмы (опционально) | 60 мин | Одна алгоритмическая задача на Python за 30 мин в Яндекс Код — сортировки, списки, строки, обход дерева. Не для всех кандидатов — уточняет рекрутер |
| Финальные встречи с командами | 45–60 мин | Знакомство с командой Поиска с Алисой, обсуждение задач, вопросы кандидата, behavioral |
| Презентация офера | 30 мин | Условия, команда, карьерные возможности |
Обязательный минимум
Плюсом будет
Выведи топ-3 категории по числу запросов с быстрым ответом Алисы за последние 7 дней
Фильтр по дате → GROUP BY category → ROW_NUMBER() OVER (PARTITION BY ... ORDER BY cnt DESC) → WHERE rn <= 3
Посчитай конверсию из просмотра быстрого ответа в переход в чат с Алисой по дням
Воронка: COUNT(DISTINCT user_id) на каждом шаге, деление второго на первый. Фильтр по event_type
Оставь только последнюю сессию каждого пользователя за день (дедупликация)
ROW_NUMBER() OVER (PARTITION BY user_id, date ORDER BY session_start DESC) = 1
Посчитай retention по неделям регистрации (когортный анализ)
Когорта = неделя первого визита. Для каждой недели N считаем долю вернувшихся: active_users / cohort_size
Чем отличается COUNT(*) от COUNT(column) и почему NOT IN с NULL ломает запрос?
COUNT(col) игнорирует NULL; NOT IN (subquery с NULL) → unknown → пустой результат. Используй NOT EXISTS или IS NOT NULL
Как оптимизировать медленный JOIN на больших таблицах логов?
Индексы на ключах JOIN, фильтрация до JOIN, партиционирование по дате, избегать SELECT *, EXPLAIN ANALYZE
Совет: Проговаривай план вслух до написания: «сначала фильтр по дате, потом JOIN, потом оконка» — структура важнее идеального синтаксиса
Ловушка: На middle часто дают задачи с дедупликацией событий и когортами — потренируй ROW_NUMBER и LAG/LEAD заранее
Фишка: В Яндексе логи поиска — огромные массивы; упомяни партиции по дате и ClickHouse, если знаком
Как спланируешь A/B-тест нового формата быстрого ответа Алисы?
Метрика (primary + guardrail), единица рандомизации (user_id), MDE, alpha, power → расчёт sample size, длительность, проверка SRM
Что такое p-value и ошибки I/II рода?
p-value = P(данные|H0). Ошибка I — ложноположительный (отвергли H0 зря). Ошибка II — пропустили реальный эффект
Что такое SRM и что делать, если группы 52/48 вместо 50/50?
Sample Ratio Mismatch — баг сплитования. Результаты невалидны, ищи проблему в экспериментальной платформе, не интерпретируй
Что такое peeking и почему нельзя останавливать тест досрочно?
Многократная проверка раздувает false positive rate. Фиксируй sample size и длительность до старта
Как посчитать доверительный интервал для разницы конверсий?
Δ = p1 - p2, SE = sqrt(p1(1-p1)/n1 + p2(1-p2)/n2), CI = Δ ± z*SE. Или bootstrap для нелинейных метрик
Что такое CUPED и зачем он нужен?
Корректировка метрики на доэкспериментальное поведение → снижение дисперсии → быстрее набирается мощность
Парадокс Монти Холла — объясни решение
После открытия двери ведущим вероятность выигрыша при смене = 2/3, при сохранении = 1/3. Условная вероятность
Ловушка: Самая частая ошибка — не упомянуть SRM, peeking или сезонность. Хороший ответ всегда заканчивается решением: «тест невалиден → не катим»
Совет: Для middle ожидают расчёт размера выборки: n = 2*(z_α/2 + z_β)² * σ² / MDE²
Фишка: В Поиске с Алисой guardrail-метрики критичны: не ухудшить общий CTR поиска ради роста переходов в чат
DAU поиска упал на 10% за неделю — твои действия?
Уточни сегмент → декомпозиция DAU = новые + вернувшиеся → гипотезы (релиз, сезонность, баг) → проверка по платформам/гео → рекомендация
Придумай метрику качества быстрого ответа Алисы
Свяжи с бизнес-целью: satisfaction (thumbs up/down), relevance (клик на источник), engagement (переход в чат), hallucination rate
Как измерить успех воронки SERP → быстрый ответ → чат?
Показы быстрого ответа → CTR на ответ → rate перехода в чат → depth чата → satisfaction. Считай конверсии между шагами
Чем отличаются DAU, WAU, MAU и sticky factor?
Sticky = DAU/MAU — показатель «липкости». В поиске DAU/MAU обычно ниже, чем в соцсетях
Как выбрать primary metric для эксперимента с новым UI быстрого ответа?
Primary = метрика, отражающая цель (например, satisfaction rate). Guardrails: общий CTR поиска, время на SERP, bounce rate
LTV vs ARPU — в чём разница?
ARPU = revenue/users за период. LTV = прогноз суммарной ценности пользователя за lifetime. LTV учитывает retention и churn
Совет: Структура ответа на кейс: уточни → декомпозируй → гипотезы → проверь данными → рекомендация с числом
Ловушка: Не начинай с «построю дашборд» — сначала покажи фреймворк мышления и конкретные гипотезы
Фишка: Для AI-продуктов важны метрики качества генерации: полнота, релевантность, фактологическая точность, user satisfaction
Как найти и обработать пропуски в датасете сессий поиска?
df.isnull().sum(), df.dropna() или fillna() с обоснованием. Для временных рядов — forward fill или удаление
Как посчитать среднее время между двумя событиями пользователя?
sort by user_id, timestamp → groupby → diff() → filter нужные event pairs → mean()
Как агрегировать логи по user_id и посчитать число уникальных запросов?
df.groupby('user_id')['query_id'].nunique() или pivot_table
Как визуализировать распределение длины чата с Алисой?
df['chat_length'].hist() или sns.boxplot. Комментируй outliers и медиану
Как проверить, что два сегмента пользователей статистически отличаются?
t-test для непрерывных, chi-square для категориальных, Mann-Whitney для ненормальных. Проверь нормальность и размер выборки
Фишка: На общей аналитической секции Яндекса код пишут в Jupyter Notebook в DataSphere — потренируйся заранее, создай аккаунт на ya.ru
Совет: Показывай валидацию данных: проверь дубликаты, аномалии, корректность типов перед анализом
Ловушка: Не молчи — комментируй каждый шаг: «сначала посмотрю на shape и dtypes, потом проверю пропуски»
Какие метрики используют для оценки качества поисковой выдачи?
CTR, MRR, NDCG, zero-result rate, time to first click, pogo-sticking (быстрый возврат к SERP)
Как оценить качество генеративного ответа без ground truth?
Human eval (side-by-side), implicit signals (thumbs, dwell time, click on sources), LLM-as-judge, A/B с satisfaction
Что такое hallucination rate и как его измерить?
Доля ответов с фактическими ошибками. Измерение: экспертная разметка, проверка по источникам, automated fact-checking
Как A/B-тестировать LLM-фичу, если ответы персонализированы?
Randomize на user_id, не на query. Учитывай network effects. Guardrail: latency, cost per query, error rate
Какие trade-off между кратким ответом на SERP и переходом в чат?
Хороший краткий ответ может снизить переходы в чат, но повысить satisfaction. Нужны композитные метрики и сегментация по intent
Фишка: Это ключевая специфика вакансии — покажи, что понимаешь dual-product модель: быстрые ответы + чат
Совет: Плюсом будет знание offline vs online метрик для LLM: offline eval на golden set + online A/B
Ловушка: Не путай метрики поиска (CTR позиции) с метриками генерации (relevance, factuality)
Конверсия воронки быстрого ответа → чат
Есть таблица events(user_id, event_type, event_time), где event_type ∈ ('serp_view', 'quick_answer_view', 'chat_open'). Посчитай дневную конверсию: quick_answer_view → chat_open.
WITH daily_funnel AS (
SELECT
DATE(event_time) AS dt,
COUNT(DISTINCT CASE WHEN event_type = 'quick_answer_view' THEN user_id END) AS viewed,
COUNT(DISTINCT CASE WHEN event_type = 'chat_open' THEN user_id END) AS opened_chat
FROM events
WHERE event_type IN ('quick_answer_view', 'chat_open')
GROUP BY 1
)
SELECT dt,
ROUND(100.0 * opened_chat / NULLIF(viewed, 0), 2) AS conversion_pct
FROM daily_funnel
ORDER BY dt;Сложность: O(n) по числу событий
Топ-N запросов по категории (оконные функции)
Таблица queries(query_id, category, search_count). Для каждой category выведи топ-3 query_id по search_count.
WITH ranked AS (
SELECT query_id, category, search_count,
ROW_NUMBER() OVER (PARTITION BY category ORDER BY search_count DESC) AS rn
FROM queries
)
SELECT query_id, category, search_count
FROM ranked
WHERE rn <= 3
ORDER BY category, rn;Сложность: O(n log n) из-за сортировки в окне
Retention 7-day (Python/Pandas)
DataFrame sessions(user_id, session_date). Посчитай 7-day retention: доля пользователей, вернувшихся ровно на 7-й день после первой сессии.
import pandas as pd
first = sessions.groupby('user_id')['session_date'].min().reset_index()
first.columns = ['user_id', 'cohort_date']
merged = sessions.merge(first, on='user_id')
merged['days_since'] = (merged['session_date'] - merged['cohort_date']).dt.days
cohort_size = first.groupby('cohort_date').size()
returned_d7 = merged[merged['days_since'] == 7].groupby('cohort_date')['user_id'].nunique()
retention = (returned_d7 / cohort_size * 100).round(2)Сложность: O(n)
Размер выборки для A/B-теста
Baseline конверсия = 5%, ожидаемый uplift (MDE) = 0.5 п.п., alpha = 0.05, power = 0.8. Посчитай необходимый размер выборки на группу.
import math from scipy.stats import norm p1, p2 = 0.05, 0.055 p_pooled = (p1 + p2) / 2 z_alpha = norm.ppf(0.975) # 1.96 z_beta = norm.ppf(0.8) # 0.84 n = 2 * ((z_alpha + z_beta) ** 2) * p_pooled * (1 - p_pooled) / (p2 - p1) ** 2 # n ≈ 30 000 на группу # Формула: n = 2 * (z_α/2 + z_β)² * σ² / δ² # Для пропорций: σ² ≈ p(1-p)
Сложность: O(1)
Каркас ответа
3 дня
7 дней
14 дней
| Блок | Готов, если... |
|---|---|
| SQL | можешь за 15 мин написать запрос с оконными функциями для воронки или когорты, проговаривая план вслух |
| A/B и статистика | можешь спланировать эксперимент с расчётом sample size и назвать 3 подводных камня (SRM, peeking, множественные сравнения) |
| Продуктовые кейсы | можешь за 10 мин разобрать падение метрики: уточнение → декомпозиция → гипотезы → проверка → рекомендация |
| Python/Jupyter | можешь загрузить CSV, проверить качество данных, посчитать агрегаты и визуализировать за 20 мин |
| Метрики AI/поиска | можешь предложить 5 метрик для оценки быстрого ответа Алисы и объяснить trade-off с переходом в чат |
| Behavioral | есть 3 готовые STAR-истории с конкретными цифрами в Result |
В день собеседования