外航船の補油で届く英文の燃料受領書(BDN)を読み取り、発注と本船の計測に照らして、数量の差と硫黄分の超過を拾う
外航船が補油するたびに届く英文の燃料受領書(Bunker Delivery Note、以下 BDN)を読み取り、油種・数量・密度・硫黄分を燃料台帳に写します。あわせて発注の内容と本船の計測値に照らし、数量の差と、規制値を超える硫黄分を担当者に回します。
- AIサービス
- AWS Textract/Azure AI/Google Document AI
- 連携・自動化
- Python
- 対象業界
- 商社/物流
- 対象部門
- 物流/購買
- 対象業務
- データ入力・転記/内容確認・チェック
- 主な課題
- 入力作業が多い/期限・対応漏れが起きる/確認ミスが多い
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 入力漏れ削減/工数削減/機会損失防止
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 必須
01導入前 / 導入後の業務フロー
- 本船から届いたメールの添付(受領書の写真・PDF)を開き、共有フォルダに保存する
- 受領書から、船名、港、補油の日付、供給業者、油種、数量、密度、硫黄分、粘度、引火点を読み、燃料台帳に手で写す
- 発注のメールを探し、発注した油種・数量・仕様と、受領書の値を見比べる
- 本船からの計測の報告を探し、受領書の数量との差を計算する
- その船の航路と排ガス洗浄装置の有無を思い出し、硫黄分が使う海域の規制値に収まるかを見る
- 差や疑いがあれば、運航管理の担当と相談し、供給業者への申し立てを検討する
- 燃料台帳の行を「確認済み」にする
- 人本船から届いた受領書の写真・PDFと計測の報告を、ファイル名に船名と補油の日付を付けて受付フォルダに置く
- 自動保存をきっかけに処理が動き、形式・サイズ・文字の大きさを確かめる
- 自動AWS Textract が受領書を読み、決めておいた質問への答え、表、キーと値、全文を信頼度つきで返す
- 自動読み取った値の単位と書き方をそろえる(数量はメートルトン、密度は15℃の値など)
- 自動発注の記録と、本船の計測値と、船の情報(航路の海域・排ガス洗浄装置の有無)を引く
- 自動数量の差、油種と仕様の食い違い、硫黄分と規制値の関係を規則で判定する
- 自動燃料台帳に「確認待ち」として下書きの行を作り、判定と根拠を付ける
- 人担当者が、差・食い違い・読み取りの怪しい項目が出た行だけを開き、受領書の画像で確かめる
- 人申し立てが要ると判断したものについて、運航管理の担当と相談し、供給業者へ連絡する
- 人台帳の行を確定する
各工程の詳しい説明を読む
- 本船から届いたメールの添付(受領書の写真・PDF)を開き、共有フォルダに保存する
- 受領書から、船名、港、補油の日付、供給業者、油種、数量、密度、硫黄分、粘度、引火点を読み、燃料台帳に手で写す
- 発注のメールを探し、発注した油種・数量・仕様と、受領書の値を見比べる
- 本船からの計測の報告を探し、受領書の数量との差を計算する
- その船の航路と排ガス洗浄装置の有無を思い出し、硫黄分が使う海域の規制値に収まるかを見る
- 差や疑いがあれば、運航管理の担当と相談し、供給業者への申し立てを検討する
- 燃料台帳の行を「確認済み」にする
(a)転記に時間がかかり、写し間違いが出る。 受領書は写真で届くことが多く、斜めに写っていたり、手書きの数字が混じっていたりします。密度の「991.2」を「919.2」と写すような誤りは、台帳の上では目立ちません。密度は数量の換算に使うので、写し間違いは数量の差の計算にそのまま響きます。
(b)数量の差に気づくのが遅れる。 3番目と4番目は、別々のメールを探す作業です。計測の報告が遅れて届くと、照合は「後でやる」の箱に入り、そのまま忘れられます。 差に気づいたときには、申し立ての期限が過ぎています。
(c)硫黄分の判定が人の記憶に頼っている。 船の航路と装置を担当者が覚えていることが前提で、担当替えの直後に抜けます。
(d)全件を丁寧に見る時間はない。 補油が重なる週ほど、3番目から5番目が省かれます。
- 【人】 本船から届いた受領書の写真・PDFと計測の報告を、ファイル名に船名と補油の日付を付けて受付フォルダに置く
- 【自動】 保存をきっかけに処理が動き、形式・サイズ・文字の大きさを確かめる
- 【自動】 AWS Textract が受領書を読み、決めておいた質問への答え、表、キーと値、全文を信頼度つきで返す
- 【自動】 読み取った値の単位と書き方をそろえる(数量はメートルトン、密度は15℃の値など)
- 【自動】 発注の記録と、本船の計測値と、船の情報(航路の海域・排ガス洗浄装置の有無)を引く
- 【自動】 数量の差、油種と仕様の食い違い、硫黄分と規制値の関係を規則で判定する
- 【自動】 燃料台帳に「確認待ち」として下書きの行を作り、判定と根拠を付ける
- 【人】 担当者が、差・食い違い・読み取りの怪しい項目が出た行だけを開き、受領書の画像で確かめる
- 【人】 申し立てが要ると判断したものについて、運航管理の担当と相談し、供給業者へ連絡する
- 【人】 台帳の行を確定する
8番目が、この設計の分かれ目です。 人が見るのは全件ではなく、差や食い違いが出たものと、読み取りに自信が無いものだけです。 何も出なかった行は、一覧で数字を流し見て確定します。
6番目を規則で決めているのも、意図してのことです。 差の幅や海域ごとの値は会社の決まりと規制で決まるもので、読み取りの道具が決めることではありません。
02今回想定するシステム構成
本船から届く燃料受領書(写真・PDF)と計測の報告 │ 担当者がファイル名に船名と補油日を付ける ▼【トリガー】受付フォルダ(Amazon S3)への保存 AWS Lambda ├──▶ 形式・サイズ・解像度の確認 ▼ AWS Textract(StartDocumentAnalysis:QUERIES・TABLES・FORMS) │ 質問への答え・表・キーと値・全文を信頼度つきで返す ▼ 完了の通知(Amazon SNS) AWS Lambda(Python) │ ① 単位と書き方をそろえる │ ② 発注の記録・本船の計測値・船の情報を引く │ ③ 数量の差・仕様の食い違い・硫黄分と規制値を規則で判定 ▼ 燃料台帳に「確認待ち」の行(判定と根拠つき) ▼ 【人が差・食い違い・読み取り不安のものだけ確認】 └──▶ 申し立ての検討(運航管理と相談)/台帳の確定
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | AWS Textract(AnalyzeDocument の非同期処理。QUERIES・TABLES・FORMS) | Azure AI Document Intelligence、Google Document AI |
| 差異計算 | 発注・本船の計測値・規制値との照合(Python。AWS Lambda で動かす) | ─ |
| 連携 | AWS Lambda(S3 への保存を起点に読み取りを始め、結果を台帳へ書く) | Amazon EventBridge |
| 保管 | Amazon S3(受領書の画像と読み取り結果) | 社内のファイルサーバー |
| 通知 | Amazon SNS(読み取りの完了の通知) | Amazon SQS |
燃料台帳と発注の記録は、新しく足すものではありません。 燃料台帳に「確認待ち」「確認済み」の列と、判定の列を足すのが最初の準備です。発注の記録はメールに散らばっているので、発注のたびに台帳の行を先に作っておく運用に変えます。 これが無いと、受領書を照らす相手がありません。
土台になるのは AWS Textract の文書分析です。 書類の全文に加えて、キーと値、表、そして「質問(Queries)」への答えを返します。質問は「What is the sulphur content?」のように英語の文で書き、答えに別名を付けて受け取れます。書式が供給業者ごとに違っても、項目名の言い方がそろっていれば同じ質問で取れるのが、この題材に合う理由です。
一方で、対応する言語は英・仏・独・伊・葡・西の6つで、質問による抽出と手書きの認識は英語だけです。 BDN は英語なので使えますが、日本語の書類には使えません。 国内の港で日本語の受領書が出る場合は、Azure AI Document Intelligence か Google Document AI で別に読みます。
03どうやって実装するのか
処理の起点を決める
受付フォルダ(Amazon S3)に受領書のファイルが保存されたことを起点にします。 補油は昼夜を問わず世界のどこかで終わるので、1日1回の定時実行にはしません。 数量の差の申し立ては早いほど通りやすく、届いたその日に差が分かる形にしておく必要があるからです。
ファイルは担当者が <船名>_<補油日>_BDN.pdf のような名前にして置きます。 船名と補油日が発注の記録を引く鍵になるため、名前の形が合わないものは処理を始める前に止めます。
S3 への保存を AWS Lambda が受け、StartDocumentAnalysis を呼びます。同期の処理では PDF は1ページまでなので、複数ページの受領書に備えて非同期にそろえます。 ClientRequestToken にファイルから作った値を入れると、二度置いても同じ JobId が返り、二重に読みません。 完了は Amazon SNS に届き、SUCCEEDED を確かめて GetDocumentAnalysis で結果を取ります。結果は既定で7日間しか取れないため、すぐ S3 に保存します。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 燃料受領書 | 写真またはPDF。本船から届いた日時と、どの船からか | 受付フォルダ(S3) |
| 読み取り結果 | 質問への答え、表、キーと値、全文と、それぞれの信頼度 | AWS Textract |
| 発注の記録 | 船名、港、補油の予定日、供給業者、油種、発注数量(メートルトン)、仕様(硫黄分の上限・規格の版) | 燃料台帳の発注の行 |
| 本船の計測値 | 本船が測った受け取り量(メートルトン)、測った時刻、計算に使った密度と温度 | 本船からの燃料の報告 |
| 船の情報 | 排ガス洗浄装置の有無、次の航海で通る排出規制海域 | 運航管理の船舶一覧と航海計画 |
| 判定の決まり | 数量の差を「差あり」とする幅、海域ごとの硫黄分の上限、密度の妥当な範囲 | 燃料調達チームが決めた表 |
質を決めるのは、下の4つです。 発注の行が無ければ照らす相手がなく、本船の計測値が無ければ数量の差が出せません。船の情報が古いと、硫黄分の判定が間違った海域で行われます。 判定の決まりは、担当者の頭の中にあるものを表に書き出すところから始めます。
データの取得方法を決める
読み取りは StartDocumentAnalysis に FeatureTypes として QUERIES、TABLES、FORMS を指定して行います。全文の行と単語は、指定した機能にかかわらず返ります。
| 取るもの | どの機能で | 何に使うか |
|---|---|---|
| 質問への答え | QUERIES | 船名・港・日付・油種・数量・密度・硫黄分など、決まった項目の値と信頼度 |
| 表 | TABLES | 油種ごとに数量と性状が表で並ぶ受領書(2種類を同時に補油した場合など) |
| キーと値 | FORMS | 「Density at 15°C」のように見出しと値が並ぶ欄 |
| 全文の行と単語 | 常に返る | 質問の答えを全文の中でもう一度探して確かめる材料 |
質問は QueriesConfig に並べ、それぞれに別名(Alias)を付けます。答えは QUERY_RESULT という種類のブロックで、信頼度と、ページ上の位置と、答えの文字列が返ります。答えが見つからないときは空になります。
質問の数には上限があります。 公式の上限の一覧では、1ページあたり同期の処理で15問まで、非同期の処理で30問までです。本記事は非同期にそろえるので30問まで使えますが、欲張らずに照合に要る項目に絞ります。
燃料台帳・発注の記録・船の情報は、Lambda から読むだけで取ります。照合は船名と補油日で発注の行を引くのが先で、書き方が受領書ごとに違う供給業者の名前は後にします。
AIへ渡す前に整形する
- 形式の確認 … JPEG、PNG、PDF、TIFF であること。XFA形式のPDFは扱えないため、印刷し直してPDFにします
- パスワードの確認 … PDFはパスワード保護不可。解除したものを頼みます
- サイズとページ数の確認 … 非同期の処理で JPEG と PNG は10MB、PDF と TIFF は500MB・3,000ページが上限です。写真は10MBを超えることがあるので、縮小してから入れます
- 画像の寸法の確認 … どの辺も10,000ピクセル以下である必要があります。高解像度の写真は縮小します
- 文字の大きさの確認 … 文字の高さが15ピクセルを下回ると検出されません。150 DPIで8ポイント相当です。受領書の数量や硫黄分は小さな字の表に書かれていることが多いので、縮小しすぎないようにします
- 写り込みの確認 … 平面内の回転は扱えますが、斜めの写真や影のかかった数字は読み取りを落とします
- 重複の確認 … 同じ船・同じ補油日の受領書が既にあれば止め、差し替えか重複かを担当者に聞きます
AIに処理させる
させるのは、受領書から決まった項目の値を読み取り、根拠の位置と信頼度を添えることだけです。 判定は、読み取りの後にプログラムの規則が行います。
| 読み取る項目 | 中身 | 読み取れないときの扱い |
|---|---|---|
| 船名・IMO番号 | 受け取った船の名前と番号 | 発注の行と合わなければ mismatch |
| 港・補油の日付 | 補油した港と、補油を始めた日付 | 日付の候補が複数なら ambiguous |
| 供給業者 | 名前・住所 | 見つからなければ not_found |
| 油種 | 製品名(低硫黄の重油・軽油など) | 読めなければ unreadable |
| 数量 | 供給した量と単位(メートルトンかどうか) | 単位が読めなければ unit_unknown |
| 密度 | 15℃での密度と単位 | 読めなければ unreadable |
| 硫黄分 | 硫黄分の含有率(質量の%) | 読めなければ unreadable |
| 試料の封印番号 | 補油のときに採った試料の封印の番号 | 見つからなければ not_found |
| 供給業者の申告 | 規制に適合する旨の記載と署名の有無 | 見つからなければ not_found |
数量の単位を独立して読むのが、この表でいちばん大事なところです。 受領書にはトンで書くもの、体積で書くもの、両方を書くものがあり、単位を確かめずに写すと体積の数字がトンの列に入ります。
| させないこと | 理由 |
|---|---|
| 硫黄分が規制に適合するかの結論 | 海域・装置・航海計画で決まる。規則で判定し、人が確かめる |
| 申し立てるかどうかの判断 | 供給業者との関係と契約に関わる。人が決める |
| 読めなかった数字の補完 | 発注の数量や前回の値で埋めない |
| 信頼度の付け直し | AWS Textract が返した値をそのまま使う |
指示内容を固定する
AWS Textract への指示は、英語の質問の一覧です。別名を付けて、受け取る側のプログラムが項目を取り違えないようにします。
QueriesConfig:
Queries:
- Text: "What is the name of the receiving vessel?"
Alias: VESSEL_NAME
- Text: "What is the IMO number of the vessel?"
Alias: IMO_NUMBER
- Text: "What is the port of delivery?"
Alias: PORT
- Text: "What is the date of commencement of bunkering?"
Alias: DELIVERY_DATE
- Text: "What is the name of the supplier?"
Alias: SUPPLIER
- Text: "What is the product name or fuel grade?"
Alias: PRODUCT
- Text: "What is the quantity delivered in metric tons?"
Alias: QTY_MT
- Text: "What is the quantity delivered in cubic meters?"
Alias: QTY_M3
- Text: "What is the density at 15 degrees C?"
Alias: DENSITY_15C
- Text: "What is the sulphur content?"
Alias: SULPHUR
- Text: "What is the viscosity?"
Alias: VISCOSITY
- Text: "What is the flash point?"
Alias: FLASH_POINT
- Text: "What is the MARPOL sample seal number?"
Alias: SAMPLE_SEAL
- Text: "Is there a supplier declaration of compliance with MARPOL Annex VI?"
Alias: DECLARATION
- Text: "Who signed for the receiving vessel?"
Alias: SHIP_SIGNATORY
数量を2つの質問に分けているのが工夫です。 1問で聞くとトンと体積のどちらを答えるかが受領書ごとに変わるため、どちらが取れたかで単位を決めます。
受け取った答えに対して、プログラムの側で次の決まりを当てます。これが実質的な「指示」です。
【答えの扱いの決まり】
1. 答えが空の項目は not_found とする。発注の値で埋めない。
2. 信頼度が決めた値を下回る項目は unreadable とし、値は参考として残す。
3. 答えの文字列が全文の行のどこにあるかを探し、見つからなければ ambiguous とする。
4. SULPHUR は「%」「% m/m」などの記号を外して数値にする。
数値にできなければ unreadable とする。0.5 と 0.50 は同じ値として扱う。
5. DENSITY_15C は kg/m3 を基準にそろえる。
値が 1 前後なら g/ml、900〜1,010 前後なら kg/m3 とみなし、
どちらにも当たらなければ unit_unknown とする。
6. QTY_MT と QTY_M3 がどちらも空なら、TABLES の表から数量の列を探す。
それでも見つからなければ not_found とする。
7. VESSEL_NAME と IMO_NUMBER は発注の行と照らし、合わなければ mismatch とする。
船名の表記ゆれ(前置きの「M/V」「MV」の有無)は外してから比べる。
8. 日付は日・月の順の書き方と月・日の順の書き方の両方がありうる。
日が12以下で両方に読めるときは ambiguous とし、発注の予定日で決めない。
8番目は解釈の罠です。 「03/04」は3月4日とも4月3日とも読め、発注の予定日に近いほうを選ぶと、外れたときに誰も気づきません。
出力形式を固定する
読み取りと判定の結果を、次の形のJSONにまとめて台帳へ渡します。
{
"bdn_id": "VESSELA_2026-10-12_BDN",
"order_ref": "BO-2026-1041",
"fields": [
{ "item": "SULPHUR", "status": "ok | not_found | unreadable | ambiguous | unit_unknown | mismatch",
"value": "0.47", "unit": "% m/m", "confidence": 0, "page": 1 }
],
"quantity_check": {
"ordered_mt": 0, "bdn_mt": 0, "ship_measured_mt": 0,
"diff_bdn_vs_ship_mt": 0, "diff_rate": 0,
"result": "within | over_tolerance | waiting_ship_figure | cannot_check"
},
"sulphur_check": {
"bdn_value": 0, "applicable_limit": 0, "basis": "global | eca | scrubber",
"result": "within | over_limit | cannot_check"
},
"spec_check": { "product_match": "match | mismatch | cannot_check" },
"verdict": "confirm | review | urgent"
}
fields には第7章「プロンプトまたは指示内容の例」の別名ごとに1要素を並べます。fields は読み取りの層、quantity_check と sulphur_check は判定の層で、別々に持ちます。
分けておけば、判定の幅や航海計画が変わっても、読み取りをやり直さずに判定だけを引き直せます。 verdict は3段階です。
verdict | 条件 | 担当者の扱い |
|---|---|---|
confirm | 全項目が ok、数量の差が幅の内、硫黄分が上限の内 | 一覧で流し見て確定 |
review | unreadable・ambiguous・unit_unknown・mismatch のどれかがある、または計測待ち | 受領書の画像で確かめる |
urgent | 数量の差が幅の外、または硫黄分が上限を超える | 当日中に運航管理と相談する |
urgent を分けるのは、数量の差と硫黄分の超過には申し立てと燃料の使い方の判断に期限があるからです。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 受付フォルダ(S3) | 保存の通知で Lambda を起動 | 受領書と計測の報告の受け付け |
| AWS Textract | StartDocumentAnalysis と GetDocumentAnalysis | 受領書の読み取り |
| Amazon SNS | 完了の通知 | 読み取りの完了を Lambda に知らせる |
| 燃料台帳 | 読み取りと、「確認待ち」の行の書き込み | 発注の行を引き、判定つきの下書きの行を作る |
| 船舶一覧・航海計画 | 読み取りのみ | 排ガス洗浄装置の有無と、通る海域を引く |
| 担当者への連絡 | メールまたはチャット | urgent の行だけを即時に知らせる |
燃料台帳へ書くのは「確認待ち」の行まで、供給業者へは何も送りません。 確定と申し立ては担当者が行います。読み違いが自動で精算や申し立てまで流れる経路を作らないためです。
人が確認する
人が開くのは review と urgent の行だけです。 confirm の行は、一覧で船名・数量・硫黄分を流し見て確定します。全件を開く設計にすると、第10章の9.0時間には収まりません。
urgentを先に見る … 受領書の画像で、数量と硫黄分の数字を自分の目で読み直します。読み取りの誤りでurgentになっていないかを最初に確かめます- 数量の差の中身を確かめる … 本船の計測の時刻と温度、計算に使った密度を見ます。計測の条件が違うだけの差を、供給業者への申し立てにしないためです
- 硫黄分の基準を確かめる …
basisが正しいか、航海計画が最新かを見ます reviewの項目を直して確定する … 読み取りの値と直した値の両方を残します
例外に対処する
| 起きること | 対応 |
|---|---|
| パスワード付きのPDF | PDFは保護されていてはいけない。解除したものを本船に頼む |
| 写真が上限を超える | 非同期でも JPEG と PNG は10MB。縮小してから再投入 |
| 文字が小さすぎる | 高さ15ピクセルが下限。撮り直しを本船に頼み、それまでは review |
| 英語以外の受領書 | 質問は英語のみ。Azure AI Document Intelligence など別の読み取りに回す |
| 2種類の燃料を同時に補油した | 1枚に2行の表になる。表から油種ごとに行を分け、発注の行も2つ引く |
| 発注の行が見つからない | 船名と補油日で引けない。台帳の発注の行の作り忘れを先に疑う |
| 本船の計測の報告が来ない | waiting_ship_figure のまま台帳に置き、2日たったら担当者に知らせる |
| 読み取りが失敗した | 受付フォルダに残し、処理済みへ移すのは成功したときだけ |
上の3行が大半で、どれも本船での写し方の問題です。
記録を残す
- 受領書の元のファイルと、本船から届いた日時
- AWS Textract が返した結果の全文(JSON)と
JobId - そろえた後の値とそろえ方の記録、判定の結果とそのときの決まり・航海計画の版
- 担当者が直した項目と、直す前の値
- 供給業者ごとの
reviewの発生率と、数量の差の傾向
陸上に保存するのは写しです。 国土交通省の案内では、国際航海に従事する総トン数400トン以上の船舶は燃料油供給証明書を3年間、試料を燃料が消費されるまで(最低1年間)船舶内に備え置くとされています。
04実装レベルの3段階
最小構成は、確かめるための段階です。 半自動化で、1件36分が20分程度になります。 読み取りと写す作業は自動になりますが、発注のメールと本船の計測の報告を探して照らす作業が残ります。本格構成で9分になり、この段階が本記事の想定です。 差が大きいのは、別々のメールを探して数字をそろえる作業が、1件ずつの手作業だからです。 段階を飛ばさないでください。 半自動化の一覧を1か月見ると、読み取りの怪しい供給業者と報告の書式がそろわない船が先に分かります。
05工数削減シミュレーション
導入後 60件 × 9分 ÷ 60 = 9 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 外航の貨物船を数十隻運航し、補油が世界各地の港で毎月数十回ある運航会社・船舶管理会社。燃料受領書の写しが本船からメールで届き、燃料の担当者が1枚ずつ開いて燃料台帳と発注の記録に手で写している場合。数量の差の申し立てが遅れて、供給業者に取り合ってもらえなかった経験がある会社。低硫黄の燃料と高硫黄の燃料(排ガス洗浄装置を積む船向け)を船によって使い分けている会社。
- 運航する船が数隻で、補油が月に数回しかない場合。補油を用船者がすべて手配し、燃料受領書の確認も用船者が行う契約の場合。燃料受領書が英語以外の言語で発行される港が多い場合(AWS Textract は英・仏・独・伊・葡・西の6言語のみで、質問による抽出は英語のみ)。なお、燃料が規制に適合しているかの最終的な判断、供給業者への申し立ての可否、燃料の使用を止めるかの判断は、この構成では行いません。
07最小構成で試す方法
- 先月の受領書から20枚を選ぶ(供給業者が違うものを混ぜ、数量の差があったと分かっているものを入れる)
- AWS のコンソールで AWS Textract の文書分析を開き、1枚ずつ読み取らせる(質問に第7章の15問を入れる)
- 答えと信頼度を表に写し、当時の燃料台帳の値と見比べる
- 読めなかった項目と、取り違えた項目(体積をトンとして読んだなど)に印を付ける
- 本船の計測の報告と手で照らし、数量の差が当時と同じく出るかを見る
20枚は必ずやってください。 判定の規則を書く前に、「受領書の書式のばらつきを、質問で吸収できるか」を確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 質問の答えが当時の台帳の値と合った | S3 と Lambda の連携に進む |
| 数量の単位を取り違えた | 質問を分け直す。構成は有効 |
| 写真が読めず答えが空の枚数が多い | 本船の撮り方が先。 AIの問題ではない |
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 体積の数字がトンの列に入る | 質問をトンと体積に分け、単位が決まらないものは unit_unknown |
| 読めなかった硫黄分が発注の上限で埋まる | 補完を禁じ、空の項目は not_found のまま人に回す |
| 日付の日と月を取り違える | 両方に読めるものは ambiguous。発注の予定日で決めない |
| 写真が斜め・影で読めない | 撮り方を決めて全船に配る。スキャナーでPDFにしてもらう |
| 結果が取れなくなる | 非同期の結果は7日間。取ったらすぐ S3 に保存 |
| 日本語の受領書が混ざる | AWS Textract は日本語を読めない。別の読み取りに回す |
| 発注の行が引けない | 発注のたびに台帳に行を作る運用にする |
| 計測の条件の違いで差が出る | 本船の計測の時刻・温度・密度を一緒に記録し、確認で必ず見る |
| 航海計画が古いまま判定する | 航海計画の更新で判定を引き直す |
| 申し立てが自動で送られる | 送らない。 担当者が運航管理と相談して出す |
上の3行が、この構成の失敗のほとんどです。 どれも「数字は入っているのに、意味が違う」形で、読み取りの側で決めずに人に回せるかどうかで、運用に乗るかが決まります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 船名と船の位置(補油した港と日付)、燃料の数量と性状、供給業者との取引の内容、そして発注の記録にある燃料の単価と取引条件です。
- 読み取りに送るのは受領書だけにする … 発注の単価や取引条件は、受領書の読み取りに要りません。照合は Lambda の側で行い、AWS Textract に送るのは受領書の画像だけにします
- 結果の保管先を自社の S3 にする … 非同期の処理の結果は、既定では AWS Textract の側の領域に暗号化されて7日間保管されます。
OutputConfigで自社の S3 に出し、必要なら自社の鍵で暗号化します - 申し立ての連絡を自動で送らない … 出すのは判定までです。供給業者との関係と、次の補油に直接ひびきます
- この構成は規制への適合を判定しません … 燃料油の硫黄分の規制、受領書と試料の扱いは MARPOL 条約附属書VI と各国の法令に定めがあります。この構成が出すのは、受領書の数字と自社の基準の比較だけです。 規制に適合するか、燃料を使ってよいかの判断は、運航管理と船長・機関長が行います
- 燃料の品質の確認は受領書だけで終わらせない … 国土交通省が公表している燃料油購入者向けのベストプラクティスのガイダンス(仮訳)では、補油の過程で代表試料を採ること、試料を分析して契約の仕様に合うことを確かめることが推奨され、バージなどで少量の汚染が起きると0.10%の燃料は規制に適合しなくなるおそれがあるとされています。受領書の数字は供給業者の申告で、分析の結果ではありません
誤りが起きた場合のリスクは、差や超過を見落とすことと、差や超過でないものを申し立てることの2つです。 前者は読めなかった項目を埋めると起き、後者は計測の条件や単位を確かめないと起きます。どちらも「読めないものを読めないまま人に回す」設計で防ぎます。
10まず何から始めるか
1週目:燃料台帳に発注の行を作る運用に変える
発注を出したときに、船名・補油の予定日・港・供給業者・油種・数量・仕様を台帳に1行作る運用に変えます。受領書が届いたときに照らす相手を、先に用意しておくためです。あわせて、本船の計測の報告の書式をそろえる依頼を全船に出します。
2週目:20枚で試す
先月の受領書から20枚を選び、AWS のコンソールで質問つきの読み取りをさせます。体積をトンとして読んでいないか、読めなかった項目が空のまま返っているかを最優先で見ます。
3週目:判定の決まりを1つの表にする
数量の差をどこから「差あり」とするか、海域ごとの硫黄分の上限、密度の妥当な範囲を、燃料調達チームと運航管理で決めます。 ここが決まらないうちに仕組みを組むと、判定は出るのに誰も使えない状態になります。あわせて、本船に受領書の撮り方を配ります。
4週目:受付フォルダから読み取りまでをつなぐ
S3 への保存で Lambda を動かし、AWS Textract の非同期処理で読み、結果を一覧に書き出すところまで作ります。この時点では判定を出さず、fields の一覧だけを見ます。
2か月目: 発注の行と本船の計測値を引く処理を足し、数量の差の判定を出します。review と urgent の件数を毎週数えます。3か月目以降: 船の情報と航海計画を引いて硫黄分の判定を足し、1件36分が何分になったかを実測します。供給業者ごとの review の発生率と数量の差の傾向を見て、本船の撮り方と調達先の見直しにつなげた時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| 対応する形式が JPEG・PNG・PDF・TIFF で XFA 形式の PDF は不可なこと。同期の処理は10MB・PDFとTIFFは1ページまで、非同期は JPEG と PNG が10MB、PDF と TIFF が500MB・3,000ページまでであること。PDFはパスワード保護不可。平面内の回転に対応し、画像は各辺10,000ピクセル以下。質問は1ページあたり同期15問・非同期30問まで。対応言語が英・仏・独・伊・葡・西で、質問は英語の文書のみ、手書きは英語のみ。文字の高さの下限が15ピクセル(150 DPIで8ポイント相当) | AWS: Set Quotas in Amazon Textract | 2026-10-14 |
質問の答えが QUERY と QUERY_RESULT のブロックで返り、別名・信頼度・位置・答えの文字列を持ち、答えが無ければ空になること | AWS: Queries | 2026-10-14 |
非同期の処理が S3 の文書を対象に StartDocumentAnalysis で始まり、完了が SNS に通知され、GetDocumentAnalysis で結果を取ること。ClientRequestToken で同じ JobId が返ること。結果は既定で7日間保管され、OutputConfig で自社の S3 に出せること | AWS: Calling Amazon Textract Asynchronous Operations | 2026-10-14 |
| 船舶の燃料油の硫黄分濃度の上限を3.5%以下から0.5%以下とする規制の開始が2020年1月と決まったこと | 国土交通省: SOx規制への対応について | 2026-10-14 |
| 北海・バルト海で2015年から硫黄分濃度0.1%以下の規制が先行していること(一般海域は2020年から0.5%以下) | 国土交通省: 北海・バルト海におけるSOx規制強化対応調査結果 | 2026-10-14 |
| 燃料油購入者が供給される燃料油を正しく指定する責任を負うこと。発注数量は通常メートルトンで表し、使用単位を明記すべきこと。供給業者が MARPOL 条約附属書VI 第18規則に従い BDN を提供し、付録Vの要件を含めるべきこと。補油の過程で代表試料を採り、分析で仕様への適合を確かめることが推奨されること。少量の汚染で0.10%の燃料が不適合になりうること | 国土交通省: 燃料油購入者/使用者向けベストプラクティスに関するガイダンス(仮訳) | 2026-10-14 |
| 国際航海に従事する総トン数400トン以上の船舶が、燃料油供給証明書を3年間、試料を燃料が消費されるまで(最低1年間)船舶内に備え置くこと(平成17年の規制開始時の案内。同ページの硫黄分の上限の数字は当時のもので、現在の規制値ではない) | 国土交通省: 船舶からの大気汚染防止規制の導入について | 2026-10-14 |
燃料が規制に適合するか、燃料を使ってよいか、供給業者に申し立てるかは、運航管理と船長・機関長、必要に応じて船級協会や旗国の当局に確かめて決めてください。 本記事は上記の公開情報で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1514)についてのご相談はこちらから。
