多くのAIツールが文章やデータを要約する中で、「SiteBrief」は現場作業の安全性という切実な課題に焦点を当てます。散在する図面や過去の事故報告書といった複数の情報源をAIが統合し、単なるテキストではなく「現場の地図」上に危険箇所を可視化するのが新規性です。汎用的なチャットボットとは異なり、作業員が次に行うべき確認事項を具体的なチェックリストとして提示するため、情報の見落としという致命的なミスを防ぎます。これは、マルチモーダルな情報統合(RAG)技術を、デスクワーカーではない現場の人々のための実用的な道具へと昇華させる試みです。
SiteBrief
現場情報をAIが統合し危険箇所を1枚にまとめる
現場の図面や作業指示書、過去の障害報告をAIが読み込みます。ユーザーはボタン一つで、危険箇所や確認項目をハイライトした持ち込み用ブリーフィングを1枚にまとめられます。
今後は、今は単一の設備に対する固定のブリーフィングしか生成できませんが、将来的にはユーザーが任意の文書をアップロードして、動的にブリーフィングを生成する機能に拡張したいです。多様な図面フォーマットへの対応が次の大きな挑戦です。
使い方
この作品の使い方と、画面で確認するポイントをまとめて表示します。
現場作業前の安全確認を効率化するため、SiteBriefは散在する情報を統合します。
ブリーフィング対象の設備を特定
システムは、ブリーフィングを生成する対象となる設備IDを認識します。デモでは、`PLT-EAST-03A` が初期値として設定されています。
設備関連資料の収集
特定された設備IDに基づき、システムは関連する図面、作業指示書、過去の障害報告などのドキュメントを収集します。これは実際の運用ではデータベースやファイルストレージから取得される情報です。
AIがドキュメントを分析
AIは安全分析者として、収集されたドキュメント群を詳細にレビューします。危険箇所と作業前チェック項目を識別し、構造化されたJSON形式で抽出する設計です。
ブリーフィングを生成・表示
分析結果に基づき、最終的な現場ブリーフィングが生成されます。これには、図面上の危険箇所マップと、実行可能なチェックリストが含まれます。例えば、危険箇所として「高圧ガス配管(A-17)」、チェック項目として「高圧ガス配管バルブA-17の締付トルクを確認」といった情報が表示されます。
制作メモ
この作品でAIが重視した制作方針を、公開向けに整理して表示します。
コメント
この作品に対するコメントとAIレビューをまとめて表示します。
「現場の地図」に危険箇所を可視化する点は、一般的なテキストベースのRAG出力と比較して、情報の空間的な関連性を直接的に提示できる。これは、デスクワーカー向けの情報集約ツールが提供する価値とは異なる、現場作業者への具体的な行動支援に特化している。
現場の図面から危険箇所を地図上に可視化して、具体的なチェックリストまで出してくれるのは、本当に事故防止に直結する良いアプローチだと感じました。散在しがちな情報を統合して、現場の作業員が直感的に「何を確認すべきか」を把握できるのは、見落としを防ぐ上で非常に有効ですね。こうしたツールが定着すれば、経験の浅い方でも安心して作業に入れるようになりそうです。あとは、更新頻度と情報の鮮度をどう保つか、運用の仕組みが気になります。
ソース
この作品で保存されているコードと確認用ファイルをまとめて表示します。
主要ファイル
コードプレビュー
'use client';
import { useState } from 'react';
import { sampleTrace } from '../data/sample-trace';
import { sampleInput } from '../data/sample-input';
const pipelineSteps = [
{ id: 'readDocuments', name: '関連文書の読み込み' },
{ id: 'analyzeDocuments', name: 'AIによるリスク・確認事項の抽出' },
{ id: 'synthesizeBriefing', name: 'ブリーフィング生成' },
];
export default function Home() {
const [currentStep, setCurrentStep] = useState(-1);
const finalOutput = sampleTrace.final_output;
const handleReplay = () => {
let step = -1;
const interval = setInterval(() => {
step++;
if (step < pipelineSteps.length) {
setCurrentStep(step);
} else {
clearInterval(interval);
}
}, 500);
};
const isCompleted = currentStep === pipelineSteps.length - 1;
return (
<div style={{ fontFamily: 'sans-serif', padding: '2rem' }}>
<header style={{ borderBottom: '1px solid #eee', paddingBottom: '1rem', marginBottom: '1rem' }}>
<h1>SiteBrief</h1>
<p>AIによる現場ブリーフィング生成デモ</p>
</header>
<div style={{ display: 'grid', gridTemplateColumns: '300px 1fr', gap: '2rem' }}>
{/* Control Panel */}
<aside>
<h2 style={{ fontSize: '1.2rem' }}>処理パイプライン</h2>
<p>対象設備ID: <span data-proof="equipment-id">{sampleInput.equipmentId}</span></p>
<button onClick={handleReplay} disabled={currentStep > -1} data-proof="generate-briefing">
ブリーフィング生成
</button>
<ul style={{ listStyle: 'none', padding: 0, marginTop: '1rem' }}>
{pipelineSteps.map((step, index) => (
...