• #書籍デジタル化
  • #TursoDB
  • #Vue
  • #Codexレビュー
  • #並列処理
  • #セミラティス
book-knowledge-base

蔵書841冊にセミラティス的タグを付ける:サブエージェント8並列+Codex2回レビュー+コンテンツ軸の追加

蔵書ナレッジベース(841冊)の整理を1日で進めた。Amazonからの商品メタ全件取得を完走させ、841冊をサブエージェント8並列で分類し、shelf UIにタグフィルタとコンテンツ軸(第3軸)を追加した。CAPTCHAで2回止まり、Codexに2回レビューを依頼し、エンコードエラーに引っかかりながら、夕方には全冊の二軸分類が一覧で見える状態になった。

Amazon商品詳細メタの全件取得:cp932エンコードエラーで肝が冷える

朝イチでAmazonからの商品詳細メタ取得を再開した。残り177件をスクレイパーに流し、ログを眺めていたら UnicodeEncodeError: 'cp932' codec can't encode character がコンソールに連発しはじめた。

DB書き込みは止まらず、レコードは入っている。ファイルの中身を select してみると正しいUTF-8で保存されている。原因は print() 経由の標準出力で、Windowsのデフォルトコードページ(cp932)が絵文字や一部の中点文字をエンコードできず、ターミナル出力時にだけ落ちていた。実害はゼロだったが、ログが赤で埋まると進捗が読めない。

スクレイパーの先頭で stdout / stderr を UTF-8 に切り替えた。

import sys
sys.stdout.reconfigure(encoding="utf-8")
sys.stderr.reconfigure(encoding="utf-8")

これで赤いエラーが消え、進捗がそのまま読めるようになった。途中CAPTCHAが1回挟まり、ブラウザで通すと残りを完走した。177件すべてのメタが揃い、合計841冊分のタイトル・サブタイトル・カテゴリ情報がDBに乗った。

841冊のセミラティス的タグ付け:サブエージェント8並列で走らせる

次は分類だ。蔵書ビューアの「棚」を整理するには、書籍に複数の軸(カテゴリ・難易度・対象読者など)を重ねて付ける必要がある。1冊が複数の親に属する=セミラティス構造で扱いたい。

最初は「Amazonのカテゴリツリーをそのまま流用するか」と考えたが、Amazonの分類はビジネス・経済 > 経営・キャリア > 起業 のような階層で、僕の蔵書(簿記・会計・ファイナンス・投資・エンジニアリングが混在)とは粒度が合わない。タイトルを目視しながらタグ辞書を手で設計することにした。

タグ辞書を作ったあと、841冊をサブエージェント8並列で分類した。1エージェントあたり約100冊を担当させ、JSONLでタグ候補を吐き出させる。並列化したのは速度のためというより、エージェントごとに「タイトルからタグを推論する基準」を独立に持たせて偏りを比較するためだった。結果として8並列で約20分で全件のタグ候補が揃った。

Codexレビューv1:キー設計の致命的バグを指摘される

タグ辞書とDBスキーマができた段階でCodexにレビューを投げた。

codex exec -m gpt-5.4 "プランをレビューして。瑣末な点へのクソリプはしないで、致命的な点だけ指摘して: ..."

戻ってきた指摘で一番痛かったのがキー設計のミスだった。book_tags テーブルの主キーを (file_no, category) で切っていたが、タグの出所を表す source カラムがキーに含まれていない。INSERT OR REPLACE を使うと、自動付与(タイトルマッチ)で入れた行を、後から手動レビューの行が上書きしたり、その逆が起きたりする。既存行を破壊する事故が容易に起きる構造だった。

主キーを (file_no, category, source) に直し、自動付与・手動レビュー・Claude再走査の3系統の行が共存できるようにした。

baseline 60冊で目盛りを作り、残り781冊を8バッチに分割

Codexのv1レビューでもう1つ大きな指摘があった。「baselineを明文化しろ」だ。サブエージェント並列で分類すると、エージェントごとに判定基準が微妙にズレる。バッチ間の整合性を担保するには、全エージェントが同じ判定基準を見られる「お手本」が要る。

代表的な60冊を選び、人間が手動でタグ付けした。簿記入門書、会計士テキスト、コーポレートファイナンス、投資の名著、エンジニアリングの定番——カバーしたい軸ごとにbaselineを置く。残りの781冊を8バッチに均等分割し、各サブエージェントには「baseline 60件+自分の担当バッチ」を渡した。エージェントはbaselineをガイドにして担当バッチをタグ付けし、JSONLを出力する。

Codexレビューv3:検証ロジック強化と交差禁止ルール

更新したプランを再度Codexに投げた。

codex exec resume --last -m gpt-5.4 "プランを更新したからレビューして。瑣末な点へのクソリプはしないで、致命的な点だけ指摘して: ..."

