С лета у меня в браузере рядом с доской работает локальный Stockfish и подсказывает стрелкой на лучшем ходу. Люди, которые начали пользоваться и разбирали этим свои партии, выразили одну и ту же претензию, каждый своими словами. Ход верный, но ход непонятный. Я бы так никогда не сыграл — покажи, что сыграл бы я, и объясни, чем это плохо.

Я полез в настройки силы. У движка есть Skill Level, можно урезать глубину, можно ограничить число узлов, можно задать рейтинг и попросить играть слабее. Вечер работы, максимум два.

Пьяный гроссмейстер

Вечера не хватило. Я подбирал уровень так, чтобы движок ошибался примерно как средний игрок, садился играть — и каждый раз получался игрок, которого в природе не встретишь.

Он отдал мне пешку. Просто отдал, я её взял и взамен ничего не отдал. Через два хода он сделал тихий ход королём в угол и спас партию. Я такой ход даже не рассматривал.

Слабый уровень не делает движок глупее. Он всё равно находит лучший ход. Программа просто иногда не даёт ему этот ход сделать. Поэтому в одной партии у него рядом оказываются глупый зевок и ход, который человек почти никогда не сделает.

Человек играет наоборот. Он делает лучшее из того, что увидел. Видит он мало.

Люди зевают по расписанию

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

Механика тут одна. Человек не считает варианты, он узнаёт картинки, и слеп он там, где картинки нет. Две разные ошибки среднего игрока часто оказываются одной и той же ошибкой в схожих позициях, поэтому его и можно учить.

Ослабленный Stockfish зевает по «своему» расписанию. Он бросил ветку раньше, чем в ней проявилась идея, или не дотянулся до глубины, где всё решается. С человеческим расписанием это совпадает случайно.

Maia отвечает на другой вопрос

Вопрос «какой ход здесь выигрывает» и вопрос «как сыграет игрок с рейтингом 1500» — разные задачи. У первой есть правильный ответ. У второй ответ размазан по десятку ходов, и каждому из них можно приписать вероятность.

Модели Maia в CSSLab учили на человеческих партиях, разобранных по рейтинговым диапазонам, а не на самоигре и не на партиях движков. Maia не ищет ход. Она угадывает, что в этой позиции сыграют люди примерно такой силы, и выдаёт вероятность для каждого хода. Самый вероятный ход часто оказывается ошибкой — тем самым взятием на f7.

Итальянская, ход белых. Оранжевая стрелка: слон бьёт на f7. Бирюзовая: тихая рокировка
Итальянская, ход белых. Оранжевая стрелка: слон бьёт на f7. Бирюзовая: тихая рокировка

Итальянская после 1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5, ход белых. Слон на c4 смотрит на f7. Оранжевое — то, что здесь часто делают. Бирюзовое — тихий ход, который находит движок.

Мне такое и требовалось. Если девять игроков из десяти в этой позиции бьют на f7 и получают по голове, то на вопрос «что тут сыграет человек» честно отвечать взятием, а не тихим усилением, которое движок находит на двадцатой глубине. Ход, который угадала Maia, вдобавок легко объяснить словами: вывел фигуру, напал на пешку. Не «единственный ход, удерживающий равенство по причине, до которой вы дойдёте через шесть ходов».

Внутри всё скучно. Одна модель Maia в формате ONNX, локально, на позиции с доски. Она не перебирает варианты и не пытается играть сильнее тех людей, на которых училась.

Stockfish больше не выбирает ход

Показывать в стрелке то, что угадала Maia, без проверки нельзя. Иногда люди этого уровня массово подставляют ладью, иногда позволяют мат в один ход. Человек доверяет стрелке на экране сильно больше, чем следует, и словами «так просто часто играют» его потом не успокоишь.

Stockfish я оставил, но право выбирать у него забрал. Он смотрит на ход, который предложила Maia, и запрещает его, только если после этого хода на доске случается катастрофа. Запрещать любую потерю преимущества нельзя: человек почти всегда играет чуть хуже лучшего, и от затеи ничего не останется.

Теперь про мою ошибку, которую я исправлял очень долго. Сначала после запрета я брал лучший ход движка. Ход правильный, чего его не показать. В итоге на всех уровнях, кроме верхних, стрелка тихо возвращалась к Stockfish. Запрет чаще всего срабатывает в сложных позициях, а в сложных позициях на стрелку и смотрят. Я собрал модель человека и подключил её так, что в самые интересные моменты партии она не работала.

