
【TypeSafe】Jev で OCR 済みの書類をページごとに種別判定できるか試してみた
こんにちは、けーまです。
Jev で書類を扱うなら、先に OCR で文字を取り出してから渡す必要があります。
そこで今回は、OCR が終わっている前提で、そのテキストを Jev に渡して書類種別を判定させてみました。
貿易書類は、I/V や P/L が1本の PDF にまとめてスキャンされて届くことがよくあります。
途中に空白ページが挟まっていたり、「INVOICE」のようなタイトルが書かれていないページが混ざっていたりもします。
こうした PDF を1ページずつ Jev に渡して、何の書類かを判定できるかを検証しました。
あわせて比較対象として、同じ入力を Amazon Bedrock の Claude Sonnet 4.6 にも渡しています。
先に結論をお伝えすると、1ページ単体で渡した場合は20ページ中19ページ正解、直前のページも一緒に渡すと20ページすべて正解になりました。
種別の見分け方を State に書いても正答数は変わらず、OCR の座標情報も必要ありませんでした。
また、Jev が誤判定したページはどれも確率が低く出ていたので、確率が低いページだけを人が確認する運用と組み合わせると、実用的なチェックフローが作れそうです。
1. 試したこと
1.1 検証の条件
| 項目 | 内容 |
|---|---|
| Jev | jev-latest(実行時は jev-1.13.0 に解決) |
| 比較対象 | Amazon Bedrock の Claude Sonnet 4.6(global.anthropic.claude-sonnet-4-6、東京リージョンから Converse API で呼び出し) |
| 入力 | OCR 済みを想定したテキスト。PDF 5本、合計20ページ |
| 呼び出し方 | 1ページにつき1リクエスト。各条件で1回ずつ実行 |
| 実行環境 | macOS、Python 3.12、boto3 1.43.96(Sonnet 4.6 のみ使用) |
| 実行日 | 2026年9月21日 |
Jev と Sonnet 4.6 のそれぞれで、次の2要素を組み合わせた4条件を実行しました。
-
直前のページ:渡さない / 一緒に渡す
-
種別の見分け方(規則):State に書かない / 書く
Jev は英語の精度が一番高いため、質問文と規則は英語で書いています。
1.2 入力データ
PDF や画像ファイルは作らず、OCR の結果にあたるデータを直接用意しました。
元のデータは Amazon Textract の LINE ブロックと同じ形式で、読み取った行ごとに文字列(Text)、ページ番号(Page)、ページ上の位置(Geometry.BoundingBox)を持たせています。
モデルに渡すのは、このうち各行の文字列だけです。
なお、座標を渡した場合の検証結果は 2.6 にまとめました。
社名・番号・品目はすべて架空のものです。
実務のスキャン書類では、書類名がそのまま書かれていなかったり、OCR の読み取りミスが発生したりすることが珍しくありません。
そのため今回は、タイトルが明記された標準的なページだけでなく、次のような実務でつまずきやすい難所を意図的に混ぜてデータを作成しました。
-
タイトルが書かれていない書類(列や項目で見分ける必要があるもの)
-
2ページ目以降の続きページ(ヘッダーがなく、明細と合計の数値だけが並ぶもの)
-
送付状や完全な空白ページ
-
OCR の誤読(「COMMERCIAL INVOICE」が「C0MMERC1AL INV0ICE」と読まれるなど)
-
スタンプ、手書きメモ、ゴミ文字などのノイズ混入
用意した PDF は次の5本です。
| ページ | 内容 | |
|---|---|---|
pdf-1 |
p.1 | インボイス(タイトルあり) |
| p.2 | インボイスの続きページ(ヘッダーなし、明細の続きと合計のみ) | |
pdf-2 |
p.1 | インボイス |
| p.2 | パッキングリスト | |
| p.3 | パッキングリストの続きページ(明細の続きと合計のみ) | |
| p.4 | B/L | |
| p.5 | 原産地証明書 | |
| p.6 | 保険証券 | |
pdf-3 |
p.1 | FAX 送付状 |
| p.2 | インボイス | |
| p.3 | 完全な空白ページ(行なし) | |
| p.4 | パッキングリスト | |
pdf-4 |
p.1 | インボイス(タイトルなし) |
| p.2 | パッキングリスト(別名「WEIGHT AND MEASUREMENT LIST」) | |
| p.3 | B/L(タイトルなし) | |
| p.4 | 原産地証明書(タイトルなし) | |
pdf-5 |
p.1 | インボイス(タイトル誤読「C0MMERC1AL INV0ICE」、スタンプ混入) |
| p.2 | ほぼ空白(ゴミ文字4つのみ) | |
| p.3 | パッキングリスト(タイトル誤読「PACK1NG L1ST」、手書きメモ混入) | |
| p.4 | パッキングリストの続きページ(ノイズ混入) |
20ページすべての中身は、次の折り畳みに載せています。
モデルに渡した各行の文字列を、上から順に並べたものです。
pdf-1 の全ページ(クリックすると展開します)
p.1:Invoice 1ページ目(タイトルあり)(正解は invoice)
COMMERCIAL INVOICE
SAMPLE EXPORT CO., LTD.
No. INV-2026-0901
1-2-3 EXAMPLE-CHO, YOKOHAMA, JAPAN
Date: SEP. 01, 2026
Sold to:
Payment: T/T 30 DAYS
EXAMPLE IMPORTS PTE. LTD.
Terms: CIF SINGAPORE
45 SAMPLE ROAD, SINGAPORE 000000
From: YOKOHAMA, JAPAN
To: SINGAPORE
Per: MV SAMPLE STAR V.012
Description
Quantity
Unit Price
Amount
CERAMIC DINNER PLATE 27CM WHITE
1,200 PCS
USD 3.20
USD 3,840.00
CERAMIC SOUP BOWL 15CM WHITE
1,500 PCS
USD 2.10
USD 3,150.00
CERAMIC MUG 350ML BLUE
2,000 PCS
USD 1.80
USD 3,600.00
Continued on next page
p.2:Invoice 2ページ目(明細の続きと合計だけ)(正解は invoice)
STAINLESS BOTTLE 500ML SILVER
800 PCS
USD 6.50
USD 5,200.00
STAINLESS BOTTLE 750ML BLACK
600 PCS
USD 7.90
USD 4,740.00
TOTAL
USD 20,530.00
SAY US DOLLARS TWENTY THOUSAND FIVE HUNDRED THIRTY ONLY
SAMPLE EXPORT CO., LTD.
Authorized Signature
pdf-2 の全ページ(クリックすると展開します)
p.1:Invoice(タイトルあり、1ページ完結)(正解は invoice)
COMMERCIAL INVOICE
SAMPLE EXPORT CO., LTD.
No. INV-2026-0902
1-2-3 EXAMPLE-CHO, YOKOHAMA, JAPAN
Date: SEP. 01, 2026
Sold to:
Payment: T/T 30 DAYS
EXAMPLE IMPORTS PTE. LTD.
Terms: CIF SINGAPORE
45 SAMPLE ROAD, SINGAPORE 000000
From: YOKOHAMA, JAPAN
To: SINGAPORE
Per: MV SAMPLE STAR V.012
Description
Quantity
Unit Price
Amount
BAMBOO CUTTING BOARD 30X20CM
900 PCS
USD 4.40
USD 3,960.00
BAMBOO SERVING TRAY 40X28CM
400 PCS
USD 8.25
USD 3,300.00
COTTON KITCHEN TOWEL 3-PACK
1,000 SETS
USD 2.75
USD 2,750.00
TOTAL
USD 10,010.00
SAMPLE EXPORT CO., LTD.
Authorized Signature
p.2:Packing List 1ページ目(タイトルあり)(正解は packing_list)
PACKING LIST
SAMPLE EXPORT CO., LTD.
Ref. No. INV-2026-0901
1-2-3 EXAMPLE-CHO, YOKOHAMA, JAPAN
Date: SEP. 01, 2026
Consigned to:
EXAMPLE IMPORTS PTE. LTD.
45 SAMPLE ROAD, SINGAPORE 000000
From: YOKOHAMA, JAPAN
To: SINGAPORE
Per: MV SAMPLE STAR V.012
Marks: EXAMPLE / SINGAPORE / C/NO. 1-UP / MADE IN JAPAN
Case No.
Description
Quantity
N.W. (KG)
G.W. (KG)
M3
1-10
CERAMIC DINNER PLATE 27CM WHITE
1,200 PCS
840.0
910.0
2.40
11-20
CERAMIC SOUP BOWL 15CM WHITE
1,500 PCS
600.0
660.0
2.10
21-30
CERAMIC MUG 350ML BLUE
2,000 PCS
640.0
700.0
2.60
Continued on next page
p.3:Packing List 2ページ目(明細の続きと合計だけ)(正解は packing_list)
31-38
STAINLESS BOTTLE 500ML SILVER
800 PCS
240.0
288.0
1.92
39-44
STAINLESS BOTTLE 750ML BLACK
600 PCS
228.0
270.0
1.68
TOTAL: 44 CARTONS
6,100 PCS
2,548.0
2,828.0
10.70
SAMPLE EXPORT CO., LTD.
Authorized Signature
p.4:B/L(タイトルあり)(正解は bill_of_lading)
Shipper
BILL OF LADING
SAMPLE EXPORT CO., LTD.
1-2-3 EXAMPLE-CHO, YOKOHAMA, JAPAN
No. SMPL-YOK-260901
Consignee
TO ORDER OF EXAMPLE BANK LTD.
Notify Party
EXAMPLE IMPORTS PTE. LTD.
45 SAMPLE ROAD, SINGAPORE 000000
Ocean Vessel / Voy. No.
Port of Loading
Port of Discharge
MV SAMPLE STAR V.012
YOKOHAMA, JAPAN
SINGAPORE
Container No. / Seal No.
No. of Pkgs
Description of Goods
Gross Weight
SMPU 123456-7 / 00112233
44 CARTONS
CERAMIC TABLEWARE AND
2,828.0 KGS
STAINLESS BOTTLES
SHIPPER'S LOAD, COUNT AND SEAL
FREIGHT PREPAID
SHIPPED ON BOARD
Date: SEP. 05, 2026
Number of Original B(s)/L: THREE (3)
RECEIVED by the Carrier the goods in apparent good order and
condition. One original must be surrendered duly endorsed in
exchange for the goods.
SAMPLE OCEAN LINE CO., LTD. AS CARRIER
p.5:原産地証明書(タイトルあり)(正解は certificate_of_origin)
CERTIFICATE OF ORIGIN
1. Exporter (Name, address, country)
Reference No. CO-2026-004512
SAMPLE EXPORT CO., LTD.
1-2-3 EXAMPLE-CHO, YOKOHAMA, JAPAN
2. Importer (Name, address, country)
EXAMPLE IMPORTS PTE. LTD.
45 SAMPLE ROAD, SINGAPORE 000000
3. Transport details
FROM YOKOHAMA TO SINGAPORE BY SEA, ON OR ABOUT SEP. 05, 2026
4. Marks, numbers, number and kind of packages; description of goods
44 CARTONS OF CERAMIC TABLEWARE AND STAINLESS BOTTLES
HS CODE 6911.10 / 7323.93
5. Country of origin
JAPAN
6. Declaration by the exporter
7. Certification
The undersigned declares that the above details are correct and
It is hereby certified that the declaration by the exporter
that all the goods were produced in JAPAN.
is correct.
EXAMPLE CHAMBER OF COMMERCE AND INDUSTRY
YOKOHAMA, SEP. 03, 2026
p.6:保険証券(タイトルあり)(正解は insurance_policy)
MARINE CARGO INSURANCE POLICY
Assured
No. MC-26-0098431
SAMPLE EXPORT CO., LTD.
Amount Insured
USD 22,583.00 (110% OF CIF VALUE)
Ship or Vessel
Sailing on or about
MV SAMPLE STAR V.012
SEP. 05, 2026
From
To
YOKOHAMA, JAPAN
SINGAPORE
Subject-matter Insured
44 CARTONS OF CERAMIC TABLEWARE AND STAINLESS BOTTLES
Conditions
INSTITUTE CARGO CLAUSES (A)
INSTITUTE WAR CLAUSES (CARGO)
INSTITUTE STRIKES CLAUSES (CARGO)
Claims, if any, payable at SINGAPORE in USD
Claim agent: EXAMPLE SURVEYORS PTE. LTD.
SAMPLE MARINE INSURANCE CO., LTD.
Authorized Signatory
pdf-3 の全ページ(クリックすると展開します)
p.1:FAX 送付状(正解は other)
FAX TRANSMISSION
To: EXAMPLE IMPORTS PTE. LTD. / Purchasing Dept.
From: SAMPLE EXPORT CO., LTD. / Export Section
Date: SEP. 02, 2026
Pages: 4 (including this page)
Dear Sirs,
Please find attached the shipping documents for your order.
Kindly confirm receipt by return.
Best regards,
p.2:Invoice(タイトルあり、1ページ完結)(正解は invoice)
INVOICE
SAMPLE EXPORT CO., LTD.
No. INV-2026-0903
1-2-3 EXAMPLE-CHO, YOKOHAMA, JAPAN
Date: SEP. 02, 2026
Sold to:
Payment: T/T 30 DAYS
EXAMPLE IMPORTS PTE. LTD.
Terms: CIF SINGAPORE
45 SAMPLE ROAD, SINGAPORE 000000
From: YOKOHAMA, JAPAN
To: SINGAPORE
Per: MV SAMPLE STAR V.012
Description
Quantity
Unit Price
Amount
CERAMIC DINNER PLATE 27CM WHITE
1,200 PCS
USD 3.20
USD 3,840.00
CERAMIC SOUP BOWL 15CM WHITE
1,500 PCS
USD 2.10
USD 3,150.00
TOTAL
USD 6,990.00
p.3:完全な空白ページ(行が1つも無い)(正解は blank)
(行なし)
p.4:Packing List(タイトルあり、1ページ完結)(正解は packing_list)
PACKING LIST
SAMPLE EXPORT CO., LTD.
Ref. No. INV-2026-0903
1-2-3 EXAMPLE-CHO, YOKOHAMA, JAPAN
Date: SEP. 02, 2026
Consigned to:
EXAMPLE IMPORTS PTE. LTD.
45 SAMPLE ROAD, SINGAPORE 000000
From: YOKOHAMA, JAPAN
To: SINGAPORE
Per: MV SAMPLE STAR V.012
Marks: EXAMPLE / SINGAPORE / C/NO. 1-UP / MADE IN JAPAN
Case No.
Description
Quantity
N.W. (KG)
G.W. (KG)
M3
1-10
CERAMIC DINNER PLATE 27CM WHITE
1,200 PCS
840.0
910.0
2.40
11-20
CERAMIC SOUP BOWL 15CM WHITE
1,500 PCS
600.0
660.0
2.10
TOTAL: 20 CARTONS
1,570.0
pdf-4 の全ページ(クリックすると展開します)
p.1:Invoice(タイトル無し。単価と金額の列で見分ける)(正解は invoice)
SAMPLE EXPORT CO., LTD.
No. SE-260904
1-2-3 EXAMPLE-CHO, YOKOHAMA, JAPAN
Date: SEP. 03, 2026
Sold to:
Payment: T/T 30 DAYS
EXAMPLE IMPORTS PTE. LTD.
Terms: CIF SINGAPORE
45 SAMPLE ROAD, SINGAPORE 000000
From: YOKOHAMA, JAPAN
To: SINGAPORE
Per: MV SAMPLE STAR V.012
Description
Quantity
Unit Price
Amount
BAMBOO CUTTING BOARD 30X20CM
900 PCS
USD 4.40
USD 3,960.00
BAMBOO SERVING TRAY 40X28CM
400 PCS
USD 8.25
USD 3,300.00
COTTON KITCHEN TOWEL 3-PACK
1,000 SETS
USD 2.75
USD 2,750.00
TOTAL
USD 10,010.00
p.2:Packing List の別名(WEIGHT AND MEASUREMENT LIST)(正解は packing_list)
WEIGHT AND MEASUREMENT LIST
SAMPLE EXPORT CO., LTD.
Ref. No. SE-260904
1-2-3 EXAMPLE-CHO, YOKOHAMA, JAPAN
Date: SEP. 03, 2026
Consigned to:
EXAMPLE IMPORTS PTE. LTD.
45 SAMPLE ROAD, SINGAPORE 000000
From: YOKOHAMA, JAPAN
To: SINGAPORE
Per: MV SAMPLE STAR V.012
Marks: EXAMPLE / SINGAPORE / C/NO. 1-UP / MADE IN JAPAN
Case No.
Description
Quantity
N.W. (KG)
G.W. (KG)
M3
31-38
STAINLESS BOTTLE 500ML SILVER
800 PCS
240.0
288.0
1.92
39-44
STAINLESS BOTTLE 750ML BLACK
600 PCS
228.0
270.0
1.68
TOTAL: 14 CARTONS
558.0
p.3:B/L(タイトル無し)(正解は bill_of_lading)
Shipper
SAMPLE EXPORT CO., LTD.
1-2-3 EXAMPLE-CHO, YOKOHAMA, JAPAN
No. SMPL-YOK-260901
Consignee
TO ORDER OF EXAMPLE BANK LTD.
Notify Party
EXAMPLE IMPORTS PTE. LTD.
45 SAMPLE ROAD, SINGAPORE 000000
Ocean Vessel / Voy. No.
Port of Loading
Port of Discharge
MV SAMPLE STAR V.012
YOKOHAMA, JAPAN
SINGAPORE
Container No. / Seal No.
No. of Pkgs
Description of Goods
Gross Weight
SMPU 123456-7 / 00112233
44 CARTONS
CERAMIC TABLEWARE AND
2,828.0 KGS
STAINLESS BOTTLES
SHIPPER'S LOAD, COUNT AND SEAL
FREIGHT PREPAID
SHIPPED ON BOARD
Date: SEP. 05, 2026
Number of Original B(s)/L: THREE (3)
RECEIVED by the Carrier the goods in apparent good order and
condition. One original must be surrendered duly endorsed in
exchange for the goods.
SAMPLE OCEAN LINE CO., LTD. AS CARRIER
p.4:原産地証明書(タイトル無し)(正解は certificate_of_origin)
1. Exporter (Name, address, country)
Reference No. CO-2026-004512
SAMPLE EXPORT CO., LTD.
1-2-3 EXAMPLE-CHO, YOKOHAMA, JAPAN
2. Importer (Name, address, country)
EXAMPLE IMPORTS PTE. LTD.
45 SAMPLE ROAD, SINGAPORE 000000
3. Transport details
FROM YOKOHAMA TO SINGAPORE BY SEA, ON OR ABOUT SEP. 05, 2026
4. Marks, numbers, number and kind of packages; description of goods
44 CARTONS OF CERAMIC TABLEWARE AND STAINLESS BOTTLES
HS CODE 6911.10 / 7323.93
5. Country of origin
JAPAN
6. Declaration by the exporter
7. Certification
The undersigned declares that the above details are correct and
It is hereby certified that the declaration by the exporter
that all the goods were produced in JAPAN.
is correct.
EXAMPLE CHAMBER OF COMMERCE AND INDUSTRY
YOKOHAMA, SEP. 03, 2026
pdf-5 の全ページ(クリックすると展開します)
p.1:Invoice(タイトルが誤読、スタンプの文字が混入)(正解は invoice)
|
C0MMERC1AL INV0ICE
SAMPLE EXPORT CO., LTD.
No. INV-2O26-O9O5
1-2-3 EXAMPLE-CHO, YOKOHAMA, JAPAN
Date: SEP. O4, 2026
Sold to:
Payment: T/T 30 DAYS
EXAMPLE IMPORTS PTE. LTD.
Terms: CIF SINGAPORE
45 SAMPLE ROAD, SINGAPORE 000000
From: YOKOHAMA, JAPAN
To: SINGAPORE
Per: MV SAMPLE STAR V.012
Description
Quantity
Unit Price
Amount
CERAMIC DINNER PLATE 27CM WHITE
1,200 PCS
USD 3.20
USD 3,840.00
CERAMIC SOUP BOWL 15CM WHITE
1,500 PCS
USD 2.10
USD 3,150.00
T0TAL
USD 6,99O.OO
RECE1VED
26. 9. -7
p.2:ほぼ空白(ゴミ文字だけが4つある)(正解は blank)
l
. _
|
- 2
p.3:Packing List(タイトルが誤読、手書きメモが混入)(正解は packing_list)
PACK1NG L1ST
SAMPLE EXPORT CO., LTD.
Ref. No. INV-2O26-O9O5
1-2-3 EXAMPLE-CHO, YOKOHAMA, JAPAN
Date: SEP. O4, 2026
Consigned to:
EXAMPLE IMPORTS PTE. LTD.
OK checked
45 SAMPLE ROAD, SINGAPORE 000000
From: YOKOHAMA, JAPAN
To: SINGAPORE
Per: MV SAMPLE STAR V.012
Marks: EXAMPLE / SINGAPORE / C/NO. 1-UP / MADE IN JAPAN
Case No.
Description
Quantity
N.W. (KG)
G.W. (KG)
M3
1-10
CERAMIC DINNER PLATE 27CM WHITE
1,200 PCS
840.0
910.0
2.40
11-20
CERAMIC SOUP BOWL 15CM WHITE
1,500 PCS
600.0
660.0
2.10
Cont'd
| |
p.4:Packing List の続きページ(ノイズあり)(正解は packing_list)
21-30
CERAMIC MUG 350ML BLUE
2,000 PCS
640.0
700.0
2.60
T0TAL: 3O CART0NS
2,27O.O
_ .
l
たとえば pdf-2 の3ページ目(パッキングリストの続きページ)は、モデルには次のように渡ります。
列の見出しがなく、数値だけが並んでいる状態です。
["31-38", "STAINLESS BOTTLE 500ML SILVER", "800 PCS", "240.0", "288.0", "1.92",
"39-44", "STAINLESS BOTTLE 750ML BLACK", "600 PCS", "228.0", "270.0", "1.68",
"TOTAL: 44 CARTONS", "6,100 PCS", "2,548.0", "2,828.0", "10.70",
"SAMPLE EXPORT CO., LTD.", "Authorized Signature"]
1.3 State と Questions
State には、判定したいページの行を page に入れます。
直前のページを渡す条件では previous_page を、規則を書く条件では classification_guide を追加します。
PDF の1ページ目では previous_page を null に設定します。
{
"classification_guide": "<規則を書く条件だけ。種別の見分け方>",
"previous_page": ["<直前のページを渡す条件だけ。直前のページの各行>"],
"page": ["<判定したいページの各行>"]
}
実際の State の例として、pdf-2 の3ページ目(パッキングリストの続きページ)を、直前のページを渡して規則も書く条件で判定したときのものを載せます。
classification_guide に種別の見分け方、previous_page に2ページ目(パッキングリストの1ページ目)、page に3ページ目の各行が入っています。
規則を書かない条件では classification_guide を、直前のページを渡さない条件では previous_page を、この State から外します。
State の実例(クリックすると展開します)
{
"classification_guide": "How to tell the document types apart. Titles are often missing, renamed, or misread by OCR, so rely on the fields, not on the title.\n- invoice: a request for payment. Has a unit price column and an amount column, a total amount in a currency, and usually payment terms or trade terms such as CIF or FOB.\n- packing_list: describes how the goods are packed. Has case or carton numbers, net weight, gross weight and measurement (M3). It has no unit price and no amount. It may be titled \"Weight and Measurement List\" or similar.\n- bill_of_lading: issued by a carrier. Has Shipper, Consignee, Notify Party, vessel and voyage, port of loading, port of discharge, container and seal numbers, \"shipped on board\", the number of original B/Ls, and a clause about surrendering an original.\n- certificate_of_origin: numbered boxes for exporter, importer, transport details and country of origin, a declaration by the exporter, and a certification by a chamber of commerce or authority.\n- insurance_policy: issued by an insurer. Has the assured, amount insured, conditions such as Institute Cargo Clauses, and where claims are payable.\n- blank: no lines at all, or only a few stray characters such as \"|\", \"_\", \".\" or a single letter left by stamps and ruled lines. A page with a few meaningless fragments is still blank.\n- other: a readable page that is none of the above, such as a fax cover sheet or a printed e-mail.\nContinuation pages: the second and later pages of an invoice or packing list often have no title and no header. They start directly with table rows and end with a total or a signature. Decide their type from the columns (prices and amounts mean invoice; weights and measurements mean packing_list).\nOCR noise: \"0\" and \"O\", \"1\" and \"I\" or \"L\" are often confused. Stamps such as \"RECEIVED\" and handwritten notes may be mixed in. Ignore them.",
"previous_page": [
"PACKING LIST",
"SAMPLE EXPORT CO., LTD.",
"Ref. No. INV-2026-0901",
"1-2-3 EXAMPLE-CHO, YOKOHAMA, JAPAN",
"Date: SEP. 01, 2026",
"Consigned to:",
"EXAMPLE IMPORTS PTE. LTD.",
"45 SAMPLE ROAD, SINGAPORE 000000",
"From: YOKOHAMA, JAPAN",
"To: SINGAPORE",
"Per: MV SAMPLE STAR V.012",
"Marks: EXAMPLE / SINGAPORE / C/NO. 1-UP / MADE IN JAPAN",
"Case No.",
"Description",
"Quantity",
"N.W. (KG)",
"G.W. (KG)",
"M3",
"1-10",
"CERAMIC DINNER PLATE 27CM WHITE",
"1,200 PCS",
"840.0",
"910.0",
"2.40",
"11-20",
"CERAMIC SOUP BOWL 15CM WHITE",
"1,500 PCS",
"600.0",
"660.0",
"2.10",
"21-30",
"CERAMIC MUG 350ML BLUE",
"2,000 PCS",
"640.0",
"700.0",
"2.60",
"Continued on next page"
],
"page": [
"31-38",
"STAINLESS BOTTLE 500ML SILVER",
"800 PCS",
"240.0",
"288.0",
"1.92",
"39-44",
"STAINLESS BOTTLE 750ML BLACK",
"600 PCS",
"228.0",
"270.0",
"1.68",
"TOTAL: 44 CARTONS",
"6,100 PCS",
"2,548.0",
"2,828.0",
"10.70",
"SAMPLE EXPORT CO., LTD.",
"Authorized Signature"
]
}
Questions は Choice(選択肢から1つ選ぶ質問)1つのみで、書類種別を7つの中から選ばせます。
選択肢の説明は、規則を書かない条件でヒントになってしまわないよう、書類の名前だけに留めました。
{
"doc_type": {
"type": "choice",
"instructions": "`page` holds the OCR result of one page of a scanned PDF, line by line from top to bottom. Decide which type of trade document this page belongs to.",
"criteria": {
"invoice": "Commercial invoice.",
"packing_list": "Packing list.",
"bill_of_lading": "Bill of lading.",
"certificate_of_origin": "Certificate of origin.",
"insurance_policy": "Cargo insurance policy or certificate.",
"blank": "Blank page.",
"other": "None of the above."
}
}
}
直前のページを渡す条件では、instructions の末尾に次の文を追加しています。
`previous_page` is the page immediately before it in the same PDF (null for the first page). Use it only as context, for example to recognise a continuation page that has no title or header. Classify `page`, not `previous_page`.
# (日本語訳)
# `previous_page` は同じ PDF 内の直前のページです(最初のページの場合は null)。
# タイトルやヘッダーのない続きページを認識するなど、文脈としてのみ使用してください。
# `previous_page` ではなく、`page` を分類してください。
State に書いた種別の見分け方(クリックすると展開します)
How to tell the document types apart. Titles are often missing, renamed, or misread by OCR, so rely on the fields, not on the title.
- invoice: a request for payment. Has a unit price column and an amount column, a total amount in a currency, and usually payment terms or trade terms such as CIF or FOB.
- packing_list: describes how the goods are packed. Has case or carton numbers, net weight, gross weight and measurement (M3). It has no unit price and no amount. It may be titled "Weight and Measurement List" or similar.
- bill_of_lading: issued by a carrier. Has Shipper, Consignee, Notify Party, vessel and voyage, port of loading, port of discharge, container and seal numbers, "shipped on board", the number of original B/Ls, and a clause about surrendering an original.
- certificate_of_origin: numbered boxes for exporter, importer, transport details and country of origin, a declaration by the exporter, and a certification by a chamber of commerce or authority.
- insurance_policy: issued by an insurer. Has the assured, amount insured, conditions such as Institute Cargo Clauses, and where claims are payable.
- blank: no lines at all, or only a few stray characters such as "|", "_", "." or a single letter left by stamps and ruled lines. A page with a few meaningless fragments is still blank.
- other: a readable page that is none of the above, such as a fax cover sheet or a printed e-mail.
Continuation pages: the second and later pages of an invoice or packing list often have no title and no header. They start directly with table rows and end with a total or a signature. Decide their type from the columns (prices and amounts mean invoice; weights and measurements mean packing_list).
OCR noise: "0" and "O", "1" and "I" or "L" are often confused. Stamps such as "RECEIVED" and handwritten notes may be mixed in. Ignore them.
# (日本語訳)
# 書類種別の見分け方。タイトルは記載がない場合や、別名になっている場合、OCR で誤読されている場合が多いため、タイトルではなく各項目(フィールド)を手がかりに判断すること。
# - invoice: 支払請求書。単価列と金額列、通貨単位付きの合計金額があり、通常は CIF や FOB などの貿易条件や支払条件が含まれる。
# - packing_list: 貨物の梱包状態を示す。ケース番号やカートン番号、正味重量、総重量、容積(M3)がある。単価や金額はなく、「Weight and Measurement List」などの別名が付くこともある。
# - bill_of_lading: 運送人が発行。荷送人、荷受人、着荷通知先、本船名・航海番号、積込港、揚地港、コンテナ・シール番号、「shipped on board」表記、オリジナル B/L の発行通数、およびオリジナル原本の提出に関する約款がある。
# - certificate_of_origin: 輸出者、輸入者、輸送詳細、原産国が記載された番号付きの枠があり、輸出者による宣誓文と、商工会議所または公的機関による証明文がある。
# - insurance_policy: 保険会社が発行。被保険者、保険金額、協会貨物約款などの保険条件、保険金支払地がある。
# - blank: 行が全くないか、スタンプや罫線に由来する「|」「_」「.」などのゴミ文字や1文字の文字断片のみ。意味をなさない少数の断片しかないページも空白とみなす。
# - other: 上記のいずれにも該当しない、内容が読み取れるページ(FAX 送付状や印刷された電子メールなど)。
# 続きページ: インボイスやパッキングリストの2ページ目以降は、タイトルやヘッダーがないことが多い。表の行から直接始まり、合計やサインで終わる。列の内容から種別を判断する(価格と金額があれば invoice、重量と容積があれば packing_list)。
# OCR ノイズ: 「0」と「O」、「1」と「I」または「L」は混同されやすい。「RECEIVED」などのスタンプや手書きメモが混ざり込んでいる場合があるが、無視すること。
Sonnet 4.6 には、同じ State を JSON のままユーザーメッセージとして渡しました。
質問文と選択肢はシステムプロンプトに指定し、回答はツール呼び出しの引数(doc_type)で受け取っています。
2. 結果
2.1 結果の一覧
金額は 1ドル = 150円で換算しています。
トークン数とコストは20ページの合計です。
| モデル | 直前のページ | 規則 | 種別の正答 | 要確認(確率 0.8 未満) | レイテンシの中央値 | 入力トークン | 出力トークン | 20ページの概算コスト |
|---|---|---|---|---|---|---|---|---|
| Jev | 渡さない | なし | 19/20 | 2ページ | 約0.65秒(649ms) | 13,827 | 1,497 | $0.0006(約0.09円) |
| Jev | 渡さない | あり | 19/20 | 2ページ | 約0.65秒(654ms) | 22,427 | 1,496 | $0.0009(約0.14円) |
| Jev | 渡す | なし | 20/20 | 1ページ | 約0.63秒(630ms) | 19,070 | 1,497 | $0.0008(約0.12円) |
| Jev | 渡す | あり | 20/20 | 0ページ | 約0.66秒(660ms) | 27,670 | 1,497 | $0.0012(約0.17円) |
| Sonnet 4.6 | 渡さない | なし | 20/20 | - | 約1.18秒(1,179ms) | 21,062 | 738 | $0.0743(約11.14円) |
| Sonnet 4.6 | 渡さない | あり | 20/20 | - | 約1.15秒(1,146ms) | 30,622 | 738 | $0.1029(約15.44円) |
| Sonnet 4.6 | 渡す | なし | 20/20 | - | 約1.15秒(1,150ms) | 25,693 | 738 | $0.0881(約13.22円) |
| Sonnet 4.6 | 渡す | あり | 20/20 | - | 約1.12秒(1,116ms) | 35,253 | 738 | $0.1168(約17.52円) |
コストは、実測のトークン数に公開価格を掛けて算出しました。
Jev は入力 100万トークンあたり $0.042 で、出力トークンは無料です(Models | TypeSafe Docs)。
Sonnet 4.6 は入力 100万トークンあたり $3.00、出力 $15.00 で、表のコストには出力トークンの分も含めています(Amazon Bedrock の料金 | AWS)。
「要確認」は、Jev が返した種別の確率が 0.8 未満だったページの数です。
確率が 0.8 以上ならそのまま自動処理し、0.8 未満なら要確認フラグを付けて人がチェックする、という運用を想定してカウントしました。
2.2 ページごとの回答と確率
Jev が20ページそれぞれにどう答えたかの一覧です。
数値は、Jev が選んだ種別の確率を小数第2位まで示したものです。
正解と異なった回答には、Jev が選んだ種別を併記しています。
「単体」は1ページだけ渡した条件、「直前あり」は直前のページも一緒に渡した条件です。
| ページ | 内容 | 正解 | 単体・規則なし | 単体・規則あり | 直前あり・規則なし | 直前あり・規則あり |
|---|---|---|---|---|---|---|
pdf-1 p.1 |
インボイス | invoice |
1.00 | 1.00 | 1.00 | 1.00 |
pdf-1 p.2 |
インボイスの続き | invoice |
0.99 | 1.00 | 1.00 | 1.00 |
pdf-2 p.1 |
インボイス | invoice |
1.00 | 1.00 | 1.00 | 1.00 |
pdf-2 p.2 |
パッキングリスト | packing_list |
1.00 | 1.00 | 1.00 | 1.00 |
pdf-2 p.3 |
パッキングリストの続き | packing_list |
0.84 | invoice 0.71 要確認 |
1.00 | 1.00 |
pdf-2 p.4 |
B/L | bill_of_lading |
1.00 | 1.00 | 1.00 | 1.00 |
pdf-2 p.5 |
原産地証明書 | certificate_of_origin |
1.00 | 1.00 | 1.00 | 1.00 |
pdf-2 p.6 |
保険証券 | insurance_policy |
1.00 | 1.00 | 1.00 | 1.00 |
pdf-3 p.1 |
FAX 送付状 | other |
1.00 | 1.00 | 1.00 | 1.00 |
pdf-3 p.2 |
インボイス | invoice |
1.00 | 1.00 | 1.00 | 1.00 |
pdf-3 p.3 |
完全な空白 | blank |
1.00 | 1.00 | 0.97 | 0.96 |
pdf-3 p.4 |
パッキングリスト | packing_list |
1.00 | 1.00 | 1.00 | 1.00 |
pdf-4 p.1 |
インボイス(タイトルなし) | invoice |
0.99 | 1.00 | 0.99 | 1.00 |
pdf-4 p.2 |
パッキングリスト(別名) | packing_list |
1.00 | 1.00 | 1.00 | 1.00 |
pdf-4 p.3 |
B/L(タイトルなし) | bill_of_lading |
1.00 | 1.00 | 1.00 | 1.00 |
pdf-4 p.4 |
原産地証明書(タイトルなし) | certificate_of_origin |
1.00 | 1.00 | 1.00 | 1.00 |
pdf-5 p.1 |
インボイス(誤読) | invoice |
1.00 | 1.00 | 1.00 | 1.00 |
pdf-5 p.2 |
ゴミ文字だけ | blank |
other 0.49 要確認 |
0.99 | 0.50 要確認 | 0.83 |
pdf-5 p.3 |
パッキングリスト(誤読) | packing_list |
1.00 | 1.00 | 1.00 | 1.00 |
pdf-5 p.4 |
パッキングリストの続き(ノイズ) | packing_list |
0.63 要確認 | 0.70 要確認 | 1.00 | 1.00 |
Jev が誤判定した2ページは、いずれも確率が 0.8 未満で要確認フラグが付いていました。
確率が 0.8 以上で自動処理に回るページについては、4条件すべてで全問正解です。
今回の検証データでは、閾値を 0.8 に設定しておけば、誤判定が人の確認をすり抜けることはありませんでした。
2.3 タイトルがないページや誤読のあるページでも判定できた
ここからは、2.2 の表をもとに Jev の検証結果を説明します。
Jev は、タイトルがないインボイス・B/L・原産地証明書や、別名表記のパッキングリスト、タイトルが誤読されたページでも、4条件すべてで正しく判定できました。
これらのページでは、Jev が返した確率もすべて 0.99 以上でした。
Jev は、単価や金額の列、重量や容積の列といった項目の並びから、書類の種別を捉えられているようです。
2.4 1ページ単体だと、見出しのない続きページとゴミ文字のページが不安定
1ページだけを渡した2条件では、Jev はそれぞれ1ページずつ誤判定しました。
規則なしの条件では、Jev はゴミ文字だけのページ(pdf-5 p.2)を other と判定しています。
規則ありの条件では、Jev はパッキングリストの続きページ(pdf-2 p.3)を invoice と判定しました。
Jev の確率が 0.8 を下回ったのも、この2ページともう1つの続きページ(pdf-5 p.4)だけでした。
pdf-2 p.3 は 1.2 で示したとおり、列の見出しがなく数値だけが並んでいます。
数値が重量なのか金額なのかを1ページだけで判別する材料が足りず、Jev の確率が割れたと考えられます。
2.5 直前のページを一緒に渡すと全ページ正解
直前のページを previous_page として一緒に渡すと、Jev は規則の有無にかかわらず20ページすべてを正しく判定できました。
1ページ単体では確率が割れていた続きページも、Jev の確率が 0.99 以上まで上がっています。
Jev は、直前のページにある見出しや列名から、続きのページだと判断できたようです。
直前のページを渡すと Jev の入力トークン数は約1.2〜1.4倍に増えますが、Jev のコストは20ページで $0.0008〜0.0012(約0.12〜0.17円)程度に収まります。
続きページを含む PDF を Jev で扱うなら、直前のページも一緒に渡すのが確実です。
2.6 OCR の座標は渡さなくてよい
Textract 形式の LINE ブロックを、座標(BoundingBox)ごと渡す条件も試してみました。
1ページだけを渡した場合の正答数は、規則なしで 20/20、規則ありで 19/20 となり、テキストの行だけを渡した場合とほぼ変わりません。
誤判定したページも、同じパッキングリストの続きページでした。
一方で、入力トークン数は規則なしのケースで 13,827 から 49,931 へと約3.6倍に膨らんでいます。
今回の書類種別判定タスクにおいては、座標まで渡すメリットは見当たりませんでした。
2.7 速度とコスト
1ページあたりのレイテンシ中央値は、Jev が約 0.65 秒(630〜660ms)、Sonnet 4.6 が約 1.15 秒(1,116〜1,179ms)でした。
20ページの概算コストは、直前のページを渡して規則を書かない条件で Jev が $0.0008(約0.12円)、Sonnet 4.6 が $0.0881(約13.22円)となり、およそ110倍の開きがあります。
同じ条件で単純に1万ページ分を試算すると、Jev が約60円、Sonnet 4.6 が約6,600円です。
3. まとめ
OCR 済みのテキストを行の並びのまま Jev に渡すだけで、タイトルがないページや誤読を含んだページでも安定して書類種別を判定できました。
種別の見分け方を State に細かく書き込む必要はなく、座標情報も不要でした。
特に効果的だったのは「直前のページを一緒に渡すこと」です。
見出しのない続きページは単体だと Jev でも判断が割れていましたが、直前のページの情報が加わることで正しく判定できるようになりました。
精度面だけを見れば Sonnet 4.6 が単体ページでも全問正解と優秀でした。
しかし、Jev も直前のページさえ渡せば同等の精度を出せるうえ、コストは約100分の1、レイテンシは約半分に抑えられ、さらに判定の確率値まで取得できます。
今回いちばん実用的だと感じたのは、この確率です。
Jev は、見出しのない続きページやゴミ文字だけのページのように判断材料が乏しいページでも無理に言い切らず、確率を下げて返してくれました。
誤判定した2ページも、どちらも確率が 0.8 未満でした。
つまり、Jev が「自信がない」と示したページだけを人が確認すれば、今回のデータでは誤判定をすべて拾えたことになります。
全ページを Jev だけに任せるのではなく、確率が低いページに要確認フラグを付けて人の目と組み合わせることで、現場で使えるチェックの仕組みになると感じました。
処理するページ数が多く、こうした実務フローを組みたいなら、Jev が向いています。







