3Dスマート駐車場における業務台帳とエージェント対話設計
既存の企業スマートコックピットバックエンドを再利用し、1年分の合成駐車台帳、サーバー側ロール認可、POI道路トポロジ図、AG-UIイベントプロトコルを組み合わせて、全画面3D園区上に駐車推薦・アラート作業票・運営集計・音声画像対話を実装した記録。
前回の3Dレンダリング最適化の記録では、園区モデルの軽量化、巡行車両と車輪回転、固定距離の追従カメラを実装し、デスクトップとスマートフォンブラウザの双方で滑らかに動かせるようにした。
描画まわりが落ち着いた次の段階として、訪問者向けの駐車区画案内、警備担当者によるアラート確認と作業票起票、運営担当者による日・週・月・年の収益と稼働率の把握、さらに自然言語でのカメラ移動やパネル表示といった業務フローを接続した。3Dキャンバスは全画面のまま維持し、チャット欄と業務パネルは必要時のみ開くオーバーレイとして配置している。バックエンドは既存の企業スマートコックピット(Spring Boot + MySQL + pgvector)をそのまま再利用し、別途エージェント用サーバーは立てていない。
デスクトップ版シーン · スマホ横画面シーン · 3Dフロントエンドソース · コックピットバックエンドソース

公開データセットから365日分の保存則を満たす合成台帳を作る
業務デモで一番困るのは画面ごとに数字が食い違うことだ。チャットで「A区は残り20台」と答えたのに、運営パネルでは50台空きと表示され、3D画面を見ると満車になっているようでは使いものにならない。
現地のゲートやセンサーの実データは直接取得できないため、公開データセット UCI Parking Birmingham から日中の変動パターンを抽出し、整合性のある年間合成台帳を生成した。元データはバーミンガム市議会と NCP に由来し、Daniel Stolfi が整理した2016年一部日程の昼間観測であり、終日連続データではない(リポジトリに出典、元ファイルハッシュ、ライセンス記載を保存)。
無効な容量や範囲外の占有数を除外したうえで、平日・週末ごとの15分スロット集計に夜間の合成曲線、季節変動、区画係数、固定乱数シードを加え、2025-10-03 から 2026-10-02 までの365日分を生成している。
| データ種別 | 件数 | 主な用途 |
|---|---|---|
| 15分ごとの区画別占有スナップショット | 105,120 | 空き台数、稼働率、ピーク時間帯の推移集計 |
| 匿名合成駐車明細 | 167,906 | 入場・出場時刻、滞在時間、模擬料金精算 |
| 合成運用アラート | 365 | 警備巡回、異常箇所確認、作業票フローの検証 |
A・B・C の3区画の容量はそれぞれ 120、100、80 台で、隣接するサンプリング時点間で厳密な保存則を満たす。
今回の占有台数 = 前回の占有台数 + 入場台数 - 出場台数
0 <= 占有台数 <= 区画容量
入場時に匿名レコードを作り、出場時に模擬料金ルールで精算して整数セント単位の paid_cents に保存する(元データに料金項目はなく、実在病院の料金体系ではない)。運営レポートの売上は占有台数からの概算ではなく、精算済みレコードの SQL 集計から直接算出する。
SELECT COUNT(*) AS settled_stays,
COALESCE(SUM(paid_cents), 0) AS paid_cents
FROM parking_stays
WHERE dataset_id = 'parking-year-v1'
AND exited_at >= :from
AND exited_at < :to_exclusive;
元ファイルの SHA256、シード値、対象期間を固定しているため同じ入力から同じ台帳を再生成できる。取り込み前にはDBバックアップを取り、不変データセットIDと冪等キーを使って件数を検証する。画面上には合成データである旨とサンプリング時刻を明示し、過去データをリアルタイムセンサー値のように見せないようにしている。
ロール権限をバックエンドAPIで強制する
システムプロンプト内の注意書きだけでは権限境界にならないため、GET を含むすべての駐車APIでサーバー署名付きセッションを検証し、業務アカウントはDB上の有効状態とロールも再確認する(BCrypt パスワードハッシュ、セッション有効期限30分)。
| ロール | 利用可能な範囲 | モデルとセキュリティ制約 |
|---|---|---|
| 訪問者 | 空き状況、駐車推薦、POI検索、経路案内、ローカル案内ガイド | 自由質問はローカル知識とルールで応答し、有料モデルを呼ばない |
| 現場警備 | アラート確認、入出場履歴、作業票の起票・現地確認、確認済み画面キャプチャ質問 | 警備・設備系APIに限定し、料金台帳は参照不可 |
| 運営担当 | 料金台帳、日/週/月/年レポート、全体監査ログ、作業票の承認・完了 | Flash(深い思考有効)を既定とし、認証済み Pro モデルも選択可 |
| 管理者 | 業務アカウント管理、駐車知識庫の初期化、道路トポロジ図の更新 | 設定変更権限を保持。アカウント停止時は既存トークンも即時失効 |
ブラウザの開発者ツールでフロント側のロール表示を書き換えても、サーバー側の権限検証は通過しない。
POI道路トポロジ図で空間ナビゲーションと推薦をつなぐ
言語モデルに3D空間の (x, y, z) 座標を直接出力させると、建物内部を指したり壁を突き抜ける経路になりやすい。そこで間にバージョン管理付きの POI道路トポロジ図 を挟んでいる。
- モデルは安定した意味IDのみを返す:
outpatient(外来棟)やzone_cなどの定義済みIDを選び、生座標は扱わない。保存時にID重複、有限座標、エッジ端点、楽観ロックバージョンを検証する。 - Dijkstra法で通行可能経路を算出:開放中のノードと道路のみを探索し、モデル縮尺ベースの推定距離を明示する。通行止めや非連結の場合はエラーを返し、建物を横切る線は描かない。
- 条件フィルタと多要素スコアリング:満車・閉鎖・到達不可・条件不一致の区画を除外したうえで、徒歩距離、空き台数、充電設備(B区)、救急用の模擬予備枠(C区に10台確保)から順位付けする(設備属性は区画単位のデモ設定であり、個別車室センサー値ではない)。
人の確認を挟む作業票フロー
設備オフラインや迷惑駐車のアラートに対し、モデルが直接DBを書き換えたりゲートを操作することはない。workorder.prepare ツールは下書きを作るだけで、状態遷移は次の通り進む。
審査待ち(担当者がアラートと備考を確認して送信)
→ 運営承認 → 警備担当割り当て → 現地確認完了 → 運営クローズ
冪等キーによる重複起票防止、同一アラートの未完了作業票の再利用、トランザクション内の行ロックとバージョン確認を行っており、モデルは情報の整理と下書き作成に徹し、現場操作の最終判断と責任境界は常に担当者側に残している。
事前集計レポートと AG-UI イベント連携
運営パネルでは期間・区画別の絞り込み、容量加重の日平均稼働率、精算件数、模擬受領額の表示と、全日次集計の CSV 出力(画面表は先頭18行プレビュー)に対応する。

