Teaching Chess with Language Models

I recently built a Chess Learning platform as part of my journey to achieve an Expert level FIDE ranking. The tool (entirely open-source and local, meant for personal use) is fairly straightforward: sync your games from Chess.com, run them through an engine, and identify your recurring mistakes. In working on this project I came across an interesting problem: getting an LLM to explain why a particular move in chess is good or bad.

Modern engines (Stockfish, AlphaZero, Leela, etc.) have essentially solved chess evaluation; they will tell you the ~best move in any position. As a semi-lazy but decent human player (~2000 rating), I find engines to be useful, but not quite as useful as a conceptual explanation. Chess books offer some of the guidance I seek but they're unpersonalized and much harder to apply without dedicated study. I'm also not interested in finding a coach at this time. An eval line alone isn't helpful instruction for a student seeking to understand what strategy is appropriate for a given situation and why a move is favorable or not. On the surface this appears to be a mere language problem which LLMs should be able to tackle.

The wrong tool for the job

After doing some digging, I found broad agreement that LLMs cannot play chess well. Frontier models routinely make illegal moves and fail to correctly assess even basic positions. Benchmarks from 2025 found o3 making illegal moves in 87.5% of games and o4-mini in 94.3% — worse than GPT-3.5-turbo-instruct on raw legality. Larger thinking budgets don't close the gap, suggesting the limitation is not simply a matter of compute.

The failure doesn't appear to be architectural either. Additional research by Adam Karvonen shows that a 50M-parameter GPT trained on human games (from Lichess) can reach ~1500 Elo and develop a coherent internal board state.

But using an LLM to play chess strikes me as the wrong framing to begin with, given that evaluation is already "solved". The interesting question isn't whether LLMs can compete with purpose-built engines (they can't) but whether they can do something that engines are incapable of: explaining a position in terms which a student can learn from.

Why it's still hard

If LLMs are bad at playing chess, the obvious solution is to pair the model with an engine. In the simplest form, provide the engine's top line to the model and have it explain. This fails in a specific way: the model receives the what but not the how. It may know that e4 is +0.3 and what subsequent moves are to follow, but the model lacks visibility into all of the branches that the engine explored to reach that conclusion. It also has no sense of what state each continuation leads to, and no framework for translating an eval score into a concept a student can act on.

A naive input representation can also compound this. Raw PGN and FEN notation are not natural inputs for a language model, and force the model to do significant inferential work to reconstruct what's on the board (e.g. whether pieces are pinned, a mating net is being set up) before it can actually reason about the position. This is a different failure mode than "the model doesn't know chess."

Bridging the gap

A chess-trained model learns to build a board representation on its own, whereas an off-the-shelf model needs us to hand it one. In my own exploration, these techniques noticeably improved how accurately LLMs reasoned about positions:

Each of these either translates the position into a language-native form, or offloads the part the model can't do reliably, before asking the model to reason about it.

Taking it further

The most relevant work I came across is Tang et al. (2026), which formalizes a similar approach into a training pipeline. Their core insight mirrors what prompt engineering approximates: Stockfish knows the correct answer but can't articulate it; LLMs can articulate but can't evaluate. Their solution was to combine both — Stockfish provides ground-truth principal variations, an LLM generates natural language explanations using Feigned Discovery Prompting (reasoning as if the answer is unknown, rather than post-hoc justification). Feigned discovery forces the model to reason about its options until it arrives at the optimal move, resulting in a thorough and grounded chain of thought (rather than reasoning backwards from the solution and rationalizing incorrectly).

Their results were impressive but constrained only to puzzles which have a single correct continuation. Real game positions remain a harder problem as there may not be an immediate tactical objective to pursue and the optimal strategy may not be clear yet.

I plan on incorporating some of these ideas in the next iteration of the tool. If you're interested in collaborating, feel free to reach out.