Мы тогда делали диспатчер — систему, которая распределяет заказы между водителями.
На самом деле задача там сильно сложнее, чем «найти ближайшую машину».
У пассажира может быть ребенок, багаж, нужен определенный тариф, дополнительные требования. Есть водитель, который может принять заказ, а может не принять. Может доехать, а может отмениться. Пассажир тоже может отмениться. Плюс нужно не конкретному человеку сделать максимально хорошо, а оптимизировать вывоз целого района.
То есть чем больше людей в итоге реально уехало — тем лучше работает диспатчер.
И первая версия всего этого была, по сути, максимально инженерной.
Фильтры, правила, эвристики, scoring, классическая оптимизация.
Грубо говоря, много хорошо написанных
switch/case.И что самое смешное — работало это очень хорошо. Быстро, дешево, понятно, предсказуемо.
Потом, конечно, появился ML.
Начали предсказывать то, что уже нельзя нормально описать руками:
— примет ли водитель заказ;
— доедет ли он до пассажира;
— сколько реально займет подача;
— какова вероятность отмены.
И эти предикты уже подмешивались в scoring, после чего обычный алгоритм принимал решение, кому отдать заказ.
Это дало еще несколько процентов к вывозу. По памяти, что-то порядка 5–7%.
На масштабе Яндекс.Такси это, естественно, огромные деньги.
Но вместе с этими процентами внезапно появляется еще один маленький Яндекс.Такси внутри Яндекс.Такси 🙂
Датасеты.
Feature pipelines.
Обучение.
Эксперименты.
Мониторинг.
Retraining.
Drift.
Постоянный tuning.
И вот тут очень хороший вопрос: а точно ли вам вообще нужен AI?
Потому что есть еще очень показательная история со Stockfish и Leela Chess Zero.
Leela — практически AI-native подход. Нейросеть находится в центре системы: оценивает позиции, ходы, вокруг нее строится поиск.
Stockfish исторически — наоборот. Максимально классический движок: search, pruning, эвристики, десятилетия оптимизации.
И когда нейросети стали реально полезными, Stockfish не переписали в Leela.
Туда добавили NNUE.
То есть взяли великолепную классическую систему и заменили нейросетью ровно тот кусок, где нейросеть оказалась лучше — evaluation.
Search остался.
Эвристики остались.
Вся эта гигантская алгоритмическая инженерия никуда не делась.
И, кстати, ровно к такому же выводу я пришел в своих трейдинг-ботах.
Я там уже много чего попробовал.
Разные модели, разные способы предсказания, разные комбинации ML с сигналами.
Но в итоге основа у меня все равно алгоритмическая.
Логика входа и выхода, риск, арбитраж, исполнение, работа со стаканом, ограничения — это обычные алгоритмы.
ML я использую в основном там, где он действительно хорошо работает:
→ CatBoost для тюнинга параметров и оценки фич;
→ иногда LSTM для конкретных временных зависимостей;
→ модели как дополнительный сигнал, а не как мозг всей системы.
И чем больше я с этим экспериментирую, тем сильнее убеждаюсь, что этот подход реально работает.
Не пытаться заставить модель принимать все решения.
А оставить детерминированную систему там, где у тебя есть понимание процесса, и использовать ML для тех частей, где есть неопределенность или слишком сложная зависимость между фичами.
Мне кажется, это вообще очень правильный паттерн для AI-разработки.
Не надо начинать с AI.
Сначала решите задачу нормально.
Если работает правило — используйте правило.
Если работает алгоритм — используйте алгоритм.
Если есть хорошая математическая оптимизация — используйте ее.
А потом найдите то место, где у вас начинается неопределенность и где prediction действительно дает дополнительную ценность.
Вот туда и ставьте модель.
Проблема текущего AI-хайпа в том, что очень часто делают наоборот: сначала берут модель, а потом начинают придумывать, какую инженерную задачу ею заменить.
Хотя зачастую лучшая AI-система — это вообще не «AI-система».
Это очень хорошая классическая система, в которую в правильном месте вставили модель.