はじめに: 「数学、どっからわからないのかわからない」
「数学、どっからわからないのかわからない」
冬休みが始まった娘が相談してきたのが、アプリ制作のきっかけでした。
状況を聞くと、「どこから分からないか分からない」、授業中地蔵状態とのこと。
(あれ? これはちょっとまずいんじゃないか?)
学校以外で、わからないところを探し出し、それに対応してくれるような教育施設というと――
家庭教師か個別塾くらいしか見当たらない。
冬期講習を探し、個別塾の相場を調べたところ、個別指導は月7万円。
2週間で効果があるか? そもそももう冬休み講習に間に合わない!
ところで私はここしばらく業務でAIの相手をずっとしたので、ふとひらめきました。
「数学AIチューター、冬休みで作ろ」
AIチューターを作る
わざわざエージェントAI自作? Gemini3Proあたりで十分じゃん、と思うかもしれませんが。あまいのです。
「何が分からないかわからない」生徒には、答えを教えるAIではなく、分からないところを見つけてくれるAIでないと学習の助けにならないのです。
娘の様子から、そう判断しました。
そこで作ることにしたのが「MathDesk」。
「いま自分がどこにいるか」「次に何をやればいいか」を可視化する数学AIチューターというコンセプト。
共通テストレベルに必要な数学スキルを、学習指導要領に基づく382個に分解し、依存関係つきのマップで可視化しています。

実際の依存チェーンから「数と式」分野を抜粋。✓ 習得済み、▶ 学習中、グレー=未挑戦

対象ユーザー
- 大学入学共通テスト(数学I・A・II・B・C)を控える大学受験生
- 数学に苦手意識を持ち、「何から手をつければいいか分からない」学習者
主要機能
1. スキルマップ — 382スキルの依存グラフ
学習指導要領をベースに、数学I〜Cの全範囲を382個のスキルに分解してます。
項目は有名参考書を複数購入し「目次」を参考にしています。
各スキルには前提スキル(prerequisite)があります。
「二次不等式が解けない」→「因数分解が怪しいかも」→「実は展開の段階で曖昧」
—— 弱点を、依存関係を辿って特定していく。
-
科目(6科目) → 単元(24単元) → スキル(382個) の3階層。
たとえば「数学II → 三角関数 → 加法定理の証明と応用」のように分解 - スキルごとに rank(未挑戦 / Lv.1 / Lv.2 / Master) をバッジ表示
- 「学習可能」フィルタ で、前提をクリア済みのスキルだけを表示

数学は積木みたいだなと思ってまして。
「わからん」の上には、何か積もうとしても崩れるだけだなと。
(漢字ならどんな順番でも覚えられますが)
当たり前ですが、その当たり前をシステムで表現する必要があるなあとこの形にしました。
スキルマップの主眼は 「何ができて、何ができないか」を一目で把握できること。
382スキルのうち、どこまでが緑(習得済み)で、どこからがグレー(未挑戦)か。
その境界線が、ユーザーの現在地です。
現状はリスト形式ですが、いずれ地図として眺められるUIにしたい。
2. AI問題生成 + 段階的マスタリー判定
各スキルに対してGemini 3 Pro(High) で4段階の難易度の問題を生成。
| Level | 難易度 | 内容 |
|---|---|---|
| Lv.1 | 基礎確認 | 定義の理解、計算の正確さ |
| Lv.2 | 標準 | 概念を組み合わせた問題 |
| Lv.3 | 応用 | 複数ステップ、条件整理が必要 |
| Lv.4 | 発展 | 複数テクニックの複合、証明・一般化 |
- 2,800問以上の事前生成プール(全レベル対応)— 即時提供、待ち時間ゼロ
- プール使い切り時はリアルタイムAI生成(SSEストリーミング)→ 生成した問題はプールに自動追加
- 部分点評価 — 途中式・考え方も含めて採点
- 図形問題の自動作図 — 幾何や関数の問題では、Flashが問題文に合わせたJSXGraphコードを生成し、図を動的に描画

3. 答えではなく「答え方」を教えるコーチング
答えだけ教えても身につかない、類題になるとダメ、というのは数学苦手界隈あるある。
MathDeskは、「どう考えればいいか」を引き出す対話型コーチングがポリシー。

