LLM «придумывает» шахматные ходы: как проверять ответы кодом
Автор показывает, почему LLM часто называет несуществующие шахматные ходы и как автоматизировать проверку каждого ответа с помощью Python‑скриптов.
Что случилось?
В недавней статье на Habr ML автор столкнулся с тем, что крупные языковые модели (LLM) при запросе о шахматных позициях часто называют ходы, которых на доске нет. Модель «знает» правильный ответ, но формулирует его в виде несуществующих координат или полностью выдуманных фигур.
Почему промпт не спасает?
Попытка уточнить запрос фразой «Пожалуйста, указывай только реальные ходы» не приводит к улучшению: LLM всё равно генерирует «правдоподобные», но неверные варианты. Это связано с тем, что модель обучена предсказывать токены, а не проверять их логическую согласованность с правилами шахмат.
Как автор проверяет ответы?
Для надёжной валидации он написал небольшой Python‑скрипт, который:
- Принимает строку с ходом от модели.
- Парсит её в формат
uci(например,e2e4). - С помощью библиотеки python‑chess проверяет, существует ли такой ход в текущей позиции.
- Если ход недопустим – скрипт генерирует запрос к модели с указанием ошибки и просит новый вариант.
import chess, re
board = chess.Board(fen="r1bqkbnr/pppppppp/n7/8/8/5N2/PPPPPPPP/RNBQKB1R w KQkq - 0 1")
move_str = "f3g5" # пример ответа LLM
if re.fullmatch(r"[a-h][1-8][a-h][1-8]", move_str):
move = chess.Move.from_uci(move_str)
if move in board.legal_moves:
print("Ход валиден")
else:
print("Ход невозможен в текущей позиции")
else:
print("Неправильный формат хода")
Ключевые цифры
- Более 30 % проверенных запросов завершались неверным ходом.
- Автоматическая валидация сократила количество повторных запросов к модели на ≈ 70 %.
Ссылка
Для разработчиков, использующих LLM в игровых или обучающих проектах, автоматическая проверка ответов — обязательный шаг. Без неё легко получить «правильный на вид» результат, который ломает логику приложения. Пример кода показывает, как быстро добавить валидацию и снизить количество ошибок.


