はじめに:「あとで調べる」が永遠に来ない問題
前回の記事では、AIでカード作成の摩擦を取り除いたら資格勉強が続くようになった話を書いた。
今回は、その先の話をしたい。日常のインプットをどう定着させるかという問題だ。
エンジニアの日常は、知らない言葉との遭遇の連続だ。
会議で飛び交う略語、Slackで流れてくる技術用語、レビューで指摘された設計パターン——その場では「ふむふむ」と頷いて、あとで調べようと思う。でも業務に戻った瞬間、きれいに忘れる。
翌週の会議で同じ言葉が出てきて、また「ふむふむ」と頷く。3回目くらいで「さすがにヤバい」と思うが、そのときにはもう聞けない空気になっている。
これが私の言う「わかったつもり」問題だ。理解していないのに、何度も聞いているから理解した気になっている。
解決策:「ポイポイ投げ込む」生活を始めた
考えた末にたどり着いたのは、とてもシンプルな運用だった。
不明な言葉が出たら、その場でCobo Memoにポイっと投げ込む。
それだけだ。完璧なカードを作ろうとしない。ワードだけでいい。意味がわからなくてもいい。とにかく投げ込む。
実際のワークフロー
業務中(PCブラウザ):
- Webコンソールのカード作成画面を常時開いておく
- 会議やSlackで知らない言葉が出たら、タブを切り替えてワードだけ入力
- 忙しいときは本当にワードだけ。「答え」も「補足」も空欄のまま保存
移動中・隙間時間(スマホアプリ):
- アプリからも同じように、気になった言葉をポイっと登録
- 電車の中で思い出した言葉、ニュース記事で見かけた用語、何でも
あとでまとめて(一括カード生成):
- 空欄だらけのカードが溜まったら、一括カード生成でAIに補完させる
- Gemini が空欄の「答え」「補足」「四択選択肢」を文脈から推測して埋めてくれる
AIが空欄を埋めてくれる
この運用のキモは「あとからAIが補完してくれる」部分だ。
たとえば、会議中に「CQRS」という言葉が出てきて意味がわからなかったとする。その場では問題文の欄に「CQRS」とだけ入力して保存する。答えも補足も空欄だ。
あとで時間ができたときに一括カード生成を実行すると、AIがこう埋めてくれる:
| 投げ込み時 | AI補完後 | |
|---|---|---|
| 問題文 | CQRS | CQRSとは何か? |
| 答え | (空欄) | Command Query Responsibility Segregation |
| 補足 | (空欄) | データの書き込み(Command)と読み取り(Query)の責務を分離するアーキテクチャパターン。大規模システムで読み書きの負荷特性が異なる場合に有効。 |
| 選択肢 | (空欄) | CRUD / Event Sourcing / Saga Pattern |
人間がやったのは「CQRS」と4文字打っただけ。残りは全部AIだ。
なぜ「ワードだけ投げ込む」が効くのか
ポイントはインプットのハードルを限界まで下げたことだ。
従来のフラッシュカード学習は、こういう流れだった:
- 知らない言葉に出会う
- その場で調べる
- 問題文と答えを考える
- カードに入力する
- あとで復習する
ステップ2〜4のどこかで脱落する。忙しいときは2で止まるし、余裕があっても3〜4が面倒で結局やらない。
「ポイポイ運用」では、ステップ1のあとすぐに入力(ワードだけ)して、2〜4はAIに丸投げする。人間がやるのは 「あ、これ知らない」と気づいてポイっと入れるだけだ。
従来: 出会う → 調べる → 考える → 入力する → 復習する
↑ここで脱落
ポイポイ:出会う → ポイっ → (AIが補完)→ 復習する
↑0.5秒
技術的な話:一括AI補完のプロンプト設計
前回の記事では「テキストからカードを新規生成する」プロンプトを紹介した。今回のポイポイ運用で核になるのは、既存カードの空欄をAIが補完するプロンプトだ。
新規生成とは異なり、ユーザーが入力済みのフィールドは尊重しつつ、空欄だけを埋める必要がある。
空欄補完のプロンプト
Lambda(Python)から Gemini API を呼び出して、空欄のあるカードを補完している。
import json
import google.generativeai as genai
def complete_card_blanks(cards: list[dict]) -> list[dict]:
"""空欄のあるカードをAIで補完する"""
# 空欄があるカードだけをフィルタリング
incomplete_cards = [
card for card in cards
if not card.get("answer") or not card.get("supplement")
]
if not incomplete_cards:
return cards
prompt = f"""
以下のフラッシュカードには空欄があります。
ユーザーが入力済みのフィールドはそのまま維持し、空欄のフィールドだけを補完してください。
## 補完ルール
- question(問題文)が単語だけの場合:「〜とは何か?」の形に拡張する
- answer(答え)が空欄の場合:問題文に対する簡潔な正解を記入する
- supplement(補足)が空欄の場合:正解の根拠や関連知識を2〜3文で記入する
- select1〜3(誤りの選択肢)が空欄の場合:同カテゴリの類似概念を使い、もっともらしいが明確に間違っている選択肢を生成する
- ユーザーが既に入力しているフィールドは変更しないこと
## 出力形式
以下のJSON配列のみを出力してください。説明文やMarkdownのコードブロック記法は不要です。
[
{{
"id": "元のカードID",
"question": "補完後の問題文",
"answer": "補完後の答え",
"supplement": "補完後の補足",
"select1": "誤りの選択肢1",
"select2": "誤りの選択肢2",
"select3": "誤りの選択肢3"
}}
]
## 補完対象のカード
{json.dumps(incomplete_cards, ensure_ascii=False, indent=2)}
"""
model = genai.GenerativeModel("gemini-2.0-flash-lite")
response = model.generate_content(prompt)
raw = response.text.strip()
if raw.startswith("```"):
raw = raw.split("\n", 1)[1].rsplit("```", 1)[0]
completed = json.loads(raw)
# 元のカードリストにマージ
completed_map = {c["id"]: c for c in completed}
return [
completed_map.get(card.get("id"), card)
for card in cards
]
設計のポイント
この補完プロンプトを設計するうえで、いくつかの判断があった:
1. 「入力済みフィールドを壊さない」が最優先
新規生成なら全フィールドをAIに任せればいいが、補完ではユーザーが意図を持って入力したフィールドがある。たとえば問題文に「CQRSの利点は?」と書いてあるのに、AIが「CQRSとは何か?」に書き換えてしまったら台無しだ。プロンプトに「入力済みのフィールドは変更しないこと」と明示的に指示している。
2. 単語だけの問題文を「問い」の形に拡張する
「CQRS」とだけ入力されたカードは、そのままでは問題として機能しない。AIが「CQRSとは何か?」と拡張することで、四択クイズとして成立するようになる。
3. 誤答の選択肢は「同カテゴリの類似概念」から生成
前回の記事でも触れたが、良い四択問題の鍵は「もっともらしい誤答」だ。CQRSの誤答に「React」や「Docker」が出てきても学習効果は薄い。「CRUD」「Event Sourcing」「Saga Pattern」のように、同じアーキテクチャパターンの文脈から選ばせることで、関連概念の整理にもつながる。
4. バッチ処理で複数カードを一括補完
1枚ずつAPIを叩くとレイテンシとコストが膨らむ。空欄のあるカードをまとめて1リクエストで補完することで、Gemini Flash Lite の低コストを活かしている。
Webコンソール × スマホアプリの使い分け
この運用が回るのは、PCとスマホの両方から同じデッキにアクセスできるからだ。
| シーン | デバイス | やること |
|---|---|---|
| 業務中の会議 | PC(Webコンソール) | ワードをポイっと登録 |
| Slackで見た用語 | PC(Webコンソール) | タブ切替でポイっと登録 |
| 電車の中 | スマホアプリ | 復習 or ポイっと登録 |
| 週末まとめて | PC(Webコンソール) | 一括カード生成でAI補完 |
Webコンソールは常にブラウザのタブに開きっぱなしにしている。これが地味に重要で、「ツールを起動する」というワンステップすら省くことで、投げ込みの摩擦がほぼゼロになる。
AIの補完精度は?Gemini Flash Lite APIの実力
正直に書くと、とても良い。
具体的に言うと:
- 技術用語の基本的な定義:ほぼ正確。「CQRS」「サーキットブレーカー」「イベントソーシング」あたりは問題ない
- 四択選択肢の質:プロンプトで「同カテゴリの類似概念を使う」と指示しているので、それなりにもっともらしい誤答が生成される
- 文脈依存の専門用語:社内固有の略語や、ニッチなツール名は苦手。これは手動で直す
体感で言えば、9割はそのまま使えて、1割は手直しが必要というレベルだ。ただし「9割の精度で自動生成されたカードを1割手直しする」のと「10割手動で作る」のでは、かかる時間が圧倒的に違う。
完璧を目指すより、まず量を確保して反復に回すほうが定着には効く。
反復復習で「わかったつもり」が消えていく
カードが揃ったら、あとは反復あるのみだ。
Cobo Memo はスペーシング復習(間隔反復)を採用しているので、アプリを開くだけで「今日やるべきカード」が出てくる。正解すれば間隔が延び、不正解なら短い間隔で再出題される。
ここで面白いのが、「わかったつもり」が可視化されることだ。
会議で何度も聞いて「知ってるつもり」だった言葉が、四択で出題されると意外と答えられない。「あれ、CQRSって……CommandとQueryを分ける……やつ? で、Event Sourcingとどう違うんだっけ?」となる。
この 「わかってなかった」と気づく瞬間が大事だと思っている。知ったかぶりの自分に気づくのは若干つらいが、気づいたあとは定着が早い。
3〜4回正解が続くと、次に会議でその言葉が出てきたときに「あ、それは〇〇ですね」と自然に言えるようになっている。この小さな成功体験が、少しずつ自信になっていく。
1ヶ月やってみた変化
| 指標 | Before | After(ポイポイ運用1ヶ月) |
|---|---|---|
| 登録したカード数 | — | 約200枚 |
| 1日の投げ込み数 | 0(メモすら取らない) | 平均3〜5ワード |
| 1日の復習時間 | 0分 | 約10分(通勤中) |
| 会議で「?」となる頻度 | 週に何度も | 体感で半分以下 |
| 「それ知ってます」と言えた回数 | ほぼなし | 週2〜3回 |
数字で見ると地味だが、会議で一度も聞き返さずに済んだ日が出てきたのは大きかった。
おまけ:こんな使い方もしている
技術用語だけでなく、こんなデッキも作って運用している:
- プロジェクト略語デッキ:社内の略語(PJT名、チーム名、ツール名)をまとめたもの。異動直後や新PJT参画時に特に有効
- 英語フレーズデッキ:会議で使いたい英語表現を登録。「Let me circle back on that」みたいなやつ
- 顧客・ステークホルダーデッキ:名前と役割、過去のやり取りのポイントを登録。顔と名前が一致しなくて困る問題の対策
特に最後のデッキは個人的に重宝している。人の名前を覚えるのが本当に苦手で、3回会っても「あの……すみません、お名前もう一度……」となるタイプだ。カードにしてからは、会議前にデッキをさっと復習するだけで「〇〇さん、先日の件ありがとうございました」とスムーズに入れるようになった。
まとめ
前回の記事では「カード作成の摩擦を取り除く」話を書いた。今回はその延長で、日常のインプットをいかに低コストでカード化し、反復で定着させるかという話だ。
やっていることは単純だ:
- 知らない言葉に出会ったらポイっと投げ込む(ワードだけでOK)
- あとからAIが空欄を補完する(Gemini Flash Lite APIが埋めてくれる)
- 反復復習で定着させる(スペーシング復習が自動スケジュール)
「わかったつもり」は、放置すると永遠に「わかったつもり」のままだ。でも、ポイっと投げ込んで、AIに補完させて、何度か復習するだけで、「少しわかった」に変わる。その積み重ねが、少しずつ自信になる。
同じような悩みを持つ方がいれば、ぜひ試してみてほしい。
Cobo Memo(iOS / Android / Web 対応・無料で利用可能)
- App Store(iOS)
- Google Play(Android)
- Webコンソール(PCブラウザからのカード作成・管理。まずはiOSまたはAndroidでアカウント作成)
前回の記事:「カード作りが面倒すぎる」問題をAIで解決したら、資格勉強が続くようになった
技術的な質問やフィードバックがあれば、コメントで気軽にどうぞ。
技術スタック: Flutter / AWS Amplify Gen2 / DynamoDB / Lambda (Python) / Google Gemini API


