62冊から2,469問を抽出し386問へ束ねるまで。利用枠とコンテキストの残量で作業の区切りを決めた記録

開発eurekapu-nuxt4

止めどきを決めるのに、進捗より先に残量を見た

作業に入った時点で、参考書の取り込みは7冊分が終わっていた。 Googleタスクに積んであった「設問を200問作る」ほうへ進めてほしい、と伝えるところから始めた。 ところが終盤で判断の中心になったのは、どこまで進んだかではなく、あと何分と何トークン残っているかだった。

取り込みの続きではなく、設問づくりへ回した

計画書と進捗ドキュメントを読ませて、取り込み済みのものがDBに実在するかを先に確かめさせた。 洗い出させると、対象の62冊はすべて入っていた。 取り込み範囲が狭いものが5冊あった。 そのうち2冊は計画書に既知の制約として書いてある分なので、そのまま進めることにした。

抽出に入る前に、進捗台帳、raw JSONのスキーマ、抽出規約の正本を書かせた。 62冊を並列で回すつもりだったので、途中で規約が揺れると全部やり直しになる。 書き出し先のワークファイルもまとめて作らせ、次のバッチの分はエージェントの待ち時間に先回りさせた。 なお、この日の日中は途中でモデルがFable 5に替わった。

3冊で品質を確かめてから、10冊ずつに広げた

書籍1冊ごとの抽出はサブエージェントに任せた。 いきなり62冊を投げず、まず3冊だけ並列で回させた。 上がってきた成果物は自分で読んだ。 1冊目には40問が並んでいた。 実在の企業名とキャラクター名が消えているか、答えの読み筋が特定の選択肢へ寄っていないか、出典ページが本文と合っているか。 この3点を1問ずつ確かめた。

3冊とも通ったので、以降は機械検証スクリプトで形式を先に弾かせ、目視は中身だけに絞った。 そこからは1バッチ10冊に広げた。 サブエージェントを10体並列で走らせ、完了通知が来るたびに検証と台帳更新をさせた。 数字は40問刻みで積み上がっていく。 4冊で160問、11冊で440問、20冊で834問、28冊で1,113問。 ここで、狙っていた候補数のレンジの中央を超えた。

設問を数合わせで膨らませていないかも見た。 取り込み範囲が88ページしかない入門書は34問で止まっていて、ページ数なりの本数に収まっていた。

品質の指摘は軽微なものが3件だけ出た。 どれも設問の語尾が疑問文の形で終わっていない、というものだった。 その場は親側で直させ、以降のバッチからは指示文に語尾の条件を書き足させた。

途中経過を自分の目で見るための台帳HTML

40問ずつ増える報告を眺めているうちに、合格を出しているのは検証スクリプトであって自分ではない、と気になってきた。 台帳と抽出結果をまとめて眺められるHTMLを作ってほしい、と頼んだ。

作らせたのは1枚のHTMLではなく、rawが増えるたびに叩き直せる生成スクリプトだ。 ローカルでのレビュー専用なので凝った作りは要らないが、選択肢を生成する箇所のエスケープだけは直させた。 Chromeで開かせて、描画とフィルタの動作を自分の目で確かめた。

これ以降、バッチが終わるたびにHTMLを再生成させて、10冊分をまとめて読む形に変わった。

残り3、40分で、抽出の完走を選んだ

43冊、1,709問。 残りが見えてきたところで、あとどれくらいかかるかを聞いた。 返ってきたのは所要時間の見積もりだけでなく、コンテキストとトークンの残量だった。 選べる道は3つ。 抽出のフェーズだけ完走して今日は締めるか、その先の工程まで一気に行くか、ここで止めるか。

残り時間は3、40分だった。 先の工程まで行くには足りないが、抽出だけなら届く。 フェーズ3は完走する、と決めて、残り19冊を全部並列に投げさせた。 第1波10体、第2波9体、合わせて19体が同時に動き出した。

19体を投入した直後に止めた判断

19体が走り出した数分後に、たぶん足りない、と思い直した。 5時間の利用枠にもう余裕がない。 19体はどれも書籍を読み込んでいる最中で、rawを1文字も書き出していないはずだった。 起動直後なら、止めても捨てるものがない。

