[{"data":1,"prerenderedAt":294},["ShallowReactive",2],{"content-/book-knowledge-base-import-batch-workflow":3,"all-pages-for-dir":292,"og-image-/book-knowledge-base-import-batch-workflow":293},{"id":4,"title":5,"body":6,"category":273,"description":274,"extension":275,"meta":276,"navigation":236,"ogImage":277,"path":278,"project_name":279,"published":280,"publishedAt":281,"seo":282,"stem":283,"tags":284,"todo":277,"unpublished":280,"updatedAt":277,"__hash__":291},"pages/2026-06/2026-06-16/book-knowledge-base-import-batch-workflow.md","裁断した実務書をOCRしてTursoのDBに横串検索できる本棚を毎日10冊単位で増やす",{"type":7,"value":8,"toc":263},"minimark",[9,13,17,25,28,35,59,65,73,77,84,87,110,113,116,120,123,126,129,148,155,159,162,169,176,179,189,192,212,215,222,225],[10,11,12],"p",{},"裁断して山積みになっていた実務書を、yomitoku で OCR して Turso の DB に流し込む作業がようやくバッチ運用に乗った。1日で3バッチ分、合計30冊以上を取り込み、DB は朝の173冊から夕方には225冊・29,619チャンクまで伸びた。手元の本棚に「日本語で質問するとAIが本をまたいで該当箇所を引いてくる」検索面ができはじめている。",[14,15,16],"h2",{"id":16},"キューと現実のズレを最初に潰す",[10,18,19,20,24],{},"朝イチでまず気づいたのは、進捗を書き溜めていた ",[21,22,23],"code",{},"memo/2026-06-12/import-queue.md"," が現実から1〜2日ぶん遅れていることだった。スキップ扱いになっていた法務分野の2冊はすでに変換済みだったし、M&A分野で「あと1冊」と書いていたものも、実際は別の本のOCRが裏で完了して取り込み待ちで止まっているだけ、というズレが何箇所もあった。",[10,26,27],{},"進捗マークダウンを手で更新するのは、こういう並行バッチ作業との相性が悪い。1セッションで5〜10冊が並列でOCR・DB取り込み・キュー更新を走るので、人間がメモを書き換える速度がワークフローに追いつかない。",[10,29,30,31,34],{},"そこで朝の最初の作業を「キューの実態調査」に当てた。Claude Code に DB の ",[21,32,33],{},"book_id"," 一覧を引かせて、キューの記述と突き合わせて、ズレを全部洗い出してもらう。やったことはシンプルで、",[36,37,38,42,56],"ul",{},[39,40,41],"li",{},"DB側の登録冊数・各書籍のチャンク数を Turso から取得",[39,43,44,45,48,49,48,52,55],{},"キュー側のチェックボックス（",[21,46,47],{},"[ ]"," / ",[21,50,51],{},"[>]",[21,53,54],{},"[x]","）と突合",[39,57,58],{},"並走中の別セッションが OCR を走らせていた分は触らずに残す",[10,60,61,62,64],{},"経営戦略5冊の項目が「着手中」のまま実態は止まっていたり、税務5冊が24時間前から ",[21,63,51],{}," で塩漬けになっていたり、キューに無い4冊が法務カテゴリで取り込み済みだったり。30分かけてキューを現実に合わせ直すと、その日に何をやるべきかが一気にクリアになった。",[10,66,67,68,72],{},"進捗マークダウンを手書きで保つのはもう諦めて、",[69,70,71],"strong",{},"Claude Code に毎朝キューと DB の差分を取らせて整える","運用に切り替えるべきだ、と決めた。",[14,74,76],{"id":75},"import-batch-コマンドで分野ごとに1015冊を流す","/import-batch コマンドで分野ごとに10〜15冊を流す",[10,78,79,80,83],{},"午前と午後で計3バッチを走らせた。すべて ",[21,81,82],{},"/import-batch \u003C分野名>"," の形で起動して、Claude Code 側でカテゴリのキューを読んで、★4.4以上の未着手書籍から10〜15冊を選んで全自動で進めてもらう。",[10,85,86],{},"1バッチでやってもらう内容はこう。",[36,88,89,95,98,101,104],{},[39,90,91,92,94],{},"候補10冊を ",[21,93,51],{}," で着手宣言してキューに書き戻す",[39,96,97],{},"各PDFからメタデータ（書名・著者・ページ数）を並列で取得",[39,99,100],{},"yomitoku の OCR バッチスクリプトを PowerShell で生成して直列で走らせる",[39,102,103],{},"OCR が1冊完了するたびに、Monitor で完了通知を拾って、DB取り込みスクリプトを並行起動",[39,105,106,107,109],{},"全冊DB登録完了後、キューを ",[21,108,54],{}," に更新してコミット",[10,111,112],{},"ファイナンス分野12冊は朝の06:20開始で1時間45分、会計分野10冊は10:08開始で約53分、税務分野10冊は11:12開始で約48分。当初は「OCR 4〜5時間+DB登録で全体6〜8時間」と見積もっていたファイナンスバッチが1時間45分で終わった瞬間、この運用は回ると確信した。",[10,114,115],{},"ページ数の重いやつ（646pや752p）が含まれていてもバッチ全体は1時間少々で終わる。yomitoku が1ページ1秒前後で進むのと、OCR と DB 取り込みが並行で走るのが効いている。",[14,117,119],{"id":118},"ocr-と-db-取り込みを並行させる勘所","OCR と DB 取り込みを並行させる勘所",[10,121,122],{},"地味だが効いたのが「OCRバッチを直列で1冊ずつ走らせる一方、完了した本から順に DB 取り込みを並列で被せる」という流し方。GPU は yomitoku で1本専有しているので OCR は直列でしか走らせられないが、DB 取り込み（Python スクリプトでチャンク分割→Turso INSERT）は CPU 仕事なので OCR と並行できる。",[10,124,125],{},"Monitor で yomitoku の終了イベントを拾い、終わったらすぐ次の OCR を起動しつつ、終わった本の取り込みを別プロセスで進める。これで「OCR 4時間+DB登録1時間=5時間」の直列見積もりが「OCR 1時間+並行DB登録」に圧縮される。",[10,127,128],{},"途中、PowerShell スクリプトの文字コードで何度かハマった。",[36,130,131,134,145],{},[39,132,133],{},"書名にカッコや日本語が入っていて、PowerShell から yomitoku に渡すコマンドラインが壊れる",[39,135,136,137,140,141,144],{},"バッチスクリプトを UTF-8 で保存すると ",[21,138,139],{},"NativeCommandError"," で落ちる → ",[69,142,143],{},"BOM付き UTF-8 で保存","で解決",[39,146,147],{},"yomitoku の進捗ログが UTF-16 で書かれているため Monitor のパターンマッチが効かない → ログ読み取り側を UTF-16 対応に修正",[10,149,150,151,154],{},"書名のかっこは PowerShell 側で ",[21,152,153],{},"''"," エスケープして安全化した。一度ハマると同じパターンで翌バッチでも踏むので、最初のバッチの後で「OCRバッチ生成テンプレ」を AGENTS.md に書き出してもらって、次回からは Claude Code がそれを参照して生成するようにした。",[14,156,158],{"id":157},"sqlは書かないclaude-codeに日本語で投げる","SQLは書かない。Claude Codeに日本語で投げる",[10,160,161],{},"DB は Turso に置いている。スキーマは「book（書籍メタ）」と「chunk（章節単位の本文）」の2テーブル中心で、書籍1冊が100〜300チャンクに分割されて入る。本日のバッチ後で 225冊 / 29,619チャンクまで増えた。",[10,163,164,165,168],{},"ただし",[69,166,167],{},"自分は SQL を書かない","。書けないし、書く気もない。",[10,170,171,172,175],{},"「会計の入門書たちで『減損』はどう説明されているか横断的にまとめて」と Claude Code に日本語で投げると、Claude Code 側で Turso の ",[21,173,174],{},"chunk"," テーブルに全文検索クエリを投げて、ヒットした該当チャンクを引き、書籍をまたいで要約まで返してくれる。自分は本棚に向かって日本語で質問するだけで、本をまたいだ論点整理が返ってくる。",[10,177,178],{},"これは紙の本棚や PDF ビューアでは絶対に追いつけない速度で、特に分野横断の論点（「税務と会計でこの取引の扱いが違うのはなぜか」みたいな問い）を立てるときに効く。1冊の本を全部めくる代わりに、関連書20冊の該当章だけが瞬時に集まる。",[10,180,181,182,184,185,188],{},"ただし注意点もあって、",[21,183,174],{}," テーブルの粒度（章節レベルか、段落レベルか）で検索結果の質が大きく変わる。今は yomitoku の出力 markdown を ",[21,186,187],{},"/restructure-book"," で章節ごとに再構造化してからチャンクに分割しているが、ここの境界判定はまだ調整余地がある。",[14,190,191],{"id":191},"今日のバッチ結果と次の手番",[36,193,194,197,200,203,206,209],{},[39,195,196],{},"朝の状態: DB 173冊 / 18,411チャンク",[39,198,199],{},"ファイナンス12冊バッチ後: DB 185冊 / 21,615チャンク",[39,201,202],{},"会計10冊バッチ後: DB 195冊 / 23,427チャンク",[39,204,205],{},"税務（第1弾）10冊バッチ後: DB 205冊 / 25,351チャンク",[39,207,208],{},"税務（第2弾）10冊バッチ後: DB 215冊 / 27,957チャンク",[39,210,211],{},"経営・経営戦略10冊バッチ後: DB 225冊 / 29,619チャンク",[10,213,214],{},"1日で52冊・11,208チャンク増えた。コミット5本に分割して履歴も読みやすくしてもらった。",[10,216,217,218,221],{},"次は財務分野の残り、それから法務・契約の宅建教科書群を片付ける順。今日のバッチが想定の半分以下で終わるペースなので、明日以降も ",[21,219,220],{},"/import-batch"," を毎セッション1〜2本ぶん回せば、週内に主要分野は埋まる見込み。",[14,223,224],{"id":224},"明日以降にやること",[36,226,229,242,248,254],{"className":227},[228],"contains-task-list",[39,230,233,238,239,241],{"className":231},[232],"task-list-item",[234,235],"input",{"disabled":236,"type":237},true,"checkbox"," 毎朝のキューと DB の差分チェックを ",[21,240,220],{}," の前に必ず1ステップ挟む",[39,243,245,247],{"className":244},[232],[234,246],{"disabled":236,"type":237}," OCRバッチ生成 PowerShell の文字コード扱い（BOM付きUTF-8、UTF-16ログ読み取り）を AGENTS.md に残す",[39,249,251,253],{"className":250},[232],[234,252],{"disabled":236,"type":237}," チャンク分割の境界（章節レベル vs 段落レベル）を、検索精度を見ながら調整する",[39,255,257,259,260,262],{"className":256},[232],[234,258],{"disabled":236,"type":237}," 並走セッションが残した ",[21,261,51],{}," 着手宣言を24時間以上たったら自動で再評価対象に出す仕組みを入れる",{"title":264,"searchDepth":265,"depth":265,"links":266},"",2,[267,268,269,270,271,272],{"id":16,"depth":265,"text":16},{"id":75,"depth":265,"text":76},{"id":118,"depth":265,"text":119},{"id":157,"depth":265,"text":158},{"id":191,"depth":265,"text":191},{"id":224,"depth":265,"text":224},"dev","yomitokuでOCRしたPDFをTursoのDBに流し込み、Claude Codeから日本語で横串検索できる本棚に育てる。/import-batchで10〜15冊を全自動取り込み、分野ごとにバッチを進める運用に到達した1日のログ","md",{},null,"/book-knowledge-base-import-batch-workflow","book-knowledge-base",false,"2026-06-16T00:00:00.000Z",{"title":5,"description":274},"2026-06/2026-06-16/book-knowledge-base-import-batch-workflow",[285,286,287,288,289,290],"Turso","OCR","yomitoku","全文検索","Claude Code","知識ベース","cHwsVxoBJyep66Xjtm15NSP7wPx9gk7xcSlILeozDgU",[],"https://log.eurekapu.com/og/blog/book-knowledge-base-import-batch-workflow.png?v=2026-06-16T00%3A00%3A00.000Z&title=%E8%A3%81%E6%96%AD%E3%81%97%E3%81%9F%E5%AE%9F%E5%8B%99%E6%9B%B8%E3%82%92OCR%E3%81%97%E3%81%A6Turso%E3%81%AEDB%E3%81%AB%E6%A8%AA%E4%B8%B2%E6%A4%9C%E7%B4%A2%E3%81%A7%E3%81%8D%E3%82%8B%E6%9C%AC%E6%A3%9A%E3%82%92%E6%AF%8E%E6%97%A510%E5%86%8A%E5%8D%98%E4%BD%8D%E3%81%A7%E5%A2%97%E3%82%84%E3%81%99&author=Kei%20Komatsu&sig=fed07d8188c087c3",1782176328615]