Cloudflare の Clef に書類画像(英語)を見せて、OCR 結果の誤りを見つけさせてみた
こんにちは、けーまです。
書類からの OCR 処理では、 AWS であれば Amazon SageMaker で OCR モデルをホストして文字を抜き出し、文字認識の確信度スコアを使いつつ後段の LLM でキーと値を構造化するようなアプローチがあります。
しかし、SageMaker でモデルを常時ホストし続けると料金がかさみやすく、複数のサービスを組み合わせるため構成も重くなりがちです。
最近は VLM 自体の文字認識精度が向上してきたため、VLM 単体で抽出まで完結させる構成も実用的になってきました。
ただ、LLM が出力する確信度は自己申告になりやすく、誤読した値に対しても高いスコアを出してしまうことがあるなど、判定の根拠として信頼しきれない弱点があります。
かといって、検証のためだけにもう1つ別の LLM を呼び出すと、さらにコストがかかってしまいます。
2026年10月1日に Cloudflare Workers AI で公開された Clef は、画像入力に対応した decision model で、質問に対して直接確率を返してくれます。
軽量かつ低コストで動かせるため、抽出結果を独立してチェックする役目に適しているのではないかと考えました。
そこで本記事では、書類画像と抽出結果を Clef に渡し、「この値は画像どおりか」を判定させて OCR 結果の誤りを見つけられるかを検証してみました。
1. 検証の条件
まずは Claude Haiku 4.5 に英語の見積書・請求書・領収書(3枚・計91項目)を抽出させ、自然に発生した誤りを検出しようと試みました。
しかし、Haiku が思った以上に優秀ですべての項目を正しく抽出してしまったため、今回は検証用に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など)
判定と検証の条件は次のとおりです。
-
判定方法:書類画像1枚と抽出結果を渡し、項目ごとに
noul(yes の確率を返す質問)で「この値は画像に印字されたとおりか」を聞く。確率 0.5 未満を「誤り」と判定 -
モデル:
clef(27B)とclef-flash(9B)
{
"model": "clef",
"images": ["data:image/png;base64,..."],
// state: 判断の前提(OCR システムが請求書画像を読み取り、キーと値を抽出した)
"state": {
"task": "An OCR system read the attached invoice image ...",
"extracted": { "invoice_no": "INV-2026-0042" }
},
"questions": {
"field.invoice_no": {
"type": "noul", // yes/no の質問。yes の確率を返す
// instructions: 判定の指示(抽出された invoice_no の値は、書類画像に印字された文字列と一文字一句違わず完全に一致しているか?)
"instructions": "Is the extracted value of \"invoice_no\" (\"INV-2026-0042\") exactly what is printed in the document image, character for character?"
}
}
}