resume --last で前回の文脈を引き継がせるのがコツだ。これを忘れると毎回ゼロから説明し直すことになる。

v3のレビューで指摘されたのは検証ロジックの甘さだった。

  • 重複検出: 同じ (file_no, category, source) の組が2行以上入っていないか
  • タグ個数チェック: 1冊あたりのタグが上限・下限の範囲に収まっているか(多すぎる本は分類が雑、少なすぎる本は取りこぼし)
  • 交差禁止: 「簿記3級」と「簿記2級」のような排他的タグが同一書籍に同時付与されていないか

検証スクリプトを追加し、DBに投入する前にJSONLを全件チェックするようにした。実際に走らせると、エージェントAとエージェントBで同じ本を取り違えていた重複が3件、タグ過多が12件、交差違反が1件出た。手で直してから投入した。

shelf UIにタグフィルタを追加

DBに841冊×複数タグが入った。次はビューアでフィルタリングできるようにする。タグAPI(/api/shelf/tags)を新設し、library API(/api/shelf/library)にタグ絞り込みクエリを追加した。

UIではチップ式のフィルタを置き、複数タグをANDで重ねられるようにした。「簿記2級」かつ「過去問」を選ぶと該当の数冊だけが残る。

評価の表示も直した。元のUIは★4.0以上、4.5以上、5.0の3段階表示だったが、★4.0と★4.5が同じ列に並ぶと差が見えづらい。評価ごとに 横線で区切り、★5.0 / ★4.5以上 / ★4.0以上 のセクションを視覚的に分けた。フィルタで絞り込んだときに「全841冊 / 表示489冊」のように両方の数字を出すと、フィルタの強さが直感で分かるようになった。

ユーザー要望から「コンテンツ軸」(第3軸)を追加

shelf UIをユーザーに見せたら「カテゴリと難易度だけだと、特定のテーマで横断検索ができない」とフィードバックが返ってきた。たとえば「キャッシュフロー計算書」「簿記3級」「Excel」のような横断テーマは、既存の2軸では拾えない。

第3軸として「コンテンツ軸」を追加した。緑系のチップで色分けし、既存の2軸(カテゴリ・難易度)と視覚的に区別する。初期セットは要望ベースで6つに絞った。

  • キャッシュフロー計算書
  • 簿記3級
  • 簿記2級
  • Excel
  • 連結
  • 決算書を読む
  • 財務3表

付与は二段構えにした。まずタイトルマッチで自動付与し、機械的に拾える本を埋める。次にClaudeで全841件を再走査し、タイトルだけでは判定できない本(副題やシリーズで判別する本)を拾い直す。

二段構えにした理由は、タイトルマッチだけだと取りこぼしが多いと予想したからだ。実際、自動付与で拾えたのは約50ペアだったが、Claudeの再走査で48ペア追加された。最終的に 98ペア / 76冊 がコンテンツ軸に紐づいた。1冊が複数のコンテンツに属するので、ペア数 > 冊数になる。

著者情報の追加取得:CAPTCHAで再び中断

shelf UIの一覧で「著者で並べたい」という要望も出た。Amazonページの #bylineInfo をスクレイパーに追加し、全841冊の著者を取り直す。

344件まで取得したところでCAPTCHAに引っかかった。今日はここで打ち切り、明日の朝にリトライする。CAPTCHAは時間帯と頻度の関数で、夜中の連続アクセスで発火しやすい印象がある。朝イチで残り497件を流す予定。

振り返り

今日の作業で効いたのは「並列化の前にbaselineを置く」「Codexレビューを2回挟む」「自動付与+手動レビューの二段構え」の3つだった。

並列サブエージェントは速度を稼げる一方、エージェント間の判定ブレを抑える仕組みが要る。baselineを全員に配ることで、出力のばらつきが目で見て減った。

Codexレビューはv1で構造の致命傷(キー設計)を、v3で検証ロジックの抜けを指摘してくれた。1回だけだと「直したつもり」で終わるが、2回挟むと「直したことで生まれた新しい穴」が見える。resume --last で文脈を引き継ぐのが必須。

自動付与+手動レビューの二段構えは、コンテンツ軸の精度を実測で2倍にした。タイトルマッチは速いが取りこぼす。Claudeの全件再走査は遅いが文脈で拾う。組み合わせると精度と速度の両取りができる。

明日やること

  • 著者情報の残り497件を取得し、CAPTCHAが出たら時間を空けて再開する
  • shelf UIで著者カラムを追加し、著者名でソートできるようにする
  • コンテンツ軸を「税務」「IFRS」「ESG」など要望が来たテーマで拡張する
  • 検証スクリプトをCIに組み込み、DBに新規行が入るたびに重複・交差・タグ個数チェックを自動で走らせる