
OpenAI の Decisions API に書類画像(英語)を見せて、OCR 結果の誤りを見つけさせてみた
こんにちは、けーまです。
VLM で書類から値を抽出するとき、VLM 自身に「この値は正しいか」を聞いても、誤読した値に高い確信度を返してしまうことがあります。
Cloudflare の Clef に書類画像(英語)を見せて、OCR 結果の誤りを見つけさせてみた | DevelopersIO では、Cloudflare の Clef に書類画像と抽出結果を渡して「この値は画像どおりか」を判定させ、仕込んだ誤り36件をすべて検出できました。
OpenAI の Decisions API(モデルは gpt-6-luna)でも、画像を入力として受け取って yes の確率を返す質問ができます。
そこで今回は、Clef の検証で使ったものと同じ英語の書類3枚・同じ質問を Decisions API に渡し、誤りの検出数や誤検知の傾向を Clef と比較してみました。
1. 検証の条件
データは Clef の検証と同じものを使いました。
英語の見積書・請求書・領収書(3枚・計91項目)を Claude Haiku 4.5 で抽出した結果に対して、3パターンの誤り(各12件・計36件)を注入しています。
-
桁の変更(12件):金額や日付の数字を1桁だけ変える(
$1,150.00→$1,160.00、09/18/2026→09/19/2026) -
似た文字への変更(12件):OCR で混同しやすい文字に差し替える(
0→O、1→l、m→rn) -
別の値への置き換え(12件):文脈として不自然ではない別の単語に置き換える(
SAMPLE MART→FRESH MARKET、Service→Hardware)
判定方法も Clef の検証と揃えています。
書類画像1枚と抽出結果を渡し、項目ごとに predicate(yes の確率を返す質問)で「この値は画像に印字されたとおりか」を問い合わせます。
確率 0.5 未満を「誤り」と判定し、比較対象は clef・clef-flash(2026年10月4日の実測値)としました。
Decisions API へのリクエストは次の形です(質問は1問だけ抜粋しています)。
コメントは説明用なので、実際に送る JSON には含めていません。
{
"model": "gpt-6-luna",
"input": [{
"role": "user",
"content": [
// 判断の前提(OCR システムが請求書画像を読み取り、キーと値を抽出した。画像と照合せよ)と抽出結果
{"type": "input_text", "text": "{\"task\": \"An OCR system read the attached invoice image and produced these key-value pairs. Verify them against the image.\", \"extracted\": {\"invoice_no\": \"INV-2026-0042\", ...}}"},
{"type": "input_image", "image_url": "data:image/png;base64,..."}
]
}],
"questions": [{
"type": "predicate", // yes/no の質問。yes の確率を返す
"name": "field__invoice_no",
// 抽出された invoice_no の値は、書類画像に印字された文字列と一字一句一致しているか
"instructions": "Is the extracted value of \"invoice_no\" (\"INV-2026-0042\") exactly what is printed in the document image, character for character?"
}]
}
Clef の noul は、Decisions API では predicate に相当します

