水道事業の担当が浄水場・配水池・給水栓で手書きする毎日の水質の点検記録を読み取り、残留塩素・濁度・色度を台帳に転記して、基準や管理の目標を外れた値を拾う
浄水場・配水池・給水栓で毎日手書きされる水質の点検記録票を撮影して読み取り、地点×日付の台帳に転記します。法令の値と管理の目標を外れた値、記入漏れ、小数点の怪しい値を拾って担当に回します。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- Azure AI/Google Document AI
- 連携・自動化
- Google Apps Script/Python
- 対象業界
- その他/自治体
- 対象部門
- 品質管理
- 対象業務
- データ入力・転記/内容確認・チェック
- 主な課題
- 人手が足りない/入力作業が多い/確認ミスが多い
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 入力漏れ削減/品質標準化/工数削減
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 点検員が、地点を回って採水し、測った値と印を点検記録票に書く。給水栓の残留塩素が低いなど異常があれば、その場で担当の職員に電話する
- 点検記録票を、その日のうちに課の箱へ入れる。土日の分は月曜にまとめて入る
- 担当が、点検記録票を1枚ずつ見て、表計算の台帳の地点のシートに値を打ち込む
- 打ち込むときに、管理の目標の範囲を外れた値や、書かれていない欄を目で見る
- 気になる値があれば、点検員に当日の状況を聞く
- 月初に、前月分の台帳から月報を作り、係長が確かめる
- 点検記録票を月ごとに綴じて保管する
- 人点検員が、いまと同じく点検記録票に手書きする。異常があれば、いまと同じくその場で電話する
- 人点検員が、書き終えた点検記録票を、その地点でタブレットで撮る
- 自動画像の保存をきっかけに、OCRが表とチェックボックスと上の欄と信頼度を返す
- 自動生成AIが、表の行を水質の項目に対応づけ、値を文字のまま写し、備考を分類する
- 自動写した文字を、決まりで「数値」「未満」「空」「読めない」に分け、数値の桁と範囲を確かめる
- 自動法令の値と管理の目標に照らし、外れた値に印を付ける。外れた値があれば担当に通知する
- 自動地点×日付の台帳の下書きを更新し、確認の要る欄の一覧を作る
- 人担当が、確認の要る欄を画像と並べて直し、外れた値については点検員からの連絡があったかを確かめる
- 人担当が、台帳の下書きを確定する
- 【人/自動】 月初に、確定した台帳から月報の下書きができ、係長が確かめる
各工程の詳しい説明を読む
- 点検員が、地点を回って採水し、測った値と印を点検記録票に書く。給水栓の残留塩素が低いなど異常があれば、その場で担当の職員に電話する
- 点検記録票を、その日のうちに課の箱へ入れる。土日の分は月曜にまとめて入る
- 担当が、点検記録票を1枚ずつ見て、表計算の台帳の地点のシートに値を打ち込む
- 打ち込むときに、管理の目標の範囲を外れた値や、書かれていない欄を目で見る
- 気になる値があれば、点検員に当日の状況を聞く
- 月初に、前月分の台帳から月報を作り、係長が確かめる
- 点検記録票を月ごとに綴じて保管する
(a)毎日12地点分の打ち直しがたまる。 担当は水質だけでなく、検針や工事の立会いも受け持っています。土日の分が月曜に24枚入り、平日の分と重なります。
(b)小数点と桁の読み違いに気づけない。 「.35」と小数点の前の0を書かない人、「0.1>」と記号を後ろに書く人、「<0.1」と前に書く人がいます。打ち込む側が書き方の癖を知っていることが前提になっていて、慣れない担当が打つと、0.35を35と打つことがあります。
(c)異常の連絡が漏れていても、台帳で気づくのが遅い。 その場で連絡があれば問題ありませんが、連絡が漏れた異常値は、担当が台帳に打ち込むまで誰も見ていません。 土日の分なら、気づくのは月曜です。
(d)月報の作成が月初に集中する。 打ち込みが追いついていない月は、月初に前月の残りを打ち込んでから月報を作ることになり、係長の確認が後ろにずれます。
(e)担当が替わると、癖の読み解きが一からになる。 町の職員は数年で異動します。どの点検員が小数点の前の0を書かないか、どの地点の記録票が濡れやすいかは、引き継ぎの書類には残りません。 新しい担当の最初の数か月は、打ち込みにも確認にも時間がかかります。
- 【人】 点検員が、いまと同じく点検記録票に手書きする。異常があれば、いまと同じくその場で電話する
- 【人】 点検員が、書き終えた点検記録票を、その地点でタブレットで撮る
- 【自動】 画像の保存をきっかけに、OCRが表とチェックボックスと上の欄と信頼度を返す
- 【自動】 生成AIが、表の行を水質の項目に対応づけ、値を文字のまま写し、備考を分類する
- 【自動】 写した文字を、決まりで「数値」「未満」「空」「読めない」に分け、数値の桁と範囲を確かめる
- 【自動】 法令の値と管理の目標に照らし、外れた値に印を付ける。外れた値があれば担当に通知する
- 【自動】 地点×日付の台帳の下書きを更新し、確認の要る欄の一覧を作る
- 【人】 担当が、確認の要る欄を画像と並べて直し、外れた値については点検員からの連絡があったかを確かめる
- 【人】 担当が、台帳の下書きを確定する
- 【人/自動】 月初に、確定した台帳から月報の下書きができ、係長が確かめる
6番目の通知は、1番目の電話の代わりではありません。 点検員からの連絡が先にあるはずで、通知が先に届いたなら、連絡が漏れていたということです。 8番目で担当が確かめるのは、その順序です。
9番目で、人が確定するまで台帳は下書きのままです。 本記事の人間の確認が「必須」なのは、法令で保存が求められる記録の元だからです。
02今回想定するシステム構成
水質の点検記録票(地点ごと・1日1枚、手書き)
│ 地点でタブレットで撮影 → 保存フォルダ
▼【トリガー】画像の保存
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 |
| 通知 | 課のメール(外れた値の通知) | 課のチャット |
法令の値と管理の目標は、別の列で持ちます。 水道法施行規則は、衛生上必要な措置として、給水栓における水が遊離残留塩素を0.1mg/L(結合残留塩素の場合は0.4mg/L)以上保持するように塩素消毒をすることとしています。水質基準に関する省令は、色度を5度以下、濁度を2度以下としています。水道事業者はふつう、これより厳しい管理の目標を自分で決めて運用しています。 法令の値を外れたものと、管理の目標を外れたものでは、急ぎ方が違うので印を分けます。
土台は Document AI の Form Parser です。 公式の説明では、Form Parser はキーと値のペア、表、チェックボックス、汎用のエンティティを OCR のテキストに加えて抽出するとされ、プロセッサの一覧の言語表では、日本語(ja)が手書きに対応する言語として示されています。
処理する場所に日本のリージョンはありません。 プロセッサの一覧では、Form Parser の対応リージョンは us・eu のほか、asia-southeast1(シンガポール)などです。点検記録票には地点の名前と水質の値と点検者の名前が書かれ、水道の施設の情報でもあります。 町の情報セキュリティの決まりに照らし、外部のクラウドで処理してよい情報かを先に確かめます。
03どうやって実装するのか
処理の起点を決める
点検記録票の画像が保存フォルダに保存されたことを起点にします。 点検員は、その地点で書き終えたらすぐに撮ります。
1日1回、課に戻ってからまとめて撮る形にはしません。 地点で撮れば、連絡が漏れた異常値も、点検員が次の地点へ向かう間に担当へ届きます。 (c)の「土日の分は月曜に気づく」をなくすのが狙いです。
ファイル名には撮影の日時と地点の番号を入れます。処理が終わった画像は処理済みのフォルダへ移し、移すのは成功したときだけにします。 庁内のネットワークの区分によっては、画像を外部の API へ送れる端末が限られるので、フォルダを見張る処理を、外部へ接続してよい区分の端末に置きます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 点検記録票の画像 | 1地点の1日分、撮影の日時、地点の番号 | 点検員のタブレット |
| 読み取りの結果 | テキスト、表(項目ごとの行)、チェックボックス、上の欄、信頼度 | Google Document AI |
| 点検の地点の一覧 | 地点の番号・名前、種類(浄水場・配水池・給水栓)、測る項目 | 担当が持つ一覧 |
| 判定の値の一覧 | 項目ごとの法令の値、管理の目標の上限・下限、ありうる値の範囲 | 担当が係長と決める一覧 |
| 前日までの台帳 | 地点ごとの確定した値 | 水質の台帳 |
質を決めるのは、判定の値の一覧です。 法令の値は条文から写し、管理の目標は事業者が決めた値を写します。「ありうる値の範囲」は、桁の読み違いを拾うための値で、法令とは関係ありません。 遊離残留塩素が10mg/L を超えるような値は、測り方の誤りか読み違いとして扱います。
地点の種類を持つのは、法令の値が給水栓の値だからです。 浄水場の出口や配水池の値に、給水栓の0.1mg/L をそのまま当てると、判定の意味が変わります。地点ごとに、どの値で照らすかを一覧に書いておきます。
データの取得方法を決める
読み取りは、Python から Form Parser のプロセッサを呼ぶだけです。返ってくる Document から、表とチェックボックスと上の欄と信頼度を取り出します。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 全テキスト | text | ほかの欄が startIndex・endIndex で指す原文 |
| 上の欄 | pages[].formFields(fieldName と fieldValue) | 地点の名前、日付、採水の時刻、点検者 |
| 水質の値 | pages[].tables(headerRows と bodyRows) | 遊離残留塩素、濁度、色度、水温、pH |
| 臭気と味の印 | fieldValue の valueType(filled_checkbox/unfilled_checkbox) | 「異常なし」「異常あり」 |
| 信頼度 | 各要素の layout の信頼度 | 確認の要る欄の印 |
公式の説明では、text が認識されたテキストの唯一の元で、ほかの欄は startIndex と endIndex でその位置を指すとされています。セルの文字はこの位置から原文を引いて取り出し、小数点や「<」の記号を落とさずに持ちます。
臭気と味は、文字ではなくチェックボックスで読みます。 公式の説明では、チェックボックスはキーと値のペアとして返り、印の付いたものは filled_checkbox、付いていないものは unfilled_checkbox になるとされています。「異常なし」と「異常あり」の両方に印が無い、または両方に印があるときは、記入漏れか書き損じとして扱います。
値の空いた欄には気を配ります。 公式の説明では、値の空いたキーと値のペアは確実には読めないとされています。上の欄の「点検者」が空いていると、欄ごと返ってこないことがあり、返ってこなかったことを「空」と同じに扱って印を付けます。
AIへ渡す前に整形する
- 画像の向きと傾き … タブレットで斜めに撮った画像を、紙の四隅で補正します
- 解像度 … 公式の説明では、スキャンは最低200dpi、300dpi以上で一般に最良の結果とされています。小数点を拾うには、なるべく大きく撮ります
- ファイルの形式と大きさ … JPEG か PNG で保存し、オンラインの処理の要求の上限の40MBと、画像の40メガピクセルの上限に収めます
- 地点の確認 … ファイル名の地点の番号と、上の欄の地点の名前を照らします
- 重複の検知 … 同じ地点・同じ日で二度撮ったものは、新しいほうだけを使います。再採水した日は、時刻の違う2枚として両方を残します
- 記号の扱いの準備 … 「<」「<」「未満」「以下」「ND」などの書き方を一覧にしておきます。ここでは置き換えず、変換の段で使います
2番目を軽く見ないでください。 小数点は紙の上でいちばん小さな印です。解像度が足りずに消えた小数点は、「0.35」を「035」に変え、それが35として扱われる経路になります。
5番目で再採水を残すのは、異常のときの記録だからです。 残留塩素が低く、時間を置いて測り直した日は、最初の値も測り直した値も、どちらも記録として要ります。
AIに処理させる
生成AIにさせるのは3つだけです。 表の行を水質の項目に対応づけること、値をセルの文字のまま写すこと、備考を分類することです。
| 見るもの | させること | 判断できないときの扱い |
|---|---|---|
| 表の行 | 各行が遊離残留塩素・濁度・色度・水温・pH・薬品の貯留量のどれかを決める | 決められない行は unknown |
| 値 | セルの文字をそのまま写す。「<」「未満」「.」も文字のまま | 読めない文字は空にし、unreadable |
| 備考 | 「再採水」「配管の工事」「降雨」「設備の不具合」「その他」に分け、原文も写す | 分けられなければ other |
数値への変換と判定は、プログラムの側で行います。
| させないこと | 理由 |
|---|---|
| 「.35」を「0.35」に直す | 直すのはプログラムの決まりで行い、直したことを記録する |
| 「<0.1」「未満」を数値にする | 定量の下限より下という情報が消える |
| 法令の値・管理の目標との比較 | 地点の種類で照らす値が違う。決まりで行う |
| 水質の良し悪しの評価 | 給水の継続や措置は職員が判断する |
| 異常の原因の推測 | 備考に書かれたことだけを写す |
2行目がいちばん起きやすい失敗です。 「<0.1」を数値にしてと言われれば、生成AIは0.1か0を返します。0.1として扱えば濁度は基準内に見え、0として扱えば「定量できなかった」という事実が消えます。 どちらも台帳の上では正しそうに見えます。
指示内容を固定する
あなたは町の上下水道課で、毎日の水質の点検記録票の読み取り結果を
表の形にそろえる係です。
OCRが返した表と上の欄だけを見てください。推測で埋めないでください。
【項目】
free_chlorine(遊離残留塩素 mg/L)、turbidity(濁度 度)、color(色度 度)、
water_temp(水温)、ph(pH)、hypochlorite_stock(次亜塩素酸ナトリウムの貯留量)
【厳守事項】
- 各行がどの項目に当たるかを row_map に書いてください。
決められない行は unknown にしてください。
- 値は、セルの文字をそのまま value_raw に写してください。
小数点、「<」「<」「未満」「以下」「ND」などの記号や語も、書かれたとおりに写してください。
- 「.35」のように小数点の前の0が無くても、0を補わないでください。
- 「未満」や「<」の付いた値を、数値に置き換えないでください。
- 読めない文字は空にし、unreadable_cells に入れてください。
前日の値やありそうな値で埋めないでください。
- 空いているセルは空のまま写してください。空いている理由を書かないでください。
- 基準を満たしているか、水質が良いか悪いかを書かないでください。
- 備考は原文を note_text に写し、resample(再採水)、construction(配管の工事)、
rain(降雨)、equipment(設備の不具合)、other のどれかに分けてください。
【OCRの表】{tables}
【上の欄】{form_fields}
「0を補わない」を明記しているのは、生成AIが親切に表記を整えるからです。 「.35」は「0.35」に、「<0.1」は「0.1未満」に、何も言わなければ書き直します。直した結果が正しくても、元の書き方が残らなければ、後で紙と見比べたときにどこを直したのかが分かりません。 表記の整え方は、プログラムの決まりとして1か所にまとめます。
出力形式を固定する
次の形のJSONで受け取ります。
{
"image_id": "",
"header": {
"site_name": "",
"date": "",
"sampling_time": "",
"weather": "",
"inspector": ""
},
"row_map": [
{ "row_index": 0, "field": "free_chlorine | turbidity | color | water_temp | ph | hypochlorite_stock | unknown" }
],
"values": [
{ "field": "", "value_raw": "" }
],
"note": { "note_text": "", "note_type": "resample | construction | rain | equipment | other | none" },
"unreadable_cells": [ { "row_index": 0 } ]
}
値を value_raw という文字列で受けるのは、変換の決まりを1か所に置くためです。 Python の側で、value_raw を次の4つに分けます。
| 分け方 | 例 | 扱い |
|---|---|---|
| 数値 | 「0.35」「.35」「1.2」 | 「.35」は0.35にし、補ったことを記録する |
| 未満 | 「<0.1」「0.1未満」「ND」 | 数値にせず、below_limit と下限の値を持つ |
| 空 | 「」 | 記入漏れの候補 |
| 読めない | 「0.3?」「3.5.」 | 確認の要る欄 |
Claude の構造化出力は、output_config.format に type: "json_schema" で JSON スキーマを渡して有効にし、オブジェクトには additionalProperties: false が必要とされています。 数値の minimum・maximum は対応していないとされているので、範囲の確認はプログラムで行います。
後段の照合は、変換した値に対して決まりで行います。
| 照合 | 外れたとき |
|---|---|
| 地点の名前と、ファイル名の地点の番号が合う | 記録票ごと止める |
| その地点で測る項目に、すべて値がある | 「記入漏れ」 |
| 値が、ありうる値の範囲に入る | 「桁の疑い」。画像で確かめる |
| 給水栓の遊離残留塩素が法令の値以上 | 「法令の値を下回る」。すぐ担当に通知 |
| 濁度・色度が法令の値以下 | 「法令の値を上回る」。すぐ担当に通知 |
| 各項目が管理の目標の範囲に入る | 「管理の目標を外れる」 |
| 臭気と味の印が、どちらか一方だけに付く | 「印の記入漏れ」 |
4行目と5行目だけを、すぐの通知にします。 管理の目標を外れた値まで通知にすると、通知が多すぎて、法令の値を下回った通知が埋もれます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 保存フォルダ | フォルダの監視 | 画像の保存を検知する |
| Google Document AI | API呼び出し | 表・チェックボックス・上の欄・信頼度を返す |
| Claude API | API呼び出し | 項目の対応づけ、値の書き写し、備考の分類 |
| 地点の一覧・判定の値の一覧 | 表計算の読み取り | 照らす値と範囲 |
| 水質の台帳 | 表計算の下書きのシート | 照合の済んだ値を書き、人が確定する |
| 課のメール | メールの送信 | 法令の値を外れた値の通知 |
台帳の確定のシートへは、人が確定した値だけを書き込みます。 自動で書くのは下書きのシートまでです。法令で保存が求められる記録の元を、読み取りの結果のまま確定させないためです。
通知の文面には、値を文字のまま入れます。 「0.05」を「0.1未満」と言い換えたりせず、点検記録票に書かれた文字と、画像へのリンクを並べます。 受け取った担当が、まず画像で読み違いでないかを確かめられるようにします。
人が確認する
人が見るのは、印の付いた欄と、通知の届いた値です。
- 通知の届いた値を先に見る … 画像で読み違いでないかを確かめ、点検員から連絡があったかを確かめます。連絡が無かったなら、点検員に状況を聞き、課の手順で対応します
- 桁の疑いを確かめる … 小数点の有無を画像で見て直します
- 記入漏れを確かめる … 点検員に、測ったかを聞きます。測っていなかったなら、その日は測れなかったことを記録します
- 管理の目標を外れた値を見る … 備考と前後の日の値を見て、係長に上げるかを決めます
- 台帳の下書きを確定する … 印の無い記録票は一覧で流し見て確定します
1番目で「連絡があったか」を確かめるのが、この構成を入れる意味の半分です。 読み取りで拾った異常値のうち、点検員からの連絡が無かったものは、手順のどこかに穴があるということです。
4番目で前後の日の値を見るのは、1日だけの外れと続く外れを分けるためです。 降雨や配管の工事の備考がある日の濁度の上がりと、理由の書かれていない上がりでは、係長に上げる急ぎ方が違います。
目標は、360件をならして1件2分です。 印の無い記録票は数十秒、通知の届いた値や記入漏れは点検員に確かめるので数分かかります。
例外に対処する
| 起きること | 対応 |
|---|---|
| 雨で紙が濡れて数字がにじむ | unreadable。点検員に聞く |
| 小数点が読めない | 「桁の疑い」。小数点を推測で付けない |
| 「<」が逆向き(「>」)に書かれている | 「読めない」として人へ |
| 再採水で1地点に2枚ある | 時刻の違う2枚として両方残す |
| 点検できなかった地点がある | 記録票が来ない。地点の一覧で未着として印 |
| 委託先が別の様式で書いた | 行の対応づけを生成AIに任せ、unknown は人が決める |
| Document AI が応答しない | フォルダに残し、担当がいまの手順で打ち込む |
2行目と3行目は、この題材に固有の例外です。 どちらも値の大きさや向きを逆にする誤りで、推測で直すと、法令の値の判定そのものが反対になります。
5行目の「記録票が来ない」は、読み取りの誤りより重く扱います。 1日1回以上の検査が求められている項目で、1地点の1日分が欠ければ、その日の記録そのものが欠けます。 毎日決まった時刻に、地点の一覧と届いた記録票を突き合わせ、未着の地点を担当に知らせます。撮り忘れなのか、点検できなかったのかは、点検員に聞いて記録に残します。
記録を残す
- 点検記録票の画像と、撮影の日時・地点の番号
- OCR が返した
Documentの全文(text、formFields、tables、チェックボックス、信頼度) - 生成AIの出力(行の対応づけ、写した文字、備考の分類)
- 文字から数値への変換の記録 … 「.35」を0.35にした、「<0.1」を未満とした、など
- 照合の結果と、そのとき使った判定の値の一覧の版
- 通知を送った日時と宛先、点検員からの連絡の有無
- 人が直した記録と、確定した日時と人
4つ目の変換の記録は、紙と台帳を見比べるときの手がかりです。 法律が求める記録の保存は5年間で、その間に台帳の値と紙の書き方が違って見えても、どう変換したかが分かります。
判定の値の一覧の版を残すのは、管理の目標が見直されるためです。 目標を変えたあとに過去の印を見直すとき、当時の目標が分からないと判断できません。
04実装レベルの3段階
半自動化で、1件5分が3.5分程度になります。 読み取りは自動になりますが、小数点や「未満」の扱いと、目標との見比べは人が続けます。 本格構成で2分になり、この段階が本記事の想定です。 差が大きいのは、変換と照合が決まりで行われ、人が見るのが印の付いた欄だけになるからです。 段階を飛ばさないでください。 半自動化の1か月で、どの点検員のどの書き方が読み違えやすいかが見え、記録票の様式と書き方の決まりを直せます。
05工数削減シミュレーション
導入後 360件 × 2分 ÷ 60 = 12 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 給水人口が数千から数万人規模の町村や小さな水道事業者で、浄水場・配水池・給水栓の毎日の水質の点検を職員や委託先の点検員が紙に手書きし、上下水道課の担当が表計算の台帳へ打ち直している場合。担当が少なく、打ち直しと月報の作成が後回しになりがちな場合。
- 残留塩素計や濁度計の連続測定の値を監視の仕組みで自動に記録していて、手書きの点検記録が無い事業者。点検の地点が数か所で、打ち直しが短時間で終わる場合。なお、水質の異常のときの給水の停止や関係者への周知、法定の水質検査とその記録の作成・保存の責任、薬品の注入量の調整は、この構成では代替できません。
07最小構成で試す方法
- 先月の点検記録票から30枚を選ぶ(小数点の前の0を書かない人、「未満」を使った人、再採水の日の記録を入れる)
- その30枚について、台帳に打ち込まれた値を書き出しておく
- 点検記録票の画像を、手元の生成AIの画面に1枚ずつ貼る
- 「この点検記録票の値を、項目ごとに書かれた文字のまま表にしてください。小数点や『<』『未満』は書かれたとおりに写してください。数値に直さないでください。読めない欄は空にしてください」と指示する
- 出てきた表を、打ち込まれた値と1欄ずつ比べる
30枚で、点検員の書き方の癖はひととおり出ます。 Form Parser とプログラムを組む前に、小数点と記号が文字のまま読めるのかを確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 打ち込まれた値とほぼ同じ表が出た | OCR の API と変換・照合の処理に進む |
| 小数点を落とした | 撮り方と、値を書く欄の大きさを見直す。構成は有効 |
| 「未満」を数値に直した | 指示と、後段の変換で止められる |
| 打ち込まれた値のほうに桁の誤りがあった | (b)の実例。 構成を入れる理由になる |
4行目が出ることは珍しくありません。 比べてみて初めて、台帳の側の読み違いが見つかることがあります。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 「未満」を数値にする | 文字のまま受け、変換で未満として別に持つ |
| 小数点が消えて桁が変わる | 撮影を大きく、ありうる値の範囲で「桁の疑い」を拾う |
| 「.35」を生成AIが直す | 直させない。プログラムの決まりで直し、記録する |
| 浄水場の値に給水栓の法令の値を当てる | 地点の種類ごとに照らす値を決める |
| 管理の目標まで通知にして通知が埋もれる | 通知は法令の値を外れたものだけにする |
| 通知を、その場の連絡の代わりにする | 連絡の手順はいまのまま。 通知は二重の網 |
| 値の空いた欄が返ってこない | 返ってこなかったことを「空」と同じに扱う |
| 再採水の記録を重複として消す | 時刻の違う記録は両方残す |
| 国外で処理されることを確かめていない | 日本のリージョンは無い。 町の決まりに照らす |
上の2行が、この構成でいちばん重い失敗です。 どちらも、法令の値の判定を反対にする経路です。
6行目は、運用で起きる失敗です。 通知が届くようになると、その場の電話を省く点検員が出ます。通知は、点検員が撮ってから届くまでの時間がかかり、撮り忘れれば届きません。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 点検の地点の名前、日ごとの水質の値、薬品の貯留量、点検者の名前です。個人の情報は点検者の名前程度ですが、水道の施設と運転の情報です。
- 処理の場所を確かめる … Form Parser の対応リージョンに日本はありません。
us・euかシンガポールなどから選びます。水道の施設の情報を国外で処理してよいかを、町の情報セキュリティの決まりに照らします。 認められない場合は、日本のリージョンで処理できる別の製品を検討します - 生成AIに渡す範囲を絞る … 生成AIには表と上の欄だけを渡し、地点の一覧や施設の図面は渡しません
- 判断を代替しない … 異常のときの給水の停止、周知、薬品の注入量の調整は、職員が決めます。構成が出すのは、値が外れたという事実までです
- 記録の責任を代替しない … 水道法は、水質検査の記録の作成と5年間の保存を水道事業者に求めています。台帳の値は人が確定し、紙の記録票と画像を残します
- その場の連絡の手順を変えない … 通知は、連絡が漏れていないかを確かめる二重の網です
誤りが起きた場合のリスクは、読み違いで法令の値の判定が反対になることと、通知に頼ってその場の連絡が省かれることの2つです。前者は文字のまま受けた変換と範囲の確認で、後者は連絡の有無を確かめる手順で防ぎます。
10まず何から始めるか
1週目:庁内の確認と、判定の値の一覧を作る
外部のクラウドで処理してよいかを、情報セキュリティの担当と確かめます。あわせて、地点の種類ごとに、法令の値、管理の目標、ありうる値の範囲を一覧にします。
2週目:30枚で試す
先月の点検記録票から30枚を選び、最小構成で表にさせて、打ち込まれた値と比べます。小数点を落としていないか、「未満」を数値に直していないかを最優先で見ます。
3週目:記録票の様式と書き方を決める
値の欄を大きくとり、臭気と味を四角の印にした様式を作ります。「0.」から書く、「未満」の書き方を1つに決めることを、委託先も含めて決めます。
4週目:Form Parser から一覧までをつなぐ
画像を保存すると Form Parser が動き、地点ごとの値を一覧に書き出すところまで作ります。この時点では変換と照合を入れず、読み取りの結果だけを見ます。
2か月目: 数値への変換、法令の値と管理の目標の照合、通知、台帳の下書きを足します。3か月目以降: 月報の下書きを足し、1件5分が何分になったかを実測します。連絡の漏れた異常値にその日のうちに気づけるようになり、月初の月報が台帳の確定と同時にできるようになった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
Form Parser がキーと値のペア、表、チェックボックス、汎用のエンティティを抽出すること。言語の一覧で日本語(ja)が手書きに対応する言語として示されていること(原文の HTML で確認)。対応リージョンが us・eu・asia-southeast1 などで日本のリージョンが無いこと | Google Cloud: Processor list | 2026-10-15 |
| 行や列をまたぐセルの無い表を抽出すること。値の空いたキーと値のペアは確実には読めないこと。チェックボックスがキーと値のペアとして抽出されること | Google Cloud: Form Parser | 2026-10-15 |
text が認識されたテキストの唯一の元で、ほかの欄が startIndex・endIndex で指すこと。formFields が fieldName と fieldValue を持つこと。チェックボックスの valueType が filled_checkbox/unfilled_checkbox になること。表が headerRows と bodyRows に分かれること | Google Cloud: Handle the processing response | 2026-10-15 |
| 対応するファイルの形式(JPEG、PNG など)。スキャンは最低200dpi、300dpi以上で一般に最良の結果とされること | Google Cloud: Supported files | 2026-10-15 |
| オンラインの処理の要求のファイルの大きさの上限が40MB、画像の解像度の上限が40メガピクセルであること | Google Cloud: Document AI limits | 2026-10-15 |
構造化出力が output_config.format に type: "json_schema" で JSON スキーマを渡して有効になること。オブジェクトに additionalProperties: false が必要なこと。数値の minimum・maximum が非対応であること | Claude Docs: Structured outputs | 2026-10-15 |
| 定期の水質検査として、1日1回以上行う色及び濁り並びに消毒の残留効果に関する検査が挙げられていること(第15条)。給水栓における水が遊離残留塩素を0.1mg/L(結合残留塩素の場合は0.4mg/L)以上保持するように塩素消毒をすること(第17条) | e-Gov 法令API: 水道法施行規則 | 2026-10-15 |
| 水道事業者が水質検査を行ったときは記録を作成し、検査を行った日から起算して5年間保存しなければならないこと(第20条) | e-Gov 法令API: 水道法 | 2026-10-15 |
| 色度が5度以下、濁度が2度以下であること | e-Gov 法令API: 水質基準に関する省令 | 2026-10-15 |
水質の異常のときの措置、法定の水質検査の計画と記録、管理の目標の決定は、水道事業者の職員が判断してください。 本記事は、上記の公開情報で確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1708)についてのご相談はこちらから。
