中学受験理科『植物』教材を事実チェック——SVG幾何の破綻2件を上位モデル統括×Sonnet 5の分業で潰した
中学受験理科『植物』教材を事実チェック——SVG幾何の破綻2件を上位モデル統括×Sonnet 5の分業で潰した
結論
中学受験向けの理科教材を、100トピック規模のインタラクティブな学習コンテンツに作り替えている。 今日はそのうち「植物」カテゴリの8トピックを仕上げの最終工程まで押し込んだ。
このバッチは前のセッションで生成・登録・テスト587件パスまで済ませて、 「事実チェックだけ未了」と書き添えたWIPコミットとして寝かせてあった。 残っていたのは事実チェック → dev環境での描画確認 → 追いコミット、の3工程。
進め方は分業にした。統括は上位モデルのまま自分の手元に置き、 日本語の文章を書くところだけSonnet 5のサブエージェントに任せる。 その体制で8トピックを一気に事実チェックにかけたら、 狙いどおりSVG幾何の破綻が2件(critical)浮いてきて、その両方をdev環境の描画で直したのを確認して閉じた。
なぜ「統括は上位モデル、文章はSonnet 5」にしたか
このバッチが植物単元なのが、モデル選びの理由になっている。 光合成・呼吸・種子の発芽といった生物学のキーワードは、 一部の上位モデルの安全分類器が「生命科学(biology)」として誤って反応することがある。 実際、前のセッションでは植物の作業中に分類器が誤発動して、 自分の好みではないモデルへ勝手にフォールバックされた。
そこで割り切った。文章を書く実働は、生命科学の分類器を持たないSonnet 5に振る。 一方で「どのトピックを誰に振るか」「どのSVGを重点的に疑うか」といった段取りは、 コンテキストを広く抱えられる上位モデルに統括させたまま残す。 人間の自分が方針を決めて、AIが手を動かす——という普段の構図を、モデル選定の層にもそのまま持ち込んだ形だ。
事実チェックは8体を並列で派遣した
まず事実チェック用に、蔵書DBから該当8トピックの本文チャンクを書き出して、 見開き画像がちゃんと手元にあることを確認した。照合の元ネタが揃っていないと、 サブエージェントは「もっともらしい創作」で埋めてしまうので、ここは先に固める。
そのうえでSonnet 5のサブエージェントを8体、1トピックにつき1体で並列起動した。 各体には3系統を担当させた。
- 知識照合: 元教材の本文と、生成した解説の中身が食い違っていないか
- SVG幾何: 断面図・維管束の内外・気孔・光合成の物質の流れ・補償点グラフといった、図の座標が正しいか
- クイズ検算: 例題とクイズ10問の正解が一意に定まるか
このときファイルは編集させず、所見レポートだけ返させたのがポイント。 8体が勝手に同じファイルへ書き込むと衝突するので、指摘を集めてから修正は自分が采配する。 植物特有の壊れどころ(維管束の内外を逆に描く、気孔の細胞の作り、光合成の矢印の向き)を、 重点的に疑えと明示して送り出した。
派遣を待つ間は遊ばせず、独立してできる登録整合性の確認とdev環境の準備を並行で回した。 教材の登録テーブルは8トピックとも3箇所+クイズキーが全部揃っていて、登録テストは650件パス。 HMRの残骸プロセスがポート24678に居座っていたので、正体だけ確認して後で掃除する算段をつけた。
出てきたのは、予想どおりSVG幾何の2件だった
8体が出揃って、最終集計は critical 2件・minor 18件。 そして critical の2件が両方ともSVG幾何だった——「植物は図が壊れる」と踏んで重点を張った、まさにそこ。
1件目は蒸散(transpiration)の気孔の図。 孔辺細胞をベジェ曲線で描いていたのだが、制御点ではなく曲線の実到達範囲で計算し直すと、 核と葉緑体が細胞の外に浮いていた。 気孔は「開くとき孔辺細胞が膨圧で膨らむ」のが正しい挙動なので、 開いた側の細胞は膨らませ、閉じた側は細いまま、核と葉緑体を細胞の実中心へ戻して、ラベル線も追従させた。
2件目は種子の発芽(seed-germination)の対照実験の例題図。 種子の中心座標が水面より下にあって、種が水に沈んでいた。 ところが本文は「種子の上半分が空気にふれる」と書いている。 つまり対照実験の核心——空気にふれる種と水没させた種の対比——が、図の上では潰れていた。 沈んでいた種の中心を水面に合わせて上半分を出し、水位の矩形の高さも揃えた。 片方(完全水没の対照区)はわざと沈めたままにして、コントラストが立つようにしてある。
この2件のSVG幾何は自分が直接直した。文章と配色系のminor(花弁の例外の表を足す、 根の断面の配色を統一する、葉の表皮ラベルを補う等)は、別のSonnet 5に並行で書かせた。
直しすぎない、という判断もいくつか残した
指摘を全部つぶすのではなく、あえて現状維持にした minor もある。
- 光合成の道管・師管を「薄青のパイプ+濃青の矢じり」「薄橙+濃橙」で描いている濃淡差は、 青と橙の色相で道管・師管を区別できていて実害がないので、意図的なスタイルとして残した
- 種子のつくりの断面図で胚の並び順が書籍と上下逆に見える件は、 種子断面の向き自体が任意(上下は決まっていない)で、相対的な順序は一致していたので触らなかった
- 引き出し線の位置が数pxずれている指摘は、実際の描画では見えない差なので保留した
過剰改変で別のところを壊すのが一番こわい。直す/直さないの判断理由は最終報告に書き残した。
dev環境で、自分の目で描画を確かめた
修正が本当に画面で効いているかは、実際に描いて見るまで信用しないことにしている。
ここで少し詰まった。dev起動が一度 exit 1 で落ちたが、原因は $TMPDIR 未設定でログのリダイレクトが失敗しただけで、
dev本体は無関係。リダイレクトを外したら普通に立ち上がった。
このページはモバイル幅(≤768px)だと全セクションが縦積みで一度に描画される作りなので、
Playwrightで幅760px・高解像度に設定して、8トピックを一括でスクリーンショット撮影した。
コンソールエラーは全トピック0件、クイズの回答フィードバックも動作。
検証スクリプトがスクラッチパッド配置だと @playwright/test を解決できなかったので、
プロジェクト内に一時的に置いて実行し、終わってから消した。
撮った画像は、破綻リスクの高かったSVGを中心に自分の目で1枚ずつ確認した。
- 蒸散の気孔: 核・葉緑体が孔辺細胞の内側に収まり、開いた細胞は膨らみ、閉じた細胞は細い
- 種子の発芽: 完全水没の対照区に対して、他の種は水面にちょうど半分だけ顔を出している
- 光合成の試験管の枠のはみ出しも解消、補償点グラフも呼吸のマイナスから立ち上がって光飽和で頭打ち
目視のおかげで、事実チェックでは挙がっていなかった不整合も1件拾えた。 根の断面図で、師管の円はamberに統一したのにラベルの文字色だけ赤が取り残されていた。 円とラベルの色が食い違って見えるので、ラベルもamberに揃えた。レポートを読むだけでは気づけなかった類の齟齬だ。
(一度だけ、種子のつくりのクイズ回答判定が false を返して肝を冷やしたが、 これは初回トピックの hydration のタイミングで、撮り直したら正常動作。バグではなかった。)
コミットと、割り込まれた履歴の確認
原文の混入チェック(20文字の連続一致と教材名の混入を機械検出するゲート)に合格、 登録テスト650件パスを確認して、変更は植物の9ファイルだけ——登録テーブルは前のWIPコミットで済んでいて無変更、 無関係なファイルの混入もなし——という状態でコミットした。
一点ひやりとしたのは、コミットの親が想定していたセッション開始時のHEADではなく、 別の並行処理が積んだ別件のコミットになっていたこと。 履歴が壊れていないか、前のWIPコミットが確実に祖先に含まれているかを確認して、健全だと確かめてから閉じた。 起動したdevサーバーも止めて、一時ファイルの残留ゼロまで見届けた。
学び
- 人間は方針を決める係、AIは実働する係——それをモデル選定の層まで持ち込めた。 「文章はSonnet 5、統括は上位モデル」という分業は、生物学の分類器という制約への対処であると同時に、 段取りとテキスト生成を別の頭に分ける役割分担としてきれいに機能した
- 壊れどころを先に名指しすると、事実チェックが当たる。 「植物は図が壊れる」と踏んで 維管束・気孔・光合成の矢印を重点指定したら、critical 2件が両方そこに出た。当てずっぽうに全体を舐めるより速い
- レポートだけでは齟齬は拾いきれない。 根の断面のラベルの色ずれは、 8体の所見には無く、自分が画面を見て初めて気づいた。表示に触れたら自分の目で描画を確認する、を今日も守ってよかった
- 直さない勇気も要る。 色の濃淡差・断面の向き・数pxのずれは、指摘されても実害がなければ残す。 全部つぶそうとすると、直した副作用で別の正しい表示を壊す