Media > AI活用ユースケース > 物流 > 運行記録と点呼記録を突き合わせて、拘束時間と休息期間の基準に外れた運行を洗い出す

運行記録と点呼記録を突き合わせて、拘束時間と休息期間の基準に外れた運行を洗い出す

実装ステータス:構成例 技術的に実現可能な構成として設計したもの。自社未検証

運行記録と点呼記録を毎日突き合わせ、拘束時間・休息期間・連続運転時間を機械で計算して、基準を外れた運行と外れそうな人を朝の一覧に出します。運行管理者の作業は、400運行を目で追うことから、印の付いた運行を確かめることに変わります。

サマリー
利用ツール
ChatGPT/Claude/Gemini/Google Apps Script/Make/n8n/Power Automate/Python
対象業界
小売/建設/物流/製造
対象部門
物流
対象業務
内容確認・チェック/集計・分析
主な課題
人手が足りない/期限・対応漏れが起きる/確認ミスが多い
AIで行う処理
判定
主な効果
品質標準化/工数削減/機会損失防止
導入難易度
★★☆☆☆
実装レベル
半自動化
費用感
ノーコード連携(中)
人間の確認
必須
現在工数
26.7h/月
AI導入後
6.7h/月
想定削減
75%
年間削減
240h
モデル条件による試算値です。実在企業の実績ではありません。

01導入前 / 導入後の業務フロー

導入前(Before)
  1. デジタルタコグラフで前日分の運行を呼び出す
  2. 運行ごとに、始業時刻、終業時刻、走行区間、停車時間を確認する
  3. 点呼記録簿で、同じ運行の乗務前点呼と乗務後点呼の時刻を探す
  4. 時刻がずれていれば、運行日報でどちらが実態に近いかを判断する
  5. 始業から終業までの時間(拘束時間)を計算する
  6. 前の運行の終業から今回の始業まで(休息期間)を計算する
  7. 停車の記録から運転の中断の位置を見て、連続運転時間を数える
  8. 改善基準告示の数値と照らし合わせ、外れていないかを確認する
  9. 外れていれば、ドライバーと配車担当に伝える
  10. 月末に、1か月の拘束時間を集計する
導入後(After)
  1. 自動毎朝1回、ワークフローのスケジュール実行で処理が始まる
  2. 自動デジタルタコグラフから前日分の運行記録を取得する
  3. 自動点呼記録簿から同じ日の乗務前点呼・乗務後点呼の記録を取得する
  4. 自動配車表と車両マスタから、2人乗務の割当と設備を取得する
  5. 自動運行を1件ずつに分解し、運行番号とドライバーで突き合わせる
  6. 自動拘束時間、休息期間、連続運転時間を計算する(AIを使わない)
  7. 自動1か月の累計と、このペースでの月末の着地見込みを計算する
  8. 自動結果を「外れた運行」「上限に近づいている人」「記録が欠けている運行」に仕分ける
  9. 自動記録の欠けと矛盾について、何が足りないかの説明文を作る
  10. 自動是正の指示文と、翌月の配車で気をつける点の要約を作る
  11. 自動ドライバー単位にまとめ、朝の点検一覧として書き出す
  12. 運行管理者が一覧を読み、印の付いた運行を確認する
  13. 記録の訂正、是正の指示、配車の組み替えを判断し、実行と記録を行う
各工程の詳しい説明を読む
  1. デジタルタコグラフで前日分の運行を呼び出す
  2. 運行ごとに、始業時刻、終業時刻、走行区間、停車時間を確認する
  3. 点呼記録簿で、同じ運行の乗務前点呼と乗務後点呼の時刻を探す
  4. 時刻がずれていれば、運行日報でどちらが実態に近いかを判断する
  5. 始業から終業までの時間(拘束時間)を計算する
  6. 前の運行の終業から今回の始業まで(休息期間)を計算する
  7. 停車の記録から運転の中断の位置を見て、連続運転時間を数える
  8. 改善基準告示の数値と照らし合わせ、外れていないかを確認する
  9. 外れていれば、ドライバーと配車担当に伝える
  10. 月末に、1か月の拘束時間を集計する

問題は4つあります。

(a)月末にまとめて見るので、外れたあとに気づく。 上限に近づいていることが月の途中で誰にも見えておらず、気づいた時点では、その月の配車はすべて終わっています。

