34
42

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

「カード作りが面倒すぎる」問題をAIで解決したら、資格勉強が続くようになった

34
Posted at

「カード作りが面倒すぎる」問題をAIで解決したら、資格勉強が続くようになった

はじめに:エンジニアの「積ん読あるある」

AWS Solutions Architect、情報処理技術者試験、LPIC、TOEIC……

エンジニアなら一度は「今年こそ取る」と決意した経験はないだろうか。参考書を買い、最初の数日は順調に進む。でも気づいたら積ん読になっている。

私も何度もこのループを繰り返してきた。でもあるとき気づいた。問題は「やる気がない」ことではなく、勉強を始めるまでの摩擦が大きすぎることだった。

この記事では、その摩擦の正体と、AIフラッシュカードアプリ(個人開発)で解決した話を、技術的な実装も含めて書いていく。


続かない本当の理由=「暗記カード作成コスト」

スペーシング復習(間隔反復)が効果的なのは知っていた。AnkiやQuizletも試した。

だが毎回こうなる:

  1. テキストを読む
  2. 重要な部分を抜き出す
  3. 問題文と答えを考える
  4. ツールに入力する

ステップ2〜4が、勉強そのものより時間がかかる。

AWS SAA を例にすると、IAM・VPC・S3・RDS・Lambda……カバーすべきサービスだけでも数十ある。各サービスの概念・ベストプラクティス・料金体系まで含めると、必要なカードは数百枚規模になる。

私のケースでは、1枚のカードを手動で作るのに平均2〜3分かかっていた。100枚作ろうとすると約4時間。これではカードを作り終える前に心が折れる。

インプットではなくカード作りに時間を使っている、という本末転倒な状態だった。


既存ツールで感じた壁

ツール 良い点 壁になった点
Anki SRSアルゴリズムが強力、自由度が高い 標準機能でのカード作成は手動のみ、UIに学習コストがある
Quizlet UIが洗練されている、共有しやすい 日本語でのAI生成精度にムラがある、無料プランの制限が大きい

特に課題だったのは以下の2点だ:

  • 日本語テキスト・画像からのカード自動生成に対応していない(AWSの公式ドキュメントも情報処理試験の参考書も日本語)
  • 学習内容から文脈を理解して四択を生成する機能がない(情報処理試験のような選択問題の練習には不十分)

「じゃあ、AIにカード作成を丸ごと任せるアプリを作ればいいのでは?」というのが出発点だった。


作ったもの:Cobo Memo

Flutter + AWS Amplify Gen2 + Google Gemini API で構成したフラッシュカードアプリだ。Flutterを選択したのは、iOS, Android, Webサービスを一体で作りたかったから。Amplifyを選定したのは、Claude Codeや、Cursorを使ってAIエージェントにフロントエンド+バックエンド一気通貫で開発を進めたかったから。Google Gemini Flush Lite APIを選択したのは、精度とコストパフォーマンスの効率が最高だったからだ。

全体アーキテクチャ

┌─────────────────────────────────────────────────┐
│  Flutter App (iOS / Android)                    │
│  ├── SQLite(ローカルストア)                     │
│  └── Amplify DataStore ⇄ DynamoDB(クラウド同期) │
└──────────┬──────────────────────────────────────┘
           │ REST API (API Gateway)
           ▼
┌─────────────────────────────────────┐
│  AWS Lambda (Python)                │
│  └── Gemini API 呼び出し            │
│      ├── テキスト → カード生成       │
│      └── 画像/動画 → カード生成      │
└─────────────────────────────────────┘
           ▲
           │ REST API (API Gateway)
┌──────────┴──────────────────────────────────────┐
│  Webコンソール(ブラウザ)                         │
│  └── カード作成・編集・デッキ管理                   │
└─────────────────────────────────────────────────┘

コア機能

機能 概要
AIカード生成 テキスト or 画像入力 → 問題・答え・補足・四択選択肢を自動生成
ChatGPT出力の取り込み ChatGPTの回答をそのまま貼り付けてカード化
Webコンソール PCブラウザからカード作成・管理。業務中のデスクでも使える
スペーシング復習 忘却曲線に基づく復習スケジュールの自動管理
オフライン対応 SQLiteをプライマリストア、DynamoDBと双方向同期
共有デッキ ロールベースの権限管理(オーナー・編集者・閲覧者)

技術的な話:AIカード生成の実装

ここからは実装の詳細に踏み込む。

