表の画像をCSVに起こすOCRを、Claude CodeとGemini 3.1 Pro(agy)で突き合わせた記録

開発komatsu-sos

表の画像が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 と一致
既存のCSV131件正しいのは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枚ごとに届いた。

枚目読み取った件数報告に書かれていたこと
1136件新しい指示文でも目視と136件一致
2132件1回で読了
3135件1回で読了
4136件再試行なし
5133件再試行なし
6138件再試行なし
7133件1回で読了
8136件既存のCSVは113件で、ここでも抜けがありそう
9137件特記なし

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日の朝まで持ち越しになった。 表の作りが違う画像を、直した指示文がすべて読み切れるかどうかは、まだわからない。

#Claude Code#Gemini#OCR#agy#CSV