Сейчас работает так.

Кандидаты Maia идут по очереди. Stockfish только запрещает катастрофу. Если запретил всех — запасной ослабленный Stockfish
Кандидаты Maia идут по очереди. Stockfish только запрещает катастрофу. Если запретил всех — запасной ослабленный Stockfish

Кандидаты Maia, самый частый первым. Первый, кто прошёл проверку, идёт в стрелку. Запретил — следующий кандидат Maia. Запретил всех — старая политика на ослабленном Stockfish.

// candidates — ходы Maia, уже отсортированы: самый частый первым
// lines — те же ходы, но с оценкой Stockfish
// bestScore — оценка лучшего хода движка в этой позиции
// maximumLoss — сколько «пешек» можно отдать ради человеческого хода
//   (на слабых уровнях порог шире, на сильных — уже)

for (const candidate of candidates) {
  const line = lines.get(candidate.uciMove);
  if (!line) continue; // Stockfish этот ход не подтвердил — пропускаем

  const loss = bestScore - score(line);
  if (loss <= maximumLoss) {
    return line; // первый допустимый кандидат Maia → в стрелку
  }
  // иначе «слишком дорого»: берём следующего кандидата Maia
}

return verifiedLines[0]; // всех запретили → запасной ход Stockfish

Последняя ступень мне не нравится. Она осталась с самой первой версии и живёт как страховка на редкие позиции, где Maia не предложила ничего допустимого. Человек в такой момент снова получает пьяного гроссмейстера, только теперь я хотя бы вижу, когда это случилось.

Два числа на карточке

Рядом со стрелкой лежит карточка, на ней — оценка Stockfish и пометка, насколько ход типичен для выбранного уровня. Числа расходятся регулярно. Мне это приносили как баг: ход помечен как обычный для уровня, а оценка просела на полторы пешки, что вы сломали.

Карточка: оценка −1.4 и пометка «часто». Числа про разное
Карточка: оценка −1.4 и пометка «часто». Числа про разное

Оценка −1.4 и пометка «часто» в одной карточке. Это не баг.

Ничего не сломано. Оценка говорит про доску, пометка — про людей, которые за доской сидят, и совпадать они не подписывались. Вероятности исходов, которые Maia тоже умеет считать, я в интерфейс не пустил: они описывают статистику человеческих партий, а рядом с оценкой поиска читались бы как второе мнение о том же самом.

Ползунок уровня подписан привычными числами от 800 до 2600. Это ориентир, а не обещание рейтинга: шкалы площадок между собой не совпадают, а модель знает только те диапазоны, где училась. Крайний правый край ползунка я назвал максимальной силой, там считает чистый Stockfish и Maia не участвует вовсе. Кто хочет объективную истину о позиции, должен получить её без подгонки под свой рейтинг.

Fair-play

Стрелка от движка в рейтинговой партии против живого человека — чит, как бы кнопка ни называлась, и площадки это запрещают. Партия с ботом, тренировочная позиция, разбор своей игры после её конца — анализ, для этого схема и сделана. Обходить чужие проверки я не умею и не обещаю. Ход за пользователя расширение не делает. Если интересно не модель, а как подсказка живёт рядом с доской на Chess.com — есть разбор по шагам.

Что остаётся на машине

Собрал я это в своём расширении ChessNavio: стрелка появляется у той доски, на которую человек и так смотрит, а партию по PGN или отдельную позицию по FEN можно разобрать на сайте. Как устроена связка «доска → модель → стрелка» без установки, я разобрал отдельно: как это работает. Живая позиция, кандидаты Maia, главный вариант и оценки никуда не уходят — обе модели считает машина пользователя, и стрелка не зависит от того, жив ли сервер.

Модель в сборке одна, упрощённая Maia в ONNX. Я взял её из открытого репозитория CSSLab maia-platform-frontend, лицензия GPLv3.

Чего я не знаю

Показать ход, который здесь сделал бы человек, и объяснить, чем он плох, я «научился». Помогает ли это играть лучше — не знаю. Вижу два сценария: человек узнаёт свою будущую ошибку до того, как её сделал, или человек повторяет подсказку и уходит с приятным чувством, что понял. Отличить их по тем данным, что у меня есть, я не могу, а придумывать себе цифры не хочу.

