[CodeStudy] あえて不便に作ったSwift学習アプリ(AIチューター)
(apps.apple.com)こんにちは。
個人プロジェクトとして作ったiOS学習アプリを紹介します。
作ったきっかけ
ChatGPTやClaudeにSwiftの概念を聞くと、すぐにきれいな答えが返ってきます。
でも、数日後に同じ概念がまた出てきたとき、頭の中が空っぽになっている経験を繰り返すうちに、「答えを受け取る学習」と「答えを見つける学習」は違うのだとあらためて感じました。
そこで、ソクラテス式教授法、つまり答えを与える代わりに質問を投げかけて自分で気づかせる方法を、AIチューターとして実装してみました。
実際、あえて不便に作ったアプリです。
どんなアプリか
- 50個のSwift概念(入門 → 上級、async/await、Actor、Associated Types などを含む)
- ユーザーが質問しても、AIは答えを出しません。 その代わり、逆質問で思考を促します
- 毎日1つの概念を、対話を通じて「マスタリー」達成まで学ぶ構成
- 対話中にSwiftコードを直接入力できる内蔵エディタ(シンタックスハイライト + 自動インデント)
- 学習記録(芝生)、ウィジェット、ダークモード
技術スタック
- iOS: SwiftUI + SwiftData, MVVM + @Observable, 外部依存 0
- Backend: Node.js on Vercel Functions (SSEストリーミング)
- LLM: Claude Haiku 4.5 via OpenRouter. providerを抽象化してあるのでGemini/OpenAIに差し替え可能
- カリキュラム: JSONベースの50個のconcept、サーバーサイドのプロンプトエンジニアリングで「答えの代わりに質問」を強制
現在の状態
- 会員登録/ログインなし — 現在は端末ローカル保存のみ、匿名利用
- 広告なし — 学習アプリのトーンに合わないと考えたため
- 決済なし — まだベース検証の段階。今後サブスクリプションモデルを検討中
正直な限界 / 悩んでいる点
- 通勤時の利用が重いというフィードバックがあり、セッション時間を予測しやすくする「5分モード」を設計中です
- 最初の応答のp99が約9秒(OpenRouter観測値)。prompt cachingを適用して次バージョンでは3〜4秒を目標にしています
- ユーザーあたりのトークンコストは**$0.005/DAU**程度。スケーリング時には再検討が必要です
3件のコメント
作っていていちばん驚いたのは、「答えを出さないAI」を作ろうとして system prompt に入れた制約([MASTERY] トークンベースの習熟度判定)を、LLM が何度も破ろうとしたため、思った以上にプロンプトエンジニアリングに時間を使ったことです。
Claude Haiku より Gemini Flash のほうがこの制約をよく守ってくれましたが、逆に質問の深さは Claude のほうが良かったです。今は Claude + プロンプト精密化の組み合わせです。
もし似たような「LLM を抑制する」プロンプト設計の経験がある方がいれば、ノウハウを共有していただけるとうれしいです 🙏
エージェントにroleを設定して、直接エージェントと会話しながら学ぶことと、
このアプリを使って学習することには、どのような違いがあるのでしょうか?
私もGPTとClaudeの両方をカスタムプロンプトで試してみたのですが、数日続けると結局「もうそのまま教えて!」となってしまうんですよね……。そして続けていると、答えを教えてくれる状況がよく出てくるんです。
なので、学習というより検索している感じがとても強かったです。
私が作ったアプリは、system promptと習熟度判定がサーバー側にあるので、そのあたりは少し回避できます。
セッションが終わるタイミングも決まっているので、通勤中に使うには便利だと思います。
実際、おっしゃる通り方法自体はGPTやClaudeでも十分できます。
でも、私のように一人で継続するのが苦手な人に合ったフォーマットだと思っていただければと思います! :)