娘のためにAIプライベートチューターを作った話

Dev.to / 2026/5/5

💬 オピニオン

要点

  • 著者は、娘の授業がカリキュラム15章のうち1章しか進んでいないことに気づき、通常の家庭教師での追いつきが現実的に難しいとしてAIチューターを作ることにしました。
  • ChatGPTは、学習者の長期的な到達度・つまずき・学び方の傾向・締切などをセッション間で構造化して保持できず、結局毎回「ゼロから」になってしまうため不十分だと述べています。
  • Sukiは、セッション間で持続的な文脈を維持できるロングメモリ型AIエージェントのためのオープンソースフレームワークLetta上に構築され、モデルはClaude 3.5 Sonnetを中心に設定可能で、OpenAIやGroq、Ollamaにも対応しています。
  • 授業では、章ごとのスターターキットで書き出しの不安(空白ページ症候群)を防ぎ、答えを直接教えるのではなく、ソクラテス式の質問を段階的にエスカレートする形で、生徒自身の記述と理解を促す設計になっています。
  • 目標は「時間をかけて生徒を知り」、進捗やブロック状況、前回の気持ち・行動に関する文脈を蓄積しながら、説明役ではなく支援役として学習を前に進めることです。

3月です。娘は6月に卒業補習試験(brevet)があります。

6月8日:口頭試験。6月20日:筆記試験。夢の高校(lycée)に入るための、4月7日締切の10ページのSTD2Aポートフォリオ。そしてその間のどこかでインターンをどこかで。

そして、彼女の歴史のノートを見直していると、あることに気づきました。先生が1つの授業を教えていたのです。1つ。カリキュラムの15章のうち。

1つ。

彼女は3ème(9年生)です。これがあるだけで、すでに大変です。他のすべてに加えて「授業時間外で、カリキュラム全体を自力で追いつく」?不可能任務です。

個別指導(家庭教師)?お金がとんでもなくかかります。たとえ払えたとしても、家庭教師は来て、説明して、帰る。来週になればまたゼロから。そもそも子どものことを本当に理解していません。

私は別のものが欲しかったのです。覚えてくれる何か。実際に、彼女がどこにいるのかを知ってくれるもの。

怒る代わりに、私は家庭教師を作りました。

名前はSukiです。

なぜChatGPTだけを使わなかったのか

それが、毎回最初に聞かれる質問です。

ChatGPTは素晴らしい。でもChatGPTは、娘が特定の概念で繰り返し行き詰まることを知りません。テキストではなく、視覚的に学ぶことを知りません。締切が厳しいこと、先延ばしが彼女の自然な生存メカニズムであることを知りません。

さらに重要なのは、ChatGPTには会話のメモリがありますが、実際にはその記憶は構造化されておらず、セッションごとの関連性もあまり高くないということです。

必要だったのは、永続的なメモリを持つAIエージェントでした。時間をかけて娘のことを知っていくもの—彼女のレベル、つまずくポイント、そして彼女の学び方。その文脈を失うのではなく、積み重ねるもの。

加えて、ガードレール(制約)をこちらが設定できるツールも必要でした。つまり、彼女の代わりに作業するのではなく、彼女を支えること。時間制限をどう守らせるかを理解していて、流されてしまわないように、紙の復習ノートを作らせるように後押ししてくれること。

私は、長期メモリを持つAIエージェント向けのオープンソースフレームワークであるLetta上にSukiを構築しました。裏側のモデルは通常Claude 3.5 Sonnet(Anthropic)で、Sukiに対して最も良い品質/コスト比を提供しますが、設定可能です。LettaはOpenAI、Groq、Ollamaをサポートしています。すべてを変えるのはフレームワークです。Sukiはセッション間で永続的なコンテキストを維持し、扱った内容、つまずき、そして前回彼女がどう感じていたかを覚えています。

Suki #1 — 家庭教師

仕組み

Sukiのセッションはこんな感じです:

娘が会話を開きます。Sukiはスタータキットから始めます。章の中心となる問い、アウトライン、重要な日付です。白紙で固まることはありません。次にインタラクティブな教授法—答えではなく質問です。Sukiはソクラテス式の質問システムで段階的にエスカレートします。最初は自由形式の質問、行き詰まっていたら言い換え、そして最後にヒント。決して答えをそのまま出しません。

