同じ書類、同じスキーマ、違う答え: space-ocr vs Mistral
難しい書類8枚・463フィールド・エンジンごと3回の統制ベンチマーク。読取率、実行間の安定性、そしてスコア表に見えない座標の差。
OCRベンダーのデモはどこも、きれいに印刷された請求書を完璧に読む。うちも例外ではない。ただ、それは導入判断には何の情報にもならない。本当に重要な問いは三つ。難しい書類ではどうなるのか。同じページを二度走らせたら答えは変わるのか。そして間違った値を、全件を手で確認し直さずにどう見つけるのか。
だから測った。自社の回帰コーパスから最も難しい8枚を選び、space-ocrとMistral Document AIにまったく同じリクエストを送り、同じスクリプトで採点した。この記事はその結果で、反論したい人が正確に反論できるだけの方法を書いてある。
設計はこうだ。実物の書類8枚(日本語の納品書数枚、商品名と数量・単価が2行に分かれるスーパーのレシート、モニターを撮影した22行の卸売相場表、報酬明細書)、採点可能なフィールド463個。3つのアームすべてに同じ画像、同じフィールドスキーマ、同じ「印字どおりに抽出」の指示。space-ocr本番のフィールド抽出API、MistralのOCR+JSONスキーマ注釈(mistral-ocr-latest)、Mistralのビジョン LLM+構造化出力(mistral-medium)。アームごとに3回実行し、空白除去後の完全一致で採点、72回分の生出力をすべて保存。2026年8月。

結果から。space-ocrは463フィールドの91.1%を完全一致で読んだ(3回平均)。MistralのOCR注釈は70.0%、ビジョンLLMは73.5%。差が書式ノイズでないことを確かめるため、区切り記号や空白だけが違う不一致をすべて除いて内容の誤りだけ数えても、1回あたりspace-ocr約23件に対しMistralの2アームは119件と93件だった。
一般化する前に知っておくべきことがある。Mistralは文字をよく読む。このセットで最もきれいな書類、22行の印刷された相場表では141中139でうちと同点だった。差が開くのは書類が構造的に厄介になるときだ。商品名が上の行、数量と単価が下の行に印字されるレシートでMistralは1回あたり13中2.3にとどまった。合計ブロックを商品行に取り込み、2行を対にできなかった。乱雑な納品書では数量が規格の列に入った。文字はおおむね合っている。その文字が収まった表が違うのだ。
一貫性はそれ自体が発見だった。同一入力の3回で、うちの合計は16フィールド動いた。Mistral OCRは100フィールド動いた。1時間前に72中58を読んだ書類が次の実行で3になり、43行の表のすべての列が音もなく入れ替わっていた。いま支払った実行がどちらの類いだったのか、レスポンスのどこにも書いていない。

この画像こそが本当の論点で、どのスコア表にも出てこない。あの相場表でspace-ocrは138個の枠を返した。フィールドごとに1つ、読み取ったピクセルに結び付いて。Mistralは表全体に長方形1つを返した。レスポンスにフィールド単位の座標というものが存在しないからだ。どの書類でも。ブロックの輪郭が最高解像度になる。検証シグナルも一切ない。Mistralの値が間違うときは静かに間違い、見つける方法は全件の確認しかない。
space-ocrの値には枠、その枠の下の文字が値と一致するかを示すtext_verified、理由付きのneeds_reviewが付き、今回のリリースからはocr_confidenceのスコアと、ページ内で繰り返される値のためのlabelアンカーも付く。このベンチマークの正直な要約は、Mistralが読めない、ではない。きれいな印刷物なら読める。片方のAPIはどの答えを信じてよいか示し、もう片方は全部信じろと求める。それが要約だ。
検証の仕組み: 言語モデルは値とワードトークンのヒントだけを返し、座標は決して作らない。エンジンは返された値の一つひとつを、OCRパスが実際にページ上で検出したシンボルと文字単位で照合し、match_ratioとして採点する(0.85以上が確信マッチ)。さらに2つのエンジンを相互照合し、不一致は理由付きのneeds_reviewになる。枠はxmin/ymin/xmax/ymaxの0〜1000正規化。上の数字への公平性ノートを一つ: 正解データはうちのパイプラインの出力慣行で凍結されているため、うちを含むすべてのライブエンジンが境界分割の差で減点される。絶対値は下限として、相対比較を結論として読んでほしい。方法の全文と72回分の生出力は保存してある。
価格も、ベンチマーク記事らしく率直に。成功したスキャン1枚$0.05、失敗は自動返金、毎月最初の100枚はカード登録なしで無料。誰かのグラフを信じる前に、この記事のグラフも含めて、自分の書類5枚を両方のAPIに通してみてほしい。下の手順が、うちが使った手続きそのものだ。
- デモではなく痛い書類を選ぶ複数行レコード、繰り返す値、画面を撮った写真、密な表など、実際に苦労させられるページを5〜10枚。きれいなサンプルではベンダーの差は出ません。
- スキーマと指示を1つに固定するフィールド一覧を一度だけ書き、同じ名前と説明で全エンジンに同一送信します。値は印字どおりに要求してください。
- 正解データは先に手で書く何かを走らせる前にフィールドごとの期待値を書き写し、その後は編集しません。
- 各エンジンを最低3回走らせる1回の実行は不安定さを隠します。すべての実行を同じスクリプトで採点し、平均ではなくばらつきを見てください。
- 静かな誤りを別に数える間違った値ごとに、エンジンがフラグを付けたかを記録します。フラグ付きの誤答は一瞥のコストですが、シグナルのない誤答はその上に築いたプロセス全体のコストです。