タクシー会社の乗務員が手書きする乗務記録(運転日報)を読み取り、営業収入・走行距離・休憩の時刻を集計表にそろえて、記入漏れと拘束時間の超過の疑いを拾う
乗務員が手書きした乗務記録(運転日報)を読み取り、営業収入・走行距離・休憩の時刻を集計表にそろえます。記録が求められる項目の記入漏れと、拘束時間・休息期間の基準を超えた疑いを、帰庫の翌日には拾います。
- 生成AI
- Azure OpenAI Service/Claude
- AIサービス
- AWS Textract/Azure AI/Google Document AI
- 連携・自動化
- Python
- 対象業界
- その他/物流
- 対象部門
- 総務
- 対象業務
- データ入力・転記/内容確認・チェック
- 主な課題
- 入力作業が多い/期限・対応漏れが起きる/確認ミスが多い
- AIで行う処理
- 読み取り(OCR)
- 主な効果
- 入力漏れ削減/判断支援/工数削減
- 導入難易度
- ★★★☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 乗務員が乗務のあいだ、乗務記録に時刻・地点・距離・乗車ごとの運賃を書く
- 帰庫して納金するときに、乗務記録を事務所へ出す
- 翌日、事務担当が乗務記録を1枚ずつ見て、集計表に打ち込む
- 乗車ごとの運賃を電卓で足し、書かれた営業収入の合計と合うかを見る
- 記入の無い欄があれば付箋を貼り、乗務員の次の出庫のときに聞く
- 月末に乗務員ごとの勤務の時間を集計し、拘束時間の基準を超えていないかを見る
- 給与計算のシステムに、営業収入と勤務の時間を入れる
- 人乗務員がこれまでどおり乗務記録を書き、納金のときに出す。事務担当がまとめてスキャンする
- 自動スキャンの PDF が保管先に入ったことをきっかけに処理が動く
- 自動読み取りのモデルが、時刻・地点・積算キロ・休憩・乗車ごとの行・合計を、信頼度付きで返す
- 自動乗車ごとの運賃を足して、書かれた合計と照らす
- 自動記録が求められる項目の空欄を拾う
- 自動出庫・帰庫の時刻と点呼の記録から拘束時間を、前の乗務の帰庫から休息期間を数え、基準と照らす
- 自動事故や遅延の記載欄に手書きがあれば、生成AIが要点を写す
- 自動集計表の案と、確認の一覧(記入漏れ・合計の食い違い・時間の疑い・読み取りの迷い)を作る
- 人事務担当が確認の一覧の乗務だけ画像を開いて確かめ、乗務員に聞く
- 人運行管理者が時間の疑いの乗務を見て、点呼の記録と照らして判断する
- 人確かめた集計表を、月末に給与計算に回す
各工程の詳しい説明を読む
- 乗務員が乗務のあいだ、乗務記録に時刻・地点・距離・乗車ごとの運賃を書く
- 帰庫して納金するときに、乗務記録を事務所へ出す
- 翌日、事務担当が乗務記録を1枚ずつ見て、集計表に打ち込む
- 乗車ごとの運賃を電卓で足し、書かれた営業収入の合計と合うかを見る
- 記入の無い欄があれば付箋を貼り、乗務員の次の出庫のときに聞く
- 月末に乗務員ごとの勤務の時間を集計し、拘束時間の基準を超えていないかを見る
- 給与計算のシステムに、営業収入と勤務の時間を入れる
(a)打ち込み直しが重い。 1枚の乗務記録には、時刻と距離のほかに、乗車ごとの行が20〜40行あります。営業収入の内訳まで打ち込むと、1枚に数分かかります。
(b)記入漏れに気づくのが遅い。 休憩の地点、主な経過地点、帰庫時の積算キロの書き漏れは、5番の付箋で拾うはずですが、打ち込みに追われると見落とします。 月末になって欠けが見つかっても、乗務員は何週間も前の乗務を覚えていません。
(c)拘束時間の超過を後から知る。 6番は月末の作業です。隔日勤務の2暦日の拘束時間が基準を超えた乗務があっても、分かるのは翌月です。 その間に同じ乗務員の勤務が続けば、超過が重なります。
(d)営業収入の食い違いの原因が追えない。 4番で合わないと分かっても、行の書き間違いか、合計の計算違いか、打ち込みの誤りかを確かめるには、もう一度1行ずつ見直すしかありません。
- 【人】 乗務員がこれまでどおり乗務記録を書き、納金のときに出す。事務担当がまとめてスキャンする
- 【自動】 スキャンの PDF が保管先に入ったことをきっかけに処理が動く
- 【自動】 読み取りのモデルが、時刻・地点・積算キロ・休憩・乗車ごとの行・合計を、信頼度付きで返す
- 【自動】 乗車ごとの運賃を足して、書かれた合計と照らす
- 【自動】 記録が求められる項目の空欄を拾う
- 【自動】 出庫・帰庫の時刻と点呼の記録から拘束時間を、前の乗務の帰庫から休息期間を数え、基準と照らす
- 【自動】 事故や遅延の記載欄に手書きがあれば、生成AIが要点を写す
- 【自動】 集計表の案と、確認の一覧(記入漏れ・合計の食い違い・時間の疑い・読み取りの迷い)を作る
- 【人】 事務担当が確認の一覧の乗務だけ画像を開いて確かめ、乗務員に聞く
- 【人】 運行管理者が時間の疑いの乗務を見て、点呼の記録と照らして判断する
- 【人】 確かめた集計表を、月末に給与計算に回す
6番目を毎日動かすのが、この設計の要です。 月末にまとめて数えるのではなく、帰庫の翌日には「この乗務は2暦日の拘束時間の基準を超えた疑いがある」と運行管理者に届きます。 次の勤務の組み方で手が打てるうちに知らせます。
10番目を運行管理者に置いているのも意図してのことです。 機械が出すのは「疑い」までです。拘束時間は始業から終業までの時間で、乗務記録の出庫・帰庫の時刻とは一致しないことがあります。 点呼の記録と照らして判断するのは人です。
02今回想定するシステム構成
乗務員が手書きした乗務記録(紙) │ 納金のときに提出、事務担当がまとめてスキャン ▼【トリガー】保管先(Blob Storage)への PDF の保存 Azure Functions(保存を起点に動く処理) ▼ Azure AI Document Intelligence(カスタム ニューラル モデル) │ 出庫・帰庫・休憩・積算キロ・乗車ごとの行(表)・合計・信頼度 ▼ Azure Functions ── 集計と判定 │ ① 運賃の足し算と合計の照合 │ ② 記録が求められる項目の空欄 │ ③ 拘束時間・休息期間の計算(点呼の記録と照らす) ├──▶ Azure OpenAI ── 事故・遅延の記載欄の要点を写す ▼ 集計表の案 + 確認の一覧 ▼ 【事務担当が確認の一覧だけ確かめる】【運行管理者が時間の疑いを判断】 ▼ 給与計算(月末)
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| OCR | Azure AI Document Intelligence(カスタム ニューラル モデル) | Google Document AI(Form Parser)、AWS Textract(英文の書類に限る。日本語の乗務記録には使えない) |
| 生成AI | Azure OpenAI(Microsoft Foundry) | Claude API |
| 集計 | 運賃の集計と時間の計算(Python。Azure Functions で動かす) | ─ |
| 連携 | Azure Functions(Blob Storage のトリガー) | Azure Logic Apps |
| 保管 | Azure Blob Storage(乗務記録の画像と読み取り結果) | 営業所のファイルサーバー |
給与計算のシステムと点呼の記録簿は、新しく足すものではありません。 この構成は点呼の記録を読むだけで、給与計算へは月末に事務担当が確かめた集計表を回します。
読み取りの中心は、Azure AI Document Intelligence のカスタム ニューラル モデルです。 乗務記録の様式は自社で決まっていますが、乗車ごとの行の数が乗務ごとに大きく違い、書き込みが行の枠からはみ出すことも多いため、レイアウトと言語の特徴を組み合わせるニューラル モデルを選びます。公式のページでは、ニューラル モデルは表の項目に対応し、v4.0(2024-11-30 GA)では表・行・セルの信頼度を返すとされています。手書きの文字の対応言語には日本語が含まれます。
乗車ごとの行を「表・行・セル」の3段で見られることが、この題材に効きます。 公式のページでは、表全体、行、セルの順に上から見ていくことが勧められています。表全体の信頼度が低ければ様式の崩れ、特定の行だけ低ければその乗車の書き込みの崩れ、と分けて人に回せます。
03どうやって実装するのか
処理の起点を決める
スキャンした PDF が保管先(Azure Blob Storage)に入ったことを起点にします。 乗務記録は、乗務員が帰庫して納金するたびに事務所に出てきます。隔日勤務の帰庫は早朝に集中するので、事務担当が朝の始業のときにまとめてスキャンし、その日の昼までに前日帰庫分の確認の一覧がそろうようにします。
起点の仕組みは Azure Functions の Blob Storage のトリガーです。公式のページでは、イベント方式とポーリング方式があり、遅れの小さいイベント方式が推奨され、ポーリング方式は従量課金のプランで最大10分の遅れが出うるとされています。昼までにそろえば足りる題材ですが、取りこぼしを避けるためにイベント方式にします。
時間の判定は、点呼の記録がそろってから動かします。 拘束時間の計算には、始業と終業の時刻が要ります。点呼の記録簿の CSV が毎朝書き出されたあとに、前日帰庫分の時間の判定をまとめて流します。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 乗務記録の画像 | スキャンした PDF(1乗務1枚) | 営業所の複合機 → 保管先 |
| 読み取り結果 | 乗務員名、車両番号、出庫・帰庫の時刻と地点、積算キロ、休憩・仮眠の地点と時刻、乗車ごとの行、営業収入の合計、事故・遅延の欄 | Azure AI Document Intelligence |
| 点呼の記録 | 乗務員ごとの乗務前・乗務後の点呼の時刻 | 点呼の記録簿の CSV |
| 乗務員の台帳 | 勤務の形態(日勤・隔日勤務)、車庫待ち等の扱いの有無、労使協定による延長の有無 | 総務の台帳 |
| 前の乗務の記録 | 同じ乗務員の直前の乗務の終業の時刻 | この構成で作った集計表 |
質を決めるのは、乗務員の台帳です。 日勤と隔日勤務では、拘束時間と休息期間の基準がまったく違います。勤務の形態を台帳に持たせ、乗務ごとにどちらの基準で照らすかを決めます。
前の乗務の記録は、休息期間を数えるために持ちます。 休息期間は「前の乗務の終業から、次の乗務の始業まで」なので、1枚の乗務記録だけでは数えられません。
データの取得方法を決める
読み取りは、Azure Functions からカスタム ニューラル モデルを呼ぶだけです。モデルの学習には、自社様式の乗務記録で、乗車の行の数が少ないもの・多いもの・2枚目にまたがるものを混ぜた見本を使います。
| 取るもの | どこから | 何に使うか |
|---|---|---|
| 乗務員名・車両番号・日付 | ラベル付けした項目 | 乗務の特定 |
| 出庫・帰庫の時刻と地点、積算キロ | ラベル付けした項目 | 走行距離、時間の判定、記入漏れ |
| 休憩・仮眠の地点と時刻 | 表の項目(行ごと) | 記入漏れ、休憩の時間 |
| 乗車ごとの乗車地・降車地・時刻・運賃 | 表の項目(行ごと) | 営業収入の集計、記入漏れ |
| 営業収入の合計 | ラベル付けした項目 | 行の足し算との照合 |
| 表・行・セルの信頼度 | 表の項目の信頼度 | 読み取りの迷いの切り分け |
時刻の読み取りは、24時を超える書き方に気をつけます。 隔日勤務では、日付をまたいだ時刻を「26:30」と書く乗務員と「2:30」と書く乗務員がいます。どちらで書くかを様式の注記で決め、読み取った時刻は日付と組にして持ちます。
点呼の記録は CSV を読むだけです。乗務記録の乗務員名は手書きなので、点呼の記録とは乗務員の番号で照らします。 様式に乗務員の番号の欄を設け、名前より番号を先に照らします。
AIへ渡す前に整形する
- ページの対応づけ … 乗車の行が多い乗務は2枚になるので、乗務員の番号と日付で1乗務にまとめます
- 向きと寸法の確認 … 画像は50×50〜10,000×10,000ピクセル、文字の最小の高さは1024×768の画像で12ピクセル(150dpiで約8ポイント)です。乗車の行の数字は小さいので、200dpi以上でそろえます
- ファイルの大きさ … 有料(S0)レベルで500MB、PDF は2,000ページまでです
- 重複の検知 … 同じ乗務員の同じ日付の乗務記録が二度読まれたら、新しい方を「二重」として人へ回します
- 台帳との照合 … 乗務員の番号が台帳に無ければ、時間の判定をせずに人へ回します
1番目を省くと、2枚目の乗車の行が別の乗務として集計されます。 営業収入の合計が1枚目にしか書かれていなければ、1枚目は合計が合わず、2枚目は合計が無いという2件の食い違いが出ます。
AIに処理させる
読み取りのモデルにさせるのは、項目と表の行の値を信頼度付きで返すことだけです。 生成AIにさせるのは、事故・遅延の記載欄の手書きを写して要点を分けることだけです。集計と時間の判定は、プログラムの規則で行います。
| 見るもの | 誰がするか | 判定の仕方 |
|---|---|---|
| 時刻・距離・運賃の値 | 読み取りのモデル | 値と信頼度を返す |
| 営業収入の照合 | 規則 | 行の運賃の合計 = 書かれた合計か |
| 走行距離 | 規則 | 帰庫時の積算キロ − 出庫時の積算キロ。負なら読み違い |
| 記入漏れ | 規則 | 記録が求められる項目の空欄 |
| 拘束時間 | 規則 | 始業(点呼の時刻)から終業までを数え、勤務の形態ごとの基準と照らす |
| 休息期間 | 規則 | 前の乗務の終業から今回の始業までを数える |
| 事故・遅延の記載 | 生成AI | 手書きを写し、要点を分ける |
記入漏れの項目は、旅客自動車運送事業運輸規則 第25条に沿って決めます。 タクシー(一般乗用旅客自動車運送事業者)は、運転者ごとに、氏名、車両の登録番号等、業務の開始・終了の地点と日時、主な経過地点、業務に従事した距離、交替した場合の地点と日時、休憩・仮眠の地点と日時、事故等の概要と原因、旅客が乗車した区間、走行距離計の業務の開始時と終了時の積算キロ数を記録させ、車両ごとに整理して1年間保存することが求められています。この項目を様式の欄と対応させ、空欄を拾います。
時間の基準は、改善基準告示のタクシーの基準を台帳の勤務の形態ごとに持ちます。
| 勤務の形態 | 1日・2暦日の拘束時間 | 休息期間 | 1か月の拘束時間 |
|---|---|---|---|
| 日勤 | 13時間以内(上限15時間、14時間超は週3回までが目安) | 継続11時間を基本とし、9時間を下回らない | 288時間以内 |
| 隔日勤務 | 2暦日22時間以内、かつ2回の隔日勤務を平均し1回あたり21時間以内 | 継続24時間を基本とし、22時間を下回らない | 262時間以内(労使協定により年6か月まで270時間) |
判定は「疑い」として出し、基準の判断はしません。 車庫待ち等の特例、事故や災害で遅延した時間の扱いなど、基準には例外があり、乗務記録だけでは決められないからです。
| させないこと | 理由 |
|---|---|
| 読めない運賃の推測 | 合計から逆算して埋めると、食い違いという事実が消える |
| 違反かどうかの結論 | 例外の適用と始業・終業の時刻は人が点呼の記録で確かめる |
| 時刻の補完 | 休憩の終わりの時刻が無いときに、ありそうな時刻で埋めない |
| 乗車地・降車地の書き換え | 地名を整えると、乗務員が書いた区間の記録ではなくなる |
| 事故の原因の推測 | 記載に無い原因を書き足さない |
1行目がいちばん起きやすい失敗です。 1行の運賃が読めないとき、合計から他の行を引けば数字は出ます。埋めた瞬間、合計の照合は必ず合うようになり、照合の意味が無くなります。
指示内容を固定する
あなたはタクシー会社の営業所で、乗務記録の「事故・遅延・異常」の欄を整理する担当です。
渡すのは、その欄から読み取った手書きの文字列だけです。
書かれていることを写し、要点を分けてください。推測で補わないでください。
【分け方】
- accident ...... 交通事故、接触、物損の記載
- delay ......... 渋滞、通行止め、車両の故障などによる遅れの記載
- passenger ..... 乗客とのトラブル、忘れ物、料金の未収の記載
- vehicle ....... 車両の不具合の記載
- other ......... 上のどれにも当たらない記載
【厳守事項】
- 原文の文字列を original にそのまま写してください。言い換えないでください。
- 時刻・地点が書かれていれば time と place に写してください。書かれていなければ空にしてください。
- 原因が書かれていれば cause に写してください。書かれていなければ空にしてください。
前後から原因を推測して書かないでください。
- 読めない文字は「■」に置き換え、unreadable を true にしてください。
- 責任の所在、違反の有無、乗務員の評価については書かないでください。
- 欄が空の場合は、items を空の配列にしてください。
【欄の読み取り結果】{incident_text}
【読み取りの信頼度】{incident_confidence}
「原因を推測しない」を明記しないと、もっともらしい原因を書き足します。 「○○交差点で接触」とだけ書かれた記載に「右折時の確認不足」と足されると、運行管理者が乗務員から聞く前に、原因が決まったように見えます。 第25条は事故等の「概要及び原因」の記録を求めていますが、原因を書くのは乗務員と運行管理者です。
「責任や違反を書かない」も同じ理由です。 この欄の整理は、運行管理者が事故の報告を見落とさないためのもので、評価のためではありません。
出力形式を固定する
乗務1件ごとに、読み取り・集計・判定・生成AIの結果を次の形の JSON にまとめます。 生成AIの部分は Azure OpenAI の構造化出力で受け取り、response_format に json_schema を指定して strict: true、すべての項目を必須にして additionalProperties: false を付けます。
{
"trip_id": "2026-10-12_D1043",
"driver_no": "D1043",
"shift_type": "day | alternate",
"vehicle": "",
"depart": { "time": "2026-10-12T07:05", "odometer": 0, "place": "" },
"return": { "time": "2026-10-13T02:40", "odometer": 0, "place": "" },
"distance_km": 0,
"rides": { "count": 0, "fare_sum": 0, "table_confidence": 0, "low_rows": [] },
"revenue_written": 0,
"revenue_match": "match | mismatch | unreadable",
"missing_items": [],
"binding_hours": { "value": 0, "basis": "roll_call | trip_record", "flag": "ok | suspect" },
"rest_hours": { "value": 0, "flag": "ok | suspect | unknown" },
"incidents": [
{ "category": "accident | delay | passenger | vehicle | other",
"original": "", "time": "", "place": "", "cause": "", "unreadable": false }
],
"verdict": "ok | check"
}
1つ目の理由は、basis で時間の根拠が分かることです。 拘束時間を点呼の時刻から数えたのか、点呼の記録が無くて乗務記録の出庫・帰庫から数えたのかで、疑いの重みが違います。 運行管理者は trip_record のものから先に点呼の記録を確かめます。
2つ目は、low_rows で見る行が絞れることです。 営業収入が合わないとき、信頼度の低い行の番号が分かれば、40行を見直さずに2〜3行を見るだけで済みます。
確認の一覧は、事務担当向けと運行管理者向けに分けます。
【事務担当向け(2026-10-13 帰庫分)】
乗務員 / 車両 / 理由(記入漏れ・合計の食い違い・読み取りの迷い) / 見る行 / 画像
【運行管理者向け(2026-10-13 帰庫分)】
乗務員 / 勤務の形態 / 拘束時間 / 根拠 / 休息期間 / 今月の拘束時間の累計 / 事故・遅延の記載 システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 保管先(Blob Storage) | Azure Functions のトリガー | 乗務記録の PDF の保存を検知する |
| Azure AI Document Intelligence | API呼び出し | 項目・表の行・信頼度を返す |
| 点呼の記録簿 | 毎朝の CSV の書き出しを読む | 始業・終業の時刻 |
| Azure OpenAI | API呼び出し(構造化出力) | 事故・遅延の欄の要点を写す |
| 集計表 | 集計の処理が書き出す | 乗務ごとの営業収入・距離・時間の案 |
給与計算のシステムへは書き込みません。 営業収入は乗務員の給与に直結するので、集計表は事務担当が確かめたものだけを月末に回します。
人が確認する
事務担当が開くのは check の乗務だけです。 ok の乗務は、件数と営業収入の合計を日ごとに見るだけにします。
- 合計の食い違いを見る …
low_rowsの行を画像で確かめ、読み違いなら直します。乗務員の計算違いなら、乗務員に確かめてから直します - 記入漏れを乗務員に聞く … 次の出庫の点呼のときに聞き、乗務員に書き足してもらいます。事務担当が推測で埋めません
- 運行管理者が時間の疑いを判断する … 点呼の記録、車庫待ち等の扱い、事故や遅延の記載を見て、基準の超過に当たるかを判断します
- 判断と対応を記録する … 超過と判断したら、次の勤務の組み直しや乗務員への説明を記録します
3番目を事務担当で閉じないでください。 時間の判断は、勤務の組み方を決める運行管理者の仕事です。 確認の一覧はその材料です。
例外に対処する
| 起きること | 対応 |
|---|---|
| 乗車の行が2枚目にまたがる | 乗務員の番号と日付で1乗務にまとめてから集計する |
| 帰庫時の積算キロが出庫時より小さい | 読み違い。check で人へ |
| 時刻の書き方が「2:30」と「26:30」で混ざる | 日付と組にして持つ。判断できなければ check |
| 点呼の記録が無い | 乗務記録の時刻で数え、basis を trip_record にして運行管理者へ |
| 乗務員の番号が台帳に無い | 時間の判定をせずに人へ |
| 前の乗務の記録がまだ無い | 休息期間を unknown にし、前の乗務が読まれたら数え直す |
| 表全体の信頼度が低い | 様式の崩れや汚れ。画像を見て、必要なら乗務員に書き直してもらう |
| 読み取りが応答しない | 既定で合計5回やり直し、すべて失敗すると poison キューに入る。確認の一覧の「未処理」に出す |
6行目は、帰庫の順番がばらばらなので必ず起きます。 前の乗務の乗務記録が後から出てきたら、今回の休息期間を数え直す処理を、毎朝の判定のなかで回します。 数え直しで suspect に変わった乗務は、すでに運行管理者が見た一覧とは別に「数え直しで変わった乗務」として出し、一度 ok で流れた乗務が黙って疑いに変わることのないようにします。
最後の行の poison キューは、公式のページに書かれた Azure Functions の仕組みです。 同じファイルを二度処理しないための受領記録(blob receipts)も持つとされているので、読み直したい乗務記録は、その記録を消してやり直します。
記録を残す
- 乗務記録の画像と、提出された日時・営業所
- 読み取りの結果の JSON の全文(項目・表・行・セルの信頼度)
- 集計と判定の結果と、そのとき使った基準の表と乗務員の台帳の版
- 人が値を直した記録 … 読み取りの値、直した値、直した人、理由
- 運行管理者の判断と対応の記録
- 乗務員ごとの記入漏れの発生率
紙の乗務記録そのものは、これまでどおり保存します。 第25条は記録を車両ごとに整理して1年間保存することを求めています。どの形で保存するかは、営業所の決めごとと所管の運輸局の扱いを確かめてから決めてください。 この構成の画像は、確認のための写しとして扱います。
04実装レベルの3段階
半自動化で、1枚4分が1.6分になり、この段階が本記事の想定です。 打ち込みの①と照合の②と④が機械に移り、人に残るのは確認の一覧の乗務の確かめと、乗務員への聞き取りです。 本格構成の価値は、時間よりも先回りにあります。 月の拘束時間の累計を毎日更新すれば、月の後半に入る前に「この乗務員はあと何回で262時間に届く」と分かります。
05工数削減シミュレーション
導入後 1,500件 × 1.6分 ÷ 60 = 40 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 乗務員が紙の乗務記録(運転日報)に出庫・帰庫の時刻、走行距離、休憩、乗車ごとの区間と運賃を手で書いており、営業所の事務担当が毎日それを集計表に打ち込み直しているタクシー会社。隔日勤務の乗務員が多く、拘束時間や休息期間の基準を守れているかの確認が月末の集計まで遅れている場合。乗務記録の様式を自社で決めている場合。
- 運賃メーターや運行記録計、配車のシステムから乗務の記録がデータで取れていて、紙の乗務記録がほとんど無い場合。車両が数台で、目で見て集計しても負担にならない場合。なお、拘束時間・休息期間の基準に違反しているかの最終的な判断と、乗務員への指導・勤務の組み直しは、この構成では代替できません。
07最小構成で試す方法
- 先月の乗務記録から、日勤と隔日勤務、乗車の行の少ないものと多いものを混ぜて40枚を選ぶ
- Document Intelligence Studio で、10枚に項目と乗車の表をラベル付けする
- カスタム ニューラル モデルを学習させる(v4.0 では10時間までの学習が無料とされている)
- 残りの30枚を読ませ、時刻・積算キロ・営業収入の合計・行の運賃を表に書き写す
- 先月の集計表の値と突き合わせ、行の運賃を足した額が書かれた合計と合うかを見る
行の足し算の照合は必ずやってください。 読み取りの確からしさを、人が1行ずつ見比べなくても合計が合うかどうかで測れるのが、この題材の利点です。
| 出てきた内容 | 判断 |
|---|---|
合計が合わない乗務の多くで、low_rows に読み違いの行が入った | 線を引いて、時間の判定の作り込みに進む |
| 合計が合わないのに、どの行も信頼度が高い | 乗務員の計算違いの可能性。画像で確かめる |
| 時刻の読み違いが多い | 様式の時刻の欄を「時」「分」に分ける |
| 2枚目の行が別の乗務になる | ページのまとめ方を先に直す |
3行目は様式を直すほうが早く効きます。 「7:05」と書く欄より、「時」と「分」が分かれた欄のほうが、読み違いが減ります。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 読めない運賃を合計から逆算して埋める | 埋めない。 埋めると合計の照合が必ず合ってしまう |
| 出庫・帰庫の時刻を拘束時間として扱う | 始業・終業は点呼の時刻で見る。根拠を basis に残す |
| 日勤と隔日勤務を同じ基準で見る | 乗務員の台帳に勤務の形態を持たせる |
| 「2:30」と「26:30」が混ざる | 様式で書き方を決め、日付と組にして持つ |
| 2枚目の行が別の乗務になる | 乗務員の番号と日付でまとめてから集計する |
| 前の乗務が後から出てきて休息期間がずれる | 毎朝の判定で数え直す |
| 車庫待ち等や事故の遅延を考えずに疑いを出す | 疑いとして出し、例外の判断は運行管理者が行う |
| 事故の原因を生成AIが書き足す | 原文を写させ、原因は書かれたものだけにする |
| 記入漏れを事務担当が推測で埋める | 乗務員に聞いて書き足してもらう |
| 確認の一覧が運行管理者に届かない | 事務担当向けと運行管理者向けに分けて出す |
上の2行が、この構成の失敗のほとんどです。 1行目は集計の確かめを壊し、2行目は時間の判定を誤らせます。読み取りは埋めずに返し、時間は根拠を残して疑いとして出す。この2つで運用に乗るかが決まります。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 乗務員の氏名・番号、勤務の時刻と拘束時間、営業収入、乗客が乗車した区間と時刻、事故の記載です。
- 乗務員の勤務の記録を個人の情報として扱う … 拘束時間や営業収入は、乗務員一人ひとりの労働と給与の情報です。確認の一覧を見られる人を、事務担当・運行管理者・総務に限ります
- 乗車の区間を乗客の情報として扱う … 乗車地・降車地と時刻は、乗客の行動を映す情報です。集計に要るのは運賃の合計と件数で、区間の一覧を目的の外で使わないでください。 生成AIにも渡しません
- 生成AIに渡すのは事故・遅延の欄の文字列だけにする … 乗務記録の画像全体や乗務員の勤務の時刻は渡しません
- 時間の判定を乗務員の処分に直結させない … 機械が出すのは疑いです。超過の多くは勤務の組み方から生まれるので、確認の一覧は勤務の組み直しの材料にします
- 紙の乗務記録の保存の扱いを確かめる … 法令が求める記録の保存を、この構成の画像で置き換えるかどうかは、所管の運輸局の扱いを確かめてから決めてください
- この構成は、法令上の判断を代替しません … 拘束時間・休息期間の基準に違反しているか、記録が法令の求める内容を満たしているかの最終的な判断は、運行管理者と会社が行います
誤りが起きた場合のリスクは、超過の疑いを見落とすことと、営業収入の読み違いが給与に乗ることの2つです。 前者は時間の判定を月末に回すと起き、後者は確認の一覧を見ずに集計表を給与計算に回すと起きます。どちらも、毎日の判定と、確かめた後にだけ回す決まりで防ぎます。
10まず何から始めるか
1週目:様式と台帳をそろえる
乗務記録の様式に乗務員の番号の欄を足し、時刻の欄を「時」「分」に分け、日付をまたぐ時刻の書き方を注記で決めます。 乗務員の台帳に勤務の形態と、車庫待ち等の扱い・労使協定による延長の有無を足します。
2週目:40枚で試す
先月の乗務記録から40枚を選び、10枚をラベル付けして学習させ、残りを読ませます。行の運賃の合計と書かれた合計が合うか、合わない乗務で low_rows に読み違いの行が入るかを最優先で見ます。
3週目:時間の判定を組む
点呼の記録の CSV と照らして、日勤・隔日勤務ごとに拘束時間と休息期間を数える処理を作ります。先月の乗務で数えた結果を、厚生労働省が案内している確認のソフトや、運行管理者の手計算と突き合わせます。
4週目:保存から確認の一覧までをつなぐ
保存を起点に読み取り、集計と判定を行い、事務担当向けと運行管理者向けの一覧を出すところまで作ります。この時点では集計表への反映は人が行い、これまでの打ち込みと並べて見比べます。
2か月目: 毎日の確認の一覧で運用し、check の件数と、運行管理者が超過と判断した件数を毎週数えます。事故・遅延の欄の整理を足します。3か月目以降: 1枚4分が何分になったかを実測し、月の拘束時間の累計の事前の知らせを足します。月末の集計で初めて超過が見つかることがなくなった時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
| カスタム ニューラル モデルがレイアウトと言語の特徴を組み合わせて項目を取り出し、表の項目に対応すること。v4.0(2024-11-30 GA)で表・行・セルの信頼度を返し、表・行・セルの順に上から見るのが勧められること。入力の形式・寸法・文字の最小の高さ・S0 で500MB・PDF 2,000ページ。v4.0 で10時間までの学習が無料であること | Microsoft Learn: Custom neural document model | 2026-10-14 |
| カスタム ニューラル モデルの手書きの文字の対応言語に日本語が含まれること | Microsoft Learn: Language support for custom models | 2026-10-14 |
| 表・行・セルの信頼度の読み方(セルが正しくても行の信頼度が低いことがある、上から順に見る)。信頼度で自動採用か人の確認かを分けられること | Microsoft Learn: Interpret and improve model accuracy and confidence scores | 2026-10-14 |
Azure OpenAI の構造化出力が response_format の json_schema と strict: true で指定し、すべての項目を必須にして additionalProperties: false を付ける必要があること | Microsoft Learn: How to use structured outputs with Azure OpenAI | 2026-10-14 |
Blob Storage のトリガーにイベント方式とポーリング方式があり、イベント方式が推奨されること。ポーリング方式は従量課金のプランで最大10分の遅れが出うること。失敗時は既定で合計5回やり直し、すべて失敗すると webjobs-blobtrigger-poison キューに入ること | Microsoft Learn: Azure Blob storage trigger for Azure Functions | 2026-10-14 |
| 一般乗用旅客自動車運送事業者が、運転者等ごとに氏名・車両の登録番号等・業務の開始と終了の地点と日時・主な経過地点・業務に従事した距離・交替・休憩又は仮眠の地点と日時・事故等の概要と原因に加え、旅客が乗車した区間と走行距離計の業務の開始時と終了時の積算キロ数を記録させ、事業用自動車ごとに整理して1年間保存しなければならないこと(旅客自動車運送事業運輸規則 第25条第1項・第3項) | e-Gov 法令API: 旅客自動車運送事業運輸規則 | 2026-10-14 |
| タクシー運転者の改善基準告示(2024年4月1日以降):1か月の拘束時間が日勤288時間以内・隔勤262時間以内(労使協定により年6回まで270時間)。日勤の1日の拘束時間が13時間以内(上限15時間、14時間超は週3回までが目安)、隔勤の2暦日が22時間以内かつ2回平均で21時間以内。休息期間が日勤は継続11時間を基本とし9時間を下回らない、隔勤は継続24時間を基本とし22時間を下回らない。ハイヤーには上の表が適用されないこと。車庫待ち等や予期し得ない事象の特例。拘束時間が始業から終業までの時間であること。遵守状況を確認できるソフトの案内 | 厚生労働省: 自動車運転者の労働時間等の改善のための基準(タクシー・ハイヤー)改善基準告示 | 2026-10-14 |
拘束時間・休息期間の基準に違反しているかの判断と、乗務記録の保存の扱いは、運行管理者・会社と、必要に応じて労働基準監督署・所管の運輸局に確かめてください。 本記事は Microsoft Learn、e-Gov 法令API、厚生労働省の公開ページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1448)についてのご相談はこちらから。