検証に使った請求書
2. 結果
2.1 誤りを見つけられたか
各モデルは項目ごとに「値が画像どおりである確率」を返します。
この確率が 0.5 未満となった項目を「誤り」と判定し、次の2つの観点で件数を集計しました。
-
誤りの検出:注入した誤り36件のうち、正しく「誤り」と判定できた件数
-
誤検知:本来は正しい値なのに「誤り」と判定してしまった件数
| 条件 | 誤りの検出(36件中) | 誤検知(237件中) |
|---|---|---|
| Decisions API | 36 | 5 |
| clef | 36 | 0 |
| clef-flash | 36 | 3 |
Decisions API でも、注入した誤りを36件すべて検出できました。
一方で、正しい値を誤りと判定してしまった誤検知は5件あり、clef(0件)や clef-flash(3件)よりも多くなっています。
| 書類 | 版 | 項目 | 抽出した値(画像どおり正しい値) | Decisions API の確率 |
|---|---|---|---|---|
| 請求書 | 誤りなし | bill_to_attn |
Accounts Payable |
0.35 |
| 請求書 | B | bill_to_attn |
Accounts Payable |
0.07 |
| 見積書 | A | item4_category |
Software |
0.46 |
| 見積書 | A | tax_rate |
8% |
0.47 |
| 見積書 | A | note |
Prices are valid for 30 days from the quote date. |
0.36 |
請求書の bill_to_attn は、画像上では「Attn: Accounts Payable」と印字されています。
抽出値には「Attn:」を含めていなかったため、Decisions API は「一字一句一致しているか」という指示を厳密に解釈し、不一致と判定したようです。
注入した36件の一致確率は次のとおりです。
値が低いほど、モデルが「画像と一致していない」と強く判断していることを示します。
注入した誤り36件の一致の確率(クリックすると展開します)
| 書類 | 版 | 項目 | 正しい値 | 注入した値 | パターン | Decisions API | clef | clef-flash |
|---|---|---|---|---|---|---|---|---|
| 見積書 | A | item1_unit_price |
$1,150.00 |
$1,160.00 |
桁 | 0.00 | 0.02 | 0.02 |
| 見積書 | A | tax |
$431.12 |
$431.72 |
桁 | 0.00 | 0.23 | 0.05 |
| 見積書 | A | quote_no |
Q-2026-0187 |
Q-2026-O187 |
似た文字 | 0.05 | 0.06 | 0.10 |
| 見積書 | A | item3_amount |
$435.00 |
$435.0O |
似た文字 | 0.00 | 0.02 | 0.16 |
| 見積書 | A | item4_name |
Office suite license |
Project management tool |
置き換え | 0.00 | 0.02 | 0.02 |
| 見積書 | A | item6_category |
Service |
Hardware |
置き換え | 0.00 | 0.01 | 0.03 |
| 見積書 | B | date |
09/18/2026 |
09/19/2026 |
桁 | 0.00 | 0.02 | 0.03 |
| 見積書 | B | item3_qty |
3 |
5 |
桁 | 0.00 | 0.03 | 0.02 |
| 見積書 | B | total |
$5,820.12 |
$5,82O.12 |
似た文字 | 0.00 | 0.07 | 0.10 |
| 見積書 | B | item1_name |
Laptop computer |
Laptop cornputer |
似た文字 | 0.00 | 0.03 | 0.08 |
| 見積書 | B | item2_amount |
$840.00 |
$1,240.00 |
置き換え | 0.00 | 0.03 | 0.11 |
| 見積書 | B | note |
Prices are valid for 30 days from the quote date. |
Prices include free shipping. |
置き換え | 0.00 | 0.02 | 0.02 |
| 請求書 | A | invoice_no |
INV-2026-0042 |
INV-2026-0045 |
桁 | 0.00 | 0.02 | 0.02 |
| 請求書 | A | item2_qty |
5 |
6 |
桁 | 0.00 | 0.06 | 0.03 |
| 請求書 | A | vendor_address_line2 |
Columbus, OH 43004 |
Columbus, OH 43OO4 |
似た文字 | 0.01 | 0.05 | 0.04 |
| 請求書 | A | bill_to_address_line1 |
88 Innovation Way |
B8 Innovation Way |
似た文字 | 0.00 | 0.13 | 0.04 |
| 請求書 | A | bill_to_name |
Example Robotics Inc. |
Example Logistics LLC |
置き換え | 0.00 | 0.03 | 0.02 |
| 請求書 | A | payment_terms |
Net 30 |
Due on receipt |
置き換え | 0.00 | 0.02 | 0.02 |
| 請求書 | B | due_date |
10/15/2026 |
10/16/2026 |
桁 | 0.00 | 0.08 | 0.02 |
| 請求書 | B | amount_due |
$1,234.50 |
$1,284.50 |
桁 | 0.00 | 0.07 | 0.04 |
| 請求書 | B | po_number |
PO-7781 |
PO-778l |
似た文字 | 0.00 | 0.07 | 0.08 |
| 請求書 | B | vendor_email |
billing@sample-supply.example |
billing@sarnple-supply.example |
似た文字 | 0.00 | 0.03 | 0.03 |
| 請求書 | B | item3_description |
Pallet wrap film |
Bubble wrap roll |
置き換え | 0.00 | 0.03 | 0.02 |
| 請求書 | B | shipping |
$14.37 |
$0.00 |
置き換え | 0.00 | 0.02 | 0.02 |
| 領収書 | A | item2_price |
3.49 |
3.48 |
桁 | 0.00 | 0.11 | 0.02 |
| 領収書 | A | time |
14:32 |
14:52 |
桁 | 0.00 | 0.04 | 0.01 |
| 領収書 | A | receipt_no |
#0815 |
#O815 |
似た文字 | 0.08 | 0.07 | 0.13 |
| 領収書 | A | total |
28.94 |
2B.94 |
似た文字 | 0.00 | 0.04 | 0.01 |
| 領収書 | A | item4_name |
APPLES 2LB |
BANANAS 3LB |
置き換え | 0.00 | 0.03 | 0.01 |
| 領収書 | A | store_name |
SAMPLE MART |
FRESH MARKET |
置き換え | 0.00 | 0.02 | 0.01 |
| 領収書 | B | date |
09/21/2026 |
09/27/2026 |
桁 | 0.00 | 0.03 | 0.01 |
| 領収書 | B | item5_price |
11.99 |
17.99 |
桁 | 0.00 | 0.03 | 0.01 |
| 領収書 | B | store_address_line2 |
Portland, OR 97201 |
Portland, OR 972O1 |
似た文字 | 0.02 | 0.06 | 0.05 |
| 領収書 | B | payment_card |
VISA ****0000 |
VISA ****OOOO |
似た文字 | 0.02 | 0.09 | 0.12 |
| 領収書 | B | item1_name |
MILK 1GAL |
ORANGE JUICE |
置き換え | 0.00 | 0.02 | 0.01 |
| 領収書 | B | subtotal |
28.94 |
31.50 |
置き換え | 0.00 | 0.03 | 0.01 |
2.2 確率の分かれ方
誤りの項目(36件)と正しい項目(237件)に出力された確率のばらつきは次のとおりです。
下位5%と上位5%は、確率を昇順に並べたときの下から5%と95%にあたる値です。
| 条件 | 対象 | 最小 | 下位5% | 中央値 | 上位5% | 最大 |
|---|---|---|---|---|---|---|
| Decisions API | 誤り | 0.0 | 0.0 | 0.0 | 0.028 | 0.08 |
| Decisions API | 正しい値 | 0.07 | 0.718 | 1.0 | 1.0 | 1.0 |
| clef | 誤り | 0.012 | 0.016 | 0.030 | 0.112 | 0.227 |
| clef | 正しい値 | 0.622 | 0.769 | 0.914 | 0.974 | 0.983 |
| clef-flash | 誤り | 0.009 | 0.012 | 0.023 | 0.122 | 0.162 |
| clef-flash | 正しい値 | 0.166 | 0.645 | 0.940 | 0.973 | 0.981 |
1項目を1点として、モデルごとに並べると次のようになります。
なお、次の3つのグラフは、検証結果のデータをもとに Claude に作成してもらったものです。

