入社予定者から届く雇入時の健康診断書を読み取り、受診日と法定の11項目の抜けを確かめて、追加の受診が要る人と人事の台帳への記録を分けて出す
入社予定者が提出した健康診断書を読み取り、受診日が雇入れの日の3か月以内か、法定の11項目がそろっているかを確かめます。足りない項目の追加受診の案内と、人事の台帳に入れる受診日・項目の有無の記録を分けて出します。
- 生成AI
- ChatGPT/Claude/Gemini
- AIサービス
- Azure AI/Google Document AI
- 連携・自動化
- Google Apps Script/Python
- 対象業界
- 人材/介護/物流/製造
- 対象部門
- 人事/採用
- 対象業務
- データ入力・転記/内容確認・チェック
- 主な課題
- 入力作業が多い/期限・対応漏れが起きる/確認ミスが多い
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 入力漏れ削減/品質標準化/工数削減
- 導入難易度
- ★★★☆☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 入社手続のフォームに健康診断書が上がると、担当がファイルを開く
- 受診日を探し、入社日との差が3か月以内かを数える
- 11項目がそろっているかを、項目名を探しながら1つずつ見る
- 人事の台帳に、受診日と項目ごとの有無を打ち込む
- 足りない項目があれば、入社予定者に追加受診の案内をメールで送る
- 健康診断書を健康診断個人票の綴りに入れる
- 人入社予定者が、入社手続のフォームから健康診断書を提出する
- 自動提出をきっかけにプログラムが動き、ファイルの形式と解像度を確かめる
- 自動OCRが健康診断書を読み、項目と値、表、全文、読み取りの信頼度を返す
- 自動生成AIが受診日と11項目それぞれの有無をそろえ、受けられていない項目と読めなかった項目を分けて返す
- 自動入社日との差で受診日の期限を規則で判定し、追加受診が要る項目を決める
- 自動人事の台帳に入れる記録(受診日と項目の有無だけ)と、追加受診の案内の下書きを作る
- 人担当が確認の一覧だけを開き、健康診断書の画像と見比べて直す。案内を確かめて送る
- 自動入社日が変わったら、台帳の受診日と照らし直し、期限を過ぎるものを知らせる
各工程の詳しい説明を読む
- 入社手続のフォームに健康診断書が上がると、担当がファイルを開く
- 受診日を探し、入社日との差が3か月以内かを数える
- 11項目がそろっているかを、項目名を探しながら1つずつ見る
- 人事の台帳に、受診日と項目ごとの有無を打ち込む
- 足りない項目があれば、入社予定者に追加受診の案内をメールで送る
- 健康診断書を健康診断個人票の綴りに入れる
(a)様式がばらばらで、項目を探すのに時間がかかる。 ある医療機関は「AST(GOT)」、別の医療機関は「GOT」とだけ書き、肝機能の3つの検査が別のページに分かれていることもあります。項目名が違う、並びが違う、ページが違う。 11項目を探し当てるまでに、毎回同じ手間がかかります。
(b)項目の抜けに入社後に気づく。 聴力が1,000ヘルツだけで4,000ヘルツの欄が無い、血中脂質がLDLコレステロールだけで中性脂肪が無い、心電図が受けられていない。項目の「中の一部」が抜けているものは、急いで見ると見落とします。 入社後に気づいて追加受診を頼むと、勤務の合間に行ってもらうことになります。
(c)受診日の期限を見落とす。 入社日が後ろにずれると、提出のときには3か月以内だった健康診断が、入社日には3か月を過ぎてしまうことがあります。入社日の変更は採用の担当から別に連絡が来るので、台帳の受診日と結びつけて見直す人がいません。
(d)結果の値が人事の台帳に残る。 確認のついでに、担当が気になった値を台帳のメモ欄に書いてしまうことがあります。台帳は人事部の多くの人が見るもので、健康診断の値を置く場所ではありません。
- 【人】 入社予定者が、入社手続のフォームから健康診断書を提出する
- 【自動】 提出をきっかけにプログラムが動き、ファイルの形式と解像度を確かめる
- 【自動】 OCRが健康診断書を読み、項目と値、表、全文、読み取りの信頼度を返す
- 【自動】 生成AIが受診日と11項目それぞれの有無をそろえ、受けられていない項目と読めなかった項目を分けて返す
- 【自動】 入社日との差で受診日の期限を規則で判定し、追加受診が要る項目を決める
- 【自動】 人事の台帳に入れる記録(受診日と項目の有無だけ)と、追加受診の案内の下書きを作る
- 【人】 担当が確認の一覧だけを開き、健康診断書の画像と見比べて直す。案内を確かめて送る
- 【自動】 入社日が変わったら、台帳の受診日と照らし直し、期限を過ぎるものを知らせる
7番目が、この設計の分かれ目です。人が見るのは全件ではありません。 11項目がそろって読め、受診日も期限の内のものは、台帳の記録が並ぶだけです。担当が開くのは、確認の一覧に出たものと、その健康診断書の画像だけです。
8番目を足しているのは、第3章の(c)のためです。 入社日の変更を、台帳の受診日と結びつけて見直すのは、人には続きません。入社日が変わったという連絡をきっかけに、規則で照らし直します。
02今回想定するシステム構成
入社予定者が提出した健康診断書(PDF・写真、医療機関ごとに様式が違う) │ ▼【トリガー】入社手続のフォームへの提出(保存先のフォルダ) Python ── 形式・解像度・ページ数の確認、入社予定者の番号と入社日を付ける ▼ Google Document AI(Form Parser) │ 項目と値、表のセル、全文、信頼度を返す ▼ Claude API ── 受診日と11項目の有無をそろえる │ 既往歴・業務歴/自覚・他覚症状/身長・体重・腹囲・視力・聴力(1,000Hz・4,000Hz) │ /胸部X線/血圧/貧血/肝機能(3つ)/血中脂質(3つ)/血糖/尿(糖・蛋白)/心電図 ▼ Python ── 入社日との差で受診日の期限を判定、追加受診が要る項目を決める ▼ 人事の台帳(受診日と項目の有無だけ)/健康診断個人票の保管先(値を含む) /追加受診の案内の下書き/確認の一覧 ▼【担当が確認の一覧を見て直し、案内を送る】
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | Google Document AI(Form Parser) | Azure AI Document Intelligence |
| 生成AI | Claude API(受診日と11項目の有無のそろえ) | OpenAI API、Gemini API |
| 連携 | Python(形式の確認、期限の判定、台帳と個人票への書き出し) | Google Apps Script |
| 保管 | 人事の台帳と、アクセスを絞った健康診断個人票の保管先 | 人事のシステム |
入社手続のフォームと人事の台帳は、新しく足すものではありません。 足すのは、提出された健康診断書を読んで台帳と個人票に分けて書き出す小さなプログラムと、健康診断個人票の保管先のアクセスを絞る設定です。
土台は Document AI の Form Parser です。 公式のプロセッサ一覧では、OCRのテキストに加えてキーと値のペア、チェックボックス、表を抽出するとされ、言語の一覧で日本語(ja)は手書きに対応する言語として示されています。健康診断書は、医療機関の印刷した結果表に、医師の手書きの所見や判定が加わる形が多く、表と手書きの両方を読めることが、この題材に効きます。
表の扱いには制約があります。 公式の説明では、Form Parser の表の抽出は行や列をまたぐセルの無い、ふつうの表だけを認識するとされ、応答の扱いの説明では、返るセルの rowSpan と colSpan は常に1です。健康診断の結果表は、「肝機能」の見出しが3行分をまたいでいることがよくあります。 表として読めない部分は全文の文字から項目を拾う、という二段構えにします(第7章)。
処理する場所に日本はありません。 プロセッサ一覧の Form Parser の対応リージョンは、us、eu、asia-southeast1、asia-south1、australia-southeast1 などで、日本のリージョンは一覧にありません。 健康診断の結果は要配慮個人情報に当たるので、国外で処理してよいかを、導入前に社内の規程に照らして決めます(第13章)。
03どうやって実装するのか
処理の起点を決める
入社手続のフォームに健康診断書が提出されたことを起点にします。 フォームの保存先のフォルダを、Python のプログラムが10分おきに見て、新しいファイルを処理します。ファイルの名前には、フォームが付ける入社予定者の番号が入っているので、そこから入社日と配属先を引きます。
提出のたびに動かすのは、追加受診の案内を早く出すためです。 入社日の2週間前に提出された健康診断書に項目の抜けがあれば、その日のうちに案内を出せば、入社前に追加の受診を済ませてもらえます。 1週間まとめて処理すると、入社日に間に合わない人が出ます。
もう1つのトリガーは、入社日の変更です。 採用の担当が入社予定者の一覧の入社日を書き換えたら、その人の台帳の受診日と照らし直します。 一覧の変更を1日1回見て、入社日が変わった人だけを処理します。処理が終わったファイルは処理済みのフォルダへ移し、移すのは成功したときだけにします。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 健康診断書 | PDFまたは写真。提出日時 | 入社手続のフォームの保存先 |
| 読み取り結果 | 項目と値、表のセル、全文、信頼度、位置 | Google Document AI |
| 入社予定者の情報 | 番号、氏名、入社日、配属先 | 入社予定者の一覧 |
| 項目名の対応表 | 11項目ごとに、医療機関が使う項目名の言い方(GOT/AST、中性脂肪/トリグリセライド など) | 担当が作る一覧 |
質を決めるのは、項目名の対応表です。 労働安全衛生規則の第43条は、肝機能検査を「GOT、GPT及びγ-GTPの検査」、血中脂質検査を「LDLコレステロール、HDLコレステロール及び血清トリグリセライドの量の検査」と書いています。医療機関の結果表では、同じ検査が「AST」「ALT」「中性脂肪」と書かれていることが多くあります。 言い方の一覧が無いと、受けている検査を「無い」と判定します。
対応表は、運用しながら足していきます。 担当が確認の一覧で「この言い方は GOT のことだ」と分かったら、その言い方を対応表に足し、次から同じ医療機関の書類が確認に回らないようにします。
入社予定者の情報は、番号と入社日と配属先だけを渡します。 住所や連絡先は、この処理には要りません。追加受診の案内を送るときに、フォームの仕組みの側で宛先を付けます。
データの取得方法を決める
読み取りは、Python から Form Parser のプロセッサを呼ぶだけです。オンラインの処理は1回の要求で最大15ページで、健康診断書は数ページに収まるので、1回で送れます。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 項目と値 | 各ページの formFields の fieldName と fieldValue | 受診日、氏名、医療機関、所見 |
| 表のセル | 各ページの tables の headerRows/bodyRows の cells | 検査ごとの値 |
| 全文 | 応答の text と各要素の textAnchor | 表として読めなかった検査を項目名から拾う |
| 信頼度 | 各要素の layout の confidence | 読めた欄と読めなかった欄の区別 |
| 位置 | layout の boundingPoly | 確認の画面で、画像の該当の欄に枠を出す |
| 一般的な項目 | 日付(date_time)、組織名(organization) | 受診日と医療機関の形の確かめ |
受診日は、項目と値から取り、全文で確かめます。 健康診断書には、受診日のほかに、発行日、前回の受診日、生年月日と、日付がいくつも並びます。「受診日」「健診日」「実施日」のように書かれた項目の値だけを受診日とし、それが無ければ受診日は空にします。 発行日を受診日の代わりにしません。
AIへ渡す前に整形する
- 形式の確認 … 公式の対応形式は PDF、GIF、TIFF、JPEG、PNG、BMP、WebP などです。それ以外は提出し直してもらいます
- 解像度の確認 … 公式の説明では、スキャンは最低200dpiが望ましく、300dpi以上が一般に最もよいとされています。写真の画素数が足りないものは、撮り直しを頼みます
- ページの組み立て … 1人分の結果が複数のファイルで出されたら、入社予定者の番号でまとめて1件にします
- 本人の確認 … 健康診断書の氏名と生年月日を、入社予定者の一覧と照らします。合わなければ処理を止めます
- 受診者以外の書類の除外 … 予防接種の記録や診断書のように、健康診断の結果でない書類を見分けます
4番目を省かないでください。 家族の健康診断書を取り違えて出す、前の会社の別の人の書類が混ざる、ということが実際に起きます。他人の健康診断の結果が、別の人の個人票に入るのは、この構成で最も避けたい事故です。 氏名と生年月日が一覧と合わないものは、読み取りの先に進めません。
2番目は、写真での提出が多いほど効きます。 机の上で斜めに撮った写真は、結果表の細い文字が読めません。読み取りの信頼度が低いものの多くは、撮り方の問題です。 フォームの説明に、真上から明るい場所で撮ることを書いておきます。
AIに処理させる
させるのは、読み取り結果から受診日と11項目それぞれの有無をそろえることだけです。 値の良し悪しの判断と、期限の判定はさせません。
| 項目 | そろえ方 | 判断できないときの扱い |
|---|---|---|
| 受診日 | 「受診日」「健診日」「実施日」の値だけを年月日の形に | 該当の項目が無ければ blank、複数あれば ambiguous |
| 既往歴・業務歴、自覚・他覚症状 | 記載の欄があり記入があるか | 欄が無ければ not_done、読めなければ unreadable |
| 身長・体重・腹囲・視力・聴力 | 5つそれぞれ。聴力は1,000Hzと4,000Hzを別に見る | どちらかの周波数が無ければその分を not_done |
| 胸部X線、血圧、血糖、心電図 | 結果か所見の記載があるか | 同上 |
| 貧血 | 血色素量と赤血球数の2つ | 1つしか無ければ無い方を not_done |
| 肝機能 | GOT(AST)、GPT(ALT)、γ-GTP の3つ | 同上 |
| 血中脂質 | LDL、HDL、トリグリセライド(中性脂肪)の3つ | 同上 |
| 尿 | 糖と蛋白の2つ | 同上 |
いちばん大事な区別は、not_done と unreadable です。 not_done はその検査の項目そのものが健康診断書に無いということで、追加の受診を頼むもの、unreadable は項目はあるが値が読めないということで、画像を見直せば済むものです。分ける材料は、項目名が全文に見つかったかと、値の欄の信頼度です。
「中の一部」を1つずつ見させるのが、第3章の(b)の答えです。 「肝機能 済」で1つに丸めると、γ-GTP だけが無い健康診断書を見落とします。3つの検査を別々の項目として返させ、1つでも not_done なら追加受診の対象にします。
| させないこと | 理由 |
|---|---|
| 値の良し悪しの判断 | 健康診断の結果の評価は医師が行う |
| 「要再検査」「要精密検査」の要約 | 人事の台帳に結果の評価を残さない |
| 受診日の推定 | 発行日や前回の受診日から受診日を作らない |
| 項目の読み替えの拡大 | 対応表に無い検査を、似た検査として「有り」にしない |
| 期限の内か外かの判定 | 規則で行う。入社日の変更に追随させる |
いちばん起きやすい失敗は、2行目です。 健康診断書を読ませると、生成AIは頼まれなくても「LDLコレステロールが高めです」と書き添えます。その一文が人事の台帳に入った時点で、要配慮個人情報が見る必要のない人の目に触れます。 出力の項目に値の評価の欄を作らず、指示でも禁じます。
指示内容を固定する
あなたは人事部で、入社予定者が提出した健康診断書について、
労働安全衛生規則第43条の項目が受けられているかを確かめる補助をする立場です。
OCRが返した項目と値、表のセル、全文だけを見て、項目の有無を返してください。
推測で埋めないでください。
【確かめる項目】
history(既往歴・業務歴)、symptoms(自覚症状・他覚症状)、
height、weight、waist、vision、hearing_1000、hearing_4000、
chest_xray、blood_pressure、hemoglobin、rbc、
got、gpt、ggt、ldl、hdl、tg、glucose、urine_sugar、urine_protein、ecg
【status の選び方】
- done ......... 項目名があり、値か所見が読み取れる
- not_done ..... 項目名が健康診断書のどこにも無い
- unreadable ... 項目名はあるが、値か所見の文字が読めない
迷ったときに done を選ばないでください。
【厳守事項】
- 項目名の言い方は、次の対応表に従ってください。対応表に無い検査を、
似た検査として done にしないでください。
- 受診日は「受診日」「健診日」「実施日」と書かれた項目の値だけから
取ってください。発行日や前回の受診日を受診日にしないでください。
該当の項目が無ければ空にしてください。
- 値は写さないでください。値が基準の内か外か、再検査が要るかを
書かないでください。所見の内容も要約しないでください。
- 聴力は 1,000Hz と 4,000Hz を別に見てください。
- 健康診断の結果でない書類と判断した場合は、document_type に種類を
書き、項目を返さないでください。
【項目名の対応表】{item_aliases}
【読み取り結果】{ocr_result}
「値は写さない」を最初に決めておくのが、この指示の要です。 有無の確認に値は要りません。値は健康診断個人票の側に、OCRの結果から直接写します。 生成AIの出力に値が無ければ、人事の台帳に値が紛れ込む経路が最初から無くなります。
「対応表に無い検査を似た検査にしない」は、done の水増しを防ぐためです。 「肝機能 ALP」は対応表のどれにも当たりません。似ているからと GOT の代わりにすると、受けていない検査を受けたことにします。
出力形式を固定する
次の形のJSONで受け取ります。 Claude API の構造化出力(output_config.format に JSON スキーマを渡す方式)を使い、形を固定します。
{
"candidate_id": "",
"document_type": "health_checkup",
"name_match": "matched | mismatch",
"exam_date": { "value": "", "status": "ok | blank | ambiguous" },
"clinic": "",
"items": [
{ "item": "got", "status": "done | not_done | unreadable",
"label_found": "", "confidence": 0 }
]
}
items にはこの形の要素を、第7章の22の項目の分だけ並べます。label_found には、健康診断書で見つけた項目名の文字だけを入れ、値は入れません。
1つ目の理由は、期限の判定をプログラムの規則で行えることです。 exam_date と入社予定者の一覧の入社日から、受診日が入社日の3か月前の日より後かを規則で決めます。入社日が変わったら、同じ規則で照らし直します。
2つ目は、追加受診と確認の一覧を、AIでなくプログラムが決められることです。
| 条件 | 出し先 |
|---|---|
name_match が mismatch | 処理を止め、担当へ |
exam_date が blank か ambiguous | 確認の一覧(受診日を画像で確かめる) |
| 受診日が入社日の3か月前より前 | 追加受診の案内の下書き(全項目) |
not_done の項目がある | 追加受診の案内の下書き(その項目だけ) |
unreadable の項目がある | 確認の一覧(画像で確かめる) |
すべて done で受診日が期限の内 | 人事の台帳への記録だけ |
3つ目は、人事の台帳と健康診断個人票を、出力の形で分けられることです。 台帳には exam_date と items の status だけを書き、個人票の側にはOCRが返した値を、別の保管先に写します。 どちらに何を書くかを、プログラムの側で固定できます。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 入社手続のフォームの保存先 | Python の定期の確認 | 新しい提出を見つける |
| 入社予定者の一覧 | 読み取り | 番号、氏名、生年月日、入社日、配属先 |
| Google Document AI | API呼び出し | 項目と値、表、全文、信頼度 |
| Claude API | API呼び出し | 受診日と項目の有無 |
| 人事の台帳 | 追記 | 受診日と項目の有無だけ |
| 健康診断個人票の保管先 | アクセスを絞ったフォルダ | 健康診断書の画像と、OCRの値 |
| 追加受診の案内 | 下書きの一覧 | 担当が確かめて、フォームの仕組みから送る |
案内は自動では送りません。 下書きには、足りない項目の名前と、提出の期限だけを書きます。送る前に担当が画像と見比べ、本当に項目が無いかを確かめます。
人が確認する
name_matchがmismatchのものを最初に見る … 書類の取り違えの疑いです。入社予定者に連絡して、正しい書類を出し直してもらいます- 追加受診の案内の下書きを確かめる …
not_doneの項目について、健康診断書の画像で本当に無いかを見ます。見落とした項目名があれば、対応表に足します - 確認の一覧を見る … 受診日と
unreadableの項目を画像で確かめて直します - 直したら記録する … どの項目を何から何に変えたかを残します
2番目を省かないでください。 追加受診の案内は、入社予定者に時間と費用をかけさせる連絡です。 受けていた検査を「無い」と案内した1件は、入社前の印象に残ります。
目標は、200件をならして1件3分です。 確認の一覧と案内の下書きに出るのは3割前後という想定で、それより多い月は、対応表の言い方が足りていないか、写真の提出が増えています。
例外に対処する
| 起きること | 対応 |
|---|---|
| 氏名・生年月日が一覧と合わない | 処理を止め、担当から本人へ連絡 |
| 健康診断の結果でない書類 | document_type を見て、出し直しを頼む |
| 結果表の見出しが行をまたいで表として読めない | 全文の文字から項目名を拾う。拾えなければ unreadable で人へ |
| 1人分が複数のファイルに分かれる | 番号でまとめてから処理する |
| 受診日が入社日の3か月前と同じ日あたり | 規則で決め、境目の数日は人が確かめる |
| 入社日が変わった | 台帳の受診日と照らし直し、期限を過ぎるなら案内の下書きを作る |
| 写真が暗い・斜め | 撮り直しを頼む |
| 一部の検査だけ別の日に受けている(心電図だけ後日など) | 受診日が2つ以上あれば ambiguous。検査ごとの受診日を人が確かめ、古いほうの日で期限を見る |
| OCRが応答しない | ファイルを元のフォルダに残し、次の回にやり直す |
上の3行目が、運用の最初の1か月にいちばん多く出ます。 医療機関ごとの結果表の癖で、同じ医療機関の書類は同じところで読めません。 医療機関ごとに件数を数え、多いところから対応表と拾い方を直します。
記録を残す
- 健康診断書の画像と提出日時(健康診断個人票の保管先にだけ置く)
- OCRが返したJSONの全文(同じく個人票の保管先にだけ置く)
- AIが返した受診日と項目の有無(値を含まない)
- 期限の判定に使った入社日と、判定の結果
- 追加受診の案内を送った日と、追加の結果が届いた日
- 人が判定を直した記録と、対応表に足した言い方
1つ目と2つ目を個人票の保管先にだけ置くのは、ログが値の漏れ道にならないようにするためです。 処理の記録を共有のフォルダに書き出すと、OCRの値がログの中に残り、人事の誰もが見られる場所に置かれます。
04実装レベルの3段階
半自動化で、1件9分が5分程度になります。 項目を探す時間は減りますが、期限の判定と台帳への打ち込み、案内を書く作業が残ります。本格構成で3分になり、この段階が本記事の想定です。 段階を飛ばさないでください。 半自動化の一覧を1か月見ると、読めない医療機関と、対応表に足りない言い方が先に分かります。そこを直してから案内の下書きを足すほうが、受けていた検査を「無い」と案内する空振りが減ります。
05工数削減シミュレーション
導入後 200件 × 3分 ÷ 60 = 10 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 毎月まとまった人数を雇い入れ、入社予定者に自分で受けた健康診断の結果を提出してもらっている人材派遣会社、介護事業者、物流・製造の会社。届く健康診断書の様式が医療機関ごとにばらばらで、受診日と項目の抜けを人事の担当が1枚ずつ目で確かめている場合。項目が足りないことに入社後に気づき、追加の受診の案内が遅れている場合。
- 雇入時の健康診断を、会社が指定した1つの医療機関でまとめて受けてもらっており、結果がデータで届く場合。月の入社が数名で、目視で足りる場合。健康診断の結果を国外のリージョンで処理することを、社内の規程で認められない場合。なお、健康診断の結果の評価、就業上の措置、医師の意見の聴取は、この構成では代替できません。
07最小構成で試す方法
- 先月提出された健康診断書から、医療機関の違うものを20件選ぶ(項目が足りなかったものを数件入れる)
- 氏名と生年月日を黒く塗ってからPDFにする
- 手元の生成AIのサービスの画面に1件ずつ貼り付ける
- 「この健康診断書について、受診日と、次の22の検査それぞれが受けられているかを答えてください。項目が無い場合と、読めない場合を分けてください。値の良し悪しは書かないでください」と指示する
- 出てきた結果を、当時の担当の確認と突き合わせる
20件は必ずやってください。 プログラムを組む前に、「医療機関ごとの様式で、項目の有無が読めるのか」を確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 当時の確認と同じ抜けが出た | Form Parser とプログラムの連携に進む |
| 値の評価を書いた、ALP を GOT とした | 指示と対応表で直る。構成は有効 |
| 結果表の項目がずれて読めない | 医療機関ごとの拾い方が先。 全文から項目名を拾う形を試す |
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 受けていた検査を「無い」と判定する | 項目名の対応表を育て、案内の前に人が画像で確かめる |
| 「中の一部」の抜けを見落とす | 肝機能・血中脂質・貧血・尿・聴力を検査ごとに分けて返させる |
| 発行日を受診日にする | 受診日の項目名を決め、無ければ空にする |
| 入社日の変更で期限を過ぎる | 入社日の変更をトリガーにして照らし直す |
| 値の評価が台帳に入る | 出力に値と評価の欄を作らず、指示でも禁じる |
| ログに値が残る | OCRの結果と画像は個人票の保管先にだけ置く |
| 他人の書類が混ざる | 氏名と生年月日を一覧と照らし、合わなければ止める |
| 結果表の見出しが行をまたぐ | 全文から項目名を拾う二段構えにする |
上の2行が、この構成の失敗のほとんどです。 どちらも、「項目が無い」と判定する基準が、医療機関ごとの書き方に追いついていないことから来ています。案内の前に人が確かめる段を外さないでください。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 入社予定者の氏名、生年月日、健康診断の結果(値と所見)です。健康診断の結果は、個人情報の保護に関する法律施行令で要配慮個人情報の記述等として挙げられています。
- 国外で処理してよいかを先に決める … Form Parser の対応リージョンに日本はありません。健康診断の結果が国外のリージョンで処理されることを、社内の規程で認めるかを導入前に決め、入社予定者への説明にも入れます。 認められない場合は、国内で処理できる別のOCRを検討します
- 生成AIに値を返させない … 有無の確認に値は要りません。出力の項目に値の欄を作らず、値は個人票の側にだけ置きます
- 人事の台帳と個人票を分ける … 台帳には受診日と項目の有無だけを書きます。個人票の保管先は、見る必要のある担当と産業保健の担当に絞ります
- 採用選考に使わない … 健康診断書を受け取るのは内定の後です。採用選考の担当が、この構成の出力を見られないようにします
- 評価と措置は医師が行う … 結果の評価、就業上の措置、医師の意見の聴取は、この構成の外です
- 保存の期間を決める … 労働安全衛生規則第51条では、健康診断の結果に基づき健康診断個人票を作成して5年間保存するとされています。画像とOCRの結果も、この保存の決まりに合わせて扱います
誤りが起きた場合のリスクは、受けていた検査を無いとして追加受診を頼むことと、健康診断の値が見る必要のない人に渡ることの2つです。 前者は対応表の不足で、後者は出力やログに値が紛れ込むことで起きます。案内の前の人の確認と、値を出力に含めない形の2つで防ぎます。
10まず何から始めるか
1週目:項目名の対応表を作る
過去3か月の健康診断書から、医療機関ごとに11項目の書き方を拾い、22の検査ごとの言い方の一覧にします。AST/GOT、中性脂肪/トリグリセライドのような組を先に入れます。
2週目:20件で試す
氏名を塗った健康診断書20件を手元の生成AIの画面に貼り付け、項目の有無を答えさせます。値の評価を書いていないか、受けた検査を無いとしていないかを最優先で見ます。
3週目:保管先を分ける
健康診断個人票の保管先を作り、アクセスを絞ります。人事の台帳に、受診日と項目の有無の列だけを足します。
4週目:提出から確認の一覧までをつなぐ
Python でフォームの保存先を見て Form Parser を呼び、受診日と項目の有無を確認の一覧に書き出すところまで作ります。この時点では台帳に書かず、案内の下書きも作りません。
2か月目: 期限の判定と台帳への記録、案内の下書きを足します。3か月目以降: 入社日の変更への追随を足し、1件9分が何分になったかを実測します。受けていた検査を「無い」と案内する件数が月に1件も出なくなった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| 雇入時の健康診断の11項目(既往歴及び業務歴、自覚症状及び他覚症状、身長・体重・腹囲・視力・聴力(1,000Hz・4,000Hz)、胸部X線、血圧、貧血、肝機能(GOT・GPT・γ-GTP)、血中脂質(LDL・HDL・血清トリグリセライド)、血糖、尿中の糖及び蛋白、心電図)。健康診断を受けた後3か月を経過しない者が結果を証明する書面を提出したときは相当する項目を省けること(第43条)。健康診断個人票を作成して5年間保存すること(第51条)(法令APIで条文を取得して確認) | e-Gov 法令API: 労働安全衛生規則 | 2026-10-08 |
| 雇入れ時の健康診断が適正配置と入職後の健康管理のためのもので、採用選考時の実施を義務づけたものではなく、採否の決定のためのものでもないこと(原文を取得して確認) | 大阪労働局: 採用選考時の健康診断について | 2026-10-08 |
| 医師等により行われた健康診断その他の検査の結果が、要配慮個人情報の記述等として挙げられていること(第2条)(法令APIで条文を取得して確認) | e-Gov 法令API: 個人情報の保護に関する法律施行令 | 2026-10-08 |
Form Parser がOCRのテキストに加えてキーと値のペア、チェックボックス、表を抽出すること。日本語(ja)が手書きに対応する言語として示されていること。オンラインの処理が最大15ページであること。対応リージョンに日本が含まれていないこと(HTMLを取得して確認) | Google Cloud: Processor list | 2026-10-08 |
| 表の抽出が行や列をまたぐセルの無い表を対象とすること。11の一般的な項目を抽出すること | Google Cloud: Form Parser | 2026-10-08 |
formFields、表の headerRows/bodyRows と、Form Parser では rowSpan/colSpan が常に1であること。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-1131)についてのご相談はこちらから。
