小学生向け理科教材に熱・光・音の8トピックを一括追加 — 生成・事実チェック・修正のエージェント並列パイプライン

開発mdx-playground

やったこと概要

中学受験向け参考書をベースにした小学生向け理科学習教材のバッチ4を進めた。対象は熱・光・音カテゴリの残り8トピック(物のあたたまり方・熱の伝わり方・熱量・光の直進・反射・屈折・凸レンズ・虹と分散)。トピックごとに Vue SFC のセクション4本+クイズ10問を生成エージェントに書かせ、事実チェック→修正→表示確認→コミットまで一日で通した。

パイプラインの流れ

バッチ3までで固まった手順をそのまま回した。

  1. 生成: 生成エージェント8体(Sonnet 5)を並列で派遣。各トピック Vue 4本+クイズ10問。原文流用を検出する機械チェッカーに合格するまで書き直させる(大半は書き直し1回、凸レンズは2回)
  2. 登録: categories.ts と quizDataRegistry への一括登録はメインセッション側で実施。その前に、エージェントに禁止している categories.ts 直編集がないか、生成ファイルが実在するかを確認
  3. 事実チェック: トピックごとにチェックエージェントを派遣し、物理的な正しさと計算を検算させる
  4. 修正: チェック結果を修正指示として確定させてから、修正エージェントを並列起動
  5. 最終検証: チェッカー全体再実行 → テスト → dev サーバーでの表示確認
  6. 計画書更新とコミット

事実チェックの起動では8体のうち6体が立ち上がらず、30秒待ってリトライしたら全員動いた。完了通知が届くたびに「残り○体」と数えながら、集計表を埋めていく一日だった。

8トピックの成績表

生成時の書き直し回数と事実チェックの結果を並べると、どこで手がかかったかが一目で分かる。

トピック生成(チェッカー)事実チェックメモ
物のあたたまり方書き直し1回critical 1 / minor 2ぼう張率の記述が逆に読める
熱の伝わり方書き直し1回critical 0 / minor 3
熱量1発合格critical 0 / minor 32解法で独立検算・全問一致
光の直進書き直し1回critical 3 / minor 5点光源の定義矛盾・扇状の平行光線
光の反射critical 1 / minor 5作図手順の光線が逆向き
光の屈折1発合格critical 5 / minor 6クイズ11問で上限超え報告
凸レンズ書き直し2回critical 0 / minor 3レンズ公式で自己検算済み
虹と分散書き直し1回critical 0 / minor 6一般知識で補完した箇所を明示

生成時に一番粘った凸レンズが事実チェックでは無傷で、1発合格だった屈折が critical 5件と最多。生成時のチェッカー通過状況と物理的な正しさは相関しなかった。

SVG光路図に critical が集中した

事実チェックの集計は critical 10件 / minor 33件。critical の内訳は屈折5・直進3・あたたまり方1・反射1で、光の単元の SVG 図解に集中した。

  • 点光源の定義が自己矛盾していて、平行光線のはずの図が扇状に開いていた(光の直進)
  • 鏡像の作図手順で、光線の矢印が「目→鏡→物」と逆向きに描かれていた(光の反射)
  • ぼう張率の大小関係が逆に読める記述(物のあたたまり方)

テキストと計算はプロンプトの検算義務でほぼ守られる(熱量のクイズは2解法で独立検算して全問一致)のに、SVG の光路や矢印の向きは生成時の検算をすり抜けて破綻する。この傾向がバッチ4ではっきり数字に出た。

修正はバッチ3の知見どおり「レビュー確定済みの修正指示を渡して1周で解消」方式。SVG 幾何の再計算を伴う4トピック(屈折・直進・反射・虹)はメインと同格のモデル、軽量修正は Sonnet に振り分けて9体並列で走らせた。屈折はスネルの法則で26項目を検算させ、凸レンズはレンズ公式で自己検算させて、全件1周で潰れた。

既存トピック2本の書き直しも並走

バッチ4の新規8本と並行して、以前に作った既存トピック2本(状態変化系と音系)の原文混入の書き直しも走らせた。どちらもチェッカー合格まで持っていき、状態変化系はテスト434件 pass、音系は計算の検算まで済ませた状態で完了報告が来た。新規生成と既存の手直しを同じ待ち行列に混ぜても、完了通知ベースで進める運びなら混乱しなかった。

スコープ外の発見: 既存クイズの設定流用

音系の書き直しを任せたエージェントから、担当外の既存クイズ2問が参考書と同一の問題設定(数値までそのまま)を流用しているという報告が上がってきた。機械チェッカーのゲートは通過するが、「数値・設定を必ず変える」というプロジェクトのルールに反する。修正バッチに混ぜて、花火とドローンを使った独自の設定に差し替えさせた。機械ゲートを通ることと、ルールを守れていることは別物だと再確認した。

最終検証でつまずいたところ

  • 全テストを回したら31件失敗した。バッチ4起因か既存の失敗かの切り分けに入ったが、Git Bash の変数展開が干渉して確認コマンドが空振り。netstat に切り替えたら、前回セッションの dev サーバー残プロセスが2つのポートを占有しているのが見つかった。PID を指名して kill し、dev を起動し直したらページは全トピック 200 を返した
  • 表示確認の途中でセッション上限に当たって強制停止(リセットは13時過ぎ)。再開したら表示確認エージェントも巻き添えで落ちていたので、起動し直した
  • 最終的に対象10トピック(新規8本+原文混入で書き直した既存2本)すべてで表示確認が合格。セクション描画・クイズ動作・タブタイトル OK、コンソールエラー0件

計画書は途中経過の時点で一度「現在地」を更新しておいた。セッション上限で切られる日は、この途中セーブが効く。

そのままバッチ5(電気)へ

午後はバッチ4の知見をプロンプトに反映して、次のカテゴリ(電気7トピック)のバッチ5も同じパイプラインで完走させた。反映した知見は「クイズの answerIndex を0〜3に分散させる」明示指示(バッチ4では9問中9問が先頭選択肢に偏った)など。それでもバッチ5の事実チェックでは critical 7件が出て、今度は電流や回転の矢印の向きに集中した。円周上の接線矢印は、検算を義務付けてもまだ破綻しやすい。

一日の締めで dev サーバーを止め、ポート3000が解放されたのを確認してからセッションを閉じた。次のセッションは「dev 未起動」前提のクリーンな状態から始められる。

成果

  • コミット5件(バッチ4を内容別に3件+バッチ5)
  • 参考書ベースの101トピック中39本が実装済みに。熱・光・音と電気の2カテゴリが完成

学び

  • テキストと計算はプロンプトの検算義務で守れるが、SVG の幾何(光路・矢印の向き)は生成時には守れない。「事実チェックで座標まで確定→修正エージェントに1周で適用」の流れを最初から工程に組み込むのが正解だった
  • クイズの正解位置の偏りは、生成プロンプトに分散指示を1行足すだけで次バッチから直る。事実チェックの minor 指摘は次バッチのプロンプト改善ネタとして拾う
  • 前回セッションの dev サーバー残プロセスがテストの切り分けを混乱させる。セッションの終わりにポートを解放しておくのが次の自分への礼儀