日・週・月・年の4種類のレポートはデータセット最新日を基準に、既存コックピットプロセスが毎日 02:15(Asia/Shanghai) に SQL 集計のみでキャッシュ生成し、モデル呼び出しを消費しない。
対話から3Dカメラや業務パネルを動かす境界には AG-UI プロトコルを採用した。/api/parking/ag-ui が標準の実行・テキスト・ツール呼び出し・状態スナップショット SSE を返し、レポート・経路・作業票下書き・知識参照は名前付き CUSTOM イベントで渡す。
{
"type": "TOOL_CALL_ARGS",
"toolCallId": "action-0",
"delta": "{\"target\":\"outpatient\"}"
}
フロントエンドは @ag-ui/core の公式スキーマで各イベントを検証してから許可リスト内の画面操作を実行する。Nginx の SSE バッファリングは無効化し、リクエスト中断時には後続のシーン操作を止め、1回の応答内で複数レポートカードを保持できるようにした。
音声割り込みと3Dキャンバス画像質問
- 音声ウェイクワードと読み上げ中断:単発・ウェイクワード・連続対話の3モードで同じロール権限ツールを共有する。読み上げ中にウェイクフレーズを話すと再生を止めて聞き取りへ戻り、自身の読み上げ文面との照合でスピーカー反響の誤反応を抑える。マイクは既定でオフ、バックグラウンド移行時に自動停止する。
- 3Dキャンバスキャプチャ質問:チャット欄やアカウント欄を除いた3Dキャンバスだけをプレビュー表示し、担当者が確認してから送信する。バックエンドで JPEG 形式・バイト数・画素数上限を検証して外部URLを拒否し、画像対応の
deepseek-flashで道路や駐車区画の可視状況を説明して巡回確認の提案を返す(ツール実行や画像のDB保存は行わない)。
まとめと設計上の振り返り
3D描画の軽量化から企業スマートコックピットとの統合までを通して一貫していたのは、3Dデジタルツインには整合性のある検証可能な業務データが不可欠であり、AIエージェントが実務フローへ安全に入るには明確なトポロジ制約、権限境界、対話プロトコルが必要になるという点だ。保存則を満たす台帳データ、サーバー側認可、道路トポロジ図、AG-UI イベント境界を分離しておくことで、今後実機センサーや測量地図、実際の料金規定へ差し替える際もワークフロー層を書き直さずに拡張できる。
デスクトップ版とスマホ横画面の動作環境は 3Dスマート駐車場プロジェクト から確認できる。