Gemini API でのカード生成

Lambda(Python)から Gemini API を呼び出して、構造化されたカードデータを生成している。

ポイントはプロンプトでJSON形式を強制することだ。自然言語で返されるとパースが面倒になるので、出力フォーマットをプロンプト側で厳密に指定する。

import json
import google.generativeai as genai

def generate_cards(text: str, num_cards: int = 5) -> list[dict]:
    """テキストからフラッシュカードを生成する"""

    prompt = f"""
以下のテキストから、学習用フラッシュカードを{num_cards}枚生成してください。

## 出力形式
以下のJSON配列のみを出力してください。説明文やMarkdownのコードブロック記法は不要です。

[
  {{
    "question": "問題文",
    "answer": "正解",
    "supplement": "補足説明(なぜその答えになるかの解説)",
    "select1": "誤りの選択肢1",
    "select2": "誤りの選択肢2",
    "select3": "誤りの選択肢3"
  }}
]

## ルール
- 問題文は具体的に。「〜とは何か」だけでなく「〜の場合、どのサービスを使うべきか」のような実践的な問いも含める
- 誤りの選択肢は、もっともらしいが明確に間違っているものにする
- 補足説明には、正解の根拠と誤りの選択肢がなぜ違うかを含める

## テキスト
{text}
"""

    model = genai.GenerativeModel("gemini-2.0-flash-lite")
    response = model.generate_content(prompt)

    # レスポンスからJSON部分を抽出してパース
    raw = response.text.strip()
    # Geminiが```json ... ``` で囲むケースに対応
    if raw.startswith("```"):
        raw = raw.split("\n", 1)[1].rsplit("```", 1)[0]

    cards = json.loads(raw)
    return cards

material2.png

画像からのカード生成

参考書のページを撮影してカードを生成する機能もある。Gemini のマルチモーダル入力を使い、画像を直接渡す。

import base64

def generate_cards_from_image(image_bytes: bytes, mime_type: str = "image/jpeg") -> list[dict]:
    """画像からフラッシュカードを生成する"""

    prompt = """
この画像に含まれる学習内容から、フラッシュカードを生成してください。
(出力形式・ルールは上記と同様)
"""

    model = genai.GenerativeModel("gemini-2.0-flash-lite")
    response = model.generate_content([
        {
            "mime_type": mime_type,
            "data": base64.b64encode(image_bytes).decode("utf-8")
        },
        prompt
    ])

    raw = response.text.strip()
    if raw.startswith("```"):
        raw = raw.split("\n", 1)[1].rsplit("```", 1)[0]

    return json.loads(raw)

material3.png

プロンプト設計で苦労したこと