4. 入力は簡単に
- 数式入力を簡単にする工夫: 分数や√を直接タップできるキーボード + 音声入力(Web Speech API)
- ノートを写真でアップロード: 手書きでも読み取って「この問題が分からない」から学習開始も可能
- バックトラック診断: 誤りを検出すると自動で前提スキルを診断
- もちろん自由に文章で入力しても解釈する。「3ぶんの4」でもOK
ここまでの機能をデモ動画にまとめた。
とにかく時間がない — 開発もAIで、徹底的に自動化
本業は別にあるので、開発時間があまりとれません。
やれそうなことは、可能性が少しでもあれば全部AIにやらせる方針で進めました。
バーチャルプレイヤーテスト
締め切り1週間前、機能はひと通りできたけどUXテストをやる時間がない。テスターを集めるあてもない。
で、思いついたのがAIにユーザーを演じさせるという方法です。
Claude Codeのサブエージェントに架空の高校生ペルソナを与え、Playwright CLI経由で実際にアプリを操作させてみました。(従来なら固定シナリオで仕様を確認するだけ)
プロンプトサンプル
あなたは Misakiという高校2年生です。
- 進学校(偏差値65)に通うが、数学は苦手(定期テスト45点)
- 友達に「このアプリいいよ」と勧められてインストールした
- 面倒くさがり。つまらなければすぐやめる
このアプリを好きなように使ってみてください。
強制はありません。面白ければ続ける、つまらなければやめる、それでOKです。
ポイントは行動を規定しないこと。
テスト項目を渡すとチェックリスト消化になってしまいます。
ペルソナの属性だけ与えて自由に操作させることで、人間のユーザビリティテストに近い「予想外の行動」を観察可能に。
バーチャルプレイヤーで見つけた課題
UIの問題:
- 「382スキル・0%」を初見でみたペルソナが絶望して離脱 → デフォルトフィルタを「学習可能」に変更
- 面倒くさがりのペルソナが「努力がすぐ反映されない」と離脱 → rankバッジのリアルタイム表示を追加
- 「スキル」と「カード」の2概念が混乱を招く → カードタブを廃止して1画面に統合
LLM設計:
こちらはもっと根深い。5体のペルソナを並列で走らせると、それぞれが詳細な操作ログを残すが、
横断的に読むことで、複数のペルソナの報告に共通点があることに気づけた。
- 同じ問題を4回出題された(x²-5x+6 が延々ループ)
- 会話9ターン目で「元の問題を教えて」と聞き返される(さっき解いた問題を忘れている)
- 存在しない会話への言及(「前のドラマ」——そんな話はしていない)
1体だけなら見過ごしたが、これは「コンテキストが小さいときのLLMの会話パターン」。
それぞれ起票するのでなく、コンテキストウィンドウが1だったりしないか調査。
答えは違いましたがやはりその部分に問題が。
毎回のリクエストで、システムプロンプト約12,000トークン + 会話履歴の全量を丸ごと送信していたのです。
会話が10ターンを超えると、システムプロンプトと合わせて20,000トークン超え。
Geminiの注意力が会話の中間部分で低下する「Lost in the Middle」問題がわずか9ターンで発生。
プロンプト12,000トークンの内訳を調べ、必須なのはキャラクター定義と基本ルールだけと結論。
習得判定用のFew-shot(約4,500トークン)は通常会話で不要。
介入戦略の詳細な台本も、各1行で十分。
対策として、プロンプトをコアと状況別に分離。
通常会話時のシステムプロンプトを 12,000 → 3,500 トークンに圧縮。
バーチャルプレイヤー自体が優秀なこと以外に、操作ログも有用。
人間のテスターなら「AIが変だった」で終わるところを、
「Turn 9でコンテキスト喪失」「5体中3体で再現」という具体的なログで、
プロンプト設計の不具合とすぐに結論できた。
デモ動画もClaudeCodeスキルで作る
デモ動画も手動撮影ゼロ。
Playwrightでアプリを自動操作して画面録画。
VOICEVOXでナレーション音声を生成。
Remotion(Reactベースの動画フレームワーク)で合成してMP4出力。
台詞を書き換えてコマンドを叩くだけで撮り直しできるので、締め切り直前の修正にも対応できた。
(=このページの動画。この原稿書いてる横で自動で作られつつある)
人間が考え、AIが作る
このプロジェクトは休日一人開発。
開発エージェント(Claude Code)とアプリ内AI(Gemini)を道具として使い分けている。
私が考えたこと:
- 「数学の地図」というコンセプト — 娘の相談から出発し、依存関係グラフという形に落とし込んだ
- 「答え方を教える」という教育思想 — 答えを教えても身につかないという実感から
- 参考書キャプチャ → AI問題生成への方針転換 — 「参考書がなくても学べるべきだ」と途中で判断
- バーチャルプレイヤーテストの発案と設計 — 「行動を規定しない」原則を含めて
- Gemini Pro / Flash の使い分け戦略 — 応答速度・コスト・品質トレードオフの判断
AIが実行したこと:
- 上記の判断に基づくフルスタック実装
- 2,800問の問題プール生成
- バーチャルプレイヤーテストの実行(5ペルソナで延べ一週間プレイ)
- 100本以上の設計ドキュメント作成(人間がレビュー・修正)
要するに、何を作るか・なぜ作るかは私がリクエストし、実装はAIという分担。
技術スタック
| レイヤー | 技術 |
|---|---|
| フロントエンド | React 18 + TypeScript + Vite |
| バックエンド | Node.js + Express + TypeScript |
| データベース | Cloud Firestore |
| AI(アプリ内) | Gemini 3 Pro / Flash(Vertex AI 経由) |
| AI(開発) | Claude Code(Claude Opus) |
| 数式表示 | KaTeX + MathLive |
| 図形描画 | JSXGraph |
| 音声入力 | Web Speech API |
| 認証 | Firebase Authentication |
| インフラ | Google Cloud Run |
Gemini APIの使い分け
| 用途 | モデル | 理由 |
|---|---|---|
| 対話コーチング | Gemini 3 Pro | 教育的推論の質が重要 |
| 問題生成(Lv.3-4) | Gemini 3 Pro | 応用・発展は質が重要 |
| 問題生成(Lv.1-2) | Flash | 基礎問は速度優先 |
| 回答評価 | Gemini 3 Pro | 部分点評価に推論力が必要 |
| 日次アドバイス | Flash | 軽量タスク |
Google Cloud の活用
- Cloud Run: フロントエンド + バックエンドを1コンテナに統合。自動スケーリング
- Vertex AI(Gemini API): 4タスクで Pro / Flash を使い分け
- Cloud Firestore: ユーザーデータ・会話履歴・スキル進捗・問題プール2,800問+を管理。開発初期のSQLiteから完全移行
- Firebase Authentication: Google ログイン
コスト — 開発中に使ったお金
GCP(Gemini API・Cloud Run)、開発AI(Claude Code)、BGM生成、参考書……全部ひっくるめても、個別塾の月謝1ヶ月分(7万円)にすら届かない。
もちろん人間の先生の代わりにはならない。でも「どこが分からないか分からない」段階のナビゲーションなら、この費用感で十分に助けになれると思っている。
現在地と今後
現時点で動くもの:
- オンボーディング(問診票)→ AIが推薦スキルを提示 → 学習・練習・チャットの一連の流れ
- 382スキルのマップ表示、問題プール2,800問、対話コーチング
まだできていないこと:
- 好きな単元を自由に選んで学ぶ — 現状はAI推薦の導線のみ
- スキルマップの地図化 — リスト形式から、依存関係を辿れるビジュアルマップへ
- 問題プールの新陳代謝 — ユーザーが解くことで正答率・解答時間が溜まり、良問が残り悪問が淘汰されるプールにしたい
- 他教科への展開 — 物理・化学など、同じく「積木型」の教科へ
おわりに
娘に相談された12月末から、約7週間。
自分の冬休み期間で作ろうと思った段階では、「黄チャートの問題をAIに読ませて解説させる」だけの簡素なツールを想定していました。
でも作り始めてみると、「参考書がなくても学べるべきだ」「答えじゃなくて答え方を教えるべきだ」と要件がどんどん変わっていきました。(キャラづけやBGMは少し暴走したかも)
第4回 Agentic AI Hackathon with Google Cloud に出すと決め、「娘専用の自炊アプリ」から「他の人にも使える形」へとゴールが変わりました。
著作権をクリアに、参考書なしでも学べる設計にと大きくピボットしましたが、結果的にプロダクトとしてよいものになっていると思います。ハッカソンが強制的にプロダクト化を促したとも言えます。
「数学は積木」という当たり前を、見通しよく表現するアプリになれているといいなと思っています。
結局一義的には娘のために作ったアプリなので、ちゃんと使ってもらえることが現在の目標です。
MathDeskは一人の開発者がClaude Code + Gemini APIで開発した数学学習プラットフォームです。
第4回 Agentic AI Hackathon with Google Cloud に応募しています。