Как я написал шахматы с LLM на Python без галлюцинаций нейросетей
Введение
Я работаю с LLM довольно давно и застал модели времен GPT-3.5, примерно в то же время мне нужно было сделать проект по учебе в этой области, тогда я выбрал именно тему шахмат, потому-что не видел конкретно таких решений раньше, конечно ИИ в онлайн шахматах и так был практически непобедим, но мысль сыграть конкретно с нейросетью уровня Chat GPT, мне показалась интересной. Основная проблема - заставить чат бот играть в игру и не делать ничего лишнего.
В этой статье я разберу архитектуру своего проекта: шахмат на Python, где в качестве соперника выступает LLM:
- Как объяснить текстовой нейросети, что происходит на доске 8х8.
- Как заставить ее делать валидные ходы и не ломать игру.
- Как собрать такую систему бесплатно, используя OpenRouter.
Проблема первая: бюджет
Обычно для таких экспериментов все берут OpenAI, но гонять запросы на каждый шахматный ход в их моделях для такого проекта - это сложно и дорого. Моей целью было сделать проект с нулевым бюджетом.
Поэтому я выбрал OpenRouter. Это агрегатор нейросетей, у которого есть доступ к ряду мощных опенсорсных моделей абсолютно бесплатно (хоть и с ограничением по количеству запросов) - у них есть тег :free.
Вот как выглядит инициализация клиента в моем проекте:
Интерфейс библиотеки openai позволяет легко переопределить base_url, поэтому мы бесшовно подключаемся к бесплатной Llama 4 через OpenRouter, не меняя привычный код.
Проблема вторая: LLM не видит доску. Как передать контекст?
Если просто написать промпт «Ты играешь черными, твой ход такой то / такой то», модель огорчится вами и сойдет с ума. Ей нужен контекст. В шахматах есть два стандарта записи:
- FEN (Forsyth-Edwards Notation) — слепок текущего состояния доски.
- PGN (Portable Game Notation) — история ходов.
Чтобы минимизировать галлюцинации, я передаю в модель и FEN, и PGN, а главное — строгий список легальных ходов. Для управления логикой игры я использую библиотеку python-chess.
Вот блок кода, который собирает весь этот контекст перед отправкой запроса:
Собрав эти данные, формируется жесткий системный промпт. Моя задача была отучить модель болтать и заставить её вернуть ровно 4 символа (например, e2e4):
Третья проблема: Паттерн «AI-Рефери» и Fallback
Даже с указанием «выбери из списка легальных ходов», Llama (или любая другая модель) может выдать галлюцинацию, предложить невозможный ход или вернуть текст с рассуждениями. Если передать это напрямую в графический движок (pygame), приложение упадет с ошибкой.
Нужен слой валидации. В моем коде за это отвечает блок try/except внутри логики UI. Если LLM возвращает недопустимый ход (не проходит проверку python-chess), срабатывает Fallback-механизм - скрипт делает случайный валидный ход, чтобы игра не прерывалась.
В консоли этот процесс выглядит так:
Архитектура проекта
Выводы
- Бесплатный ИИ существует (хоть и с условностями): OpenRouter и опенсорсные модели отлично справляются с подобными проектами, позволяя не тратить деньги на API.
- Контекст решает всё: Чем больше жестких рамок вы зададите в промпте (FEN + PGN + список легальных ходов), тем адекватнее будет ответ.
- Защищайте свой код: Паттерн «Рефери», когда классический детерминированный код (в данном случае python-chess) стоит между LLM и состоянием приложения, - это база для построения надежных AI-систем.
P.S. Не знаю принято тут так писать или нет, но, Спасибо за внимание.