«Сыграй хорошо» и «сыграй как человек» — разные просьбы. Слабый Stockfish отвечает только на первую. На вторую пришлось искать другую модель.

Про локальный Stockfish в браузере без Maia я уже писал.

Комментарии (13)


  1. CitizenOfDreams
    12.09.2026 20:15

    (рейтинг 1000 на chess.com) А почему люди чаще всего играют здесь Bxf7? Я бы не стал менять две пешки на потерю рокировки, тем более в начале партии, когда ничего еще толком не ясно. Или рокировался бы сам, как предлагает Stockfish, или пошел бы c3, чтобы защитить центр, не пускать черного коня на b4/d4 и начать развивать застоявшийся ферзевый фланг.


    1. 12hsrate Автор
      12.09.2026 20:15

      Да, тут я загнул. Никаких «девяти из десяти» на самом деле нет - просто хотел показать, как человек и движок смотрят по-разному, и взял плохой пример.

      Bxf7 в этой позиции - скорее разовый зевок, а не то, как все бы сходили. Рокировка и c3 как раз нормальные ходы.


    1. dom1n1k
      12.09.2026 20:15

      Я бы не стал менять две пешки на потерю рокировки, тем более в начале партии, когда ничего еще толком не ясно.

      Просто вспомнилось. Накамура на стримах периодически играет с форой. Зрители предлагают ему разные позиции без фигур, с предварительно сделанными ходами и пр.
      И вот однажды ему предложили позицию без двух крайних пешек. Он посмотрел и сказал - ребята, это не фора, я сейчас очень быстро разовью ладьи и вам плохо будет.


      1. CitizenOfDreams
        12.09.2026 20:15

        Ну да, в дебюте пешки в основном только путаются под ногами. Поэтому в Итальянской школе их даже за людей не считали и разменивали направо и налево. Зато в эндшпиле каждая выжившая пешка - на вес золота.


  1. Oreolek
    12.09.2026 20:15

    Ах ты грязный шахматный читер.


  1. dom1n1k
    12.09.2026 20:15

    По-моему, регулировка рейтинга у них работает веротяностно - ходы сортируются по оценке, а потом из них псевдослучайно выбирается один. Суть настройки в распределении графика вероятности - чем ниже рейтинг, тем выше шансы нижних ходов. И наоборот, на максимуме всегда выбирается первый.

    Работает это на практике так себе, конечно. Я давно ещё пробовал на чесскоме играть против слабых ботов - они играли тупо, делали глупые зевки. А мне хотелось, чтобы бот играл просто и бесхитростно, но не делал явного бреда.


    1. 12hsrate Автор
      12.09.2026 20:15

      Да, примерно так и устроен ослабленный Stockfish: лучший ход он всё равно находит, просто иногда его не "применяет". Отсюда и получается «1 линия рядом с откровенным зевком».

      Из-за этого я в итоге и пошёл в Maia - она лучший ход не ищет, а угадывает, какие ходы люди примерно такой силы вообще рассматривают.


      1. Fedorkov
        12.09.2026 20:15

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


        1. 12hsrate Автор
          12.09.2026 20:15

          В начальной позиции разница настолько мала, что при разном времени на расчёт движок останавливается на разных ходах - для него они равноценны. Плюс сайты добавляют дебютную книгу, чтобы партии не были однообразны.

          Подобрать выигрыш перебором это не мешает. За пределами дебюта та же ошибка приводит к тому же результату, тут движок предсказуем. А в дебюте нет единственной выигрышной линии, там позиция равная.


  1. LeshaRB
    12.09.2026 20:15

    Если девять игроков из десяти в этой позиции бьют на f7 и получают по голове,

    А какая выгода , как продумывают люди. Я бы просто так не пошел


    1. 12hsrate Автор
      12.09.2026 20:15

      Выгоды нет. Кто бьёт, обычно видит только шах и «король без рокировки», а дальше не считает.

      Фразу про девять из десяти зря написал. Пример неудачный.


      1. LeshaRB
        12.09.2026 20:15

        Просто в начале отдать слона за пешку. И получить отсутствие рокировки…

        Да если б играл гроссмейстер итд. То думаю против соперника , классом ниже без слона можно играть.

        Но против своего уровня и выше, потерять фигуру. Это фактически равноценно проигрышу

        Потом 9 из 10 вызывает вопросы


    1. Fedorkov
      12.09.2026 20:15

      Это что-то в духе романтических шахмат. Сейчас так даже новички не играют.