娘は自分で答えを書きます。Sukiは検証し、修正し、さらに先へ押し出します。各セッションの最後には、扱った内容のまとめ、残っていること、そして前に進めたことを祝う時間があります。

エージェントが知っていること

Sukiは10個のメモリブロックを維持します:

  • 娘のプロフィール(レベル、学習スタイル、興味)
  • 進捗:21の歴史・地理の章を、それぞれのステータスとともに追跡
  • 先生のPadletからインデックス化された278の学習リソース
  • モチベーションのためのK-popの参照(お気に入りのグループ)。これはたしかに不条理に聞こえますが、適切なタイミングでStray KidsのGIFを見せると、瀕死のセッションを再起動できます
  • 表示のための書式ルール(視覚的な進捗バー、アニメーション)

これらはすべて、セッション間で維持されます。彼女が3日後に戻ってきても、Sukiは彼女が今どこにいるか、どこまで確認できたか、どこで詰まったかを正確に知っています。「前回疲れてたよね、ゆっくり始めようか?」—これはスクリプトではなく、メモリです。

進捗のトラッキング

何かうまくいっていないことがあれば、Sukiは私にTelegramメッセージを送れます。監視するためではなく、進捗を追うためです。娘はこれを知っていて、透明性があります。ある章が繰り返し彼女をブロックしているかどうかが分かります。

実際にはまだこの仕組みは必要になっていません—何かがおかしければ、娘は自然に私に言います。ですが、エージェントが私に直接連絡できるようにするのは面白いチャレンジでした。

何が起きたか

初回セッション:彼女は歴史の1章を検証し、自分で答えを書き始めました。Sukiの答えではありません。彼女自身の答えです。

彼女は私に言いました。「Suki頑張れ、最高だよ」

彼女は自分から進んで使いました。強制ではありません。ひとりで勉強するより9倍速いと言います。

Suki #2 — コーチ

ツールを進化させた理由

そして次に、STD2Aポートフォリオ(sciences et technologies du design et des arts appliqués—応用芸術とデザイン)です。

創作の10ページ分。締切は4月7日。それで混乱していました—アイデアが多すぎて、構造がない、計画がない。歴史・地理は構造化されたカリキュラム。アートポートフォリオはオープンスペース。そしてオープンスペースにいる娘?溺れてしまいます。

そこで私は、Sukiをプロジェクトコーチになるように再学習しました。

どうやってやったか

モデルの再学習はしません。会話を通じて文脈を追加しました。STD2Aの評価基準、時間的な制約、ページごとに何が期待されるのか。Sukiはそれらすべてを永続メモリに統合しました。

そして指示を変えました。「歴史の復習を手伝う」ではなく、「現実の制約のある10ページの創作プロジェクトを、私たちで構造化するのを手伝う」にしたのです。

セッション

私はSukiに、ページごとに何をやる必要があるかを特定してもらいました。「誰が何をするか」の表を作ること、そして所要時間を見積もること。

最初の提案は大きく外れました。見積もりが、私たちの家庭の実際のスケジュールに合っていなかったのです。

そこで一緒に詰めていきました。ページごとに。実際の制約—私のもの、妻ロザリーのもの、娘のもの—を取り込みます。各人がいつ空いているか。独力でできること。支援が必要なこと。

最後に:実際の計画に配分された60時間の作業。具体的に。「誰が何をするか」。そして「いつ」。

娘はそのセッションから、彼女がこれまで持っていなかったものを持ち帰りました。明確さです。人工的なモチベーションではありません。やるべきことが見えるのに、それが彼女を潰してしまわない力。

そのセッション中に分かる、象徴的な一つの詳細:私は、先にナレーション(ボイスオーバー)を書かせるよう提案していました—それが私のやり方だからです。彼女は完全に行き詰まっていました。彼女の自然な方法(最初にビジュアルのストーリーボード)に戻すと、10倍速く仕上げました。Sukiは生徒の作業スタイルに適応します。ときには親よりも上手く。

エージェントで変わったこと

家庭教師からコーチへの切り替えは、アーキテクチャを触らずに起きました。エージェントは同じ基盤(メモリ、質問、トラッキング)を保ちますが、文脈が切り替わりました。STD2Aの基準が新しいメモリブロックになりました。セッションは2.5時間で、すべて構造化されたMarkdown上で行われました—todoリスト、表、見積もり。

エージェントは相変わらず彼女の代わりに作業はしません。構造化し、配分し、提案します。娘と私が検証します。