Decisions API:誤りは 0.0 付近、正しい値は 1.0 付近に固まる

clef:誤りは 0.0〜0.2 台、正しい値は 0.6〜0.9 台に散らばる

clef-flash:clef に近い分かれ方だが、正しい値の一部が 0.5 を下回る
Decisions API の出力した確率はかなり両極端に寄っていました。
誤りの36件中31件はちょうど 0.0、正しい値の237件中123件はちょうど 1.0 になっており、Clef のように 0.9 台や 0.0 台へ緩やかに散らばる形にはなりませんでした。
ただその一方で、正しい値の下位5%は 0.718 と、Clef と同程度に低い値も一部出ています。
しきい値を変更した際の結果は次のとおりです。
| しきい値 | Decisions API:検出 | Decisions API:誤検知 | clef:検出 | clef:誤検知 | clef-flash:検出 | clef-flash:誤検知 |
|---|---|---|---|---|---|---|
| 0.1 | 36/36 | 1/237 | 33/36 | 0/237 | 31/36 | 0/237 |
| 0.3 | 36/36 | 1/237 | 36/36 | 0/237 | 36/36 | 2/237 |
| 0.5 | 36/36 | 5/237 | 36/36 | 0/237 | 36/36 | 3/237 |
| 0.7 | 36/36 | 10/237 | 36/36 | 5/237 | 36/36 | 18/237 |
| 0.8 | 36/36 | 16/237 | 36/36 | 23/237 | 36/36 | 50/237 |
Decisions API は誤りの確率がすべて 0.08 以下に収まっていたため、しきい値を 0.1 まで下げても36件すべてを検出できました。
2.3 時間と費用
リクエストは書類1枚につき1回行い、画像1枚とその書類に含まれる全項目の質問(21〜38問)をまとめて送信しています。
所要時間は日本国内から REST API を呼び出した際の実測値で、費用は1ドル150円換算です。
| 条件 | 1回あたりの時間(中央値) | 9回の合計時間 | 1回あたりの入力トークン | 9回の費用合計 |
|---|---|---|---|---|
| Decisions API | 0.638秒(638ms) | 7.02秒 | 約10,160 | $0.0078(約1.16円) |
| clef | 1.737秒(1,737ms) | 14.46秒 | 約5,280 | $0.0103(約1.55円) |
| clef-flash | 0.953秒(953ms) | 8.69秒 | 約5,280 | $0.0039(約0.58円) |
Decisions API は検証した3モデルの中で最もレスポンスが速く、clef の約3分の1の時間で処理が終わりました。
入力トークン数は Clef と同内容でも約1.9倍に増えたものの、トークン単価が clef($0.24)より安いため、総費用としては clef の約4分の3に収まっています。
3. まとめ
Decisions API は英語の書類画像をそのまま読み込ませて、OCR の抽出結果が正しいかどうかをチェックすることはできそうです。
ただ、出力される確率が 0.0 付近と 1.0 付近に極端に張り付く傾向がある点は、運用上少し気になるところです。