(b)記録が2か所にあり、突き合わせに時間がかかる。 同じ運行を車両の側と人の側から記録したもので、時刻が数分ずれるのが普通です。

(c)判定の解釈が人によって違う。 フェリーに乗っている時間、荷待ちで止まっている時間、分割して与えた休息期間、2人乗務の運行。これらの扱いを3名がそれぞれの理解で処理しているため、同じ運行でも判定が変わります。

(d)「誰が上限に近いか」が分からない。 人単位の積み上げが月末までないため、月末の数日に特定のドライバーの運行を急に止めることになります。

  1. 【自動】 毎朝1回、ワークフローのスケジュール実行で処理が始まる
  2. 【自動】 デジタルタコグラフから前日分の運行記録を取得する
  3. 【自動】 点呼記録簿から同じ日の乗務前点呼・乗務後点呼の記録を取得する
  4. 【自動】 配車表と車両マスタから、2人乗務の割当と設備を取得する
  5. 【自動】 運行を1件ずつに分解し、運行番号とドライバーで突き合わせる
  6. 【自動】 拘束時間、休息期間、連続運転時間を計算する(AIを使わない
  7. 【自動】 1か月の累計と、このペースでの月末の着地見込みを計算する
  8. 【自動】 結果を「外れた運行」「上限に近づいている人」「記録が欠けている運行」に仕分ける
  9. 【自動】 記録の欠けと矛盾について、何が足りないかの説明文を作る
  10. 【自動】 是正の指示文と、翌月の配車で気をつける点の要約を作る
  11. 【自動】 ドライバー単位にまとめ、朝の点検一覧として書き出す
  12. 【人】 運行管理者が一覧を読み、印の付いた運行を確認する
  13. 【人】 記録の訂正、是正の指示、配車の組み替えを判断し、実行と記録を行う

12番目と13番目を自動化しないことが、この設計の中心です。 計算の結果は、基準を外れている可能性を示す材料であって、法令違反の有無の判定ではありません。 記録そのものが誤っていることも、例外の扱いが認められる場合もあります。最終的な判断は必ず運行管理者が行います。

8番目の仕分けが「外れる前に気づく」を作ります。 「外れた運行」だけでは朝の一覧が過去の報告になります。「上限に近づいている人」を同じ一覧に並べ、今日と明日の配車に反映できる情報にします。

02今回想定するシステム構成

構成図
デジタコ(運行記録)    点呼記録簿    配車表・車両マスタ
      └─────────┬──────────┴────────────────┘
                ▼【トリガー】毎朝1回のスケジュール実行(Make)
      前日分を1運行ずつに分解(Iterator)
                ▼
      Python で計算する(AIを使わない)
        ├ 1日の拘束時間(始業時刻から起算した24時間で見る)
        ├ 休息期間(前の終業から次の始業まで)
        ├ 連続運転時間(運転の中断で区切って積む)
        └ 1か月の累計と、月末の着地見込み
                ▼
      結果を3つに仕分ける(外れた運行/上限に近づいている人/記録の欠け)
                ▼
      Claude API(計算はさせない)
        └ 欠け・矛盾の説明文/是正の指示文/翌月の注意点の下書き
                ▼
      ドライバー単位にまとめる(Array Aggregator)── 朝の点検一覧へ
                ▼
      【運行管理者が読んで判断する】── 是正の指示 ──▶ 記録を書き戻す
役割想定する製品代替候補
ワークフローMakePower Automate、n8n
差異計算PythonGoogle Apps Script
処理Claude APIOpenAI API、Gemini API

デジタルタコグラフ、点呼記録簿、配車表、書き出し先のスプレッドシートは、すでに業務で使っているものです。足すのは、ワークフローと計算の処理と生成AIの3つだけです。

Make のシナリオはスケジュールで実行でき、既定では15分ごとに実行されます。 タイミングは、定期的な間隔(at regular intervals)、1日1回(once daily)、平日(weekdays)、週単位(weekly)、月単位(monthly)、指定日(specified dates)、オンデマンド(on demand)から選べ、最小の長さは契約しているプランによって変わります。 この構成では1日1回にします。

400運行の回し方もワークフロー側の話です。Iterator は配列を一連のバンドルに変換するので、まとめて取得した前日分を1運行ずつに分解します。Array Aggregator は複数のバンドルを1つにまとめ、設定にはソースとなるモジュール(source module)、まとめた先の構造の種類(target structure type)、まとめる単位(group by)があります。group by にドライバーを指定すると、運行単位の判定結果が人単位に集まります。

計算を Python に置くのは、数値の判定をAIから切り離すためです。 時刻の引き算としきい値との比較しかしないので、言語モデルに渡す理由がありません。Claude API に任せるのは、計算のあとの日本語だけです。 扱いやすくするため構造化出力(structured outputs)を使います。応答を特定のスキーマに準拠させる機能で、JSON のパースエラーが起きず、必須のフィールドと型が保証されます。 ただし数値の範囲の制約(minimummaximummultipleOf)は書けません。「拘束時間が13時間以内か」をスキーマで検査できない以上、AIに数値を返させないほうが自然です。

03どうやって実装するのか

Step1

処理の起点を決める

毎朝1回のスケジュール実行を起点にします。 前日分が出そろってから動かすため、始業前に設定します。1日1回のリスクは、1回止まると1日分が丸ごと抜けることです。 処理の最後に「本日の対象は何運行だった」という行を書き出し、その行がない日を検知してください。 取り込みが遅れた日は後から再処理するので、運行番号を鍵にして上書きできる形にします。

Step2

入力データを集める

データ中身取得元
運行記録運行番号、車両番号、エンジンの始動・停止時刻、停車時刻と長さデジタルタコグラフ
点呼記録乗務前・乗務後点呼の実施時刻、点呼の方法、実施者点呼記録簿
運行日報始業・終業時刻、荷積み・荷卸し、荷待ちの時間と場所運行日報
配車と車両運行とドライバーの対応、2人乗務の割当、長距離かどうか、身体を伸ばして休息することができる設備の有無配車表・車両マスタ
フェリーの利用記録乗船した便、航路、乗船時刻と下船時刻配車表または運行指示書
過去の累計ドライバーごとの当月・当年の拘束時間前日までの判定結果

質を決めるのは、4番目と5番目です。 2人乗務とフェリーの利用は扱いが変わるのに、デジタコの記録だけでは区別が付きません。 また6番目を毎日引き継ぐことが「外れる前に気づく」の前提です。

Step3

データの取得方法を決める

運行記録: 管理サービスから前日分を取得します。APIがあればAPIで、無ければ日次のCSV出力を指定の場所に置きます。1日1回しか動かないので、リアルタイムでなくてかまいません。

点呼記録: 電子データを日付とドライバーで取得します。紙の記録簿しかない場合、突き合わせる相手がいないため、この構成は成り立ちません。 電子化が先になります。

運行日報: 荷待ちの時間と場所は、停車記録だけでは何のための停車か分かりません。運行日報の記録と停車の記録を時刻で結びつけ、結びつかない停車は「用途不明の停車」とします。

配車の割当・車両マスタ・フェリーの利用記録: スプレッドシートや運行指示書から読みます。デジタルタコグラフの側からは、フェリーに乗っている時間は「長い停車」としか見えません。

Step4

AIへ渡す前に整形する

  1. 運行の単位をそろえる … デジタルタコグラフは車両単位、点呼記録はドライバー単位です。運行番号を鍵にして結びつけ、結びつかない記録は分離します
  2. 時刻のずれを吸収する「点呼記録を優先し、無い場合のみエンジン始動時刻を使う」のように、どちらを始業とするかを先に1つに決めます
  3. ずれが大きい運行を分離する … 点呼とエンジン始動が30分以上離れている運行は、既定値で埋めず、記録の矛盾として別に出します
  4. 停車の用途を分類する … 運転の中断、荷待ち、荷積み・荷卸し、フェリー乗船、休息期間に分類し、当てはまらない停車には印を付けます
  5. 2人乗務と長距離の印を付ける … 配車表と車両マスタで割当と設備の有無を確認します。この印であとの判定に使う基準が変わります
  6. 前日までの累計を読み込む … 当月・当年の累計に、当日分を足せる状態にします

2番目を1つに決めることが重要です。 運行ごとに人が判断する限り、判定は人によって変わり続けます。ルール自体が実態に合っていないことは、例外の件数で分かります。

Step5

AIに処理させる

判定はAIにさせません。 拘束時間、休息期間、連続運転時間、1か月と1年の累計は、すべて Python で計算します。判定する内容と基準は次のとおりです。

判定する項目基準(改善基準告示)
1日の拘束時間1日(始業時刻から起算し24時間)について13時間を超えない。延長時の最大拘束時間は15時間
14時間を超えた回数週2回までが目安。できるだけ少なくするよう努める
長距離貨物運送の例外1週間の運行が全て長距離貨物運送(450km以上)で、一の運行の休息期間が住所地以外の場所である場合、1週2回に限り最大16時間
1か月の拘束時間原則284時間以内。例外310時間以内(年6か月まで)
1年の拘束時間原則3,300時間以内。例外3,400時間以内
休息期間継続11時間以上与えるよう努めることを基本とし、9時間を下回らない
長距離貨物運送の休息期間の例外継続8時間以上(週2回まで)とする場合、いずれかが9時間を下回るときは運行終了後に継続12時間以上
連続運転時間4時間を超えない。やむを得ず超える場合は30分まで延長できる
運転の中断1回がおおむね10分以上、かつ合計が30分以上

この表の数値が、そのまま計算の条件になります。 AIに任せるのは、(1) 記録の欠けと矛盾の説明、(2) 是正の指示文の下書き、(3) 翌月の配車の注意点の要約、の3つだけです。

(1) がいちばん効きます。 記録の欠けは、機械が出すと「点呼記録なし」の1行になり、担当者は動けません。「3月14日の運行番号1024について、乗務後点呼の記録がありません。エンジン停止は18時42分、同日の乗務前点呼は6時10分です。実施時刻を点呼記録簿に追記してください」まで書ければ、そのまま連絡に使えます。(3) は月末に1回だけ動かしますが、「休息期間が9時間台になる日が続いた」の日数は Python が数えた値を渡します。

Step6

指示内容を固定する

あなたは、トラック運送事業の運行管理者を支援する立場です。
計算済みの判定結果と、記録の欠け・矛盾の一覧を渡します。これをもとに
(1) 何が起きているかの説明文、(2) 是正の指示文の下書き を作ってください。
運行管理者が読んで判断し、直したうえで使います。あなたの出力は判断材料
であり、最終判断ではありません。

【厳守事項】
- 時間、時刻、回数、日数を自分で計算しないでください。拘束時間、休息
  期間、連続運転時間、累計、残り時間は渡した値をそのまま使い、足し算、
  引き算、四捨五入、単位の変換、概算への言い換えをしないでください。
- 渡していない数値を本文に書かないでください。本文に出てくる数値は
  すべて facts_used に「項目名・使った値・出どころ」で列挙してください。
- 法令に違反しているかどうかの断定をしないでください。「違反です」と
  書かず、「計算上、1日の拘束時間が15時間を超えた記録になっています。
  記録の確認をお願いします」のように、確認を求める書き方にし、罰則や
  行政処分には触れないでください。
- 記載がない項目は不明として扱い、推測で補わないでください。
  needs_human_attention の理由に「〇〇が不足」と書きます。
- フェリー乗船、分割した休息期間、2人乗務、荷待ちの扱いを、あなたの判断
  で「この扱いでよい」と書かないでください。渡した分類結果をそのまま書き、
  分類できていない場合は「確認が必要」とします。
- ドライバー個人の勤務態度、能力、健康状態への評価を書かないでください。
- 是正の指示文には、誰が、何を、いつまでに行うかを入れてください。

【運行の情報】{run_info}
【計算済みの判定結果】{calculated_results}
【記録の欠け・矛盾の一覧】{record_issues}
【当月の累計と着地見込み(計算済み)】{monthly_totals}
【この運行に付いている印(2人乗務・長距離・フェリー利用など)】{flags}

「自分で計算しない」が、いちばん効く制約です。 労働時間の数値は、ドライバー本人も配車担当も自分の記憶と照らして読みます。1つずれるだけで、その一覧全体が信用されなくなります。

「違反かどうかの断定をしない」も必要です。 記録そのものが誤っていることがあり、例外の扱いが認められる場合もあります。機械が「違反」と書いた文面がそのまま使われると、事実でないことを会社が通知したことになります。 また、労働時間の記録は書き方によって人事評価の文書に読めるため、個人への評価も書かせません。 月末の要約を作る指示でも、「渡した数値以外の数を書かない」「配車の組み方の注意点として書く」を同じ形で縛ります。

Step7

出力形式を固定する

{
  "run_id": "", "driver_id": "", "run_date": "",
  "finding_type": "record_missing | record_mismatch | threshold_exceeded | threshold_approaching | no_finding",
  "explanation": "", "correction_request": "",
  "missing_items": [{ "item": "", "where": "", "why_it_matters": "" }],
  "facts_used": [{ "item": "", "value": "", "source": "" }],
  "needs_human_attention": { "flag": false, "reason": "" }
}

月末の要約は month driver_id watch_pointspointbased_onfacts_used の形にします。構造化する理由は3つです。

1つ目は、確認を速くするためです。 facts_used に「本文で使った数値とその出どころ」を列挙させると、運行管理者は説明文を読みながら、その数字がデジタコの値か点呼記録の値かを一目で確かめられます。

2つ目は、一覧の並べ替えのためです。朝の一覧で最初に読むのは threshold_approaching です。 これだけが、今日の配車を変えれば間に合うからです。なお threshold_exceeded は「違反があった」印ではなく、計算の結果が基準の数値を超えた記録になっているという意味です。

3つ目は、書き出し先で機械的に扱うためです。 構造化出力を使うと応答が常に有効な JSON になり、スキーマ違反による再試行が要りません。 ただし additionalPropertiesfalse にする必要があり、minItems は 0 か 1 しか指定できません。数値や文字列の長さの制約も使えませんが、数値をAIに返させないので問題になりません。

Step8

システムへ連携する

つなぎ先方式内容
デジタコ・点呼記録簿APIまたは日次のCSV出力前日分の運行記録と点呼記録の取得
運行日報・配車表・車両マスタCSVまたはスプレッドシートの参照荷待ち、2人乗務、長距離、設備の確認
計算処理Python拘束時間・休息期間・連続運転時間と累計
生成AIサービスAPI説明文・指示文・翌月の注意点の下書き
点検一覧スプレッドシートへの書き出しと書き戻し一覧と対応の記録

書き出し先は専用の画面にせず、スプレッドシートにします。 普段使う道具の中に出るほうが毎朝開かれます。点呼記録簿への書き戻しは行いません。 法令上の記録を機械が書き換えると正しさを担保できないためで、訂正は人が正規の手順で行います。

Step9

人が確認する

印の付いた運行は全件、運行管理者が確認します。 順番は、threshold_approaching の人(今日の配車を変えれば間に合う)、threshold_exceededrecord_missingrecord_mismatchneeds_human_attention が真の運行です。過去の報告より先に、まだ変えられるものを読みます。

  • facts_used の数値が、デジタルタコグラフと点呼記録の値と合っているか
  • 記録の欠けが、本当の欠けなのか取り込みの失敗なのかの見分け
  • 計算の前提(どの時刻を始業としたか、停車をどう分類したか)が実態と合っているか
  • 是正の指示文が、その相手に送ってよい内容か

3番目は機械にできません。 フェリーに乗っていた時間、荷待ちの時間、休息として過ごした時間は、車両の動きが同じでも意味が違います。

そして、基準に外れているかどうかの最終的な判断は、必ず人が行います。 記録の誤り、例外の扱い、就業規則との関係を踏まえて判断するのは運行管理者で、迷う事案は労務担当や労働基準監督署に確認してください。確認の目標は1件10分です。

Step10

例外に対処する

起きること対応
点呼記録が無い計算を保留にし、record_missing として出す。エンジン始動時刻で代用して判定を確定させない
デジタルタコグラフと運行日報の時刻が合わない決めたルールで処理し、差が30分以上なら record_mismatch として別に出す
フェリーの乗船記録が無いのに長時間の停車がある用途不明として印を付ける。フェリー乗船時間は原則、休息期間として取り扱われ、扱いが変われば判定も変わる。人へ回す
分割した休息期間がある各回の長さと合計を計算して示す。扱ってよいかの判断は人が行う
2人乗務の運行2人以上の乗務と、身体を伸ばして休息することができる設備の有無を確認する。確認できない運行は保留にする
荷待ちの時間が運行日報に無い用途不明の停車として出す。荷待ちか休息かで意味が変わるため、既定値を当てない
事故や故障で運行が遅れた通常予期しないことに遭遇し一定の遅延が生じた場合は、客観的な記録が認められる場合に限り対応に要した時間を除ける。機械が自動で除かず、人が承認する
月の途中で上限に近づいたthreshold_approaching として一覧の最上段に出し、配車担当にも知らせる
facts_used に無い数値が本文にある、または応答が読めない突き合わせて検知し、要確認として上に出す。説明文が作れなくても、判定の数値は必ず出す

最後の行は仕組みで持ってください。 説明文の数値を機械で拾い、facts_used と照合するだけの処理です。7行目を自動化しないことも重要です。 「遅れたから除く」を機械が行うと、客観的な記録の確認を飛ばすことになります。除外の判断と根拠の確認は人が行い、誰がいつ承認したかを残してください。

Step11

記録を残す

  • 取り込んだ運行記録・点呼記録の件数と、取り込めなかった件数
  • 計算に使った前提(どの時刻を始業としたか、停車をどう分類したか)
  • 計算した拘束時間・休息期間・連続運転時間と、判定の結果
  • AIに渡した材料と、返ってきた説明文・指示文・facts_used
  • 人が直した箇所と、直した内容
  • 運行管理者の判断(記録の訂正、是正の指示、配車の組み替え)と日時
  • 予期し得ない事態による除外の根拠とした記録と、承認者

2番目と7番目を必ず残してください。 「どの時刻を始業としたか」は判定の結果を左右し、除外は結果を変えるものです。残っていないと、同じ計算を再現できず、誰が何をもとに承認したかも説明できません。 5番目からは弱点が見えます。 「毎回、荷待ちの扱いを直している」なら、運行日報の様式に問題があります。

04実装レベルの3段階

最小構成:数式で計算し、手で基準と比べる / 計算
半自動化:上記+記録の自動取得+Python での計算+毎朝の実行+AIによる下書き / 取得、突き合わせ、計算、判定、説明文の作成
本格構成:上記+月の途中の着地見込み+配車への反映+書き戻し+月末の要約 / 上記に加えて、外れる前の警告と配車への連動

最小構成だけでも、4分が2分程度になります。 ただし記録の突き合わせの1分は残るので、負担はあまり変わりません。半自動化で2分から1分程度になります。 記録の取得と突き合わせが消えるためで、この段階の効果がいちばん大きく、本記事が想定するのもここです。 本格構成では工数はそれほど変わりませんが、(a)と(d)の「月末にしか分からない」が解けます。 ただし、配車表を機械が書き換える形にはしないでください。 配車は労働時間だけで決まるものではありません。

05工数削減シミュレーション

前提値(モデル条件)
対象人数
3 名
月間件数
400 件
1件あたり現在時間
4 分
1件あたり導入後時間
1 分
現在  400件 × 4分 ÷ 60 = 26.7 時間/月
導入後 400件 × 1分 ÷ 60 = 6.7 時間/月
月間削減時間
20h
削減率
75%
年間削減時間
240h
年間金額換算(時間単価3,500円)
84万円
モデル条件による試算であり、実際の効果は業務内容・運用方法によって異なります。

自社条件で導入効果を整理したい方へ

このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。

AI活用について相談する

06向いている企業・向いていない企業

向いている
  1. ドライバーを10名以上抱え、デジタルタコグラフと点呼記録が電子データで残っている運送事業者。泊まりや長距離の運行があり、拘束時間と休息期間の計算を運行管理者が手で行っている場合。月末の集計ではじめて基準を外れたことに気づく状態が続いていて、月の途中で止められるようにしたい場合。
向いていない
  1. ドライバーが数名で、運行管理者が全員の運行を頭に入れていられる規模。デジタルタコグラフが紙の記録紙のままで、運行の時刻を電子データとして取り出せない場合は、記録の電子化が先で、本記事の構成はその後の話になります。運行管理システムに拘束時間の計算と警告の機能がすでにあり、それが自社の運行の実態と合っている場合も、同じものを二重に作る意味はありません。

07最小構成で試す方法

  1. 先月の運行から、ドライバー3名分の1週間分(15運行程度)を抜き出す
  2. そのうち、泊まりを含む長距離を3件、フェリーを使った運行を1件、2人乗務を1件含める
  3. デジタコの記録、点呼記録、運行日報をスプレッドシートに並べる
  4. 拘束時間・休息期間・連続運転時間を、スプレッドシートの数式で計算する
  5. 改善基準告示の数値と比べ、外れている運行があるかを見る
  6. 手で点検した結果と数式の結果を比べ、食い違った理由を書き出す

6番目がこの段階の目的です。 AIの評価ではなく、人が判断していた部分がどこだったかを見つける作業です。

食い違いが時刻の丸め方だけなら、ルールを1つに決めて Python に移せます。 フェリーと荷待ちの扱いで食い違うなら、分類のルールと記録の様式を先に直します。点呼記録が見つからない運行があるなら、記録の運用のほうが先です。 これは失敗ではなく、仕組みを作る前に何を直すべきかが分かったということです。

08実装時につまずきやすいポイント

問題対策
点呼とエンジン始動の時刻が合わないどちらを始業とするかを1つに決めて書き込む。運行ごとに判断しない
点呼記録が電子データで取れない前提が崩れる。電子化が先。 紙を読み取る工程を足して無理に動かさない
フェリー乗船や荷待ちが長時間の停車としか見えない利用記録を時刻で結びつけ、結びつかない停車は用途不明として人へ回す。既定値で休息と決めない
2人乗務や分割した休息期間を判定できない配車表に割当を、車両マスタに設備の有無を列として持つ。判断は人に残す
1日の区切りを暦日で切ってしまう始業時刻から起算した24時間で見る。泊まりの運行が2暦日にまたがる
月初に累計がリセットされない月の切り替えを明示的に書く。前月を持ち越すと誤った警告が出る
AIが時間を自分で計算するプロンプトで縛り、出力の側でも facts_used と突き合わせる
AIが「違反です」と断定する確認を求める書き方に縛る。最終判断は人が行うと手順にも書く
印の付く運行が多すぎて読まれないしきい値の基準を見直す。毎朝100件出る一覧は開かれなくなる
処理が止まったことに気づかない「本日の対象は何運行だった」の行を毎日書き出し、0件の日を検知する

5行目は見落とされやすい点です。 1日の拘束時間は、始業時刻から起算した24時間について見ます。暦日で切ると、深夜をまたぐ運行の値が実態と変わります。 泊まりの運行がある会社では、ここを誤ると判定そのものが成り立ちません。

09セキュリティ・AIガバナンス上の注意点

この構成で扱うデータ: ドライバーの氏名または社員番号、日ごとの始業・終業時刻、休息の時間帯、運行した区間、点呼の実施記録。すべて、特定の個人の労働時間と行動の記録です。

  1. 従業員の労働時間は個人情報として扱う … 誰が何時から何時まで働き、どこで休んだかという記録で、社内の業務データであっても保護の対象になります
  2. アクセス範囲を運行管理部門と労務担当に限定する … 閲覧権限は運行管理者3名と労務担当に限ります。配車担当に見せるのは「残り時間の目安」までにとどめ、個別の運行の時刻は開かないこともできます。 他部門には開きません
  3. 保存期間を先に決める労働時間の記録には法令上の保存期間の定めがあるため、それを下回らないことが前提です。 期間は労務担当と確認し、過ぎたものは削除してください。「とりあえず残す」にすると、個人の行動の記録が期限なく蓄積されます
  4. 外部AIへ渡す範囲を決める … 渡すのは運行番号、計算済みの時刻と時間、判定の結果、記録の欠けの一覧までです。 氏名は渡さずドライバー番号に置き換え、一覧に書き出す段階で機械が差し込むので、外部へ出るのは「誰か分からない運行の時刻と判定結果」だけです
  5. 法令違反の有無の最終判断は人が行う … この構成が出すのは計算の結果と、確認を求める文面です。最終的な判断は、記録の正しさと例外の扱いを踏まえて運行管理者が行います。 AIの出力をそのまま「違反の記録」として扱わないでください
  6. 人事評価に転用しない拘束時間の長さを評価に使うと、記録を短く申告する動きが生まれます
  7. 入力を学習に使わないサービスを選ぶ … 労働時間の記録は個人情報を含むためです

リスクは、誤った判定を根拠に是正を求めることと、外れていることに気づかないまま運行を続けることの2つです。 前者は指示文を人が読んで直すことで、後者は計算の前提を記録に残して見直すことで減らせます。どちらも、AIの精度ではなく運用の設計の問題です。

10まず何から始めるか

1週目:記録がそろっているかを見る

先月の1週間分について、デジタコの記録、点呼記録、運行日報が全運行分そろっているかを確認します。欠けている運行が何件あり、何が欠けているかを数えてください。 この段階でAIはまだ使いません。

2週目:判定のルールを決める

3名の運行管理者で、どの時刻を始業とするか、停車をどう分類するか、フェリー・荷待ち・分割した休息期間・2人乗務をどう扱うかを決め、1枚にまとめます。 これがそのまま計算の条件になります。

3週目:15運行で計算を試す

数式で計算し、手で点検した結果と比べて食い違った理由を書き出します。 ここで2週目に決めたルールの穴が見つかります。

4週目:毎朝の実行を組む

記録の取得、計算、一覧への書き出しまでを組みます。最初はAIを入れず、計算の結果だけを出してください。 一覧を毎朝開く習慣がつくかを確かめます。

2か月目以降: AIによる説明文と指示文の下書きを足し、人が直した箇所を記録します。 そのうえで月の途中の着地見込みと配車担当への共有を足し、「月の半ばで、残り時間の少ない人が誰か分かる」状態になれば完成です。


11関連ユースケース

12この仕組みを理解するための記事

13技術仕様の確認日・参考情報

技術仕様確認日:2026-09-22/最終更新:2026-09-22
確認した内容情報源確認日
1日(始業時刻から起算し24時間)の拘束時間は13時間を超えず、延長時は最大15時間。14時間を超える回数は週2回までが目安。1週間の運行が全て長距離貨物運送(450km以上)で、一の運行の休息期間が住所地以外の場所である場合は1週2回に限り最大16時間。1か月は原則284時間以内・例外310時間以内(年6か月まで)、1年は原則3,300時間以内・例外3,400時間以内。休息期間は継続11時間以上を基本とし9時間を下回らない。長距離貨物運送で継続8時間以上(週2回まで)とする場合、いずれかが9時間を下回るときは運行終了後に継続12時間以上。連続運転時間は4時間を超えず、やむを得ない場合は30分まで延長できる。運転の中断は1回おおむね10分以上かつ合計30分以上。フェリー乗船時間は原則、休息期間として取り扱う。分割した休息期間は1回当たり継続3時間以上、2分割の場合は合計10時間以上。2人乗務の特例は1台に2人以上乗務し、身体を伸ばして休息することができる設備がある場合に限る。事故・故障・災害等で一定の遅延が生じた場合は、客観的な記録が認められる場合に限り対応に要した時間を除ける厚生労働省 自動車運転者の長時間労働改善に向けたポータルサイト:トラック2026-09-22
シナリオがスケジュールで実行でき、既定では15分ごとに実行されること。定期的な間隔(at regular intervals)、1日1回(once daily)、平日(weekdays)、週単位(weekly)、月単位(monthly)、指定日(specified dates)、オンデマンド(on demand)から選べること。間隔の最小の長さがプランによって変わることMake ヘルプ: Schedule a scenario2026-09-22
Iterator が配列を一連のバンドルに変換すること。Array Aggregator が複数のバンドルを1つにまとめ、設定にソースとなるモジュール(source module)、まとめた先の構造の種類(target structure type)、まとめる単位(group by)があることMake ヘルプ: Flow control2026-09-22
構造化出力(structured outputs)が応答を特定のスキーマに準拠させる機能で、JSON のパースエラーが起きず、必須のフィールドと型が保証され、スキーマ違反による再試行が不要であること。output_config.formattype: json_schema とスキーマを渡して使うこと。additionalPropertiesfalse にする必要があり、配列の minItems は 0 または 1 のみ指定できること。数値の制約(minimum など)、文字列の制約(minLength など)、再帰的なスキーマが使えないことClaude ドキュメント: Structured outputs2026-09-22

Make のエラー処理の詳細は、フロー制御のページに記載がないため触れていません。改善基準告示のうち運転時間の基準(2日単位・2週単位の平均)も対象外で、扱うのは拘束時間・休息期間・連続運転時間の3つです。 荷待ち時間の算入は実態と就業規則によって変わるため、労務担当への確認が必要です。

本記事は、法令違反の有無についての判断を代替するものではありません。 条文の解釈や個別の事案の適否は、所管の労働基準監督署または社会保険労務士にご確認ください。実装ステータスは構成例で、当社で構築・検証したものではありません。

自社の業務に使えるAI活用候補を整理します

このユースケース(UC-0166)についてのご相談はこちらから。

AI活用について相談する
目次