🎬 取引文書を 爆速分類→テキスト抽出
書類の画像をまとめてアップロードして分類から項目の抽出まで流れる様子です。シュバババーっと仕分けして内容を抽出してくれています。この記事では検証内容や結果について記載していきます。
👀 対象読者
- Cloudflareの"Clef"・"Clairic"がどんなもんか知りたい方
- 判断/抽出特化モデル(System Oneモデル)に興味がある人
🧐 はじめに
Cloudflareから"抽出特化"のclairicが出ました。今まで話題になっていた"判断特化"と今回出た"抽出特化"の2つのモデルを使って「書類を仕分けて中身まで爆速で抜き出す」という検証をやってみました。
🖋️ 判断特化モデル(clef)
ChatGPTのようなLLMは質問されると文章で答えを組み立てます。判断特化モデルは文章を書きません。「これは請求書?レシート?」と聞かれたら「請求書 97%」と即答するだけです。作文しないので速くて安いのです。そのかわり説明や雑談はできません。Jevが有名ですが今回はclefを使用しました。
🔎 抽出特化(clairic)
テキストまたは画像から決めた項目の値だけを抜き出すことに特化したモデルです。
書類の画像と一緒に「店名:文字列、合計:数値、日付:日付」のように欲しい項目と型を渡すと、項目ごとに値とその確からしさ(confidence)が返ってきます。
生成AIのように文章を組み立てず決まった形で値だけを返すので、そのぶん応答が速いのも特徴です。
🧭 全体構成
ファイルをアップロードしてClefで種類を分けてClairicで書類に応じた項目を抜き出します。迷ったものは人間で補正します。
🔍 Clefで書類を仕分ける
Clefにはchoice型の質問を1つ投げます。選択肢ごとに説明(criteria)を書いておくと、確率が返ってきます。判断特化モデルのJev(TypeSafe AI)と一緒ですね。
Clefを呼ぶコード
const DOC_TYPES = {
invoice: '請求書。発行元が取引先に代金の支払いを求める書類。請求書番号・支払期限・振込先などがある',
receipt: 'レシート・領収書。店頭などで支払い済みの代金を証明する書類',
estimate: '見積書。取引前に金額の見込みを提示する書類。有効期限がある',
delivery_note: '納品書。納品した品目と数量を記載した書類。請求書と違い、請求金額・支払期限・振込先は書かれないことが多い',
other: '上記のいずれでもない書類',
};
const url = `https://api.cloudflare.com/client/v4/accounts/${ACCOUNT_ID}/ai/run/@cf/cloudflare/clef-flash`;
const resp = await fetch(url, {
method: 'POST',
headers: { Authorization: `Bearer ${TOKEN}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
model: 'clef-flash',
state: '',
questions: {
doc_type: {
type: 'choice',
instructions: 'この業務書類の種別はどれか。',
criteria: DOC_TYPES,
},
},
images: [`data:image/png;base64,${base64}`],
}),
});
const { result } = await resp.json();
// result.answers.doc_type
// => { choice: "receipt", probabilities: { invoice: 0.0113, receipt: 0.9743, ... }, confidence: 0.9325 }
いちばん高い確率が0.8未満なら「その他」扱いにして人に種類を選んでもらうようにしました。
⛏️ Clairicで項目を抜き出す
Clairicには抜き出したい項目をfieldsに並べて投げます。金額はunit: "JPY"とdecimals: 0を付けました。
Clairicを呼ぶコード
const JPY = { type: 'number', decimals: 0, unit: 'JPY' };
const url = `https://api.cloudflare.com/client/v4/accounts/${ACCOUNT_ID}/ai/run/@cf/cloudflare/clairic`;
const resp = await fetch(url, {
method: 'POST',
headers: { Authorization: `Bearer ${TOKEN}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
model: '@cf/cloudflare/clairic',
state: '',
fields: {
issuer: { type: 'text', instructions: '請求元(請求書を発行した会社)' },
invoice_number: { type: 'text', instructions: '請求書番号' },
issued_on: { type: 'date', instructions: '請求日' },
due_on: { type: 'date', instructions: '支払期限' },
subtotal: { ...JPY, instructions: '小計' },
tax: { ...JPY, instructions: '消費税額' },
total: { ...JPY, instructions: '合計金額(税込)' },
bank_name: { type: 'text', instructions: '振込先の銀行名' },
},
images: [`data:image/png;base64,${base64}`],
}),
});
const { result } = await resp.json();
// result.answers.issuer.value
項目ごとに値と確からしさ(confidence)、書類に書かれていない確率(p_null)が返ってきます。下はレシートで試したときの例で、正解の「やまちゃん商店 渋谷店」が化けた値に confidence 0.78 が付いていました。
{
"store_name": {
"value": "やちゃんちゃん商店 谷店",
"confidence": 0.7814,
"p_null": 0.00005,
"source": "image",
"span": null
}
}
📊 検証結果
検証に使った17枚はChatGPTの画像生成で作った架空の書類で、実物のスキャンや写真ではありません。
| 観点 | 結果 |
|---|---|
| 速度 | 1件なら約1.5秒、17枚同時で全体5.2秒 |
| コスト(分類 Clef) | 1,000枚あたり約0.05ドル(実測は17枚で約0.0008ドル) |
| コスト(抽出 Clairic) | 1,000枚あたり約0.74ドル(実測は17枚で約0.0126ドル) |
| 分類の精度 | 17/17 |
| 抽出の精度 | ヘッダ100項目中62(金額36/37、日付17/24、番号7/9、文字2/30) |
数字・日付・英数字はしっかり読めるのに日本語の文字になると急に怪しくなります。店名や会社名は字が抜けたり重なったりして解像度を上げても直りませんでした。一方で分類はしっかり判断できていました。指定の分類ができ、分類にないものは確信度がちゃんと低く出ていました。
📝 画像ではなくテキストで渡すと読める
日本語が化けるのは「画像から文字を読む」ところで「項目を抜き出す」力は足りているのでは?と思い、請求書を1枚だけ手で書き起こしてテキストで渡してみました。
| 画像で渡す | テキストで渡す | |
|---|---|---|
| ヘッダの正解数 | 6/8 | 8/8 |
| 請求元 | ねここシステム ❌ | 株式会社ねころびシステム ✅ |
| 振込先銀行名 | ひだ銀行銀行 ❌ | ひだまり銀行 ✅ |
| コスト(ヘッダ) | 63.7 neuron | 22.5 neuron(約1/3) |
化けていた2項目がどちらも正しく取れてコストも約3分の1になりました。苦手なのは画像から日本語を読む部分でテキストさえ正確なら抜き出しはちゃんとできるということです。
⏱️ 処理時間
1件だけなら判断と抽出あわせて約1.5秒、そのうち通信はそれぞれ0.1秒ほどです。17枚を同時に投げると画像の送信が重なり処理も混むので1枚ごとの所要時間は3.8秒まで延びました。それでも全体は17倍にはならず5.2秒、1枚あたりに直すと約0.3秒です。
タイトルの「1枚0.3秒」は1リクエストのレスポンスタイムではなく、17枚を同時に投げたときの全体の時間(5.2秒)を枚数で割った数値です![]()
※タイトル詐欺っぽくてすみません
💡 他にもこんな使い方ができそう
名刺の取り込み
Clefで名刺かどうかを判断してClairicで氏名・会社名・役職・電話番号を抜き出す
メール情報のDB登録
Clefで「請求」「障害」「解約」「その他」に振り分けて、Clairicで契約番号・発生日時・製品名等の主要項目をDB化してシステム連携に繋げる
Text To API
自然言語テキストからClefでどのAPIを呼ぶかを判断し、ClairicでそのAPIに必要なパラメータを型どおりに抜き出してAPI Callします。
いづれもAI OCRやAIエージェントを使えば実現可能ですが、判断特化モデルで爆速、低コストで実現するというところがポイントです。
尚、上記はあくまで想像です。実際に使えるかは検証が必要となります。
🍜 締め
判断も抽出もとにかく爆速で返ってきました。これまで書類の読み取りは「アップロードしたら後で結果を見に来てね」という非同期の作りが一般的でしたがこの速さなら同期処理でユーザーも待てるレベルです。
しかし課題はやはり精度でした。日本語の精度が特に悪かったです。また、ビジネス文書はミスが許されない領域のためかなりの精度が求められます。現状では安心して任せられないため実運用での採用は難しそうな印象でした。
2026年10月時点でまだプレビュー版ということで今後の日本語読み取り精度向上に期待したいです。




