海運の運航会社が、代理店から届く英文の荷役記録(Statement of Facts)を読み取り、着岸・荷役・中断の時刻を並べて、停泊期間の超過(デマレージ)と早出料の試算に回す
代理店から届く英文の荷役記録(Statement of Facts)を読み取り、到着・荷役準備完了通知・着岸・荷役・中断の時刻を出来事の一覧に並べます。中断の理由を区分に分け、傭船契約の条件に沿ったタイムシートの下書きと、デマレージ・早出料の試算を運航担当に回します。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- AWS Textract/Azure AI/Google Document AI
- 連携・自動化
- Python
- 対象業界
- 商社/物流/製造
- 対象部門
- 物流
- 対象業務
- データ入力・転記/集計・分析
- 主な課題
- 入力作業が多い/属人化している/確認ミスが多い
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 入力漏れ削減/属人化解消/工数削減
- 導入難易度
- ★★★★☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 必須
01導入前 / 導入後の業務フロー
- 代理店から届いた荷役記録のPDFを、航海ごとのフォルダに保存する
- 荷役記録を開き、出来事と日時をタイムシートのひな形に1行ずつ写す
- 中断の行を読み、雨・本船の故障・陸側の都合・移動・日曜祝日などに分ける
- 傭船契約の条件の一覧を見て、差し引く時間と数える時間を決める
- 許容される停泊期間と実際に使った時間を比べ、デマレージか早出料かを出す
- 船主・傭船者・荷主のどれかから届いたタイムシートと突き合わせ、違う行を確かめる
- 人運航担当が、届いた荷役記録のPDFを航海ごとの受け取りの場所(Amazon S3)に保存する
- 自動保存をきっかけに、AWS Textract が表と項目の読み取りを非同期で始める
- 自動プログラムが表のセルから「日付・開始・終了・出来事・備考」の行を組み立て、日時に直す
- 自動Claude API が、各行の出来事を決められた区分に当てはめ、中断の理由を分け、根拠の文を写す
- 自動プログラムが時刻の抜け・重なり・前後の逆転を確かめる
- 自動プログラムが、傭船契約の条件の一覧から計算の規則を選び、タイムシートの下書きとデマレージ・早出料の試算を出す
- 人運航担当が、区分が `unclear` の行と確かめる点を先に見て、下書きを直す
- 人相手のタイムシートが届いたら、行ごとの違いの一覧を見て、精算の交渉に使う
各工程の詳しい説明を読む
- 代理店から届いた荷役記録のPDFを、航海ごとのフォルダに保存する
- 荷役記録を開き、出来事と日時をタイムシートのひな形に1行ずつ写す
- 中断の行を読み、雨・本船の故障・陸側の都合・移動・日曜祝日などに分ける
- 傭船契約の条件の一覧を見て、差し引く時間と数える時間を決める
- 許容される停泊期間と実際に使った時間を比べ、デマレージか早出料かを出す
- 船主・傭船者・荷主のどれかから届いたタイムシートと突き合わせ、違う行を確かめる
(a)写すだけで時間がかかる。 1寄港で数十行の日時を写します。「0800-1130 rain」「1130-1400 resumed」のような行が続き、1行ずれると後ろの計算がすべてずれます。 日付が変わる行、24時と0時の書き方、現地時刻の表記にも気を配る必要があります。
(b)中断の分け方が担当者で違う。 「stopped due to shore conveyor breakdown」は陸側の都合、「ship's crane No.2 out of order」は本船の都合です。ところが「awaiting cargo」「waiting for documents」のように、どちらの責任か文だけでは決めにくい行があります。 経験の長い担当者は代理店の書き方の癖まで知っていますが、その知識は担当者の頭の中にしかありません。
(c)計算の根拠を説明できない。 相手のタイムシートと合わないとき、どの行をどの理由で差し引いたかがタイムシートに残っていないことがあります。表計算のひな形には時間の数字しか残らず、半年後に精算の交渉が続いているとき、当時の判断を思い出せません。
(d)時刻の抜けと重なりに気づきにくい。 荷役の中断の終了時刻が書かれていない行、2つの中断が重なっている行は、目で写しているうちは見落とします。 そのまま計算すると、差し引く時間が多すぎたり少なすぎたりします。
- 【人】 運航担当が、届いた荷役記録のPDFを航海ごとの受け取りの場所(Amazon S3)に保存する
- 【自動】 保存をきっかけに、AWS Textract が表と項目の読み取りを非同期で始める
- 【自動】 プログラムが表のセルから「日付・開始・終了・出来事・備考」の行を組み立て、日時に直す
- 【自動】 Claude API が、各行の出来事を決められた区分に当てはめ、中断の理由を分け、根拠の文を写す
- 【自動】 プログラムが時刻の抜け・重なり・前後の逆転を確かめる
- 【自動】 プログラムが、傭船契約の条件の一覧から計算の規則を選び、タイムシートの下書きとデマレージ・早出料の試算を出す
- 【人】 運航担当が、区分が
unclearの行と確かめる点を先に見て、下書きを直す - 【人】 相手のタイムシートが届いたら、行ごとの違いの一覧を見て、精算の交渉に使う
4番目と6番目を分けているのが、この設計の分かれ目です。 中断の理由を区分に分けるのは言葉を扱う作業で、規則では書き切れません。一方、その区分を停泊期間から差し引くかは、傭船契約の条件の問題です。 AIには区分までをさせ、差し引くかは計算の規則で決めます。区分を後から直しても、計算をやり直すだけで済みます。
6番目で計算の規則を「選ぶ」のは、同じ言葉でも契約によって数え方が違うからです。 BIMCO などがまとめた停泊期間の定義集(Laytime Definitions for Charter Parties 2013)では、天候の悪い時間の差し引き方だけでも複数の定義があり、しかもその定義が適用されるのは傭船契約に明示的に取り込まれたときだけとされています。
02今回想定するシステム構成
荷役記録(英文のPDF。代理店からメールで届く) │ 運航担当が航海ごとの場所へ保存 ▼【トリガー】Amazon S3 への保存 AWS Lambda ── StartDocumentAnalysis(FeatureTypes:TABLES、FORMS、QUERIES) ▼ AWS Textract(非同期の文書分析)── 完了の通知(Amazon SNS) ▼ AWS Lambda ── GetDocumentAnalysis ├──▶ Python:表のセルから出来事の行を組み立て、日時に直す ├──▶ Claude API:行ごとの出来事の区分と中断の理由(根拠の文付き) ├──▶ Python:時刻の抜け・重なりの確認 └──▶ Python:傭船契約の条件で停泊期間を計算し、タイムシートの下書きを作る ▼ タイムシートの下書きと確認事項の一覧(運航担当が確認) ▼ 精算の記録/相手のタイムシートとの行ごとの比較
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | AWS Textract(StartDocumentAnalysis/GetDocumentAnalysis。TABLES・FORMS・QUERIES) | Azure AI Document Intelligence、Google Document AI |
| 生成AI | Claude API(出来事の区分と中断の理由の当てはめ) | OpenAI API、Gemini API |
| 差異計算 | Python(日時の組み立て、抜け・重なりの確認、停泊期間の計算) | 停泊期間の計算の専用の仕組み |
| 連携 | AWS Lambda(保存と完了の通知を起点に処理を動かす) | AWS Step Functions |
| 保管 | Amazon S3(荷役記録の原本、読み取り結果、確認の記録) | 社内のファイルサーバー |
土台は、AWS Textract の表の読み取りです。 荷役記録の多くは「Date/From/To/Description/Remarks」の列を持つ表で、行と列の位置関係が崩れると時刻と出来事の対応が取れなくなります。 Textract の表の機能は、セルごとに行の番号と列の番号を返し、列の見出しのセルや表の題名・脚注も区別して返すとされています。ページをまたぐ表があるので、非同期の StartDocumentAnalysis を使います。
Textract を選べるのは、荷役記録が英文だからです。 公式の対応言語は英語・フランス語・ドイツ語・イタリア語・ポルトガル語・スペイン語で、手書きは英語だけ、問い合わせ(クエリ)は英語の文書でだけ使えます。南米の港でスペイン語と英語が併記された荷役記録も、英語の部分を使えば読めます。
運航管理の仕組みには書き込みません。 タイムシートの下書きは、運航担当が確かめてから精算の記録に登録します。
03どうやって実装するのか
処理の起点を決める
航海ごとの受け取りの場所(S3 のフォルダ)にPDFが保存されたことを起点にします。 フォルダは sof/<航海番号>/<港の区分:load|disch>/ の形にし、どの航海・どの港の荷役記録かを、保存した場所で決めます。 荷役記録の本船名と港名から航海を探すと、同じ本船の前後の航海や、同じ港に続けて寄った航海と取り違えます。
読み取りを始めるとき、ClientRequestToken に「航海番号+港の区分+受領日」を入れます。 公式のページでは、同じトークンで StartDocumentAnalysis を呼ぶと同じ JobId が返り、同じジョブを誤って二度始めるのを防げるとされています。代理店が同じ荷役記録を2回送ってきても、読み取りは1回で済みます。
完了は Amazon SNS の通知で受け、JobTag に入れた航海番号でどの航海かを知ります。 JobId は7日間だけ有効なので、結果は受け取ったその場で S3 に保存します。
船長の署名のある版と、署名の無い速報の版が別々に届くことがあります。 速報の版でも下書きは作りますが、署名のある版が届いたら作り直し、2つの版の違いを確認事項に出します。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 荷役記録 | 本船名、港、貨物と数量、出来事ごとの日付・開始・終了・内容・備考、船長と代理店の署名、但し書き | 代理店から届くPDF |
| 読み取り結果 | 表のセル(行・列・見出し)、キーと値の組、問い合わせの答え、行と単語、信頼度 | AWS Textract |
| 傭船契約の条件 | 1日あたりの荷役量または停泊期間の日数、日曜・祝日の扱い、天候の扱い(どの定義か)、NORの後の猶予時間、除外の条項、デマレージと早出料の1日あたりの額、早出料の数え方、積み揚げの合算や相殺の有無 | 傭船の担当者が契約から書き出した条件の一覧 |
| 港の暦 | その港の現地の祝日、時差 | 自社で用意する港ごとの表 |
| 区分の表 | 出来事の区分と中断の理由の区分の一覧と、その説明 | 自社で用意する表 |
質を決めるのは、傭船契約の条件の一覧です。 「天候の悪い日を除く」とだけ書かれていると、計算の規則を選べません。定義集のどの定義に当たるか(たとえば Weather Working Day、Weather Working Day of 24 Consecutive Hours、Weather Working Day of 24 Hours のどれか)まで、傭船の担当者が契約から書き出します。 書き出せない契約は、自動の計算を止めて人が計算します。
港の暦は、日曜・祝日を除く契約で使います。 定義集では、祝日を「現地の法律や慣行で通常の労働時間に通常は働かない日」としており、国や港で日が違うので、自社の暦では代わりになりません。
データの取得方法を決める
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 出来事の表 | TABLES の TABLE・CELL のブロック(行の番号・列の番号・列の見出し) | 日付・開始・終了・内容・備考の行の組み立て |
| 本船名・港・貨物・数量 | QUERIES の QUERY_RESULT、FORMS のキーと値の組 | 航海との照合、計算の数量 |
| NORの通知と受理の日時 | 表の行、QUERIES の QUERY_RESULT | 停泊期間の始まりの計算 |
| 署名と但し書き | 表の脚注、最後のページの LINE のブロック | 署名の有無、「under protest」などの但し書き |
| 表の外の文の記録 | LINE のブロック | 表になっていない荷役記録の行の組み立て |
表は、TABLE のブロックから CELL を行の番号・列の番号の順に並べて組み立てます。 公式のページでは、セルには行と列の位置が付き、列の見出しのセルには COLUMN_HEADER の印が付くとされています。見出しのセルの文字から、どの列が日付・開始・終了・内容・備考かを決めます。見出しの言い方は代理店ごとに違う(Date/Day、From/Commenced、To/Completed など)ので、言い換えの一覧を持ちます。
結合されたセルにも気を付けます。 同じ日の行が続くとき、日付の列が1つのセルに結合されていることがあります。公式のページでは、結合されたセルは MERGED_CELL として、どのセルを結合したかと一緒に返るとされています。結合されたセルの日付を、結合の範囲の行すべてに配ります。
問い合わせは、表の外にある項目だけに使います。
| 問い合わせ(Text) | Alias |
|---|---|
| What is the name of the vessel? | VESSEL |
| What is the name of the port? | PORT |
| What is the cargo and quantity? | CARGO_QTY |
| When was the notice of readiness tendered? | NOR_TENDERED |
| When was the notice of readiness accepted? | NOR_ACCEPTED |
結果は NextToken が返る限り GetDocumentAnalysis を呼び続け、全ページ分をそろえてから組み立てます。 公式のページでは、1回で返るブロックは最大1,000件とされ、数ページの荷役記録でも複数回に分かれます。
AIへ渡す前に整形する
- 形式の確認 … JPEG、PNG、PDF、TIFF のどれかであることを確かめます。XFA の形式のPDFとパスワードで保護されたPDFは扱えないとされています
- ページをまたぐ表のつなぎ … 次のページの表の列の見出しが同じなら、1つの表としてつなぎます
- 日時の組み立て … 日付の列が空の行には直前の日付を引き継ぎます。「2400」は翌日の「0000」に直し、終了が開始より前なら日をまたいだとみなして印を付けます
- 日付の順の決め方 … 月の名前で書かれたものはそのまま読み、数字だけの日付は代理店ごとの設定(日月年か月日年か)で読みます。設定の無い代理店で日が12以下のものは人に回します
- 現地時刻の確かめ … 荷役記録の時刻は現地時刻として扱い、港の表の時差を持たせます。「LT」「UTC」「GMT」と書かれた行があれば、そのとおりに印を付けます
- 手書きの追記の印 … 単語の TextType が手書きのものに印を付け、確認事項に出します
3番目と4番目を軽く見ないでください。 停泊期間は時間単位、デマレージは1日あたりの額を時間で按分することが多く、日付を1日取り違えると、請求額が1日分ずれます。 定義集でも、1日を24時間とし、1日に満たない部分は按分すると定めています。
AIに処理させる
させるのは、行ごとの出来事を区分に当てはめることだけです。 読み取りは Textract、日時と計算はプログラムが行います。
| させること | 中身 | できないときの扱い |
|---|---|---|
| 出来事の区分 | 行の内容を、到着・NORの通知・NORの受理・検疫の許可・錨泊・着岸・荷役の開始・荷役の終了・中断・再開・移動・喫水の検査・書類・出港・その他のどれかに当てはめる | 当てはまらなければ other |
| 中断の理由の区分 | 中断の行について、天候・本船・陸側・移動・日曜祝日・荷主側の書類や貨物の待ち・不明のどれかに当てはめる | 文から決められなければ unclear |
| 根拠の文 | 判断に使った行の文を、そのまま写す | 必ず埋める |
中断の理由の区分は、停泊期間から差し引くかの判断ではありません。 「本船のクレーンの故障」を ship に分けても、それを差し引くかは傭船契約の条項で決まります。AIの出力には「差し引く」「数える」という言葉を入れさせません。
| させないこと | 理由 |
|---|---|
| 時刻の計算と時間の合計 | プログラムが日時から計算する |
| 差し引くか数えるかの判断 | 傭船契約の条件で決まる |
| 責任がどちらにあるかの結論 | 精算の交渉で決まる。区分は文に書かれた事実まで |
| 抜けている時刻の補い | 前後の行から推して埋めない |
| 但し書きの解釈 | 「under protest」などはそのまま写し、人が読む |
3行目がいちばん起きやすい失敗です。 「awaiting cargo」をAIは荷主側の責任と書きがちですが、貨物が来ないのが陸側の設備の問題か、荷主の手配の問題かは、文だけでは決まりません。 指示で「文に書かれた理由の言葉で分け、責任を推し量らない」と縛り、迷えば unclear にさせます。
指示内容を固定する
あなたは不定期船の運航会社で、代理店から届いた荷役記録(Statement of Facts)の
行を整理する担当者を手伝います。
渡された「行の一覧(行番号・日付・開始・終了・内容・備考)」と「区分の表」だけを見てください。
【やること】
- 行ごとに、event_code を区分の表の中から1つ選んでください。
- event_code が stoppage の行には、stop_cause を次のどれかで付けてください。
weather ........ 雨・風・波など天候が理由と書かれている
ship ........... 本船の設備・乗組員が理由と書かれている
shore .......... 岸壁・荷役の設備・作業員など陸側が理由と書かれている
shifting ....... 別の岸壁や錨地への移動
holiday ........ 日曜・祝日・休みのため作業しないと書かれている
cargo_docs ..... 貨物や書類の到着を待っていると書かれている
unclear ........ 上のどれに当たるかを文から決められない
- evidence には、判断に使った内容と備考の文をそのまま写してください。
【厳守事項】
- 時刻を計算しないでください。開始と終了は渡された値のまま返してください。
- 終了の時刻が空の行を、次の行の時刻で埋めないでください。
- 差し引く・数える・請求できる、といった判断を書かないでください。
- 誰の責任かを推し量らないでください。
「awaiting cargo」は cargo_docs、理由の書かれていない「stopped」は unclear です。
- 迷ったときに weather や ship を選ばないでください。unclear にしてください。
- 備考に「under protest」「without prejudice」「not agreed」などがあれば、
remarks_flag に true を入れ、文をそのまま evidence に写してください。
「理由の書かれていない stopped は unclear」を例として書くのは、AIが前後の行から理由を補いがちだからです。 直前の行が雨なら、次の「stopped」も雨と書きます。前後から補った区分は、相手のタイムシートと合わなかったときに根拠を示せません。
cargo_docs を独立の区分にしているのは、ここが精算の交渉でいちばん争われるところだからです。 天候や本船の故障と混ぜると、後で行を探し直すことになります。
出力形式を固定する
区分は、Claude API の構造化出力で形を決めて受けます。 公式のページでは、output_config.format に JSON スキーマを渡すと、スキーマに合う JSON が返るとされ、正式提供の機能です。ただし、数値の minimum/maximum などの制約はスキーマに書けないとされているので、値の範囲はプログラムで確かめます。
{
"voyage_no": "V-2611",
"port_type": "disch",
"rows": [
{ "row_no": 14, "date": "2026-09-18", "from": "08:00", "to": "11:30",
"event_code": "stoppage", "stop_cause": "weather",
"evidence": "Stopped loading due to heavy rain", "remarks_flag": false },
{ "row_no": 15, "date": "2026-09-18", "from": "11:30", "to": "",
"event_code": "stoppage", "stop_cause": "unclear",
"evidence": "Stopped", "remarks_flag": false }
]
}
プログラムは、これに計算の結果を足してタイムシートの下書きにします。
{
"laytime_allowed_hours": 96.0,
"time_used_hours": 118.5,
"excluded": [ { "row_no": 14, "hours": 3.5, "rule": "weather_wwd24c" } ],
"result": "demurrage", "excess_hours": 22.5, "amount_usd": 0,
"checks": [ "row_15_missing_to", "nor_accepted_missing" ],
"rule_set": "CP-2611:SHEX/WWD24C/notice 6h"
}
1つ目の理由は、区分と計算を別の層に置けることです。 rows はAIが埋め、excluded はプログラムが傭船契約の条件で決めます。区分を1行直せば、計算はやり直すだけで済みます。
2つ目は、rule と rule_set で計算の根拠が残ることです。 どの行をどの規則で差し引いたかがタイムシートに残り、半年後の交渉でも説明できます。
checks | 決め方(プログラム) |
|---|---|
| missing_to | 終了の時刻が空の行がある |
| overlap | 2つの中断の時間が重なっている |
| order | 日時が前の行より前に戻っている |
| unclear_cause | stop_cause が unclear の行がある |
| nor_accepted_missing | NORの受理の行が無い |
| remarks | remarks_flag が true の行がある |
| version_diff | 署名のある版と速報の版で行が違う |
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| Amazon S3 | 保存の通知で Lambda を動かす | 航海と港をフォルダで決める |
| AWS Textract | StartDocumentAnalysis/GetDocumentAnalysis | 表のセル・キーと値の組・問い合わせの答え・行・信頼度 |
| Amazon SNS | 完了の通知 | JobTag で航海を知る |
| 傭船契約の条件の一覧 | 書き出したファイルを読む | 読み取りだけ |
| Claude API | API呼び出し(構造化出力) | 出来事の区分と中断の理由 |
| 運航担当 | 下書きと確認事項を共有の場所に置き、チャットで知らせる | 確認、修正、精算の記録への登録 |
傭船契約の条件の一覧には書き込みません。 条件を直すのは傭船の担当者で、運航担当が計算の都合で条件を書き換えると、契約と計算が食い違います。
運航管理の仕組みへの登録も人が行います。 下書きの数字がそのまま精算の金額になると、区分の誤りがそのまま請求に進みます。
人が確認する
運航担当が全件の下書きを見ます。 見る順を決めておきます。
checksのあるものを先に見る … 抜け・重なり・日付の取り違えを原本で確かめますunclearとcargo_docsの行を読む … 原本の文と備考を読み、必要なら代理店に問い合わせて区分を直しますremarksの行を読む … 但し書きの付いた行は、相手が争う意思を示した行です。 交渉の材料として印を残します- 計算の規則が契約と合っているかを見る …
rule_setが傭船契約の条件と合っているかを確かめます - 精算の記録に登録する … 請求や支払の連絡は運航担当と傭船の担当者が行います
例外に対処する
| 起きること | 対応 |
|---|---|
| パスワード付き・XFA のPDF | 読めない。代理店に送り直してもらう |
| 表として読めない(文だけの荷役記録) | LINE のブロックから行を組み立てる。組み立てられなければ人へ |
| 終了の時刻が空の行 | missing_to。補わず、原本と代理店に確かめる |
| 日付の順が決められない | 代理店ごとの設定が無い数字だけの日付は人へ |
| 傭船契約の条件が一覧に無い | 計算を止め、区分の一覧だけを出す |
| 署名のある版と速報の版が違う | version_diff。署名のある版を正とし、違う行を確認事項に出す |
| 英語以外だけで書かれた荷役記録 | 対応言語の外。人が写す |
5行目が、この構成で最も守りたいことです。 条件が分からないまま計算すると、それらしい数字が出て、そのまま交渉に使われます。 条件が無いときは数字を出しません。
記録を残す
- 荷役記録の原本と、保存した場所(航海・港・受領日・版)
- Textract が返した結果の全文と、組み立てた行の一覧
- AIの区分の結果(
rows)と根拠の文 - 運航担当が直した区分 … どの行を、どの区分から、どの区分に、なぜ直したか
- 計算に使った傭船契約の条件(
rule_set)と計算の結果 - 相手のタイムシートと、行ごとの違い
4つ目の直した記録は、指示と区分の表の改善に使います。 直しが多い代理店や言い回しが分かれば、区分の表の説明に足せます。
04実装レベルの3段階
半自動化で、1件40分が12分になり、この段階が本記事の想定です。 写す作業と時間の合計は無くなり、人は迷う行と計算の規則を確かめます。 本格構成は、精算の交渉が多い会社で検討します。 相手から届くタイムシートも同じ形で読み取れば、違う行だけを並べて交渉に入れます。 ただし、その前に区分の表と計算の規則を半年回して固めておく必要があります。
05工数削減シミュレーション
導入後 120件 × 12分 ÷ 60 = 24 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- ばら積み船や小型の一般貨物船を航海傭船・数量輸送契約で運航し、積み地・揚げ地の代理店から英文の荷役記録のPDFが毎月数十〜数百件届く運航会社・商社の物流部門。運航担当が荷役記録の時刻を表計算のタイムシートに手で写し、傭船契約の条件を思い出しながら中断の時間を差し引いている場合。担当者によって中断の扱いが違う、計算の根拠を後から説明できない、といったことが起きている場合。
- 寄港が月に数件で、目で写して足りる場合。定期船のコンテナ輸送のように停泊期間の計算が無い場合(コンテナの留置料の管理は別の題材です)。代理店から荷役記録が構造化されたデータで届き、読み取りが要らない場合。荷役記録が英語以外の言語だけで書かれている場合(この構成で使う読み取りのサービスは英語など6言語に対応します)。なお、どの中断を停泊期間から除くか、請求するか・応じるかの判断は、傭船契約の解釈として運航担当と傭船の担当者が行います。この構成は計算の下書きと確かめる点を出すまでです。
07最小構成で試す方法
- 精算が終わった過去の航海から、代理店の違う荷役記録を10件選ぶ(うち数件は、手書きの追記のあるものと、相手と争いになったものを入れる)
- AWS のコンソールで Textract の文書分析を開き、表の読み取りを有効にして読み取る
- 読み取った表を表計算に書き出し、当時のタイムシートの行と並べる
- 手元のAIサービスに、行の一覧と区分の表を貼り、中断の理由を区分に分けさせる
- 分けた結果を、当時の担当者が差し引いた行と比べる
比べるのは「区分」と「当時の判断」です。 区分が同じでも差し引いた・差し引かないが違うなら、それは計算の規則の問題で、AIの問題ではありません。
| 出てきた内容 | 判断 |
|---|---|
| 表が崩れずに読め、区分も当時の判断と合った | 計算の規則の組み立てに進む |
| ページをまたぐ表や結合されたセルで行がずれた | 組み立ての手順で直る。構成は有効 |
| AIが理由の無い中断に理由を補った | 指示の縛りで直す。構成は有効 |
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| ページをまたぐ表で行がずれる | 列の見出しでつなぎ、行数を原本と照らす |
| 結合された日付のセルで日付が抜ける | MERGED_CELL の範囲の行すべてに日付を配る |
| 2400 と 0000 で日がずれる | 2400 は翌日の 0000 に直す |
| AIが理由の無い中断に理由を補う | 「理由の無い stopped は unclear」と例を示して縛る |
| デマレージに入った後も天候で差し引く | 定義集では、デマレージは契約に明記が無い限り停泊期間の除外を受けない。規則で分ける |
| 早出料の数え方を取り違える | 「all working time saved」と「all time saved」を条件の一覧で分ける |
| 傭船契約の条件が「天候を除く」としか書かれていない | どの定義に当たるかを傭船の担当者が決めるまで計算しない |
5行目と6行目は、AIの問題ではなく規則の問題です。 定義集では、早出料を「節約した労働時間すべて」に払うときは除外の期間を除き、「節約した時間すべて」に払うときは除外の期間を含むとされています。同じ荷役記録でも、規則を取り違えると早出料が大きく変わります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 本船名・港・貨物と数量、荷役の経過、傭船契約の条件(デマレージと早出料の額)、船長と代理店の署名です。個人情報はほとんど含みませんが、傭船契約の条件は取引の条件そのものです。
- 生成AIに渡す範囲を絞る … 区分には、行の一覧と区分の表だけを渡します。デマレージの額や荷主の名前は渡しません
- 受け取りの場所の権限を絞る … S3 のフォルダは運航部と処理のプログラムだけが読めるようにし、結果は KMSKeyId を指定した暗号化で保存します
- 計算の結果をそのまま請求に使わない … 運航担当が確かめてから精算の記録に登録します
- 相手に送る連絡を自動にしない … 請求・支払・交渉の連絡は人が行います
- 区分を責任の判断として使わない … 区分は文に書かれた理由の整理で、責任の所在は傭船契約と交渉で決まります
誤りが起きた場合のリスクは、差し引くべき時間を数えて過大に請求することと、数えるべき時間を差し引いて請求を取り逃がすことの2つです。 どちらも区分か計算の規則の誤りから起きるので、区分は根拠の文を残し、規則は傭船契約の条件から選ぶ設計で防ぎます。
10まず何から始めるか
1週目:傭船契約の条件の一覧を整える
傭船の担当者と一緒に、よく使う契約の条件を、定義集のどの定義に当たるかまで書き出します。日曜・祝日の扱い、天候の数え方、NORの後の猶予時間、早出料の数え方を列にします。
2週目:10件で読み取りを試す
代理店の違う10件をコンソールで読み取り、当時のタイムシートの行と並べます。ページをまたぐ表と結合されたセルで行がずれないかを最優先で見ます。
3週目:区分を当時の判断と比べる
手元のAIサービスで10件の中断を区分に分け、当時の担当者の判断と比べます。理由の無い中断に理由を補っていないかを確かめ、指示を直します。
4週目:保存から下書きまでをつなぐ
保存を起点に読み取り、行を組み立て、区分を付け、抜けと重なりを確かめるところまで作ります。計算はよく使う条件の組み合わせ1つから始めます。
2か月目: 計算の規則を増やし、checks と unclear の件数を毎週数えます。3か月目以降: 1件40分が何分になったかを実測し、相手のタイムシートとの比較を足します。運航担当が替わっても同じ区分と規則で精算できるようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| 対応する形式が JPEG・PNG・PDF・TIFF で XFA の形式のPDFは扱えないこと。パスワードで保護されたPDFは扱えないこと。非同期でPDFは3,000ページまでであること。対応言語が英語・フランス語・ドイツ語・イタリア語・ポルトガル語・スペイン語で、手書きは英語だけであること。問い合わせは英語の文書だけで、非同期で1ページ30件までであること | AWS: Set Quotas in Amazon Textract | 2026-10-14 |
| StartDocumentAnalysis の FeatureTypes に TABLES・FORMS・QUERIES・SIGNATURES・LAYOUT があること。文書を S3 に置くこと。完了の状態が SNS に通知されること。ClientRequestToken で同じジョブの二重の開始を防げること。JobTag が通知に含まれること。KMSKeyId で結果を暗号化できること。JobId が7日間だけ有効であること | AWS: StartDocumentAnalysis | 2026-10-14 |
| GetDocumentAnalysis が表を TABLE と CELL、キーと値の組を KEY_VALUE_SET、問い合わせを QUERY と QUERY_RESULT、行と単語を LINE と WORD のブロックで返すこと。1回で返すのは最大1,000件で、NextToken でページを送ること | AWS: GetDocumentAnalysis | 2026-10-14 |
| 表のセルに行と列の位置が付くこと。列の見出しのセルに COLUMN_HEADER の印が付くこと。表の題名と脚注が TABLE_TITLE・TABLE_FOOTER で返ること。結合されたセルが MERGED_CELL で返ること | AWS: Tables(Amazon Textract) | 2026-10-14 |
output_config.format に JSON スキーマを渡すとスキーマに合う JSON が返ること。正式提供の機能であること。数値の minimum/maximum などの制約に対応しないこと | Claude Docs: Structured outputs | 2026-10-14 |
| 定義が傭船契約に明示的に取り込まれたときに適用されること。1日を24時間とし1日に満たない部分を按分すること。祝日・天候の悪い日の定義が複数あること(定義15〜17)。NORの定義。デマレージは契約に明記が無い限り停泊期間の除外を受けないこと。早出料の「all working time saved」と「all time saved」の違い | BIMCO ほか: Laytime Definitions for Charter Parties 2013 | 2026-10-14 |
どの中断を停泊期間から除くか、請求するか・応じるかは、傭船契約の解釈として運航担当と傭船の担当者が決めてください。 本記事は公開されている製品の仕様と資料で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1510)についてのご相談はこちらから。
