害虫防除の会社が食品工場で手書きするトラップの点検表を読み取り、トラップごとの捕獲数の推移をそろえて、顧客への月次報告の下書きに回す
技術者が食品工場の巡回で手書きするトラップの点検表を読み取り、トラップごと・虫の種類ごとの捕獲数を顧客の台帳にそろえます。前月までの推移と管理の水準に照らして確認の要るトラップを拾い、月次報告の下書きにします。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- Azure AI/Google Document AI
- 連携・自動化
- Google Apps Script/Python
- 対象業界
- その他/製造
- 対象部門
- 品質管理
- 対象業務
- データ入力・転記/書類作成
- 主な課題
- 人手が足りない/入力作業が多い/書類作成に時間がかかる
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 品質標準化/対応スピード向上/工数削減
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 技術者が巡回でトラップを点検し、点検表に捕獲数とトラップの状態を手書きする
- 巡回が終わると、点検表を事務所に持ち帰る
- 報告担当が、点検表を1枚ずつ見て、顧客ごとの推移の表にトラップごとの捕獲数を打ち込む
- 顧客のトラップ台帳と見比べて、点検表に出てこないトラップや、番号の違うトラップを探す
- 前月と比べて捕獲数の増えたトラップ、顧客と取り決めた水準を超えたトラップに印を付ける
- 推移の図と表を報告書の雛形に貼り、技術者に所見を書いてもらう
- 技術者が確かめた報告書を顧客に送る
- 人技術者が、いまと同じく点検表に手書きする。捕獲の無いトラップには「0」、見られなかったトラップには「×」を書く決まりにする
- 人巡回が終わったら、技術者がその場でスマートフォンで点検表を撮るか、事務所でスキャンする
- 自動画像の保存をきっかけに、OCRが表とチェック欄と上の欄と読み取りの信頼度を返す
- 自動生成AIが、表の列をトラップ番号・設置場所・虫の種類・状態に対応づけ、セルの文字のまま写す
- 自動顧客のトラップ台帳と照らし、未点検・台帳に無い番号・状態の変化を拾う
- 自動「0」「×」「空欄」「多数」などを決まりで値に分け、前月までの推移と管理の水準と比べる
- 自動推移の表と図を更新し、確認の要るトラップの一覧と、報告書の所見の下書きを作る
- 人報告担当が、確認の要る欄だけを点検表の画像と並べて直し、空欄は技術者に確かめる
- 人技術者が所見の下書きを直し、報告書を確かめる
- 人報告担当が報告書を顧客に送る
各工程の詳しい説明を読む
- 技術者が巡回でトラップを点検し、点検表に捕獲数とトラップの状態を手書きする
- 巡回が終わると、点検表を事務所に持ち帰る
- 報告担当が、点検表を1枚ずつ見て、顧客ごとの推移の表にトラップごとの捕獲数を打ち込む
- 顧客のトラップ台帳と見比べて、点検表に出てこないトラップや、番号の違うトラップを探す
- 前月と比べて捕獲数の増えたトラップ、顧客と取り決めた水準を超えたトラップに印を付ける
- 推移の図と表を報告書の雛形に貼り、技術者に所見を書いてもらう
- 技術者が確かめた報告書を顧客に送る
(a)報告書が巡回から遅れる。 打ち直しは巡回の戻りに合わせて毎週たまり、報告書が顧客に届くのが巡回から1〜2週間後になることがあります。 捕獲数が急に増えたトラップがあっても、顧客が知るのは次の巡回の直前です。
(b)「0」と空欄があいまい。 捕獲が無かったトラップに「0」を書く技術者と、何も書かない技術者がいます。打ち込む担当は、空欄を0として入れるか、技術者に聞きに行くかを毎回判断しています。
(c)台帳との照合が抜ける。 トラップの移設や紛失は、点検表の備考に書かれるか、書かれないこともあります。台帳と1基ずつ見比べないと、点検表に出てこないトラップに気づけません。
(d)所見の書き方が技術者ごとに違う。 同じ程度の増え方でも、「要注意」と書く人と「経過観察」と書く人がいます。顧客の品質管理の担当から見ると、どの報告書が重いのかが分かりにくくなっています。
- 【人】 技術者が、いまと同じく点検表に手書きする。捕獲の無いトラップには「0」、見られなかったトラップには「×」を書く決まりにする
- 【人】 巡回が終わったら、技術者がその場でスマートフォンで点検表を撮るか、事務所でスキャンする
- 【自動】 画像の保存をきっかけに、OCRが表とチェック欄と上の欄と読み取りの信頼度を返す
- 【自動】 生成AIが、表の列をトラップ番号・設置場所・虫の種類・状態に対応づけ、セルの文字のまま写す
- 【自動】 顧客のトラップ台帳と照らし、未点検・台帳に無い番号・状態の変化を拾う
- 【自動】 「0」「×」「空欄」「多数」などを決まりで値に分け、前月までの推移と管理の水準と比べる
- 【自動】 推移の表と図を更新し、確認の要るトラップの一覧と、報告書の所見の下書きを作る
- 【人】 報告担当が、確認の要る欄だけを点検表の画像と並べて直し、空欄は技術者に確かめる
- 【人】 技術者が所見の下書きを直し、報告書を確かめる
- 【人】 報告担当が報告書を顧客に送る
1番目の決まりが、この構成の前提です。 「0」と「×」を書き分けてもらえば、空欄は書き忘れだけになり、確認に回す理由がはっきりします。 決まりを守れなかった点検表も、空欄として拾えるので、仕組みが崩れることはありません。
9番目の所見は、技術者が書き直します。 生成AIの下書きは、推移の表から言える事実(どのトラップで、どの虫が、前月から何匹増えたか)だけを並べたものです。原因や対策は、現場を見た技術者が書きます。
02今回想定するシステム構成
トラップの点検表(手書き・区画ごとに1枚) │ 巡回の終わりに撮影/事務所でスキャン ▼【トリガー】画像の保存 Google Document AI(Form Parser) │ 表、表の中のチェック欄(✓/☐)、上の欄、読み取りの信頼度 ▼ OpenAI API(構造化出力)── 列とトラップの項目の対応づけ、セルの書き写し ▼ Python ── トラップ台帳との照合、「0」「×」「空欄」の値の決まり、前月比、管理の水準 ▼ 推移の表・図、確認の要るトラップの一覧 ▼ OpenAI API ── 所見の下書き(推移の表の事実だけ) ▼ 【報告担当が確認の要る欄を直す】→【技術者が所見を直す】→ 顧客へ
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | Google Document AI(Form Parser) | Azure AI Document Intelligence |
| 生成AI | OpenAI API(列の対応づけ、書き写し、所見の下書き) | Claude API、Gemini API |
| 連携 | Python(画像の受け取り、API の呼び出し、報告書の作成) | Google Apps Script |
| 集計 | Python(トラップ台帳との照合、前月比、管理の水準との比較) | Google Apps Script |
| 保管 | 社内のファイルサーバー(点検表の画像と読み取りの結果) | クラウドのストレージ |
顧客には、人が確かめた報告書だけを送ります。 下書きを自動で送る経路は作りません。報告書は、顧客の食品工場が衛生管理の記録として持つものだからです。
食品衛生法施行規則の別表第十七(一般的な衛生管理の基準)は、ねずみ及び昆虫対策として、一年に二回以上の駆除作業を実施して実施記録を一年間保存することを求めています。ただし、発生場所・生息場所・侵入経路・被害の状況について定期に、統一的に調査を実施し、その結果に基づき必要な措置を講ずるなどの方法で目的が達成できれば、施設の状況に応じた方法と頻度で実施できるとされています。毎月のトラップの点検と報告は、顧客がこの調査と記録を行うための材料になります。 顧客の衛生管理の計画として足りているかは、顧客が判断します。
土台は Document AI の Form Parser です。 公式の説明では、Form Parser はキーと値のペア、表、チェックボックスなどを抽出するとされ、プロセッサ一覧の言語表では日本語(ja)が手書きに対応する言語として示されています。表の中のチェックボックスは、JSON では ✓(チェックあり)や ☐(チェックなし)の Unicode の文字として現れるとされています。点検表の状態の欄(交換・破損・移動・紛失)は、この文字として受け取れます。
処理する場所に、日本のリージョンはありません。 Form Parser の対応リージョンは us・eu と、asia-southeast1(シンガポール)などの単一リージョンです。点検表には顧客の工場の区画と設置場所が書かれているので、国外で処理されることを顧客との契約の秘密保持の条項に照らして確かめます。
03どうやって実装するのか
処理の起点を決める
点検表の画像がフォルダに保存されたことを起点にします。 技術者が巡回の終わりにスマートフォンで撮るか、事務所に戻ってスキャンします。巡回の当日に撮ってもらえれば、その日のうちに推移の表ができ、(a)の報告の遅れが縮みます。
ファイル名には、顧客のコード、巡回の日付、区画を入れます。撮った人に入れてもらうのではなく、撮影用のアプリやフォルダの選択で自動的に付く形にします。 ファイル名の打ち間違いで、別の顧客の台帳と照合されるのを防ぐためです。
処理が終わったものは処理済みのフォルダへ移し、移すのは成功したときだけにします。 顧客ごとに、その月の巡回で戻るはずの区画の数が台帳から分かるので、区画の点検表がそろったかどうかも、報告書の前に確かめられます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 点検表の画像 | 区画ごとの1枚、顧客のコード、巡回の日付 | 技術者のスマートフォン、事務所のスキャナ |
| 読み取りの結果 | テキスト、表(ヘッダの行と本体の行)、チェック欄の文字、上の欄、信頼度 | Google Document AI |
| トラップ台帳 | 顧客・区画ごとのトラップ番号、設置場所、種類、設置日、状態 | 顧客ごとの表計算 |
| 虫の種類の列の定義 | 顧客の雛形ごとの列名と、報告書での虫の種類の名前 | 雛形の一覧 |
| 管理の水準 | 顧客と取り決めた、トラップの種類・虫の種類ごとの注意と対応の水準 | 契約の仕様書 |
| 前月までの推移 | トラップごと・虫の種類ごとの捕獲数の履歴 | 推移の表(このシステムが持つ) |
質を決めるのは、トラップ台帳です。 移設や新設を台帳に反映していないと、点検表の番号が「台帳に無い」と出続けます。台帳を更新する責任者を決め、点検表の備考に移設と書かれたら、その月のうちに台帳を直します。
管理の水準は、顧客ごとの取り決めです。 同じ1匹でも、包装の工程の近くのトラップと、倉庫の外周のトラップでは重みが違います。構成は水準の数字と比べるだけで、水準そのものは技術者と顧客が決めます。
データの取得方法を決める
読み取りは、Python から Form Parser のプロセッサを呼ぶだけです。返ってくる Document から、表と上の欄と信頼度を取り出します。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 全テキスト | text | ほかの欄が startIndex・endIndex で指す原文 |
| 上の欄 | pages[].formFields(fieldName と fieldValue) | 顧客名、区画、巡回の日付、技術者の名前 |
| トラップの行 | pages[].tables(headerRows と bodyRows) | トラップ番号、設置場所、虫の種類ごとの捕獲数 |
| 状態の欄 | 表のセルの文字(✓/☐) | 交換・破損・移動・紛失 |
| 信頼度 | 各要素の layout の信頼度 | 確認の要る欄の印 |
公式の説明では、text が認識されたテキストの唯一の元で、ほかの欄は startIndex と endIndex でその位置を指すとされています。表のセルの文字は、この位置から原文を引いて取り出します。 表は headerRows と bodyRows に分かれ、行や列をまたぐセルの無い表だけが対象とされています。
チェック欄は、セルの文字の中の ✓ と ☐ で見分けます。 表の外にあるチェックボックスは別の扱い(formFields の valueType が filled_checkbox か unfilled_checkbox)になるとされているので、点検表の雛形では、状態の欄を表の中の列に置いておきます。
トラップ台帳は、顧客ごとの表計算を毎朝読み込みます。照合はトラップ番号と区画の組で行います。 番号だけで引くと、区画ごとに1番から振っている顧客で取り違えます。
AIへ渡す前に整形する
- 画像の向きと傾き … スマートフォンで撮った画像の傾きを、紙の四隅で補正します
- 解像度 … 公式の説明では、スキャンは最低200dpi、300dpi以上で一般に最良の結果とされています。撮影の解像度はこれに相当する大きさにします
- ファイルの形式 … PDF、JPEG、PNG などで保存します。複数枚をまとめたPDFは区画ごとに分けます
- 雛形の判定 … 上の欄の顧客のコードから、どの雛形(虫の種類の列の並び)かを決めます
- 重複の検知 … 同じ顧客・同じ日付・同じ区画が二度入ったら、新しい方だけを使います
- 区画のそろいの確認 … 顧客の台帳にある区画の数と、その月に届いた点検表の数を比べます
4番目が、この題材に固有の前処理です。 虫の種類の列は顧客ごとに違うので、雛形が決まらないと、生成AIに渡す「項目の一覧」も決まりません。 顧客のコードが読めない点検表は、ファイル名の顧客のコードで補い、それも無ければ人に回します。
AIに処理させる
生成AIにさせるのは、読み取りの段で2つ、報告の段で1つです。
| 見るもの | させること | 判断できないときの扱い |
|---|---|---|
| 表の列 | 各列がトラップ番号・設置場所・トラップの種類・雛形の虫の種類・状態・備考のどれかを決める | 決められない列は unknown |
| 行の値 | セルの文字をそのまま写す。「0」「×」「多数」「30+」も文字のまま | 読めない文字は空にし、unreadable |
| 所見の下書き | 推移の表と照合の結果から、事実だけを短い文で並べる | 書ける事実が無ければ空 |
値の決まり、照合、比較はプログラムの側で行います。
| させないこと | 理由 |
|---|---|
| 空欄を「0」にする | 点検していないトラップが「捕獲なし」になる |
| 「多数」を数字にする | 数えていない数が報告書に載る |
| 虫の種類の読み替え | 雛形の列の名前のまま。同定は技術者が行う |
| 所見での原因や対策の記述 | 現場を見た技術者が書く |
| 管理の水準を超えたかの判断の言い換え | 比較はプログラムの結果をそのまま使う |
1行目がいちばん起きやすい失敗です。 捕獲数の列に数字が並んでいると、空欄を0とみなしたくなります。0とした瞬間、(b)の書き忘れが消え、見ていないトラップが「異常なし」として顧客に届きます。
指示内容を固定する
読み取りの段の指示です。
あなたは害虫防除の会社で、トラップの点検表の読み取り結果を台帳の形にそろえる担当です。
OCRが返した表と上の欄だけを見てください。推測で埋めないでください。
【台帳の項目】
trap_no(トラップ番号)、location(設置場所)、trap_type(トラップの種類)、
雛形の虫の種類の列:{species_columns}
status_replace(交換)、status_damaged(破損)、status_moved(移動)、
status_missing(紛失)、note(備考)
【厳守事項】
- 各列がどの項目に当たるかを column_map に書いてください。
決められない列は unknown にしてください。
- 行ごとに、セルの文字をそのまま写してください。
「0」「×」「多数」「30+」などは書かれたとおりに写し、数字に直さないでください。
- 空いているセルは空のまま写してください。0 にしないでください。
- 読めないセルは空にし、そのセルを unreadable_cells に入れてください。
- 状態の列は、✓ があれば "checked"、☐ だけなら "unchecked"、
どちらも無ければ空にしてください。
- 虫の種類は、雛形の列の名前のまま扱ってください。
備考に別の虫の名前が書かれていても、列を作らずに備考に写してください。
- トラップ番号は書かれた文字のまま写してください。似た番号に直さないでください。
【OCRの表】{tables}
【上の欄】{form_fields}
報告の段の指示です。
あなたは害虫防除の会社の報告担当です。次の【推移の表】と【照合の結果】だけを使って、
月次報告書の「今月の点検結果」の下書きを書いてください。
【厳守事項】
- 書くのは、表と結果から言える事実だけです。
例:「包装室のトラップ No.12 で、チョウバエが前月の2匹から9匹になりました」
- 原因、発生源、対策、薬剤の使用は書かないでください。
- 「危険」「問題なし」などの評価の言葉を使わないでください。
- 管理の水準を超えたトラップは、照合の結果の言葉のまま書いてください。
- 未点検のトラップと、捕獲数を数えていない「多数」の欄は、必ず書いてください。
【推移の表】{trend}
【照合の結果】{checks}
報告の段で「未点検と多数を必ず書く」を明記しているのは、下書きがきれいにまとまりたがるからです。 何も言わなければ、増えたトラップの話だけを書き、見ていないトラップや数えていない欄を省きます。 顧客にとっては、そちらのほうが知っておくべき事実です。
出力形式を固定する
読み取りの段は、次の形のJSONで受け取ります。
{
"sheet_id": "",
"customer_code": "",
"area": "",
"inspection_date": "",
"technician": "",
"column_map": [
{ "column_index": 0, "field": "" }
],
"rows": [
{ "row_index": 0, "trap_no": "", "location": "", "trap_type": "",
"counts": [ { "species": "", "text": "" } ],
"status_replace": "checked | unchecked | none",
"status_damaged": "checked | unchecked | none",
"status_moved": "checked | unchecked | none",
"status_missing": "checked | unchecked | none",
"note": "" }
],
"unreadable_cells": [
{ "row_index": 0, "field": "" }
]
}
捕獲数を文字列で受けるのは、意図してのことです。 数値の型で受けると、「×」「多数」「30+」が数値にできず落ちるか、どこかで0に丸められます。文字のまま受け、次の決まりでプログラムが値に分けます。
| 書かれた文字 | 値 | 報告書での扱い |
|---|---|---|
| 数字(0を含む) | その数 | 推移に載せる |
| 「×」 | not_inspected | 未点検として書く |
| 「多数」「30+」など | uncounted | 数えていない旨と、書かれた文字を書く |
| 空欄 | blank | 技術者に確かめる。確かめるまで報告書に載せない |
| 読めない | unreadable | 画像で確かめる |
決まりは、次のような短い処理で足ります(要点だけ)。
def count_value(text, unreadable):
t = text.strip().replace("0", "0")
if unreadable:
return ("unreadable", None)
if t == "":
return ("blank", None) # 0 にしない
if t in ("×", "x", "X"):
return ("not_inspected", None)
if t.isdigit():
return ("count", int(t))
return ("uncounted", t) # 「多数」「30+」は文字のまま残す
空欄を最初に分けておくのが要点です。 数字に変換できるかを先に試すと、空欄や「×」が例外として捨てられ、集計の段で0と同じ扱いになりがちです。
OpenAI API の構造化出力は、JSON スキーマに strict: true を付けて使い、すべての項目を required にし、オブジェクトには additionalProperties: false を必ず設定するとされています。 省略してよい項目は、null との組み合わせの型で表すとされています。この形なら、生成AIが項目を落としたり、雛形に無い項目を足したりすることを防げます。
後段の照合は、この出力に対して決まりで行います。
| 照合 | 外れたとき |
|---|---|
| トラップ番号と区画の組が台帳にある | 「台帳に無い番号」の印。移設か書き間違いかを技術者に確かめる |
| 台帳にあるトラップがすべて点検表に出てくる | 「未点検」の印 |
| 状態の「移動」「紛失」に ✓ がある | 台帳の更新の一覧に回す |
| 前月からの増え方が、顧客の取り決めの幅を超える | 「増加」の印 |
| 管理の水準を超える | 「水準超え」の印。技術者の所見の対象にする |
| 読み取りの信頼度が基準を下回る欄がない | 欄に印を付ける |
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 撮影の保存フォルダ | フォルダの監視 | 画像の保存を検知する |
| Google Document AI | API呼び出し | 表・チェック欄・上の欄・信頼度を返す |
| OpenAI API | API呼び出し | 列の対応づけと書き写し、所見の下書き |
| トラップ台帳 | 顧客ごとの表計算の読み込み | 番号と区画の照合 |
| 推移の表 | 表計算のファイル(顧客ごと) | 確認の済んだ捕獲数を書き込む |
| 報告書 | 文書作成ソフトの雛形への差し込み | 推移の図と表、所見の下書きを入れる |
トラップ台帳へは書き込みません。 「移動」「紛失」の印が付いたトラップは、台帳の更新の一覧に出すだけで、台帳を直すのは担当の技術者です。 移設先を決めるのは顧客との相談だからです。
推移の表へ書き込むのは、人が確かめた値だけです。 空欄が残っている点検表は、技術者の確認が済むまで推移の表に入れません。
人が確認する
人が見るのは、印の付いた欄と、所見の下書きです。
- 未点検と台帳に無い番号を先に見る … 点検表の画像と台帳を並べて、移設か書き間違いかを確かめます
- 空欄を技術者に確かめる … 見たのか、見られなかったのかを聞き、「0」か「×」に直します
- 数字の欄を確かめる … 信頼度の低い欄を、画像と並べて直します
- 所見の下書きを技術者が直す … 事実の並びに、現場で見た状況と対策を書き足します
- 報告書を送る前に通して読む … 未点検と水準超えが所見に書かれているかを確かめます
2番目は、巡回の翌日までに行います。 技術者の記憶が新しいうちなら、空欄の理由はすぐ分かります。1週間たつと、技術者も覚えていません。
目標は、480枚をならして1枚1.5分です。 印の無い点検表は一覧で流し見て数十秒、空欄や台帳の食い違いのある点検表は技術者に確かめるので数分かかります。
例外に対処する
| 起きること | 対応 |
|---|---|
| 粘着シートの汚れや手袋の跡で読めない | unreadable。人が画像で確かめる |
| 空欄が多い点検表 | 推移の表に入れず、技術者に確かめる |
| 雛形が判定できない | 顧客のコードを人が選び、読み取りをやり直す |
| 台帳に無い番号 | 印を付け、技術者に確かめる。似た番号に寄せない |
| 1枚に区画が2つ書かれている | 区画ごとに行を分け、人が確かめる |
| 「多数」と書かれた欄が多い | uncounted のまま報告書に書き、数え方を技術者と相談する |
| 雛形に無い虫の名前が備考にある | 備考のまま報告書に載せ、技術者が扱いを決める |
| 区画の点検表がそろわない | 報告書を作る前に、残りの区画の点検表を技術者に確かめる |
| Document AI が応答しない | フォルダに残し、報告担当がいまの手順で打ち込む |
上の2行が大半を占めます。 どちらもAIの精度の問題というより、工場の中で手袋をして書く紙の性質と、書き方の決まりの問題です。 点検表をバインダーに挟んで書く、「0」と「×」を書き分けるほうが、指示を直すより効きます。
記録を残す
- 点検表の画像と、顧客のコード・巡回の日付・区画・技術者
- OCR が返した
Documentの全文(text、formFields、tables、信頼度) - 生成AIの出力(列の対応づけ、行の文字、所見の下書き)
- 照合の結果(台帳・未点検・状態・前月比・管理の水準)
- 人が直した欄の記録 … どの点検表の、どのトラップの、どの欄を、何から何に直したか
- 技術者が直した所見の記録 … 下書きと送った文の差
- 顧客に送った報告書と、送った日時
送った報告書と元の点検表がつながっていることが、顧客の監査への備えになります。 顧客の工場が外部の監査を受けるとき、報告書の数字がどの点検表のどの欄から来たかを示せれば、問い合わせに早く答えられます。
04実装レベルの3段階
最小構成は、空欄と0を分けて読めるかを確かめる段階です。 月480枚には使えません。 半自動化で、1枚6分が3分程度になります。 打ち込みは自動になりますが、台帳との照合と前月比、報告書への貼り込みが人の手に残ります。 本格構成で1.5分になり、この段階が本記事の想定です。 差が大きいのは、台帳との照合と報告書の下書きが自動になり、人が見るのが印の付いた欄と所見だけになるからです。 段階を飛ばさないでください。 半自動化の1か月で、台帳の古い顧客と、空欄の多い技術者が見えます。台帳を直し、「0」と「×」の決まりを浸透させてから本格構成に進むほうが、印が減ります。
05工数削減シミュレーション
導入後 480件 × 1.5分 ÷ 60 = 12 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 食品工場・食品の倉庫など数十の顧客と防虫・防そ管理の契約を結び、技術者が毎月巡回して紙の点検表に捕獲数を手書きしている害虫防除の会社。事務所で点検表を表計算に打ち直し、顧客ごとの推移の表と月次報告書を作っていて、報告が巡回から1〜2週間遅れる場合。報告書の所見の書き方が技術者ごとにばらばらな場合。
- 点検の結果をすでに端末やアプリで記録し、報告書が自動で作られている会社。顧客が数社で、打ち直しの手間が小さい場合。なお、虫の種類の同定、発生源の特定、駆除の方法と薬剤の選定、顧客の衛生管理の計画の適否の判断は、この構成では代替できません。
07最小構成で試す方法
- 先月の点検表から20枚を選ぶ(空欄の多いもの、「多数」と書かれたもの、雛形の違う顧客のものを入れる)
- その20枚について、推移の表に打ち込まれた値を書き出しておく
- 点検表の画像を、手元の生成AIの画面に1枚ずつ貼る
- 「この点検表を、トラップ番号・設置場所・虫の種類ごとの捕獲数・状態の表にしてください。空欄は空欄のまま、0は0のまま写してください。数字に直さないでください」と指示する
- 出てきた表を、打ち込まれた値と1欄ずつ比べる
20枚で約300基分になります。 Form Parser とプログラムを組む前に、手書きの点検表が表として読めるのか、空欄と0を分けて写せるのかを確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 打ち込まれた値とほぼ同じ表が出た | OCR の API と照合の処理に進む |
| 空欄を0にした | 指示と、後段の値の決まりで止められる |
| チェック欄を読み落とした | 雛形の状態の欄を表の中に置く。構成は有効 |
| 読めない点検表が多い | 書き方と撮り方が先。 AIの問題ではない |
2行目が出たら、打ち込み済みの推移の表も見直してください。 人が打ち込んだ表にも、空欄を0として入れた欄が混ざっていることがあります。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 空欄を0として集計する | 0と空欄と×を別の値で持つ。 空欄は報告書に載せる前に確かめる |
| 「多数」を数字に直す | 文字のまま受け、uncounted として報告書に書く |
| 区画ごとの番号で取り違える | トラップ番号と区画の組で照合する |
| 台帳が古く「台帳に無い番号」が出続ける | 移設の印から台帳の更新の一覧を作り、月内に直す |
| チェック欄が読めない | 状態の欄を表の中の列に置く |
| 顧客ごとに虫の種類の列が違う | 雛形を顧客のコードで判定し、列の一覧を渡す |
| 所見の下書きに原因や対策が混ざる | 事実だけを書かせ、原因と対策は技術者が書く |
| 所見の下書きが未点検を省く | 未点検と多数を必ず書くと指示する |
| 国外で処理されることを確かめていない | 日本のリージョンは無い。 顧客との契約に照らす |
| 下書きの報告書を自動で送る | 送信は人。技術者が確かめてから送る |
上の2行が、この構成でいちばん重い失敗です。 どちらも、点検表に書かれていない数字が顧客の記録に載る経路です。書かれた文字を文字のまま受け、値への変換を決まりで行うことで防ぎます。
下の2行も、早く効いてきます。 報告書は顧客の工場の記録として残り、外部の監査で読まれることもあります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 顧客の工場の区画とトラップの設置場所、捕獲数、トラップの状態、技術者の名前です。顧客の工場の中で虫やねずみが捕まった記録は、顧客にとって外に出したくない情報です。
- 処理の場所を確かめる … Form Parser の対応リージョンに日本はありません。
us・euかシンガポールなどから選びます。顧客との契約の秘密保持の条項に照らし、必要なら顧客に説明します - 生成AIに渡す範囲を絞る … 生成AIには表と上の欄、所見の段では推移の表と照合の結果だけを渡します。顧客名は顧客のコードに置き換えて渡します
- 判断を代替しない … 虫の種類の同定、発生源、駆除の方法、薬剤の選定は技術者が判断します。構成が出すのは、点検表に書かれた事実と比較の結果までです
- 顧客の衛生管理の判断を代替しない … 食品衛生法施行規則の別表第十七は、ねずみ及び昆虫の駆除作業や調査とその記録について定めています。顧客の衛生管理の計画として足りているかは、顧客が判断します
- 報告書を自動で送らない … 顧客の記録として残る文書です。技術者が確かめてから、人が送ります
誤りが起きた場合のリスクは、見ていないトラップを「捕獲なし」と報告することと、捕獲数の増え方を見落とすことの2つです。前者は0と空欄の区別で、後者は前月比と管理の水準の照合で防ぎます。
10まず何から始めるか
1週目:書き方の決まりとトラップ台帳を整える
技術者と、「捕獲なしは0」「見られなかったら×」の書き分けを決めます。あわせて、点検表の多い上位10か所の顧客について、トラップ台帳の移設と新設を反映します。
2週目:20枚で試す
先月の点検表から20枚を選び、最小構成で表にさせて、打ち込まれた値と比べます。空欄を0にしていないか、「多数」を数字にしていないかを最優先で見ます。
3週目:雛形と管理の水準を一覧にする
顧客ごとの虫の種類の列と、契約の仕様書にある管理の水準を一覧にします。水準が取り決められていない顧客は、技術者と顧客で決めてもらうきっかけにします。
4週目:Form Parser から推移の表までをつなぐ
点検表の画像を保存すると Form Parser が動き、顧客ごとの推移の表に書き出すところまで作ります。この時点では照合を入れず、読み取りの結果だけを見ます。
2か月目: トラップ台帳との照合、値の決まり、前月比と管理の水準の比較を足し、確認画面で印の付いた欄だけを見る運用にします。3か月目以降: 所見の下書きと報告書への差し込みを足し、1枚6分が何分になったかを実測します。報告書が巡回から数日で顧客に届くようになり、空欄の確認が巡回の翌日までに終わるようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
Form Parser がキーと値のペア、表、チェックボックスなどを抽出すること。言語の一覧で日本語(ja)が手書きに対応する言語として示されていること(原文の HTML で確認)。対応リージョンが us・eu・asia-southeast1 などで、日本のリージョンが無いこと | Google Cloud: Processor list | 2026-10-15 |
| Form Parser が学習済みで追加の学習ができないこと。行や列をまたぐセルの無い表を抽出すること。チェックボックスを抽出すること | Google Cloud: Form Parser | 2026-10-15 |
text が唯一の元で、ほかの欄が startIndex・endIndex で指すこと。表が headerRows と bodyRows に分かれること。表の中のチェックボックスが ✓ や ☐ の Unicode の文字として現れ、表の外では formFields の valueType が filled_checkbox/unfilled_checkbox になること | Google Cloud: Handle the processing response | 2026-10-15 |
| 対応するファイルの形式。スキャンは最低200dpi、300dpi以上で一般に最良の結果とされること | Google Cloud: Supported files | 2026-10-15 |
構造化出力で strict: true を使い、すべての項目を required にし、オブジェクトに additionalProperties: false を必ず設定すること。省略してよい項目を null との組み合わせの型で表すこと | OpenAI API: Structured model outputs | 2026-10-15 |
| 食品衛生法施行規則の別表第十七のねずみ及び昆虫対策として、一年に二回以上の駆除作業と実施記録の一年間の保存、または定期に統一的に行う調査とその結果に基づく措置による方法が定められていること(e-Gov 法令API で条文を確認) | e-Gov 法令API: 食品衛生法施行規則 | 2026-10-15 |
虫の種類の同定、発生源の特定、駆除の方法と薬剤の選定、顧客の衛生管理の計画の適否は、技術者と顧客が判断してください。 本記事は、上記の公開情報で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1627)についてのご相談はこちらから。
