市町村の窓口に出る犬の登録・注射済票の交付・届出の手書きの申請書を読み取り、登録原簿の犬と突き合わせて台帳に起こす
窓口で受け付けた犬の登録・注射済票の交付・変更・死亡の手書きの申請書をスキャンして読み取り、申請の区分ごとに項目をそろえます。登録番号で原簿の犬と突き合わせ、台帳に取り込む一覧と、記入漏れを確かめる一覧を作ります。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- Azure AI/Google Document AI
- 連携・自動化
- Google Apps Script/Python
- 対象業界
- 自治体
- 対象部門
- 総務
- 対象業務
- データ入力・転記/台帳・マスタ管理
- 主な課題
- 人手が足りない/入力作業が多い/確認ミスが多い
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 入力漏れ削減/品質標準化/工数削減
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 窓口で申請書を受け取り、記入を確かめて鑑札または注射済票を手渡す
- 申請書を受付の箱に入れる。支所で受け付けたものは、写しが週に2回届く
- 閉庁後か翌日に、担当の職員が申請書を1枚ずつ取り出し、申請の区分を見る
- 変更・死亡・注射済票の申請は、台帳システムで登録番号か飼い主の名前から犬を探す
- 区分に応じて、新しい犬を足すか、既にいる犬の行を直すか、閉じる
- 記入の足りない申請書は付箋を貼り、申請者に電話で確かめる
- 人窓口で申請書を受け取り、鑑札または注射済票を手渡す。手渡した鑑札・注射済票の番号を申請書の所定の欄に書く
- 人1日の終わりに、その日の申請書を複合機でまとめてスキャンする。支所も同じ様式でスキャンして送る
- 自動スキャンの保存をきっかけにプログラムが動き、1枚ずつに分けて形式と解像度を確かめる
- 自動OCRが申請書を読み、項目と値、チェック欄の状態、読み取りの信頼度を返す
- 自動生成AIが申請の区分と項目をそろえ、書かれていない欄と読めない欄を分けて返す
- 自動登録番号で登録原簿の犬を引き、飼い主の名前・犬の名前・毛色が合うかを規則で照らす
- 自動問題の無いものは台帳システムに取り込む一覧に、問題のあるものは確認の一覧に出す
- 人担当の職員が確認の一覧だけを開き、申請書の画像と見比べて直す。取り込む一覧を確かめて台帳システムに取り込む
各工程の詳しい説明を読む
- 窓口で申請書を受け取り、記入を確かめて鑑札または注射済票を手渡す
- 申請書を受付の箱に入れる。支所で受け付けたものは、写しが週に2回届く
- 閉庁後か翌日に、担当の職員が申請書を1枚ずつ取り出し、申請の区分を見る
- 変更・死亡・注射済票の申請は、台帳システムで登録番号か飼い主の名前から犬を探す
- 区分に応じて、新しい犬を足すか、既にいる犬の行を直すか、閉じる
- 記入の足りない申請書は付箋を貼り、申請者に電話で確かめる
(a)打ち込みが後に回る。 窓口が混む日は、3番目以降が翌日、翌々日に回ります。台帳に入るまでの間に、飼い主から「登録できていますか」と問い合わせがあっても、台帳を見ても分かりません。 箱の中の申請書を探すことになります。
(b)同じ飼い主の別の犬と取り違える。 4番目で、登録番号が書かれていない申請書は、飼い主の名前で探します。2頭以上を飼っている家では、犬の名前と毛色で見分けるしかありません。 急いでいると、死亡の届出を別の犬の行に付けてしまいます。翌年度に、生きている犬の注射の案内が届かない、という形で見つかります。
(c)記入漏れが打ち込みの時まで分からない。 窓口では鑑札を手渡すことに気を取られ、犬の生年月日や毛色の欄の空きを見落とします。打ち込みの時に気づいて電話をしても、つながるまでに何日もかかります。
(d)支所の写しが読みにくい。 支所から届く写しは複合機でコピーしたもので、手書きの細い字がかすれていることがあります。 読めない字を前後から推し量って打ち込み、後で違っていたと分かります。
- 【人】 窓口で申請書を受け取り、鑑札または注射済票を手渡す。手渡した鑑札・注射済票の番号を申請書の所定の欄に書く
- 【人】 1日の終わりに、その日の申請書を複合機でまとめてスキャンする。支所も同じ様式でスキャンして送る
- 【自動】 スキャンの保存をきっかけにプログラムが動き、1枚ずつに分けて形式と解像度を確かめる
- 【自動】 OCRが申請書を読み、項目と値、チェック欄の状態、読み取りの信頼度を返す
- 【自動】 生成AIが申請の区分と項目をそろえ、書かれていない欄と読めない欄を分けて返す
- 【自動】 登録番号で登録原簿の犬を引き、飼い主の名前・犬の名前・毛色が合うかを規則で照らす
- 【自動】 問題の無いものは台帳システムに取り込む一覧に、問題のあるものは確認の一覧に出す
- 【人】 担当の職員が確認の一覧だけを開き、申請書の画像と見比べて直す。取り込む一覧を確かめて台帳システムに取り込む
8番目が、この設計の分かれ目です。人が見るのは全件ではありません。 区分がはっきりし、登録番号で原簿の犬が1頭に決まり、記入もそろっている申請書は、取り込む一覧に並ぶだけです。確認の一覧に出たものと、その申請書の画像だけを見ます。 全件を見直す設計にすると、打ち込みが見直しに変わるだけです。
1番目で、手渡した鑑札・注射済票の番号を書いてもらうのは、意図してのことです。 窓口で何を手渡したかが申請書に残っていれば、台帳に入れる番号を、窓口の在庫の帳簿から推し量らずに済みます。 職員の手順に1つ足すだけで、後の照合が確かになります。
02今回想定するシステム構成
窓口・支所で受け付けた申請書(手書き、1枚の様式に申請の区分のチェック欄) │ 1日の終わりに複合機でまとめてスキャン ▼【トリガー】共有フォルダへのPDFの保存 Python ── ページを1枚ずつに分ける、形式と解像度の確認 ▼ Google Document AI(Form Parser) │ 項目と値(キーと値の組)、チェック欄の状態、全文、信頼度を返す ▼ Claude API ── 申請の区分と項目をそろえる │ 区分/登録番号/所有者/犬の所在地/犬の種類・生年月日・毛色・性別・名 │ /注射の年月日と獣医師/手渡した鑑札・注射済票の番号 ▼ Python ── 登録番号で登録原簿の犬を引き、名前・毛色・所有者を照らす │ 注射済票の年度、届出の期限、記入漏れを規則で調べる ▼ 台帳システムに取り込む一覧(CSV)/確認の一覧 ▼【担当の職員が確認の一覧を見て直し、台帳システムに取り込む】
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | Google Document AI(Form Parser) | Azure AI Document Intelligence |
| 生成AI | Claude API(申請の区分と項目のそろえ) | OpenAI API、Gemini API |
| 連携 | Python(ページの分割、原簿との照合、規則の判定、一覧の書き出し) | Google Apps Script |
| 保管 | 庁内の共有フォルダ(申請書の画像と、取り込む一覧・確認の一覧) | 文書管理のシステム |
台帳システムは、新しく足すものではありません。 この構成からは書き込まず、職員が確かめた一覧を、台帳システムの取り込みの機能で入れます。 取り込みの形式はシステムごとに違うため、一覧の列の並びは利用環境に応じた個別実装になります。
土台は Document AI の Form Parser です。 公式のプロセッサ一覧では、OCRのテキストに加えてキーと値のペア(項目とチェック欄)、表、一般的な項目を抽出するとされ、言語の一覧で日本語(ja)は手書きに対応する言語として示されています。申請書は「所有者の氏名」「犬の名」のように項目名が印刷され、その横に手書きで記入する形なので、項目と値の組として読めることが、この題材にいちばん効きます。
チェック欄は、文字とは別の結果として返ります。 Form Parser の説明では、チェック欄は項目と値の組として抽出され、記入されているかどうかが valueType で示されるとされています。応答の扱いの説明では、印の付いたものは filled_checkbox、付いていないものは unfilled_checkbox です。申請の区分を、手書きの丸や印の文字から推し量らずに、この値で決められます。
チェック欄には、はっきりした制約もあります。 公式の説明では、検出されたチェック欄に対応する項目名が無いことがあり、ラジオボタンの読み取りには対応しないとされています。表の中のチェック欄は、項目と値ではなく文字として返ります。申請の区分の欄は、表の外に、四角のチェック欄と項目名を横に並べた形にしておきます(第7章の前処理)。
処理する場所に日本はありません。 プロセッサ一覧の Form Parser の対応リージョンは、us、eu、asia-southeast1、asia-south1、australia-southeast1 などで、日本のリージョンは一覧にありません。 申請書には飼い主の氏名と住所、電話番号が書かれているので、国外で処理してよいかを、導入前に情報セキュリティポリシーに照らして決めます(第13章)。
03どうやって実装するのか
処理の起点を決める
共有フォルダにスキャンしたPDFが保存されたことを起点にします。 窓口の職員が1日の終わりにその日の申請書をまとめてスキャンし、Python のプログラムが10分おきにフォルダを見て、新しいPDFを処理します。
1日1回のまとめたスキャンにしているのは、窓口を止めないためです。 申請書を受け取るたびにスキャンすると、混んでいる時間に窓口の職員が複合機まで往復することになります。その日のうちに台帳の取り込みの一覧ができれば、翌朝には台帳に入ります。 第3章の(a)の「台帳を見ても分からない」は、ここで解きます。
支所のスキャンは、支所のフォルダに保存します。ファイルの名前に、受け付けた窓口(本庁・支所の別)と受付日を付けます。 処理が終わったPDFは処理済みのフォルダへ移し、移すのは成功したときだけにします。 元のフォルダに残った数が、未処理の数です。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 申請書の画像 | 1枚ずつのページ。受け付けた窓口、受付日 | 共有フォルダ |
| 読み取り結果 | 項目と値、チェック欄の状態、全文、信頼度、位置 | Google Document AI |
| 登録原簿の抜き出し | 登録番号、登録年度、所有者の氏名と住所、犬の所在地・種類・生年月日・毛色・性別・名、状態(生存・死亡・転出) | 台帳システムから書き出した一覧 |
| 窓口の交付の記録 | その日に手渡した鑑札と注射済票の番号の範囲 | 窓口の帳簿 |
| 動物病院の一覧 | 市内の動物病院の名前と獣医師の名前 | 担当課が持つ一覧 |
質を決めるのは、登録原簿の抜き出しです。 変更・死亡・注射済票の申請は、すべて既にいる犬の行に付く手続です。原簿の抜き出しが古いと、前日に登録した犬が「原簿に無い」と出ます。 抜き出しは毎朝、台帳システムから書き出し直します。
窓口の交付の記録を渡すのは、番号の書き間違いを拾うためです。 申請書に書かれた注射済票の番号が、その日に窓口で手渡した番号の範囲に無ければ、書き間違いか読み違いのどちらかです。 どちらであっても、台帳に入れる前に止めます。
データの取得方法を決める
読み取りは、Python から Form Parser のプロセッサを呼ぶだけです。オンラインの処理は1回の要求で最大15ページで、申請書は1枚ずつ送るので上限に届きません。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 項目と値 | 各ページの formFields の fieldName と fieldValue | 所有者、犬の項目、登録番号、注射の年月日 |
| チェック欄の状態 | fieldValue の valueType(filled_checkbox/unfilled_checkbox) | 申請の区分、性別 |
| 全文 | 応答の text と各要素の textAnchor | 項目名と値の文字を取り出す |
| 信頼度 | 各要素の layout の confidence | 読めた欄と読めなかった欄の区別 |
| 位置 | layout の boundingPoly | 確認の画面で、画像の該当の欄に枠を出す |
| 一般的な項目 | 電話番号(phone)、日付(date_time)、住所(address) | 値の形の確かめ |
項目名は、印刷された文字のとおりに返ります。 応答の扱いの説明では、キーと値の組のキーは書類に書かれているキーの文字そのものとされています。様式の「所有者氏名」「犬の名前」「毛色」のような項目名と、台帳の列の対応表を1つ作っておけば、値をどの列に入れるかを規則で決められます。
登録原簿の照合は、台帳システムから書き出した一覧をプログラムで引くだけです。 台帳システムに直接つなぐ方法はシステムごとに違うので、毎朝書き出した一覧を使う形にすれば、どの台帳システムでも同じ作りで済みます。
AIへ渡す前に整形する
- 様式を作り直す … 申請の区分の欄を、表の外に四角のチェック欄と項目名を横に並べた形にします。丸で囲む選択肢にしません
- 番号の欄を足す … 「窓口で手渡した鑑札・注射済票の番号」の欄を、職員が書く欄として足します
- ページを分ける … まとめてスキャンしたPDFを1枚ずつに分けます。裏面に記入があれば、表と裏を1組にします
- 形式と解像度の確認 … 公式の説明では、スキャンは最低200dpiが望ましく、300dpi以上が一般に最もよいとされています。複合機の設定を300dpiにそろえます。JPEG のような非可逆の形式で小さくすると、精度が落ちうるとされているので、PDFのまま送ります
- 向きの確認 … 横向き・逆さのページは回転させます
- 支所の写しの扱い … 支所はコピーを送らず、原本をその場でスキャンして送る手順に変えます
1番目を省くと、区分の読み違いが残ります。 いまの様式の区分の欄が「1 登録 2 注射 3 変更 4 死亡」と並べて丸で囲む形なら、丸は文字の上に重なり、チェック欄としては読まれません。 公式の説明でも、チェック欄の検出はラジオボタンに対応しないとされています。
6番目は、第3章の(d)の答えです。 かすれた写しの読み取りは、AIをどう工夫しても上がりません。支所の複合機で原本をスキャンするほうが、確実に効きます。
AIに処理させる
させるのは、1枚の申請書の読み取り結果を、申請の区分と台帳の項目の形にそろえることだけです。 原簿との照合と、届出の期限の判定はさせません。
| 項目 | そろえ方 | 判断できないときの扱い |
|---|---|---|
| 申請の区分 | チェック欄の filled_checkbox から決める | 印が0個または区分の組み合わせが様式の想定外なら ambiguous |
| 登録番号・登録年度 | 書かれた数字をそのまま写す | 空欄なら blank、読めなければ unreadable |
| 所有者の氏名・住所・電話 | 書かれたとおりに写し、氏名のふりがなは別の項目に | 読めなければ unreadable |
| 犬の種類・毛色・性別・名・生年月日 | 種類と毛色は書かれた語のまま、生年月日は年月日の形に | 「不明」「○年頃」と書かれていれば原文を残す |
| 注射の年月日・動物病院・獣医師 | 注射済証から写した欄を写す | 空欄なら blank |
| 変更の内容 | 新旧の所在地・所有者を対にして写す | 新旧のどちらかが無ければ blank |
| 手渡した番号 | 職員が書いた鑑札・注射済票の番号 | 空欄なら blank |
いちばん大事な区別は、blank と unreadable です。 blank は申請者が書かなかったということで、申請者に照会するかを職員が決めるもの、unreadable は字はあるが確定できないということで、申請書の画像を見れば済むものです。分ける材料は、OCRがその欄に文字を検出したかと、信頼度です。
空欄の判定を、キーと値の組だけに頼らないでください。 公式の説明では、Form Parser は値の入っていないキーと値の組を確実には読み取れないとされています。項目名だけが返ってこなかったときも、全文と位置から、その欄の範囲に文字が無いことを確かめてから blank にします。
| させないこと | 理由 |
|---|---|
| 登録番号の補完 | 桁を足す、似た番号に直すと、別の犬の行に付く |
| 原簿の犬の推定 | 照合は規則で行い、決まらなければ人に回す |
| 犬の種類の言い換え | 「ミックス」「雑種」を勝手にそろえない。そろえ方は台帳の決まりで規則として持つ |
| 生年月日の推定 | 「3歳くらい」から日付を作らない |
| 受付の可否の判断 | 職員が決める |
いちばん起きやすい失敗は、登録番号の補完です。 「R6-12」のように一部しか書かれていない番号を渡すと、それらしい番号の形に整えて返すことがあります。整えられた番号は、原簿の別の犬に当たることがあります。 書かれたとおりに写させ、照合はプログラムに任せます。
指示内容を固定する
あなたは市の生活衛生の担当課で、窓口で受け付けた犬の登録・注射済票・
届出の申請書を、台帳に取り込む形に写す補助をする立場です。
OCRが返した項目と値、チェック欄の状態、全文だけを見て写してください。
推測で埋めないでください。
【申請の区分】
registration(登録)/tag_injection(注射済票の交付)/
change_address(所在地の変更)/change_owner(所有者の変更)/
death(死亡)/reissue(鑑札・注射済票の再交付)
- 区分は、チェック欄が filled_checkbox になっているものだけから決めてください。
- 印が1つも無い、または想定に無い組み合わせのときは
category_status を ambiguous にしてください。
【写し方】
- 登録番号、注射済票・鑑札の番号は、書かれた文字のとおりに写してください。
桁を補う、記号を足す、それらしい形に直すことをしないでください。
- 氏名は書かれたとおりに写し、ふりがなの欄があれば別の項目に写してください。
- 犬の種類と毛色は、書かれた語のまま写してください。言い換えないでください。
- 生年月日は年月日の形に直してください。「不明」「○年頃」のように
書かれていれば、そのまま birth_raw に写し、birth_date は空にしてください。
- 変更の届出は、新旧の値を対にして写してください。
【厳守事項】
- 空欄の欄は値を書かずに status を blank にしてください。
- 文字はあるが読めない欄は「(判読不能)」とし、status を unreadable に
してください。空欄と読めない欄を混ぜないでください。
- 登録原簿のどの犬かを推測しないでください。
- 受け付けてよいか、照会が要るかを書かないでください。
- 犬の登録・注射以外の書類と判断した場合は、写さずに document_type に
種類を書いてください。
【様式の項目名と台帳の列の対応】{field_map}
【読み取り結果(項目と値、チェック欄、信頼度)】{ocr_result}
「チェック欄の filled_checkbox だけから決める」と書かないと、余白のメモから区分を推し量ります。 職員が「死亡のため」と欄外にメモしていると、チェック欄が「登録」のままでも死亡として返すことがあります。区分の根拠をOCRの値に固定し、食い違いは ambiguous として人に回します。
「どの犬かを推測しない」は、第1章の取り違えを防ぐためです。 生成AIに原簿を渡せば、名前と毛色から犬を当てに行きます。原簿は渡さず、照合はプログラムの規則だけで行います。
出力形式を固定する
次の形のJSONで受け取ります。 Claude API の構造化出力(output_config.format に JSON スキーマを渡す方式)を使い、形を固定します。
{
"page_id": "",
"document_type": "dog_application",
"category": ["registration | tag_injection | change_address | change_owner | death | reissue"],
"category_status": "ok | ambiguous",
"registration_no": { "value": "", "status": "ok | blank | unreadable" },
"owner": { "name": "", "kana": "", "address": "", "phone": "", "status": "ok | blank | unreadable" },
"dog": { "name": "", "breed": "", "color": "", "sex": "", "birth_date": "", "birth_raw": "" },
"injection": { "date": "", "clinic": "", "vet": "", "status": "ok | blank | unreadable" },
"change": { "old": "", "new": "" },
"issued_no": { "license": "", "tag": "" },
"min_confidence": 0
}
1つ目の理由は、照合をプログラムの規則で行えることです。 registration_no が ok なら、原簿をその番号で引き、所有者の氏名・犬の名・毛色のうち2つ以上が合えば同じ犬とします。合わなければ、番号の読み違いか書き間違いとして確認に回します。
2つ目は、確認の一覧に出す条件を、AIでなくプログラムが決められることです。
| 条件 | 確認の一覧に出す理由 |
|---|---|
category_status が ambiguous | 区分を申請書の画像で確かめる |
登録以外の区分で、登録番号が blank か unreadable | 原簿の犬を決められない。候補を名前で挙げて人に回す |
| 原簿の犬と、氏名・犬の名・毛色が2つ以上食い違う | 取り違えの疑い |
| 原簿で既に死亡・転出になっている犬への届出 | 二重の届出か、別の犬の疑い |
| 手渡した注射済票の番号が、その日の交付の範囲に無い | 書き間違いか読み違い |
登録の申請で、施行規則の記載事項に blank がある | 記入漏れ。照会するかは職員が決める |
min_confidence がしきい値を下回る | 画像で確かめる |
3つ目は、注射済票の年度を規則で決められることです。 狂犬病予防法施行規則では、毎年3月2日から31日までの間に実施した予防注射について交付する注射済票は、翌年度のものとされています。injection.date から年度をプログラムで決め、窓口で手渡した注射済票の年度と合うかを確かめます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 共有フォルダ | Python の定期の確認 | 新しいPDFを見つける |
| Google Document AI | API呼び出し | 項目と値、チェック欄、信頼度を返す |
| Claude API | API呼び出し | 申請の区分と項目をそろえる |
| 登録原簿の抜き出し | 台帳システムから毎朝書き出した一覧 | 登録番号で犬を引く |
| 取り込む一覧・確認の一覧 | CSV とスプレッドシート | 台帳システムの取り込みに渡す/職員が見る |
台帳システムには直接書き込みません。 取り込む一覧を職員が確かめ、台帳システムの取り込みの機能で入れます。死亡や転出のように行を閉じる手続は、取り込む一覧でも別の欄に分けて並べます。 閉じた行を開き直すのは手間がかかるので、職員が最後にもう一度見る場所にします。
人が確認する
- 区分が
ambiguousのものを先に見る … 申請書の画像を開き、区分を決めます - 取り違えの疑いを見る … 原簿の犬と申請書の画像を並べ、同じ犬かを確かめます。分からなければ申請者に照会します
- 記入漏れを見る … 照会するかを決めます。照会の電話は、申請から日が浅いうちにかけます
- 取り込む一覧を流し見る … 件数と区分の内訳を見て、行を閉じる手続の欄だけは1件ずつ確かめてから取り込みます
- 直したら記録する … どの項目を何から何に変えたかを残します
目標は、360件をならして1件2分です。 確認の一覧に出るのは2割前後という想定で、それより多い月は、様式のチェック欄からはみ出した印か、支所のスキャンの設定を疑います。
例外に対処する
| 起きること | 対応 |
|---|---|
| 区分のチェック欄が読まれない | 様式の外の印か、丸で囲んだもの。ambiguous として人へ。様式の使い方を窓口に伝え直す |
| 1枚に2頭分が書かれている | 様式の想定外。1頭1枚に書き直してもらう運用にし、届いたものは人へ |
| 登録番号が原簿に無い | 他の市町村で登録された犬の転入か、番号の誤り。人へ |
| 原簿の犬が既に死亡になっている | 二重の届出か取り違え。人へ |
| マイクロチップの番号だけが書かれている | 特例による登録の犬の可能性。原簿のマイクロチップの欄で引き、決まらなければ人へ |
| 注射の年月日が年度の境目 | 3月2日〜31日の注射は翌年度。規則で決め、手渡した注射済票の年度と照らす |
| 申請書以外の書類が混ざる | document_type を見て人へ |
| OCRが応答しない | PDFを元のフォルダに残し、次の回にやり直す |
上から3行目までが、運用の最初の1か月にいちばん多く出ます。 どれもAIの問題ではなく、様式と窓口の使い方の問題です。 窓口ごとに件数を数え、多い窓口にだけ使い方を伝え直します。
記録を残す
- 申請書の画像と、受け付けた窓口・受付日
- OCRが返したJSONの全文(項目と値、チェック欄、信頼度)
- AIが返した区分と項目と、そのとき照合した原簿の抜き出しの日付と該当の行
- 確認の一覧に出した理由と、職員が直した記録(項目、変更前、変更後)
- 台帳システムに取り込んだ日時と、取り込んだ職員
- 窓口ごとの、
ambiguousとunreadableの件数
3つ目で「照合した原簿の行」を残すのは、取り違えが後で見つかったときにたどるためです。 どの日の抜き出しのどの行と照らして同じ犬としたかが残っていれば、どこで取り違えたかを確かめられます。
04実装レベルの3段階
半自動化で、1件6分が4分程度になります。 読み取りは自動になりますが、原簿の犬を探す作業と打ち込みが残ります。本格構成で2分になり、この段階が本記事の想定です。 差が大きいのは、原簿との照合と台帳への打ち込みが、1件ずつの手作業だからです。
05工数削減シミュレーション
導入後 360件 × 2分 ÷ 60 = 12 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 犬の登録、注射済票の交付、死亡・変更の届出を、窓口で手書きの申請書で受け付け、職員が閉庁後や翌日に台帳のシステムへ打ち込んでいる市町村。同じ申請書の様式に申請の区分のチェック欄があり、区分によって台帳のどこを直すかが変わる場合。打ち込みの順番待ちで台帳の反映が遅れ、問い合わせに答えられないことがある場合。
- 犬の手続の大半を電子申請や動物病院からのデータで受けており、紙の申請書がほとんど残っていない市町村。月の件数が数十件で、窓口でその場で打ち込めている場合。申請者の氏名・住所を国外のリージョンで処理することを、情報セキュリティポリシーで認められない場合。なお、登録や交付の可否の判断、申請者への照会の要否は、この構成では代替できません。
07最小構成で試す方法
- 先月受け付けた申請書から、区分の違うものを20枚選ぶ(2頭以上を飼っている家の届出を数枚入れる)
- 複合機で300dpiでスキャンする
- 手元の生成AIのサービスの画面に1枚ずつ貼り付ける
- 「この申請書の申請の区分と、登録番号・所有者・犬の項目を写してください。空欄の欄と読めない欄を分けてください。登録番号を補わないでください」と指示する
- 出てきた結果を、台帳システムに打ち込んだ内容と突き合わせる
20枚は必ずやってください。 プログラムを組む前に、「この様式で区分と項目が読めるのか」を確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 台帳とほぼ同じ内容が出た | Form Parser とプログラムの連携に進む |
| 登録番号を補った、毛色を言い換えた | 指示の書き方で直る。構成は有効 |
| 区分を読み違えた | 様式のチェック欄が先。 AIの問題ではない |
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 区分を読み違える | 区分の欄を四角のチェック欄にし、filled_checkbox だけで決める |
| 同じ家の別の犬と取り違える | 登録番号で照合し、名前・毛色の2つ以上が合わなければ人へ |
| 登録番号が補われる | 補完を禁じ、照合はプログラムで行う |
| 空欄が「読めない」に紛れる | 欄の範囲に文字が無いことを確かめて blank にする |
| 原簿の抜き出しが古い | 毎朝書き出し直し、抜き出しの日付を記録する |
| 注射済票の年度がずれる | 3月2日〜31日の注射は翌年度として規則で決める |
| 支所の写しが読めない | コピーではなく原本をスキャンする |
| 行を閉じる手続が流し見で入る | 取り込む一覧で別の欄に分け、1件ずつ確かめる |
| 国外での処理を後から問われる | 導入前に情報セキュリティポリシーに照らして決める |
上の2行が、この構成の失敗のほとんどです。 どちらも、申請書に書かれた手続を、台帳の正しい犬の正しい場所に入れるという同じことから来ています。様式のチェック欄と、登録番号での照合の2つで、ほぼ防げます。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 犬の所有者の氏名、住所、電話番号と、犬の情報(種類、毛色、生年月日、名前)、注射の記録です。
- 国外で処理してよいかを先に決める … Form Parser の対応リージョンに日本はありません。住民の氏名と住所が国外のリージョンで処理されることを、情報セキュリティポリシーで認めるかを導入前に決めます。 認められない場合は、国内で処理できる別のOCRを検討します
- 生成AIに渡すのは読み取り結果だけにする … 申請書の画像そのものではなく、Form Parser が返した項目と値を渡します。登録原簿は渡しません。 照合はプログラムの側で行います
- 台帳への反映は人が行う … 取り込む一覧は職員が確かめてから台帳システムに入れます。行を閉じる手続は1件ずつ確かめます
- 申請者への照会は人が行う … 記入漏れの照会の要否と方法は職員が決めます。この構成は申請者に何も送りません
- 画像と中間の一覧を残す期間を決める … 申請書の画像と取り込む一覧には、住民の氏名と住所がまとまっています。文書の保存の決まりに合わせて、消す期間を先に決めます
誤りが起きた場合のリスクは、別の犬の行を直すことと、記入漏れを見落として台帳に入れることの2つです。 前者は名前で照合すると起き、後者は空欄と読めない欄を混ぜると起きます。どちらも、登録番号での照合と、blank の扱いを規則で決めることで防ぎます。
10まず何から始めるか
1週目:様式を作り直す
申請の区分の欄を四角のチェック欄にし、「窓口で手渡した鑑札・注射済票の番号」の欄を足します。1頭1枚に書くことを、窓口の案内に入れます。
2週目:20枚で試す
先月の申請書から20枚を選び、手元の生成AIの画面に貼り付けて写させます。区分を読み違えていないか、登録番号を補っていないかを最優先で見ます。
3週目:照合の準備をする
台帳システムから登録原簿の抜き出しを書き出す手順と、様式の項目名と台帳の列の対応表を作ります。取り込みの形式を、台帳システムの担当と確かめます。
4週目:スキャンから確認の一覧までをつなぐ
Python で共有フォルダを見て Form Parser を呼び、区分と項目を確認の一覧に書き出すところまで作ります。この時点では取り込む一覧を作らず、確認の一覧だけを職員が見ます。
2か月目: 原簿との照合と、注射済票の年度と番号の確認を足し、取り込む一覧を作ります。3か月目以降: 支所に広げ、1件6分が何分になったかを実測します。4〜6月を一度通して、確認の一覧に出る件数が2割前後で落ち着いた時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| 犬の所有者が取得した日(生後90日以内の犬は生後90日を経過した日)から30日以内に登録を申請し、市町村長が原簿に登録して鑑札を交付すること。死亡・所在地等の変更を30日以内に届け出ること。予防注射を毎年1回受けさせ、市町村長が注射済票を交付すること(法令APIで条文を取得して確認) | e-Gov 法令API: 狂犬病予防法 | 2026-10-08 |
| 登録の申請書の記載事項(所有者の氏名及び住所、犬の所在地・種類・生年月日・毛色・性別・名、特徴)。原簿の記載事項。死亡・変更の届出書の記載事項。予防注射を4月1日から6月30日までの間に1回受けさせること。3月2日から31日までの予防注射の注射済票が翌年度のものであること(法令APIで条文を取得して確認) | e-Gov 法令API: 狂犬病予防法施行規則 | 2026-10-08 |
| 特例制度に参加する市町村では指定登録機関からの通知が登録の申請等とみなされ、マイクロチップが鑑札とみなされること。注射済票は引き続き市町村の窓口等で交付を受ける必要があること(原文を取得して確認) | 厚生労働省: マイクロチップの装着等の義務化に係る狂犬病予防法の特例に関する対応について | 2026-10-08 |
Form Parser がOCRのテキストに加えてキーと値のペア(項目とチェック欄)、表、一般的な項目を抽出すること。日本語(ja)が手書きに対応する言語として示されていること。オンラインの処理が最大15ページであること。対応リージョンに日本が含まれていないこと(HTMLを取得して確認) | Google Cloud: Processor list | 2026-10-08 |
チェック欄が項目と値として抽出され valueType で記入の有無が示されること。対応する項目名が無いことがあり、ラジオボタンに対応しないこと。値の入っていないキーと値の組を確実には読み取れないこと。11の一般的な項目 | Google Cloud: Form Parser | 2026-10-08 |
formFields の名前と値、キーが書類のキーの文字そのものであること。チェック欄の値が filled_checkbox/unfilled_checkbox であること。表の中のチェック欄は文字として返ること。textAnchor と boundingPoly | Google Cloud: Handle the processing response | 2026-10-08 |
| 対応形式と、スキャンは最低200dpiが望ましく300dpi以上が一般に最もよいこと。非可逆の形式で小さくすると精度が落ちうること | Google Cloud: Supported files | 2026-10-08 |
output_config.format に JSON スキーマを渡して応答の形を固定できること。列挙の値の大文字・小文字は保証されないこと | Claude API: Structured outputs | 2026-10-08 |
登録や交付の可否、申請者への照会、国外での処理の可否は、担当課と情報セキュリティの担当で決めてください。 本記事は確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1130)についてのご相談はこちらから。