開発中、いくつかの課題にぶつかった:

  • 出力が安定しない: JSONの前後に余計なテキストが入ることがある → ```json の除去処理で対応
  • 「もっともらしい誤答」の品質: 最初は明らかに違う選択肢ばかり生成された → プロンプトに「同じカテゴリの類似サービス名を使う」と指示を追加して改善
  • 日本語特有の問題: 英語に比べて1トークンあたりの情報量が少ない → カード枚数の上限とテキスト量のバランス調整が必要だった

ChatGPTの出力をそのまま貼り付けてカード化する

ここまではアプリ内蔵のAI(Gemini)によるカード生成の話だったが、実はすでに手元にあるChatGPTの出力を活用するワークフローの方が、実務では使う場面が多い。

エンジニアなら、業務中にChatGPTで技術的な概念を調べたり、コードの仕組みを聞いたりする場面があると思う。そのとき得た知識を「あとで復習したい」と思っても、別途カードを作るのは面倒でやらない——というのがよくあるパターンだ。

Cobo Memo では、ChatGPTの回答をそのままテキスト入力欄に貼り付けるだけでカード化できる

実際のワークフロー

ステップ1: ChatGPTに聞く

たとえば、AWSのサービスについて整理したいとき、ChatGPTにこんなプロンプトを投げる:

AWSのストレージサービス(S3、EBS、EFS、FSx)の違いを、
以下の観点で整理してください:
- ユースケース
- 料金体系の特徴
- パフォーマンス特性
- 選択時の判断基準

ステップ2: 出力をCobo Memoに貼り付ける

ChatGPTが返してきた回答を、Cobo Memoのテキスト入力にそのままコピー&ペーストする。

ステップ3: AIがカードを自動生成

貼り付けたテキストをもとに、Gemini APIが問題文・答え・補足・四択選択肢を生成する。たとえばこんなカードができる:

Q: 大容量の非構造化データを低コストで保存し、静的Webサイトのホスティングにも使えるAWSサービスはどれか?
A: Amazon S3
補足: S3はオブジェクトストレージで、99.999999999%(イレブンナイン)の耐久性を持つ。EBSはEC2にアタッチするブロックストレージ、EFSは共有ファイルシステムで用途が異なる。

ChatGPTで「理解する」→ Cobo Memoで「定着させる」、という2段構えの学習ループが作れる。

応用:ChatGPTにカード形式で出力させる

さらに効率を上げたいなら、ChatGPTへのプロンプト自体を工夫する方法もある:

AWSのS3ストレージクラスの違いについて、
フラッシュカード形式で5問作ってください。

各カードは以下の形式で出力してください:
- 問題文(実務的なシナリオベース)
- 正解
- 補足説明
- 誤りの選択肢3つ(もっともらしいもの)

この出力をそのまま貼り付ければ、AIがさらに整形・補完してくれる。

material1.png


Webコンソール:スマホアプリだけじゃない

Cobo Memo はスマホアプリだけでなく、PCブラウザから使えるWebコンソールも用意している。

これが意味するのは、業務中のデスクでもそのまま使えるということだ。

「勉強ツール」から「仕事のナレッジ管理」へ

フラッシュカードというと通勤時間にスマホでポチポチ、というイメージがあるかもしれない。だがWebコンソールがあることで使い方が変わる:

  • 業務中に調べた技術知識をその場でカード化 — ChatGPTやドキュメントで調べた内容を、ブラウザのタブを切り替えてすぐにカードにできる
  • PCのキーボードで大量のカードを効率的に作成・編集 — スマホでの入力よりはるかに速い
  • チームのナレッジベースとして運用 — 共有デッキと組み合わせれば、チームの技術知識を体系的に管理・復習できる

スマホアプリは「復習」、Webコンソールは「作成・管理」と使い分けることで、学習のサイクルが回りやすくなる。

material5.png


技術的な話:スペーシング復習の仕組み

各カードは以下の状態を持っている:

enum CardState {
  unlearned,  // 未学習
  learning,   // 学習中(短い間隔で復習)
  learned,    // 習得済み(間隔を広げて復習)
}
class CardProgress {
  DateTime nextReviewDate;  // 次回復習日
  double progressRate;      // 習熟度(0.0 〜 1.0)
  CardState state;          // 学習状態
  int consecutiveCorrect;   // 連続正答数
}

回答の正誤に応じて次の復習間隔を決定する。ロジックの概要は以下の通りだ:

  • 正解progressRate を上げ、次の復習間隔を延長(1日→3日→7日→14日→30日…)
  • 不正解progressRate をリセットし、短い間隔(当日〜翌日)で再出題

エビングハウスの忘却曲線に基づき、「覚えたばかりのカードは頻繁に、定着したカードは間隔を空けて」復習する。これにより、アプリを開くだけで「今日やるべきカード」が自動で出てくる。


実際の効果

AWS SAA の勉強で約2ヶ月使ってみた結果を書く。

指標 Before(手動カード作成) After(COBO MEMO)
カード作成時間(100枚) 約4時間 約30分(AI生成+確認・編集)
1日の勉強時間 30〜60分(大半がカード作成) 30分(ほぼ復習に集中)
作成したカード総数 約80枚で挫折 約350枚
継続日数 最長2週間 2ヶ月以上継続中

material4.png

最も大きかった変化は勉強の意思決定コストが下がったこと。「何を覚えるか」「どうカード化するか」を考える負担がなくなり、純粋にインプットと復習に集中できるようになった。


まとめ

資格勉強が続かない最大の理由は「やる気」ではなく「摩擦」だと私は思っている。

暗記カードを作る手間という摩擦を AI で取り除くことで、勉強そのものに集中できるようになる。同じ壁にぶつかっている方がいれば、ぜひ試してみてほしい。

Cobo Memo(iOS / Android / Web 対応・無料で利用可能)

AWS・情報処理試験・TOEIC・プログラミング言語の文法など、暗記が必要な学習全般に使えるように設計している。

技術的な質問や「こういう機能がほしい」というリクエストがあれば、コメントで気軽に聞いてください。


技術スタック: Flutter / AWS Amplify Gen2 / DynamoDB / Lambda (Python) / Google Gemini API

34
42
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
42

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?