1. はじめに:なぜ作りたいと思ったのか
私は現在、社内メンバー向けのタイピング練習アプリを開発・運用しています。
当初は、約1500個の文章をJSONファイルに用意し、そこからランダムに出題するシンプルな仕組みで順調に稼働していました。
しかし、運用を続けていく中で、ユーザーであるメンバーからある意見をもらいました。
「何度もプレイしていると、文章を覚えてしまって、タイピングの練習というより暗記ゲームになってしまっている...」
確かに、1500個という数は一見多く見えますが、毎日プレイするメンバーにとっては数日で覚えてしまう量でした。
これでは「反射的に文字を打つ」という本質的なタイピング練習にならず、スキルの向上につながりません。
解決策の検討
まず考えたのは文章の数を増やすという物理的な解決策でした。
しかし、これには以下の課題がありました。
- 文章データのファイル容量が肥大化する
- 追加の文章を大量に考える人的コストがかかる
AIによる文章自動生成という発想
そこで思いついたのが、生成AI(Gemini API)を活用した文章の自動生成です。
AIを使えば、無限に異なる文章を生成できるため、「文章を覚えてしまう」という問題を根本から解決できると考えました。
2. 実装における3つの壁
「Gemini APIを使えば万事解決!」と考えていましたが、実際に導入しようとすると
以下の3つの大きな課題に直面しました。
1. 🐌 レイテンシ問題(待ち時間)
ユーザーがプレイを開始するたびに API を叩くと、
APIリクエスト → Geminiが生成 → レスポンス
というフローになり、文章が表示されるまで5〜7秒も待たされてしまいます。
これではユーザー体験が最悪です。
2. 💰 コスト問題
今回は社内ツールということもあり、予算はサーバー(VM)代のみ。
ユーザー数 × プレイ回数の分だけ API 呼び出しが発生すると、APIの無料枠を超えて課金が発生するリスクがありました。
3. ⚠️ レート制限問題
多数のユーザーが同時にプレイした場合、Gemini API のレート制限(無料枠は 1日あたり200)に引っかかり、エラーで遊べないユーザーが出てしまう可能性がありました。
3. 解決策:AIでリアルタイムに生成しているように"見せかける"
どうすればこれらの課題をクリアできるか。答えはシンプルでした。
「前日にバッチ処理で文章を生成してDBに貯めておき、プレイ時はそこから出す」
つまり、リアルタイム生成を諦め、事前生成(プリフェッチ)方式に切り替えました。
結局、ユーザーが求めていることは
「ランダム性の高い文章でタイピング練習をすること」
であって
「リアルタイムにAI生成された文章でタイピング練習をすること」
ではないことに気づきました。
システムアーキテクチャ図
この実装により、ユーザーからは「毎回違う文章が出てくる(まるでAIがその場で作っている)」ように見えつつ、システム内部では高速なDBアクセスしか行わない状態を作ることができました。
4. 導入効果:3つの課題を同時解決
このアーキテクチャにより、前述の課題はすべて解決しました。
| 課題 | 解決内容 | 効果 |
|---|---|---|
| レイテンシ | DB参照のみ | レスポンスが 5~7秒 → 20~50ms に短縮 (約100倍高速化) |
| コスト | バッチ処理で生成 | 10分に1回(1日に144回)生成するだけなので、API無料枠の範囲内 |
| レート制限 | バッチ処理 | バッチ処理でリクエストを送る(1日に144回)ので、制限に引っかからない |
まとめ
今回はタイピング練習アプリにおける「文章を覚えてしまう」という課題に対し、生成AIを活用しつつ、「バッチ処理による事前生成」という工夫を組み合わせることで、レイテンシ・コスト・レート制限の壁を乗り越えました。
「AIを使う=リアルタイムにAPIを叩く」という固定観念を捨て、要件に合わせて処理タイミングをずらすことで、UXとコストのバランスの取れた実装ができたと思います。
同じような課題を持っている方の参考になれば幸いです。
また、もっといいアーキテクチャあるぞ!って方いらっしゃいましたら、是非コメントにてご教授いただけるとありがたいです!
