表の画像をCSVに起こすOCRを、Claude CodeとGemini 3.1 Pro(agy)で突き合わせた記録
表の画像が42枚あり、それをOCRしたCSVもリモートにもう上がっていた。 ただ、そのCSVが画像をどこまで正しく写しているのかは、この時点ではわからなかった。
取り込んだ画像と、すでにあったCSV
リモートにプッシュされた画像とCSVを Claude Code に同期してもらった。 取り込んだのは1コミットで、ファイルは43件だった。 ローカルには変更がなかったので、追いつかせるだけで済んだ。
続けて、この画像と似た内容のCSVをもう持っていないかを確かめてもらった。 あわせて、画像の読み方も説明した。 表は青い線で区切られていて、途中に入る黄色の線がたぶん区切りになっている。 一番右の列の数字がどう並ぶか、その数字が番号のどの桁に当たるかも、実例の番号を挙げて伝えた。
返ってきた答えによると、似た内容のCSVは今回プッシュされたCSVそのものだった。 42枚をOCRした結果が、4つの列に分けて5,278行入っている。 リポジトリ内にほかのCSVはなく、PC全体の検索は時間切れで途中までしか見られていない。
自分で打った1回目の agy
Gemini でのOCRは、Claude Code の安全チェックに止められて、まだ動いていなかった。 そこで、agy コマンドを自分でセッションに打ち込んだ。 モデルは gemini-3.1-pro-high を指定し、指示はフォルダ内の ocr-prompt.txt から読ませる形にした。
agy -p "Read ocr-prompt.txt in this folder and follow its instructions exactly. Output only the CSV." \
--model gemini-3.1-pro-high --sandbox --dangerously-skip-permissions --print-timeout 9m > out.txt
コマンドは120秒のタイムアウトまでに終わらず、バックグラウンドに回った。 画面には、終わったら知らせるという案内と、出力の書き込み先が出た。 完了の知らせが来る前に、「これって進んでるんすか?」と聞いた。
進んでいなかった。 Gemini は画像を読まずに迷子になり、途中で固まっていたので、Claude Code の側で止めたという。 何が起きていたかは、agy のログと会話記録で確かめてあった。
「コマンドを実行するな」と書き足した2回目
原因を直した指示文を用意してもらい、もう一度自分でコマンドを打った。 1回目との違いは、少なくとも次の3点ある。
- 指示文のファイルを、フォルダ内の名前ではなくフルパスで指した
- 「Do not run any commands.」を足し、コマンドを実行させない形にした
--add-dirで作業フォルダを渡した
agy -p "Open <指示文のフルパス> and follow its instructions exactly. Do not run any commands. Output only the CSV." \
--add-dir "<作業フォルダ>" ...
このコマンドも120秒では終わらず、バックグラウンドに回った。 今度は、1枚目の読み取り結果まで届いた。
1枚目で3つの読み取りを並べる
1枚目の画像について、3つの読み取りを突き合わせてもらった。
| 読み取り | 件数 | 突き合わせの結果 |
|---|---|---|
| Gemini 3.1 Pro(agy) | 136件 | すべて正解。Claude Code の目視と、数字も並び順も136件中136件一致 |
| Claude Code(画像を拡大して目で読む) | 136件 | Gemini と一致 |
| 既存のCSV | 131件 | 正しいのは128件(94.1%) |
既存のCSVは、136件のうち8件を正しく拾えていなかった計算になる。
この結果を見て、「あなたが突合した内容と、Geminiが突合した内容が完全に一致してたってことですよね」と確かめた。 そのうえで、残り41枚も同じ方法で進めると決めた。 Claude Code の設定で agy の実行は許可してあるはずだ、とも伝えた。 Gemini の出力をどこに置くかは任せたが、履歴として分けたほうがいいのでは、と添えた。
残り41枚の読み取りと利用枠
14時41分に、残り41枚のOCRが回り始めた。 3枚ずつ並行で回し、1枚あたり2〜3分かかるとして、42枚すべてが終わるのは15時20分前後の見込みだった。 今回は、agy の実行が止められなかった。
ほかの画像には、表の作りが1枚目と違うものがあった。 それに合わせて指示文を直したので、1枚目も新しい指示文で読み直してもらった。 結果は136件すべてが目視と一致し、指示文を直しても精度は落ちていなかった。
回しているあいだ、件数つきの短い報告がほぼ1枚ごとに届いた。
| 枚目 | 読み取った件数 | 報告に書かれていたこと |
|---|---|---|
| 1 | 136件 | 新しい指示文でも目視と136件一致 |
| 2 | 132件 | 1回で読了 |
| 3 | 135件 | 1回で読了 |
| 4 | 136件 | 再試行なし |
| 5 | 133件 | 再試行なし |
| 6 | 138件 | 再試行なし |
| 7 | 133件 | 1回で読了 |
| 8 | 136件 | 既存のCSVは113件で、ここでも抜けがありそう |
| 9 | 137件 | 特記なし |
9枚目を読み終えたところで、agy の利用枠が切れた。
枠はモデルに関係なくアカウントで共通なので、3.8 Flash に替えた試行でも同じ429エラーが返った。
15時に確認した時点で、解除は2026-09-19 09:17ごろの見込みだった。
ここまでの読み取り結果と、続きの計画や進捗をまとめた引き継ぎ書は、コミットしてGitHubにプッシュしてもらった(a64ce33)。
並べるまで見えなかったこと
既存のCSVにも、42枚分のOCR結果が5,278行入っていた。 それでも1枚目では131件と136件、8枚目では113件と136件の差があった。 別の読み取りと並べて、はじめてその差が数字になって出てきた。
バックグラウンドに回ったコマンドは、黙っていても進んでいるとは限らない。 1回目の Gemini がそうで、画像を読まないまま固まっていた。
残り41枚に進むと決めたのは、目視と Gemini の136件がそろって一致したのを、自分の言葉で言い直して確かめたあとだった。
残り33枚は、利用枠が戻る9月19日の朝まで持ち越しになった。 表の作りが違う画像を、直した指示文がすべて読み切れるかどうかは、まだわからない。