検証に使った請求書
2. 結果
2.1 誤りを見つけられたか
Clef は項目ごとに「値が画像どおりである確率」を返します。
この確率が 0.5 未満の項目を「誤り」と判定し、次の2つの観点で件数を集計しました。
-
誤りの検出:注入した誤り36件のうち、正しく「誤り」と判定できた件数
-
正しい値を誤りと判定:本来は正しい値なのに「誤り」と判定してしまった件数(誤検知)。
| 条件 | 誤りの検出(36件中) | 正しい値を誤りと判定(237件中) |
|---|---|---|
| clef | 36 | 0 |
| clef-flash | 36 | 3 |
clef は、注入した誤りを全件検出し、誤検知も 0 件でした。
一方、clef-flash は本来正しい値であるはずの項目を「誤り(確率 0.5 未満)」と誤判定してしまう誤検知が 3 件ありました。該当したのは次の項目で、いずれも合計金額など金額に関する項目でした。
| 書類 | 項目 | 実際に入力した値(画像どおり正しい値) | clef-flash が判定した確率 |
|---|---|---|---|
| 見積書 | 合計金額(Total) | $5,820.12 |
0.17 〜 0.19 |
| 領収書 | 明細1の価格 | 4.29 |
0.34 |
※ 見積書の Total は2回の試行でそれぞれ誤検知されたため件数としては計3件ですが、対象の項目自体は上記の2種類です。
注入した36件すべての一致の確率は次のとおりです。
この値は「抽出した値が画像どおり正しい確率」を表しているため、数値が低ければ低いほどモデルが「画像と一致していない(誤りである)」と強く疑っていることを意味します。
注入した誤り36件の一致の確率(クリックすると展開します)
| 書類 | 版 | 項目 | 正しい値 | 注入した値 | パターン | clef | clef-flash |
|---|---|---|---|---|---|---|---|
| 見積書 | A | item1_unit_price |
$1,150.00 |
$1,160.00 |
桁 | 0.02 | 0.02 |
| 見積書 | A | tax |
$431.12 |
$431.72 |
桁 | 0.23 | 0.05 |
| 見積書 | A | quote_no |
Q-2026-0187 |
Q-2026-O187 |
似た文字 | 0.06 | 0.10 |
| 見積書 | A | item3_amount |
$435.00 |
$435.0O |
似た文字 | 0.02 | 0.16 |
| 見積書 | A | item4_name |
Office suite license |
Project management tool |
置き換え | 0.02 | 0.02 |
| 見積書 | A | item6_category |
Service |
Hardware |
置き換え | 0.01 | 0.03 |
| 見積書 | B | date |
09/18/2026 |
09/19/2026 |
桁 | 0.02 | 0.03 |
| 見積書 | B | item3_qty |
3 |
5 |
桁 | 0.03 | 0.02 |
| 見積書 | B | total |
$5,820.12 |
$5,82O.12 |
似た文字 | 0.07 | 0.10 |
| 見積書 | B | item1_name |
Laptop computer |
Laptop cornputer |
似た文字 | 0.03 | 0.08 |
| 見積書 | B | item2_amount |
$840.00 |
$1,240.00 |
置き換え | 0.03 | 0.11 |
| 見積書 | B | note |
Prices are valid for 30 days from the quote date. |
Prices include free shipping. |
置き換え | 0.02 | 0.02 |
| 請求書 | A | invoice_no |
INV-2026-0042 |
INV-2026-0045 |
桁 | 0.02 | 0.02 |
| 請求書 | A | item2_qty |
5 |
6 |
桁 | 0.06 | 0.03 |
| 請求書 | A | vendor_address_line2 |
Columbus, OH 43004 |
Columbus, OH 43OO4 |
似た文字 | 0.05 | 0.04 |
| 請求書 | A | bill_to_address_line1 |
88 Innovation Way |
B8 Innovation Way |
似た文字 | 0.13 | 0.04 |
| 請求書 | A | bill_to_name |
Example Robotics Inc. |
Example Logistics LLC |
置き換え | 0.03 | 0.02 |
| 請求書 | A | payment_terms |
Net 30 |
Due on receipt |
置き換え | 0.02 | 0.02 |
| 請求書 | B | due_date |
10/15/2026 |
10/16/2026 |
桁 | 0.08 | 0.02 |
| 請求書 | B | amount_due |
$1,234.50 |
$1,284.50 |
桁 | 0.07 | 0.04 |
| 請求書 | B | po_number |
PO-7781 |
PO-778l |
似た文字 | 0.07 | 0.08 |
| 請求書 | B | vendor_email |
billing@sample-supply.example |
billing@sarnple-supply.example |
似た文字 | 0.03 | 0.03 |
| 請求書 | B | item3_description |
Pallet wrap film |
Bubble wrap roll |
置き換え | 0.03 | 0.02 |
| 請求書 | B | shipping |
$14.37 |
$0.00 |
置き換え | 0.02 | 0.02 |
| 領収書 | A | item2_price |
3.49 |
3.48 |
桁 | 0.11 | 0.02 |
| 領収書 | A | time |
14:32 |
14:52 |
桁 | 0.04 | 0.01 |
| 領収書 | A | receipt_no |
#0815 |
#O815 |
似た文字 | 0.07 | 0.13 |
| 領収書 | A | total |
28.94 |
2B.94 |
似た文字 | 0.04 | 0.01 |
| 領収書 | A | item4_name |
APPLES 2LB |
BANANAS 3LB |
置き換え | 0.03 | 0.01 |
| 領収書 | A | store_name |
SAMPLE MART |
FRESH MARKET |
置き換え | 0.02 | 0.01 |
| 領収書 | B | date |
09/21/2026 |
09/27/2026 |
桁 | 0.03 | 0.01 |
| 領収書 | B | item5_price |
11.99 |
17.99 |
桁 | 0.03 | 0.01 |
| 領収書 | B | store_address_line2 |
Portland, OR 97201 |
Portland, OR 972O1 |
似た文字 | 0.06 | 0.05 |
| 領収書 | B | payment_card |
VISA ****0000 |
VISA ****OOOO |
似た文字 | 0.09 | 0.12 |
| 領収書 | B | item1_name |
MILK 1GAL |
ORANGE JUICE |
置き換え | 0.02 | 0.01 |
| 領収書 | B | subtotal |
28.94 |
31.50 |
置き換え | 0.03 | 0.01 |
2.2 確率の分かれ方
しきい値をどこに設定すればよいかを見るため、誤りの項目(36件)と正しい項目(237件)に付いた「値が画像どおりである確率」のばらつきをまとめました。
下位5%と上位5%は、確率を低い順に並べたときに、下から5%と95%の位置にある値です。
| 条件 | 対象 | 最小 | 下位5% | 中央値 | 上位5% | 最大 |
|---|---|---|---|---|---|---|
| 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 |
正しい項目については、どちらのモデルも中央値が0.9台(clef: 0.914、clef-flash: 0.940)と高い確率を出しています。
下位5%を見ると clef は 0.769、clef-flash は 0.645 とやや低めに出る項目もありました。
しきい値を変えたときの結果は次のとおりです。
| しきい値 | clef:誤りの検出 | clef:誤検知 | clef-flash:誤りの検出 | clef-flash:誤検知 |
|---|---|---|---|---|
| 0.5 | 36/36 | 0/237 | 36/36 | 3/237 |
| 0.6 | 36/36 | 0/237 | 36/36 | 8/237 |
| 0.7 | 36/36 | 5/237 | 36/36 | 18/237 |
| 0.8 | 36/36 | 23/237 | 36/36 | 50/237 |
どのしきい値でも、注入した誤りは両モデルとも36件すべて拾えました。
違いが出たのは誤検知の数で、しきい値を上げるほど、正しい値まで人の確認に回ってしまう件数が増えます。
clef は 0.5〜0.6 なら誤検知が 0 件でしたが、0.8 にすると正しい値の約1割(23件)が人の確認に回ります。
clef-flash は 0.5 でも誤検知が3件あり、0.8 では約2割(50件)にのぼるため、確認の手間を抑えたいなら clef が向いています。
ただし、誤りのデータは36件と少ないため、実際の運用では扱う書類で同様に集計を取り、しきい値を決めることをおすすめします。
2.3 時間と費用
Clef へのリクエストは、書類1枚につき1回です。
1回のリクエストで、画像1枚と、その書類の全項目に関する質問(21〜38問)をまとめて送っています。
| 条件 | 1回あたりの時間(中央値) | 9回の合計時間 | 9回の費用合計 |
|---|---|---|---|
| clef | 1.737秒(1,737ms) | 14.46秒 | $0.0103(約1.55円) |
| clef-flash | 0.953秒(953ms) | 8.69秒 | $0.0039(約0.58円) |
時間は日本国内から REST API を呼び出した際の実測値で、費用は1ドル150円で換算しています。
Haiku による抽出には1枚あたり10〜13秒ほどかかるため、このチェック処理を追加しても全体の処理時間はほぼ変わりません。
3. まとめ
英語の書類3枚で試した限りでは、画像を渡した clef は注入した誤りをすべて検出し、誤検知もありませんでした。
ただし、今回の誤りは人工的に注入したもので、Haiku 自身が起こす読み間違いに対する性能までは確かめていません。
書類の抽出チェックに組み込むなら、VLM で抽出した結果の正しさをその VLM 自身に自己申告させるのではなく、Clef のような軽量な decision model に画像付きで渡してダブルチェックさせる構成が有効です。