全部止めさせた。 確認させると、どのエージェントも出力前で、中途半端なファイルは1つも残っていなかった。

止めたあとに、残す作業を2つ頼んだ。 適切な粒度でコミットすること(学習ゲートはスキップ)、そして新しいセッションからそのまま再開できるドキュメントを置くことだ。 コミットの手前で、別セッションがgitのロックを握っていて競合した。 gitのプロセスが生きていないことと、ロックが5分以上前のものであることを確かめさせてから解除させた。 抽出済み43冊分のスクリプトと成果物で53ファイル、19,647行がステージに乗った。 引き継ぎ用のHANDOFF.mdは別コミットで足させた。

同じ作業ツリーには、別セッションが進めている講義ノートの図解の変更も混ざっていた。 自分がこのセッションで完了を確認していないものなので、コミットさせずにそのまま残させた。

夜、モデルを切り替えて横断統合に入った

夜のセッションでは、横断統合のフェーズを親セッションに直接やらせた。 サブエージェントには分割しない、と最初に指定した。

rawは62冊で2,469問あった。 1つのカテゴリだけで200問を超えるので、まとめて読ませるとコンテキストが持たない。 カテゴリ別のダンプをファイル化させ、チャンクに割って読ませた。 束ね方を決める前に、検証スクリプトを書かせた。 グループへの参照ミスをその場で弾ける状態にしてから進めた。

三表の基本から始めて、損益計算書の292問、貸借対照表、キャッシュフローの269問と順に読み進めた。 貸借対照表では未割当が21件出た。 保留として想定していたのは13件なので、8件多い。 内訳を出させると、5件は既存のグループに入るはずの取りこぼしだった。 以降は、カテゴリを1つ終えるたびに未割当リストを出させて拾い直す手順に変えた。 折り返しの時点で、統合問は208、全体の51.5%まで来ていた。

消えたディレクトリと、切れた利用枠

後半で、同じファイルへの編集が10件まとめて失敗した。 ファイルを見に行かせると、ディレクトリごと無くなっていた。 別セッションのstash操作に巻き込まれた形だった。

復元させると、371グループと2,354件の割当が戻ってきた。 直前の編集も残っていたので、失われたのは失敗した10件だけだった。 それを再適用させて、作業を続けた。

そのあとFable 5の利用上限に当たって止まった。 モデルを切り替えて、同じセッションの続きから再開させた。 残っていたエラー9件、未割当7件、重複1件を潰させて、未割当ゼロ、エラーゼロになった。 2,469問が386問の統合問に束ねられ、どの問がどこへ入ったかの記録も一緒に出た。

残したもの

セッションの上限がまた近づいた。 まだ行けるか、進捗を残せそうかを聞いた。 進捗ドキュメントは更新済みで、引き継ぎのほうもまだ書ける、という返事だった。 HANDOFF.mdを書き換えさせ、消えたstashの件も別セッションの分まで確認させた。 どちらも無事だった。

コミットは23ファイル、48,312行になった。 内訳は、束ね方の判断そのものが入ったJSONが15ファイル、成果物の統合問386問、全2,469問の束ね記録、生成スクリプト2本、レビュー用のHTML、更新した進捗と引き継ぎのドキュメントだ。

最後に、次の工程をGoogleタスクへ積ませた。 計画書も一緒に添えさせた。 期日と本文が入っていることは、APIで取り直して確認させた。

今日の学び

  • 62冊を一気に投げる前に3冊で品質を見たので、直しは語尾の3件で済んだ。規約を正本として先に書かせたことが効いている
  • 進捗が数字でしか流れてこなくなったら、自分の目で見る導線を作る。1枚のHTMLではなく再生成できるスクリプトにしたので、バッチごとに使い回せた
  • 並列を投げた直後は、止めるコストがいちばん低い。「今スタートしたばかりか」で撤退の判断が変わる
  • 作業ツリーを別セッションと共有していると、gitのロックとstashの両方で足を取られる。自分が完了を確認していない変更はコミットしない