漁協の産地市場で手書きされる水揚げ伝票を読み取り、魚種・数量・規格・買受人を水揚げの台帳にそろえて、仕切りの計算の元データを作る
産地市場の入札・セリのたびに手書きされる水揚げ伝票を読み取り、出荷者・魚種・規格・数量・単価・買受人を水揚げの台帳の項目にそろえます。マスタとの照合と金額の検算で確認の要る行を拾い、仕切りと請求の元データにします。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- Azure AI/Google Document AI
- 連携・自動化
- Google Apps Script/Python
- 対象業界
- その他/商社
- 対象部門
- 経理
- 対象業務
- データ入力・転記/内容確認・チェック
- 主な課題
- 人手が足りない/入力作業が多い/確認ミスが多い
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 入力漏れ削減/対応スピード向上/工数削減
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 入札・セリの終わった伝票を、市場の職員が事務所に持ち込む
- 販売課の職員が伝票を1枚ずつ見て、販売管理のシステムに出荷者・魚種・規格・数量・単価・買受人を打ち込む
- 魚種の書き方がコード表のどれに当たるかを判断し、分からなければ市場の職員に聞く
- 伝票に金額が書かれていれば、システムの計算と合っているかを見る
- 打ち込みが終わったら、日ごとの合計を伝票の束の合計と突き合わせる
- 販売管理のシステムで仕切書と請求書を作る
- 伝票の束を日付ごとに綴じて保管する
- 人入札・セリの終わった伝票を、事務所のスキャナで読み込むか、タブレットで撮る
- 自動画像の保存をきっかけに、OCRが伝票の表と見出しの欄と読み取りの信頼度を返す
- 自動生成AIが、表の列を台帳の項目(出荷者・魚種・規格・箱数・重さ・単価・金額・買受人)に対応づける
- 自動魚種の書き方を辞書で引き、引けないものは生成AIがコード表の候補を出す
- 自動組合員の番号と買受人の番号を、それぞれのマスタに照らす
- 自動数量×単価と金額を検算し、伝票の合計と行の合計を突き合わせる
- 自動特定の水産動植物に当たる魚種の行に印を付ける
- 人販売課の職員が、確認の要る行だけを伝票の画像と並べて直す
- 人確認の済んだ日の分を、販売管理のシステムに取り込む
- 人印の付いた行を、特定の魚種の担当者が確かめる
各工程の詳しい説明を読む
- 入札・セリの終わった伝票を、市場の職員が事務所に持ち込む
- 販売課の職員が伝票を1枚ずつ見て、販売管理のシステムに出荷者・魚種・規格・数量・単価・買受人を打ち込む
- 魚種の書き方がコード表のどれに当たるかを判断し、分からなければ市場の職員に聞く
- 伝票に金額が書かれていれば、システムの計算と合っているかを見る
- 打ち込みが終わったら、日ごとの合計を伝票の束の合計と突き合わせる
- 販売管理のシステムで仕切書と請求書を作る
- 伝票の束を日付ごとに綴じて保管する
(a)打ち直しが終わるまで、次の工程が止まる。 水揚げの多い日は伝票が百枚を超え、打ち込みが終わらないと、漁業者への仕切書も買受人への請求も作れません。 打ち込みは夕方から翌朝にかけて集中し、少ない人数で回しています。
(b)魚種の書き方を毎回判断している。 地方名や略字は、経験の長い職員なら見ればわかりますが、新しく入った職員は市場の職員に聞きに行くか、似たコードを選んでしまいます。 似たコードを選ぶと、仕切書の魚種と単価の相場が合わなくなります。
(c)数字の写し間違いが後で分かる。 箱数と重さの取り違え、単価の桁の打ち間違いは、漁業者や買受人から問い合わせが来て初めて分かることがあります。 直すには、伝票の束から該当の1枚を探し出すところから始まります。
(d)特定の魚種の記録が別の作業になっている。 アワビ・ナマコのように情報の伝達と取引記録が求められる魚種は、伝票とは別に担当者が記録を確かめていますが、どの伝票に含まれていたかを打ち込みのあとで探しています。
- 【人】 入札・セリの終わった伝票を、事務所のスキャナで読み込むか、タブレットで撮る
- 【自動】 画像の保存をきっかけに、OCRが伝票の表と見出しの欄と読み取りの信頼度を返す
- 【自動】 生成AIが、表の列を台帳の項目(出荷者・魚種・規格・箱数・重さ・単価・金額・買受人)に対応づける
- 【自動】 魚種の書き方を辞書で引き、引けないものは生成AIがコード表の候補を出す
- 【自動】 組合員の番号と買受人の番号を、それぞれのマスタに照らす
- 【自動】 数量×単価と金額を検算し、伝票の合計と行の合計を突き合わせる
- 【自動】 特定の水産動植物に当たる魚種の行に印を付ける
- 【人】 販売課の職員が、確認の要る行だけを伝票の画像と並べて直す
- 【人】 確認の済んだ日の分を、販売管理のシステムに取り込む
- 【人】 印の付いた行を、特定の魚種の担当者が確かめる
8番目で人が見るのは、確認の要る行だけです。 信頼度が低い欄、マスタに無い番号、検算の合わない行、辞書で引けなかった魚種に印が付き、それ以外の行は一覧で流し見て終わります。
9番目の取り込みは、人が行います。 販売管理のシステムへ自動で書き込むと、読み違いがそのまま仕切書と請求書に進みます。取り込む前に、日ごとの合計を伝票の束と突き合わせる手順を残します。
02今回想定するシステム構成
水揚げ伝票(手書き) │ 事務所のスキャナ/タブレットで撮影 ▼【トリガー】画像の保存 Python(取り込みの処理) ├──▶ 画像の向き・明るさ・解像度の確認 ▼ Google Document AI(Form Parser) │ 表(ヘッダの行と本体の行)、見出しの欄、読み取りの信頼度 ▼ Claude API(構造化出力)── 列と台帳の項目の対応づけ、魚種の候補 ▼ Python ── 魚種の辞書、組合員・買受人のマスタ、数量×単価と金額の検算、特定の魚種の印 ▼ 【販売課の職員が確認の要る行だけ直す】 ▼ 取り込み用のファイル → 販売管理のシステム(取り込みは人)
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | Google Document AI(Form Parser) | Azure AI Document Intelligence |
| 生成AI | Claude API(列の対応づけと魚種の候補) | OpenAI API、Gemini API |
| 連携 | Python(画像の受け取り、API の呼び出し、取り込み用ファイルの作成) | Google Apps Script |
| 差異計算 | Python(数量×単価と金額の検算、マスタとの照合) | Google Apps Script |
| 保管 | 社内のファイルサーバー(伝票の画像と読み取りの結果) | クラウドのストレージ |
販売管理のシステムには書き込みません。 この構成が出すのは、販売管理のシステムが受け付ける形式の取り込み用ファイルまでで、取り込むかどうかは人が決めます。 仕切書と請求書は、いまと同じく販売管理のシステムが作ります。
土台は Document AI の Form Parser です。 公式のプロセッサ一覧では、OCR のテキストに加えてキーと値のペア、チェックボックス、表を抽出するとされ、言語の一覧で日本語(ja)は手書きに対応する言語として示されています。伝票の上部の「日付」「市場」「船名」はキーと値のペアとして、明細の行は表として読めます。
処理する場所に、日本のリージョンはありません。 プロセッサ一覧では、Form Parser の対応リージョンは us・eu と、シンガポール(asia-southeast1)などの単一リージョンです。伝票には組合員の船名と番号、買受人の番号が書かれているので、国外で処理されることを組合の規程に照らして確かめます。
Form Parser は学習済みで、追加の学習はできないとされています。 また、一部の言語ではキーと値のペアの品質がラテン文字の言語より低い場合があるとされています。伝票の書式に合わせて精度を上げるのではなく、表として読んだ結果を、後段の対応づけと照合で補う設計にします。
03どうやって実装するのか
処理の起点を決める
伝票の画像がフォルダに保存されたことを起点にします。 入札・セリが終わるたびに市場の職員が事務所に伝票を持ち込み、販売課の職員がスキャナで読み込みます。市場の職員がタブレットで撮って送る形でも、同じフォルダに入れれば同じ処理に流れます。
1日1回まとめて動かす形にはしません。水揚げの多い日は伝票が順に届くので、届いたものから読み取っておけば、最後の伝票が届いたときには確認だけが残っています。 (a)の夕方から翌朝の集中を、ならすのが狙いです。
ファイル名には、市場の日付と入札・セリの回を入れます。同じ日の伝票を束として扱い、束の合計と突き合わせるためです。 処理が終わったものは処理済みのフォルダへ移し、移すのは成功したときだけにします。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 伝票の画像 | 1枚ずつの画像、市場の日付、入札・セリの回 | 事務所のスキャナ、タブレット |
| 読み取りの結果 | テキスト、表(ヘッダの行と本体の行)、見出しの欄、信頼度 | Google Document AI |
| 魚種の辞書 | 地方名・略字・書き癖と、魚種のコードの対応 | 販売課で整える一覧 |
| 組合員のマスタ | 組合員の番号、船名、氏名 | 販売管理のシステムの書き出し |
| 買受人のマスタ | 買受人の番号、名称、取引の状態 | 販売管理のシステムの書き出し |
| 特定の魚種の一覧 | 情報の伝達・取引記録の対象になる魚種と条件 | 水産庁の公表をもとに組合で整える一覧 |
質を決めるのは、魚種の辞書です。 (b)のように、伝票の魚種は標準の名前で書かれるとは限りません。辞書は、ベテランの職員が見ればわかる書き方を、最初に一覧にするところから始めます。
特定の魚種の一覧には、条件も書きます。 水産庁の説明では、太平洋クロマグロは30kg以上の大型魚、うなぎの稚魚は全長13cm以下が対象とされています。魚種の名前だけで印を付けると、対象でない大きさの行にまで印が付きます。
データの取得方法を決める
読み取りは、Python から Form Parser のプロセッサを呼ぶだけです。返ってくる Document の中から、表と見出しの欄と信頼度を取り出します。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 全テキスト | text | ほかの欄が startIndex・endIndex で指す原文 |
| 見出しの欄 | pages[].formFields(fieldName と fieldValue) | 日付・市場・船名 |
| 明細の表 | pages[].tables(headerRows と bodyRows) | 行ごとの魚種・規格・数量・単価・買受人 |
| 信頼度 | 各要素の信頼度 | 確認の要る欄の印 |
公式の説明では、text が認識されたテキストの元であり、ほかの欄は startIndex と endIndex でそれを指すとされています。表のセルの文字は、この位置から原文を引いて取ります。 また、表は headerRows と bodyRows に分かれ、表のセルは行や列をまたがないとされています。 伝票の見出しが2段になっている場合でも、セルは1つずつに分かれて返ってきます。
伝票の表の見出しの行が読めないこともあります。 見出しの行が薄い印刷だったり、手書きの列の見出しを略していたりすると、headerRows が空になります。その場合も、本体の行の並びは取れるので、列の対応づけは次の段の生成AIに任せます。
表のセルから文字を取り出す処理は、次のような形になります(要点だけ)。
def cell_text(document, cell):
# セルの layout.textAnchor が指す範囲を、document.text から切り出す
parts = []
for seg in cell.layout.text_anchor.text_segments:
parts.append(document.text[int(seg.start_index):int(seg.end_index)])
return "".join(parts).strip()
for page in document.pages:
for table in page.tables:
header = [[cell_text(document, c) for c in row.cells] for row in table.header_rows]
body = [[cell_text(document, c) for c in row.cells] for row in table.body_rows]
conf = [[c.layout.confidence for c in row.cells] for row in table.body_rows]
文字と信頼度を、セルごとに同じ並びで持っておくのが要点です。 後段で「この行の単価の欄は信頼度が低い」と印を付けるには、生成AIが対応づけた列と、OCR が返したセルの位置がずれないことが前提になります。
組合員と買受人のマスタは、販売管理のシステムから毎朝書き出したものを読みます。照合は番号で行い、名前では行いません。 名前で引くと、同じ名字の組合員を取り違えます。
AIへ渡す前に整形する
- 画像の向き … タブレットで撮った画像の傾きと向きを直します
- 明るさとコントラスト … 鉛筆の薄い線と水のにじみを読みやすくするため、明るさを整えます
- 解像度 … 細かい数字が潰れないよう、スキャナは事務所の既定より高い解像度に設定します
- 1枚1ファイル … 複数枚をまとめて読み込んだものは、ページで分けます
- 重複の検知 … 同じ日付・同じ回・同じ画像に近いものが二度入ったら、印を付けて止めます
- 見本との比較 … 伝票の書式が変わったときに気づけるよう、表の列の数がいつもと違うものに印を付けます
3番目を軽く見ないでください。 単価の欄は小さく、桁の区切りの点やカンマが読みにくい欄です。解像度が足りずに読めなかった数字は、書かれていないのか、読めなかったのかの区別がつきません。
AIに処理させる
生成AIにさせるのは2つだけです。 表の列を台帳の項目に対応づけること、辞書で引けなかった魚種の書き方にコード表の候補を出すことです。
| 見るもの | させること | 判断できないときの扱い |
|---|---|---|
| 表の列 | 各列が出荷者・魚種・規格・箱数・重さ・単価・金額・買受人のどれかを決める | 決められない列は unknown |
| 行の値 | セルの文字をそのまま項目に写す | 読めない文字は空にし、unreadable |
| 魚種の書き方(辞書に無いもの) | コード表から候補を3つまで出し、理由を書く | 候補が無ければ no_candidate |
| 規格の書き方 | 大きさ・入り数の書き方を、そのまま写す | 解釈はしない |
数字はプログラムの側で扱います。 生成AIは、セルに書かれた数字の文字を写すだけです。
| させないこと | 理由 |
|---|---|
| 数量・単価・金額の計算 | 検算はプログラムで行う。計算させると読み違いが埋まる |
| 読めない数字の補い | 前後の行や相場から推測した数字は、支払と請求の誤りになる |
| 魚種のコードの確定 | 候補までにし、人が選ぶ |
| 特定の魚種に当たるかの判断 | 一覧と条件で機械的に印を付け、担当者が確かめる |
| マスタに無い番号の書き換え | 似た番号に寄せない |
2行目がいちばん起きやすい失敗です。 単価の欄がにじんでいると、同じ魚種の前の行の単価で埋めたくなります。埋めた瞬間、読めなかったという事実が消え、誤った単価で仕切書が出ます。
指示内容を固定する
あなたは漁協の販売課で、水揚げ伝票の読み取り結果を台帳の形にそろえる担当です。
OCRが返した表だけを見てください。推測で埋めないでください。
【台帳の項目】
shipper_no(組合員の番号)、vessel(船名)、species_text(魚種の書き方)、
grade_text(規格の書き方)、boxes(箱数)、weight_kg(重さ)、
unit_price(単価)、amount(金額)、buyer_no(買受人の番号)
【厳守事項】
- 各列がどの項目に当たるかを column_map に書いてください。
決められない列は unknown にしてください。
- 行ごとに、セルの文字をそのまま写してください。
数字を計算しないでください。桁を補わないでください。
- 読めないセルは空にし、そのセルを unreadable_cells に入れてください。
前後の行の値や、ありそうな値で埋めないでください。
- 箱数と重さの列を取り違えないでください。
単位(箱、kg)が書かれていれば、それを根拠にしてください。
- 魚種は、伝票の書き方をそのまま species_text に写してください。
【辞書で引けなかった魚種】に当たる行だけ、コード表から候補を3つまで出し、
理由を書いてください。候補を確定させないでください。
- 規格は、伝票の書き方をそのまま写してください。解釈しないでください。
- 組合員の番号と買受人の番号は、書かれた文字のまま写してください。
似た番号に直さないでください。
【OCRの表】{tables}
【見出しの欄】{form_fields}
【辞書で引けなかった魚種】{unmatched_species}
【魚種のコード表】{species_codes}
「箱数と重さの列を取り違えない」を明記しているのは、(c)の型がいちばん多いからです。 どちらも数字だけの列で、見出しが読めないと区別がつきません。単位の文字を根拠にさせ、それでも決められなければ unknown にさせます。
魚種の候補を3つまでに限るのは、人が選ぶ手間を減らすためです。 候補が多すぎると、結局コード表を全部見ることになります。
出力形式を固定する
次の形のJSONで受け取ります。
{
"slip_id": "",
"market_date": "",
"session": "",
"column_map": [
{ "column_index": 0, "field": "shipper_no | vessel | species_text | grade_text | boxes | weight_kg | unit_price | amount | buyer_no | unknown" }
],
"rows": [
{ "row_index": 0, "shipper_no": "", "vessel": "", "species_text": "",
"grade_text": "", "boxes": "", "weight_kg": "", "unit_price": "",
"amount": "", "buyer_no": "" }
],
"unreadable_cells": [
{ "row_index": 0, "field": "" }
],
"species_candidates": [
{ "row_index": 0, "candidates": [ { "code": "", "reason": "" } ] }
]
}
数字の欄を文字列で受けるのは、意図してのことです。 数値の型で受けると、読み取った「1,2」のような崩れた文字が、どこかで数値に丸められます。文字のまま受け、プログラムで数字として読めるかを確かめてから数値にします。
Claude の構造化出力では、オブジェクトに additionalProperties: false を設定する必要があり、数値の minimum・maximum や文字列の長さの制約は使えないとされています。 範囲の確認はプログラムで行います。
後段の照合は、この出力に対して規則で行います。
| 照合 | 外れたとき |
|---|---|
| 数量×単価と金額が合う(伝票に金額がある場合) | 行に印を付け、人が伝票を見る |
| 行の金額の合計と伝票の合計が合う | 伝票ごと印を付ける |
| 組合員の番号が組合員のマスタにある | 行に印を付ける。似た番号に寄せない |
| 買受人の番号が買受人のマスタにあり、取引の状態が有効 | 行に印を付ける |
| 魚種の書き方が辞書で引ける | 候補を出し、人が選ぶ |
| 読み取りの信頼度が基準を下回る欄がある | 欄に印を付ける |
| 特定の魚種の一覧と条件に当たる | 担当者の確認の一覧に回す |
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 伝票の保存フォルダ | フォルダの監視 | 画像の保存を検知する |
| Google Document AI | API呼び出し | 表・見出しの欄・信頼度を返す |
| Claude API | API呼び出し | 列の対応づけと魚種の候補 |
| 組合員・買受人のマスタ | 毎朝の書き出しファイル | 番号の照合 |
| 確認画面 | 社内の Web 画面 | 確認の要る行を伝票の画像と並べる |
| 販売管理のシステム | 取り込み用ファイル | 確認の済んだ日の分を人が取り込む |
販売管理のシステムへは、取り込み用のファイルを渡すだけです。 システムが受け付けるファイルの形式に合わせて列を並べ、取り込みの操作は販売課の職員が行います。 取り込み用のファイルを作る前に、日ごとの合計を伝票の束の合計と突き合わせます。
人が確認する
人が見るのは、印の付いた行と伝票だけです。
- 伝票の合計が合わないものを先に見る … 行の読み違いか、行の抜けかを伝票の画像で確かめます
- 数字の欄を確かめる … 信頼度の低い欄と検算の合わない行を、画像と並べて直します
- 魚種の候補を選ぶ … 選んだ書き方は、確認画面から辞書に足します
- マスタに無い番号を確かめる … 書き間違いか、マスタの登録漏れかを市場の職員に確かめます
- 日ごとの合計を突き合わせて取り込む … 伝票の束の合計と合えば、取り込み用のファイルを販売管理のシステムに取り込みます
3番目の辞書への追加が、この構成を育てます。 最初のうちは魚種の候補を選ぶ回数が多くても、同じ書き方は二度目から辞書で引けるようになります。
目標は、2,400枚をならして1枚1分です。 印の無い伝票は一覧で流し見て数秒、印の付いた伝票は画像を見て直すので数分かかります。
特定の魚種の行は、販売課とは別の担当者が見ます。 印の付いた行を一覧で受け取り、漁獲番号などの記載がそろっているか、取引記録に載せる必要があるかを確かめます。この一覧が打ち込みと同時にできるので、(d)の後から探す作業がなくなります。
例外に対処する
| 起きること | 対応 |
|---|---|
| 伝票がにじんで数字が読めない | unreadable。人が伝票の実物を見て直す |
| 表の見出しの行が読めない | 列の対応づけを生成AIに任せ、unknown の列は人が決める |
| 箱数と重さの列が決められない | unknown。人が伝票を見て決める |
| 伝票の合計が行の合計と合わない | 伝票ごと印を付け、行の抜けか読み違いかを確かめる |
| 組合員・買受人の番号がマスタに無い | 印を付け、市場の職員に確かめる。似た番号に寄せない |
| 1つの画像に複数の伝票 | ページで分けて読み直す。分けられないものは撮り直す |
| 伝票の書式が変わった | 列の数の違いで気づき、対応づけの結果を人が確かめる |
| 特定の魚種の大きさが伝票から分からない | 印を付けて担当者に回す。対象かどうかを決めつけない |
| Document AI が応答しない | フォルダに残し、職員がいまの手順で打ち込む |
上の3行が大半を占めます。 どれもAIの精度の問題というより、濡れた場所で書く伝票の性質と、スキャンの設定の問題です。 鉛筆を濃いものに替える、スキャナの解像度を上げるほうが、指示を直すより効きます。
記録を残す
- 伝票の画像と、市場の日付・入札・セリの回
- OCR が返した
Documentの全文(text、formFields、tables、信頼度) - 生成AIの出力(列の対応づけ、行の値、魚種の候補)
- 照合の結果(検算・マスタ・辞書・信頼度・特定の魚種)
- 人が直した欄の記録 … どの伝票の、どの行の、どの欄を、何から何に直したか
- 取り込み用のファイルと、取り込んだ日時・取り込んだ職員
人が直した欄の記録は、問い合わせへの答えになります。 漁業者や買受人から「数量が違う」と言われたとき、伝票の画像・読み取りの結果・直した記録が1か所でつながっていれば、伝票の束を探さずに済みます。
直した記録が多い欄は、書き方の相談の材料になります。 単価の欄の読み違いが続くなら、市場で使う伝票の欄を広げるほうが早く解決します。
04実装レベルの3段階
最小構成では枚数がさばけません。 1枚ずつ貼るので、月2,400枚には使えません。手書きの伝票が読めるかを確かめる段階です。 半自動化で、1枚3分が2分程度になります。 読み取りは自動になりますが、魚種とマスタの当てはめと、検算を人が行います。本格構成で1分になり、この段階が本記事の想定です。 差が大きいのは、照合と検算が自動になり、人が見るのが印の付いた行だけになるからです。 段階を飛ばさないでください。 半自動化の一覧を1か月見ると、辞書に足りない魚種の書き方と、読み違いの多い欄が見えます。そこを直してから本格構成に進むほうが、印の付く行が減ります。
05工数削減シミュレーション
導入後 2,400件 × 1分 ÷ 60 = 40 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 産地市場を運営し、入札・セリの結果を市場の職員が紙の水揚げ伝票に手書きして、事務所で販売管理のシステムに打ち直している漁協。1日に数十枚から百枚を超える伝票があり、打ち直しが終わるまで漁業者への仕切書と買受人への請求が出せない場合。魚種の書き方が地方名・略字・職員の癖でばらばらで、入力する職員がマスタのどれに当たるかを毎回判断している場合。
- 入札・セリの結果を、すでに端末やタブレットで電子的に記録している市場。伝票が1日に数枚で、打ち直しの手間が小さい場合。なお、単価や金額の正しさの判断、仕切書と請求書の確定、特定の水産動植物の情報伝達や取引記録の要否の判断は、この構成では代替できません。
07最小構成で試す方法
- 先月の水揚げ伝票から30枚を選ぶ(にじんだもの、地方名で書かれた魚種のあるもの、明細の多いものを入れる)
- その30枚について、販売管理のシステムに打ち込まれた値を書き出しておく
- 伝票の画像を、手元の生成AIの画面に1枚ずつ貼る
- 「この伝票の明細を、出荷者・魚種・規格・箱数・重さ・単価・金額・買受人の表にしてください。読めない欄は空にしてください。計算で埋めないでください」と指示する
- 出てきた表を、打ち込まれた値と1欄ずつ比べる
30枚は必ずやってください。 Form Parser とプログラムを組む前に、手書きの伝票が表として読めるのかを確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 打ち込まれた値とほぼ同じ表が出た | OCR の API と照合の処理に進む |
| 箱数と重さを取り違えた | 列の対応づけの指示で直る。構成は有効 |
| 読めない数字を前の行の値で埋めた | 指示と、後段の検算で止められる |
| 読めない伝票が多い | 伝票の書き方とスキャンの設定が先。 AIの問題ではない |
4行目が出ることは珍しくありません。 失敗ではなく、打ち込みに時間がかかっていた理由が1つ分かったということです。 鉛筆とスキャナの設定を変えて、同じ30枚を撮り直してみてください。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 読めない単価を前の行の値で埋める | 埋めることを禁じ、検算で印を付ける |
| 箱数と重さを取り違える | 単位の文字を根拠にさせ、決められなければ unknown |
| 魚種の地方名を似たコードに当てる | 辞書で決め、引けないものは候補までにして人が選ぶ |
| 組合員の番号を似た番号に寄せる | 番号で照合し、無ければ印。書き換えない |
| 数字を数値の型で受けて崩れが消える | 文字列で受け、プログラムで数値にする |
| 表の見出しの行が読めない | 本体の行の並びから対応づけ、unknown は人が決める |
| にじみと薄い鉛筆で読めない | 鉛筆とスキャナの設定を見直す |
| 特定の魚種に名前だけで印を付ける | 大きさなどの条件も一覧に持たせる |
| 国外で処理されることを確かめていない | 日本のリージョンは無い。 組合の規程に照らす |
| 販売管理のシステムに自動で書き込む | 取り込み用のファイルまでにし、取り込みは人 |
| 辞書への追加が人によって違う | 追加は確認画面から行い、追加した人を記録する |
上の2行が、この構成でいちばん重い失敗です。 どちらも、誤った数字がそのまま仕切書と請求書に進む経路です。読めなかったことを読めなかったとして残し、検算で必ず止めます。
最後の行も早く効いてきます。 辞書は全員で育てるものなので、誤った対応が1つ入ると、以後その書き方は全部誤ったコードで引かれます。 追加した人と日時を残し、月に一度、追加された対応をベテランの職員が見直します。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 伝票に書かれた組合員の船名と番号、買受人の番号、魚種・数量・単価・金額です。組合員ごとの水揚げの金額は、組合員の収入に直結する情報です。
- 処理の場所を確かめる … Form Parser の対応リージョンに日本はありません。
us・euかシンガポールなどから選びます。組合員の情報が国外で処理されることを、組合の個人情報の取り扱いの規程と、組合員への説明に照らして確かめます - 生成AIに渡す範囲を絞る … 生成AIには表と見出しの欄だけを渡し、組合員のマスタは渡しません。照合は Python の側で行います
- 数字を確定させない … 単価と金額は、漁業者への支払と買受人への請求に直結します。検算の合わない行と読めない欄は、人が伝票の実物を見て直します
- 販売管理のシステムに書き込まない … 取り込みは人が行い、取り込む前に日ごとの合計を伝票の束と突き合わせます
- 特定の水産動植物の判断を代替しない … 水産庁の説明では、アワビ・ナマコ・うなぎの稚魚(全長13cm以下)・太平洋クロマグロの大型魚(30kg以上)は、取扱事業者間の情報の伝達と取引記録の作成・保存が求められる対象です。この構成が付けるのは印までで、情報の伝達と記録の要否は担当者が確かめます
- 伝票の原本の扱いを決める … 画像を残すようになっても、紙の伝票をいつまで綴じて残すかは組合の規程で決めます
誤りが起きた場合のリスクは、誤った数字で仕切書や請求書を出すことと、特定の魚種の記録が漏れることの2つです。前者は検算と人の確認で、後者は一覧と条件による印で、打ち込みと同時に担当者へ回すことで防ぎます。
10まず何から始めるか
1週目:魚種の辞書を作る
ベテランの職員に、伝票でよく見る魚種の書き方(地方名・略字・書き癖)を挙げてもらい、魚種のコードとの対応を一覧にします。過去の伝票の束から、打ち込みで迷った書き方を拾うと早く集まります。
2週目:30枚で試す
先月の伝票から30枚を選び、最小構成で明細の表にさせて、打ち込まれた値と比べます。読めない数字を埋めていないか、箱数と重さを取り違えていないかを最優先で見ます。
3週目:伝票の書き方とスキャンを見直す
読めない伝票が多ければ、鉛筆の濃さ、伝票の欄の広さ、スキャナの解像度を見直します。あわせて、特定の魚種の一覧と条件を作ります。
4週目:Form Parser から一覧までをつなぐ
伝票の画像を保存すると Form Parser が動き、明細を一覧に書き出すところまで作ります。この時点では照合を入れず、読み取りの結果だけを見ます。
2か月目: 列の対応づけ、魚種の辞書、マスタとの照合、検算を足し、確認画面で印の付いた行だけを直す運用にします。3か月目以降: 取り込み用のファイルの作成と特定の魚種の一覧を足し、1枚3分が何分になったかを実測します。魚種の候補を選ぶ回数が月を追って減り、辞書が育っていることを確かめた時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
Form Parser が OCR のテキストに加えてキーと値のペア、チェックボックス、表を抽出すること。言語の一覧で日本語(ja)が手書きに対応する言語として示されていること(原文の HTML で確認)。Form Parser の対応リージョンが us・eu・asia-southeast1 などで、日本のリージョンが無いこと。同期の要求のページ数の上限が15であること | Google Cloud: Processor list | 2026-10-14 |
| Form Parser が学習済みで追加の学習ができないこと。一部の言語ではキーと値のペアの品質がラテン文字の言語より低い場合があること | Google Cloud: Form Parser | 2026-10-14 |
text が認識されたテキストの元であり、ほかの欄が startIndex・endIndex で指すこと。formFields が fieldName と fieldValue を持つこと。表が headerRows と bodyRows に分かれ、セルが行や列をまたがないこと | Google Cloud: Handle the processing response | 2026-10-14 |
構造化出力が output_config.format に JSON スキーマを指定して有効になること。オブジェクトに additionalProperties: false が必要なこと。数値の minimum・maximum や文字列の minLength・maxLength が非対応であること | Claude Docs: Structured outputs | 2026-10-14 |
| 特定第一種水産動植物等にアワビ・ナマコ・うなぎの稚魚(全長13cm以下)・太平洋クロマグロの大型魚(30kg以上)が示されていること。取扱事業者間の情報の伝達、取引記録の作成と保存が義務付けられていること。改正法が令和8年4月1日に施行されること | 水産庁: 特定水産動植物等の国内流通の適正化等に関する法律 | 2026-10-14 |
単価・金額の正しさ、仕切書と請求書の確定、特定の水産動植物の情報の伝達と取引記録の要否は、組合の担当者が確かめて判断してください。 本記事は、上記の公開情報で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1505)についてのご相談はこちらから。
