👨💻 Герой: Роман Халкечев, 28 лет, Москва. Окончил бакалавриат в РУДН и совместную магистерскую программу ВШЭ и Школы анализа данных Яндекса.
🛠 Работа: Руководитель аналитики в Яндекс.Еде. Работает в офисе, 5/2. Обычно начинает в 10, заканчивает в 20.
🧭 Рынок: Руководитель отдела аналитики в Москве: 34 вакансии.
Школа анализа данных. Задача про подсказки
Я учился в РУДН на математическом факультете. На втором курсе заинтересовался биологией и позже узнал про направление биоинформатики в Школе анализа данных Яндекса. Я заинтересовался, начал готовиться и в 2012 году прошёл отбор.
На одной из лекций разработчик Яндекса рассказывал нам, как устроены поисковые подсказки. В конце лекции он предложил нам домашнее задание (по желанию). Энтузиастов вызвалось немного, поэтому он поднял ставки и то ли в шутку, то ли нет пообещал приз — работу в Яндексе. Я вызвался.
Поисковые подсказки — это популярные варианты запросов, которые поисковик предлагает пользователю, когда тот что-то ищет. Например, забиваем в Яндексе «программирование» и он предлагает «программирование с нуля», «программирование на python» и так далее. Это нужно, чтобы сэкономить пользователю время или помочь сформулировать запрос.
Докладчик выдал нам логи поисковых запросов и предложил сделать такие подсказки, но с учётом опечаток. Например, пользователь пишет «крта», а нам нужно понять, что это ошибка, — и предложить «карта метро».
Я две недели занимался этой задачей днями и вечерами. Программировал я тогда слабо, практики не хватало. Но в итоге смог написать подсказки на Java. Порой они очень медленно работали: вводишь символ и ждёшь потом секунд 10–11, пока загрузятся подсказки. Приходилось много оптимизировать.
Решение я отправил за пару дней до дедлайна. В ответ мне предложили подождать дедлайна, чтобы определить победителя, но сразу задали два вопроса: рассматриваю ли я стажировку в Яндексе и умею ли программировать на C++ и Питоне.
Первому вопросу я обрадовался, а вот со вторым было сложнее: ни на C++, ни на Питоне я не писал.
В тот же день купил книжку по C++, открыл её и написал, что «C++ изучаю, а про Питон много хорошего слышал». Мы договорились, что я досдам летнюю сессию и выйду с первого июля.
Вскоре факультет биоинформатики отделился от ШАДа, но мне так понравилось в Яндексе, что я решил остаться. К тому времени я выпустился из бакалавриата и решил пойти на совместную магистерскую программу ВШЭ и ШАДа на направление computer science.
Стажировка в Яндексе до того, как это стало мейнстримом
В июле 2013 года после задачи с подсказками я попал в Яндекс без единого собеседования. Сначала это разжигало во мне синдром самозванца — вокруг очень умные люди, кандидаты наук, и тут я с ними, мне всего 20 лет, опыта работы совсем нет.
Вместе со мной в отделе был ещё один стажёр — парень из Харькова. Мы шутили, когда уходили на обед, что вернёмся, а наших рабочих мест уже нет и записка «Простите, мы ошиблись, вы уволены». Но это были безосновательные опасения.
Сейчас в Яндекс берут много стажёров, бывает по 800–1000 человек за лето. А тогда нас было всего 30. В конце мы все защищали стажировки: рассказывали, что сделали за три месяца. Это вроде проверки, после которой решали, кому предложить остаться, а кому нет. Я получил оффер от той же команды, где проходил стажировку, и был этому рад: задачи и руководитель мне нравились.
Путь до руководителя
Осенью началось обучение на совместной программе «Вышки» и ШАДа. Большая часть занятий проходила прямо в Яндексе: до 6 вечера я работал, а потом спускался на пары.
Первое время совмещать учёбу и работу было непросто, так что мы договорились, что я буду работать три дня из пяти. Но уже через год — летом 2014-го — я понял, что хочу погрузиться в работу целиком, и вышел на полную рабочую неделю.
Я потихоньку рос. После стажировки стал младшим разработчиком, потом просто разработчиком, вроде мидл-1. Потом мидл-2 и через три с половиной года — старшим разработчиком. Со временем мне предложили стать руководителем группы — той же самой, куда я приходил.
Сначала я отказался: я был самым последним и самым молодым, кто пришёл в эту команду. Другие ребята были постарше, учили меня всему. Так что мне было некомфортно представлять, что я буду их руководителем. Но вся остальная команда поддержала это решение, и я согласился — стал руководителем команды поисковых подсказок.
Как работают подсказки
Задача подсказок — сделать так, чтобы пользователь быстрее находил то, что ему нужно. Например, без подсказок ему нужно набрать в среднем 19 символов, а с подсказками — в два раза меньше. Или можно вывести результаты поиска прямо в поле с подсказками, чтобы не нужно было даже запускать поиск.
Решали разные задачи. Например, чтобы по запросу сформировались подсказки, должна накопиться статистика: как часто его задают, на что именно кликают. Но как в таком случае учитывать новостную повестку или недавние события? Например, запросы про прошедший футбольный матч, запуск ракеты или результаты выборов. По ним нет исторической статистики, а через пару дней они уже будут неактуальны.
Мы построили отдельную систему, которая постоянно мониторила поток запросов и искала аномалии. Если вдруг какие-то слова или фразы начинали искать чаще, при этом для них появлялось большое количество новостных статей, система отбирала такие запросы и быстро отправляла в продакшен. Через несколько минут такие запросы и подсказки по ним уже подмешивались в выдачу.
Мы развивали подсказки во всех сервисах, кроме гео: в поиске, картинках, маркете, музыке. Например, в маркете добавили в подсказки разделы: можно искать по бренду, по товарам или по частым запросам.
В изображениях реализовали связанные запросы. Например, если пользователь ищет «ягуар», то ему по умолчанию показывают животное. Но вдруг он ищет автомобиль или напиток? Эти варианты мы выводим в отдельный блок, так что пользователь может сразу уточнить запрос.
Переход в «Такси»
В начале 2018 года мне написали из Яндекс.Такси. Там строили команду машинного обучения и дата-сайенса, нужен был руководитель.
Я тогда чувствовал, что подустал заниматься подсказками. Почти любые рабочие задачи я решал одними и теми же технологиями, это наскучило. Так что я согласился и начался процесс ротации: я начал проходить собеседования.
Яндекс.Такси тогда был в процессе слияния с «Убером», и очень быстро рос, появлялись новые команды. Для меня это был вызов: до этого я руководил командой в 4–5 человек, а здесь — сразу 14.
Машинное обучение в «Такси»
У службы машинного обучения анализа данных в «Такси» две основные задачи.
Первая — находить в продукте зоны, которые можно улучшить. Глобальная цель у этого — сделать идеальное приложение, которое при запуске уже знает, куда поедет пользователь, какая машина ему нужна и сколько придётся ждать.
Вторая задача — улучшать бизнес-процессы компании: поддержку, маркетинг, контроль качества. То есть делать так, чтобы работа «Такси» была более простой, быстрой и дешёвой.
Задачи преимущественно сервисные — придумать, как можно улучшить то, что есть, или грамотно реализовать то, что в планах. Но при этом очень важные для бизнеса, так как с помощью машинного обучения много задач можно решать намного эффективнее, чем простыми алгоритмами или силами человека.
Пример: машинное обучение помогает находить новые заказы
Раньше было так: если в определённом радиусе от точки вызова не было ни одного доступного таксиста, то приложение даже не начинало поиск, появлялось сообщение: «Нет свободных машин».
В команде решили провести эксперимент и определённой части пользователей позволили вызывать такси даже в такой ситуации. Оказалось, что в 29% случаев исполнитель всё-таки находился.
Но 29% удачных поисков — это 71% случаев, когда пользователь получил ложную надежду. Чтобы повысить надёжность, мы сделали систему, которая рассчитывает вероятность того, что машина будет найдена.
Мы решали задачу классификации. На входе есть несколько параметров: время и место, количество машин и пользователей, радиус поиска. И нужно определить, приведёт ли такой набор к успешному поиску. То есть, ответ либо «да» — тогда мы запускаем подбор водителя, либо «нет» — тогда говорим, что свободных машин нет. Как раз эту задачу решает машинное обучение — подсчитать вероятность удачи.
Пример: машинное обучение помогает общаться с клиентами и водителями
В поддержку постоянно пишут пользователи — с жалобами, вопросами или благодарностями. Сервис постоянно подключает новые города, и отсматривать все обращения вручную невозможно. Здесь помогает нейросеть, которая может определить, нужно ли срочно реагировать и, если да, подключает оператора. А иногда даже может сама ответить шаблонным сообщением, например, на отзыв о поездке.
В поддержку обращаются не только клиенты, но и сами таксисты. У них тоже есть претензии и идеи, как можно улучшить сервис. Прочитать и отсортировать их все — невозможно. Поэтому мы сделали алгоритм, который кластеризует сообщения и показывает, к каким частям системы больше всего претензий. Их берут в работу и запускают новые функции. Так в приложении «Такси» появилась возможность делиться геопозицией, чтобы водитель видел точное место, из которого нужно забрать пользователя.
Пример: фотоконтроль
Водителям периодически нужно фотографировать автомобиль, чтобы мы убедились, что у него нет повреждений и он может безопасно выполнять заказы. Здесь тоже помогает нейросеть. Она сразу отмечает, если на фото нет автомобиля или он влез не полностью, не тот ракурс, другой номерной знак или есть очевидные повреждения. Это экономит кучу времени водителям и поддержке.
Было ещё множество задач, которые можно решить с помощью анализа данных и машинного обучения. Этим мы и занимались: придумывали системы, писали алгоритмы, обрабатывали сырые данные, обучали модели.