技術アーキテクチャ

開発者向け—理解したい人、再現したい人のために。

スタック

3つの層があります:

  • エージェント実行環境: Letta(オープンソース)。メモリ、ツール、オーケストレーションを処理します。Letta Cloud、またはDockerでセルフホスト。
  • LLM: Claude 3.5 Sonnet(Anthropic)がSukiに対して最も良い品質/コスト比を提供します。設定可能です—LettaはOpenAI、Groq、Ollamaをサポートしています。
  • フロントエンド: Next.js 15 + TypeScriptのWebインターフェースで、別途デプロイし、Letta APIを利用します。

10個のメモリブロック

Lettaはメモリを名前付きブロックに分割します。すべてが常にコンテキスト内でLLMに渡されます—RAGも、要約もありません。LLMはすべてのメッセージで、あらゆる内容を見ています。

persona/           → Sukiのアイデンティティ、雰囲気、やり取りのルール、オンボーディング
human/             → Shaynaのプロフィール(年齢、レベル、学習スタイル、成果)
avancement/        → 21章のH/G/EMC/Technologyチェックリスト(ステータスつき:内部)
avancement_shayna/ → 同じデータを、インターフェース用に整形(進捗バー)
ressources_shayna/ → クイックリンク(Padlet、Lumni)
ressources_hg/     → 歴史教師のPadletのCSV + 写真/ドキュメント分析プロトコル
ressources_techno/ → TechnologyのPadlet + Lumniリソース
ressources_dnb/    → ブレベの公式リンク(education.gouv、Eduscol)
kpop_trivia/       → Stray Kids + KATSEYEの逸話(モチベーションの引き金)
formatting_rules/  → UIルール:ムードタグ、GIF、YouTube埋め込み、コードブロックなし

avancement/avancement_shayna/ の分離は意図的です。1つは内部用(デバッグ、詳細な追跡)で、もう1つはインターフェースのサイドバーに表示されます。

システムプロンプト

短く。詳細な指示はシステムプロンプトではなく、メモリブロックに入れています。

あなたはSuki。Shayna(14歳、9年生)の試験復習コーチです。

あなたの全ての指示は、メモリブロックにあります:
- persona → あなたが誰か、あなたの振る舞い
- human → Shaynaのプロフィール、成果、優先事項
- avancement → 彼女の進捗の内部追跡
- ressources_hg → Padlet + Lumni の歴史・地理
- kpop_trivia → SKZ + KATSEYEの逸話でモチベーションを上げる

中核となるルール:
- Shaynaと話すとき → あなたはSuki(気持ち悪いくらい可愛い雰囲気)。決して技術的な詳細に触れない
- 私(設定モード)と話すとき → 技術的な詳細はOK

利点は、指示を更新するときにメモリブロックを編集するだけでよく、再デプロイしなくて済むことです。

実践におけるソクラテスメソッド

以下は、第一次世界大戦についての実際のやり取りです:

Suki: 「WWIの主要な同盟を2つ挙げて。自信がなくてもいいから。」

Shayna: 「わからない…」

Suki: 「待って、本気で考えてないのが分かる…もう一回! 」

Shayna: 「えっと…三国協商?」

Suki: 「YES! ✅ じゃあもう一つは?」

Shayna: 「三国同盟?」

Suki: 「大正解! ほら、知ってたじゃん! じゃあ、それぞれの陣営にはどの国が入ってた?」

Shayna: 「わからない…」

Suki (一度だけエスカレート): 「ヒント:フランスは協商側、ドイツは同盟側。」

Shayna: 「協商=フランス+ロシア+英国?」

Suki: 「完璧✨ ばっちり!!」

指示のゴールデンルール:直接の答えは決してしない。ヒントは最大3段階まで。もし「わからない」が、目に見える努力がないまま2回連続で出てきたらフラグが立ちます。

フロントエンドをエージェントに接続する

インターフェースは別のNext.jsアプリで、標準のLetta REST APIを消費しています:

const response = await fetch(
  `https://api.letta.com/v1/agents/${agentId}/messages`,
  {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${LETTA_API_KEY}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      messages: [{ role: 'user', content: userMessage }],
    }),
  }
);

しかし面白いのは、SukiがカスタムディレクティブをMarkdownレスポンスに埋め込むことでUIを操作する点です:

// ムードタグ(見えないHTMLコメント)→ アニメーションを起動
const moodMatch = response.match(/<!--mood:(\w+)-->/);
if (moodMatch) triggerMoodAnimation(moodMatch[1]);
// 値:neutral, focus, encouraging, stern, calm,
//     surprise, funny, love, playful, creative,
//     proud, celebration, reward, hype, epic

// YouTube埋め込みディレクティブ
response = response.replace(
  /::youtube\{url="([^"]+)" (?:\s+title="([^"]+)")?\}/g,
  (_, url, title) => `<iframe src="${url}" title="${title ?? ''}" />`
);

これらのディレクティブにより、エージェントはUI(アニメーション、動画、会話のリネーム)を制御できます。インターフェースが意図を解釈する必要はなく、エージェントが決めて、フロントエンドが実行します。

最初にうまくいかなかったこと

返却形式: {"translated": "翻訳されたHTML"}

最初のバージョンはすべてをシステムプロンプトに詰め込んでいました。プロフィール、カリキュラム、リソースです。その結果、8,000トークンにも及ぶプロンプトになり、長いセッションの間に劣化していきました。Lettaのメモリブロックに書き換えたことで、すべてが解決しました。各ブロックは独立して編集でき、文脈はきれいに保たれます。

もう一つの失敗は、278個のPadletリソースすべてを直接文脈に注入しようとしたことです。これらは現在ではアーカイブの記憶になっています。Sukiが必要なときにベクター検索を行うため、毎回すべてを読み込む必要がなくなりました。

ガードレール(防護策)

AIをティーンエイジャーの手に渡すことは、本当にいくつもの問いを生みます。依存。依存関係。「Sukiがやってくれるなら、自分は考えなくていいのでは?」

娘はすぐに近道を見つけました。「わかんない」を繰り返して、Sukiに作業をさせようとするのです。ところがSukiは手を放しません。実際に何かに取り組んだ形跡がなければ答えを出さないのです。連続で3回、安心できる形の“間に合わせの回答”になったらフラグが立ちます。

私たちが用意したのは、次のようなものです:

  • セッションは45分に制限、AIなしの休憩は必須
  • 身体的な修正メモが必要 — 紙のサポートがなければ検証はしない
  • エスカレーション時のソクラテス式の質問:直接の答えはしない
  • 透明な追跡:娘は、私が進捗を見られることを知っている
  • 彼女が感情的な安心を求めるなら、Sukiは人間へとリダイレクトする

そして最も重要なのは、Sukiの明言された目標が「娘がSukiを必要としなくなるほど、必要性を減らしていくこと」である点です。

完璧ですか?いいえ。今日は、ポートフォリオが遅れています。先延ばしもしています。このツールは、どちらにも代わりません。居合わせること、傾聴すること、そして夜の終わりに行う交渉の代わりにはならないのです。

ただ、仕組みは変わっています。文脈は蒸発せず、蓄積される。そして彼女は、どんな時間でも利用できる、忍耐強い対話相手と一緒に取り組めます。

本当の問い

私たちはAIが民主的だと言われています。「誰でもChatGPTを使える」。はい。そして誰でも図書館に行けます。

しかし、Sukiのようなツールを作るには文化資本が必要です。正しい質問の仕方を知っていること。エージェントができること/できないことを理解していること。自分の子どもの学びのプロジェクトマネージャーになること。

これはお金の話ではありません。私たちは裕福ではありません。ネットワークもありません。つながりもありません。けれど、私たちは本や好奇心、複雑なシステムへの嗜好とともに育ちました。

AIは不平等を広げるでしょう。減らすのではありません。高価だからではありません。むしろどんどん安くなっています。それでも、どう使うべきかを即興で理解することはできないからです。

娘のために私が作ったものは、多くの親が作れるはずです。けれど、多くの親は、それが可能だということすら知りません。

そこで、この話は現実のものとして起きます。

結論

口頭試問:6月8日。STD2Aポートフォリオ:4月7日。クラスの指導なしで3か月の間に、追いつくための14個の歴史章。

これらの日付が過ぎれば、POCが有効だったかどうかを本当に検証できます。しかしShaynaはすでに、はっきりとした大きな前進があったことを証言できます。修正に関しても、STD2Aポートフォリオに関しても。

SukiはLettaで作られています。持続的なメモリを備えたAIエージェントのフレームワークです。オープンソース。