ローカルLLMに中学数学30問を解かせた正答率|Ollama 4モデル実測(RTX 3090)
要点
- gemma4:31bとgpt-oss:20bは30問すべて正答した。 1問あたりの平均時間は
gpt-oss:20bが1.8秒、gemma4:31bが11.2秒でした。 - 計算間違いによる誤答は、4モデル・延べ120問のうち完走した118問で0件だった。 失点はすべて、回答が届く前の時間切れか、答えの行に付いたLaTeX記号による書式不一致です。
- qwen3.6:35b-a3bは28/30(時間切れ2問)、qwen2.5:14bは厳密採点で28/30(数式としては30/30一致)。
qwen2.5:14bは文字式2問で答え: \(-2x\)のように\( ... \)を付けたため、正規化関数が弾きました。 - 答えが合っていても、途中式の出し方はモデルで大きく違う。
gpt-oss:20bは30問中25問で思考(thinking)にだけ計算を書き、本文(content)には答え: ...の1行だけを返しました。
家庭学習の検算や問題づくりの補助にAIを使う話題が増えていますが、手元のPCとOllamaで動くローカルLLMに中学数学の計算・方程式・文章題を解かせると、どの分野でどれだけ正答し、どんな失敗が起きるのかを実測しました。RTX 3090 24GBで4モデルに7分野30問を1回ずつ出し、出力を機械的に採点しています。
問題生成・採点を行うベンチマークスクリプトと、4モデル×30問の結果JSONをそのまま配布します。本文の数値はすべてこのJSONからの転記です。
7分野30問の内訳と測定条件
問題は、外部の問題集から転載したものではなく、乱数シード(20261026)を固定した決定的な乱数(mulberry32)で生成し、スクリプト側で計算した正解と一緒に保持しています。方程式や平方根は、解や簡約後の形から逆算して問題文を作るため、端数や平方根の中の平方数が残らない設計です。
| 分野ID | 分野名 | 問数 | 出題例(シード 20261026) | 正解の例 | 求める出力形式 |
|---|---|---|---|---|---|
seifu | 正負の数の四則 | 6 | (-6)² - 7 × (-8) | 92 | 単位を書かず数だけ |
mojishiki | 文字式の計算 | 4 | 2(3x + 2) - 2(4x + 2) | -2x | 最も簡単な形の文字式 |
ichiji | 一次方程式 | 5 | 7x - 12 = 8x - 4 | -8 | x=... または数 |
renritsu | 連立方程式 | 4 | 2x - 2y = 12, -3x + 5y = -28 | x=1, y=-5 | x=..., y=... |
kansu | 一次関数の値 | 3 | y = 3x + 4 で x が 4 から 8 まで増加するときの y の増加量 | 12 | 単位を書かず数だけ |
bunshou | 割合・速さの文章題 | 5 | 定価 3000 円の商品を 15% 引きで買うと、代金は何円か | 2550 | 単位を書かず数だけ |
heihoukon | 平方根の計算 | 3 | √63 + √7 | 4√7 | 最も簡単な形で √ を使用 |
各問題のプロンプトは、最後の行に答え: に続けて答えだけを書くよう指示し、分野ごとの出力例を添えています。たとえばrenritsu-1に送ったプロンプトは次のとおりです。
次の中学数学の問題を解いてください。最後の行に「答え: 」に続けて答えだけを書いてください。答えは x と y の値を書く(例: 答え: x=3, y=-2)。
問題: 次の連立方程式を解きなさい。 2x - 2y = 12, -3x + 5y = -28実行は2026年10月26日16:14〜16:40(日本時間、2026-10-26T07:14:19.303Z〜07:40:39.784Z)です。
- 実行環境:NVIDIA GeForce RTX 3090(24,576 MiB、ドライバ617.42)、Windows(
win32 10.0.26300)、Ollama 0.30.6、Node.js v24.22.1 - 推論オプション:Ollamaの
/api/chatへ、temperature0、seed20261026、num_ctx4096、num_predict3584でストリーム送信。1回答の上限は300秒(300,000 ms) - 実行順序:
gemma4:31b→qwen3.6:35b-a3b→gpt-oss:20b→qwen2.5:14bの順に30問ずつ1回実行し、各モデルの終了後にollama stopでメモリを解放。思考(thinking)の有効・無効はモデル既定のまま - 採点基準:回答本文(
content)の最後の答え:行を抽出し、全角半角・空白・単位(円、km、人、時間など)・$や\boxed{}・\sqrt{}などを正規化したうえで、数値・一次式の係数(p, q)・連立解(x, y)・平方根(a, b)が正解と一致するかを判定。未整理の式(例:5x - 2 - x - 1や√45)は不正解とする
結果:gemma4とgpt-ossが30/30、残り2モデルが28/30
分野ごとの正答数と、モデル別の所要時間・出力文字数の集計です。
| 分野(問数) | gemma4:31b | gpt-oss:20b | qwen3.6:35b-a3b | qwen2.5:14b |
|---|---|---|---|---|
| 正負の数の四則(6) | 6/6 | 6/6 | 6/6 | 6/6 |
| 文字式の計算(4) | 4/4 | 4/4 | 4/4 | 2/4(書式不一致2) |
| 一次方程式(5) | 5/5 | 5/5 | 5/5 | 5/5 |
| 連立方程式(4) | 4/4 | 4/4 | 3/4(時間切れ1) | 4/4 |
| 一次関数の値(3) | 3/3 | 3/3 | 2/3(時間切れ1) | 3/3 |
| 割合・速さの文章題(5) | 5/5 | 5/5 | 5/5 | 5/5 |
| 平方根の計算(3) | 3/3 | 3/3 | 3/3 | 3/3 |
| 合計(30) | 30/30(100%) | 30/30(100%) | 28/30(93.3%) | 28/30(93.3%) |
| 30問の合計時間 | 337.1秒 | 53.4秒 | 1,125.2秒 | 61.9秒 |
| 1問あたりの平均時間 | 11.2秒 | 1.8秒 | 37.5秒 | 2.1秒 |
| thinking合計文字数 | 17,783文字 | 6,984文字 | 63,388文字 | 0文字 |
| 回答本文(content)合計文字数 | 2,717文字 | 592文字 | 3,893文字 | 4,458文字 |
1問あたりの平均時間を並べると、gpt-oss:20b(1.8秒)とqwen2.5:14b(2.1秒)が2秒前後、gemma4:31bが11.2秒、qwen3.6:35b-a3bが時間切れ2問を含めて37.5秒でした。各モデルとも1問目(seifu-1)にモデルの読み込み時間(12.2〜36.5秒)が含まれます。
失敗の型:計算ミスではなく、書式ズレと時間切れ
今回の30問では、最後まで回答が出た118問(4モデル×30問のうち時間切れ2問を除く)すべてで、導かれた数や式が正解と一致していました。不正解になった4件は、次の2種類に分かれます。
1. 答えの行に \( ... \) を付けた書式不一致(qwen2.5:14b の2問)
qwen2.5:14bは、文字式のmojishiki-1(正解 -2x)とmojishiki-3(正解 6x - 24)の2問で不正解と判定されました。実際の出力は次のとおりです。
# mojishiki-1(問題: 2(3x + 2) - 2(4x + 2) / 正解: -2x)与えられた式は \(2(3x + 2) - 2(4x + 2)\) です。まず、分配法則を使って括弧を展開します:\[= 6x + 4 - (8x + 4)\]次に、マイナスの符号を通じて二番目の括弧内の各項に負号を適用します:\[= 6x + 4 - 8x - 4\]最後に似た項をまとめます:\[= (6x - 8x) + (4 - 4)\]\[= -2x + 0\]\[= -2x\]答え: \(-2x\)
# mojishiki-3(問題: 3(x - 6) + 3(x - 2) / 正解: 6x - 24)(中略)\[ 3x + 3x - 18 - 6 = 6x - 24 \]答え: \(6x-24\)計算自体はどちらも合っています。ただ、採点スクリプトのnormalizeMathTextは$...$や\boxed{...}は取り除く一方、LaTeXのインライン数式記号である\(と\)を取り除いていませんでした。そのため抽出された\(-2x\)と\(6x-24\)にバックスラッシュと括弧が残り、一次式のパーサー(parseLinearExpression)がnullを返して不一致になりました。
同じqwen2.5:14bでも、本文中で\[ ... \]や\( ... \)を使いながら、最後の行だけは答え: x=-8や答え: 10x-14とプレーンテキストで書いた他の28問は正答になっています。プログラムでLLMの出力を受け取って自動判定する場合、数式の中身だけでなくLaTeXデリミタの揺れ($...$、\( ... \)、\[ ... \])を正規化側で吸収する必要があることが分かります。
2. 思考の途中で300秒に達した時間切れ(qwen3.6:35b-a3b の2問)
qwen3.6:35b-a3bは、連立方程式のrenritsu-4(4x - 2y = -14, 3x - y = -8)と一次関数のkansu-1(y = 6x + 9 で x = -6 のときの y)の2問で、上限の300秒に達して打ち切られました。
renritsu-4:300.0秒で171チャンク、思考(thinking)が614文字出たところで停止。本文は0文字kansu-1:続く問題でも300.0秒で21チャンク、思考が92文字出たところで停止。本文は0文字- その次の
kansu-2は168.5秒(527トークン)で完走して正答し、以降のkansu-3からheihoukon-3までの9問は5.2〜18.3秒で完走してすべて正答
ほかの完走した28問では5.0〜36.5秒(kansu-2のみ168.5秒)で1,036〜4,232文字の思考を出力しているのに対し、時間切れの2問は300秒間で21〜171チャンクしか進んでいません。問題の難しさで考え込んだというより、この2問の途中で生成速度自体が極端に落ちています。RTX 3090(24GB)で23GB級のモデルを動かす際にVRAMの空きやオフロードがどう影響したかは今回記録していませんが、WindowsとOllamaで急に遅くなるときの確認手順はOllamaがWindowsでGPUを使わない・遅いときの確認手順にまとめています。
同じ満点でも、途中式の出し方が違う
30問すべて正答したgemma4:31bとgpt-oss:20b、および完走した問題すべてで計算過程を書いたqwen2.5:14bとqwen3.6:35b-a3bでは、回答本文(content)と内部思考(thinking)の使い分けがはっきり分かれました。
今回のプロンプトは「最後の行に『答え: 』に続けて答えだけを書いてください」とだけ指定し、途中の行に計算過程を書くかどうかは指示していません。その結果、gpt-oss:20bは一次方程式の4問と平方根の1問を除く25問で、計算をすべてthinkingフィールド内で済ませ、contentには答え: 3や答え: x=1, y=-5の1行だけを返しました。
家庭学習の検算で「自分の途中式のどこが違うか」を確かめたい場合は、答えの数字だけでは役に立ちません。gpt-oss:20bのように思考と本文を分けるモデルを使うなら、プロンプトで「途中の計算式も本文に書くこと」と明示するか、APIのthinkingフィールドもあわせて表示する必要があります。
手元で再現する
local-llm-math-bench.mjsとlocal-llm-math-bench-20261026.jsonを同じフォルダに保存します。Node.js 22以降の標準機能だけで動き、追加パッケージやAPIキーは不要です。
# 生成される7分野30問の問題文と正解を表示する(Ollamaには接続しない)node .\local-llm-math-bench.mjs --print-problems
# 1モデルだけ実行し、結果JSONと各問の生ログ(thinking・content全文)を保存するnode .\local-llm-math-bench.mjs --models gpt-oss:20b --out results.json --raw-dir raw--modelsを省略すると今回の4モデルを順番に実行します。Ollamaを使わずに、公開している結果JSONの120件を採点関数で再検証するだけなら、同じフォルダで次のワンライナーを実行できます。
node -e "import('./local-llm-math-bench.mjs').then(({generateProblems,isCorrect})=>{const fs=require('node:fs');const d=JSON.parse(fs.readFileSync('./local-llm-math-bench-20261026.json','utf8'));const p=new Map(generateProblems().map(x=>[x.id,x]));const diff=d.results.filter(r=>(!r.error&&isCorrect(p.get(r.id),r.extracted??''))!==r.correct);console.log(d.results.length+' results, '+diff.length+' mismatches');})"120 results, 0 mismatches測定の限界と、検算に使うときの注意点
よくある質問
ローカルLLMは中学数学の計算や方程式をどのくらい解けますか?
今回の7分野30問(正負の数、文字式、一次方程式、連立方程式、一次関数、割合・速さの文章題、平方根)では、gemma4:31bとgpt-oss:20bが30問すべて正答しました。qwen3.6:35b-a3bは300秒の時間切れ2問を除く28問すべてで正答し、qwen2.5:14bは文字式2問でLaTeX記号付きの出力により自動採点で不一致になりましたが、導出した数式自体は30問すべて正解と一致していました。各問1回の結果です。
qwen2.5:14bが28/30になった原因は何ですか?
計算ミスではなく、答えの行の書式です。mojishiki-1で「答え: (-2x)」、mojishiki-3で「答え: (6x-24)」とLaTeXのインライン数式記号を付けて出力したため、$や\boxedだけを除去していた採点関数で不一致となりました。本文の計算過程とカッコ内の式は正解と一致しています。
同じ30問のベンチマークを自分のPCで再現できますか?
同梱のlocal-llm-math-bench.mjsはNode.jsの標準機能だけで動き、乱数シード20261026から同じ30問と正解を生成します。—print-problemsで問題一覧を確認でき、手元のOllamaへ送信して採点できます。結果JSONも同梱しているため、Ollamaを動かさずに採点関数の再計算だけを確かめることもできます。
次に読む
日本語の実務課題でローカルLLMがどう失敗するかはJ-WorkBenchの失敗例7ケース、クラウドモデルとの相対得点と測定の限界はローカルLLMとクラウドの比較にまとめています。手元のGPUメモリにどのモデルとnum_ctxが載るかを見積もるには、VRAM別モデルサイズ早見を参照してください。
この記事の情報・検証メモ
- local-llm
- ollama
- benchmark
- nodejs
- 公開日
- 情報確認
- 更新性
- 定期更新
仕様・料金・提供範囲が変わりやすいテーマは、公開日・更新日・情報確認日を分けて管理します。 導入前には必ず記事末尾の一次情報と公式ドキュメントで最新状況を確認してください。