多くの災害情報アプリがデータを並べるだけなのに対し、「マイ避難コンパス」は、自宅周辺の多様なデータ(気象警報、河川水位、ハザードマップ)をAIが統合・解釈し、あなた個人のための「いつ・何をすべきか」という具体的な行動タイムラインに変換する点が全く新しい体験です。これにより、災害時の「結局どうすれば?」という最大の悩みを解消し、判断の認知負荷を劇的に下げます。これは、マルチモーダルな情報を個人の状況に合わせて合成し、実用的な示唆を生成するという、最新のLLM技術の価値を社会課題解決に応用した好例です。
マイ避難コンパス
自宅周辺の災害情報を個人向け行動タイムラインに変換
自宅の住所を入力すると、リアルタイムの気象・河川データとハザードマップを統合します。警戒レベルに応じた「いつ・何をすべきか」を具体的な行動タイムラインとして表示し、災害時の判断を支援します。
今後は、現在は単一の固定シナリオしか体験できませんが、将来的には複数の災害パターン(台風、ゲリラ豪雨など)や異なる地域に対応したサンプルを追加し、より多くの人々が自分事として備えを考えるきっかけを作りたいです。
使い方
この作品の使い方と、画面で確認するポイントをまとめて表示します。
対象地域の災害関連データを収集
リアルタイムの気象警報、河川水位、ハザードマップ情報を仮想的に取得します。デモでは、東京都世田谷区玉川1-1-1の緯度経度が入力として使用されます。出力例として、大雨警報(東京都、レベル3)、多摩川の水位4.8m、洪水浸水想定区域(2.0-5.0m)などが収集されます。
AIが危険度を分析し行動計画を立案
防災専門家としての役割を与えられたAIが、収集された気象・河川・ハザードマップ情報を総合的に分析します。現在の危険度を日本の5段階警戒レベルで判定し、80字以内の要約と、時系列の具体的な行動計画(3〜5ステップ)を生成する設計です。例えば、警戒レベル4(避難指示)と判定され、「多摩川の水位が危険レベルに近づいています。
最終的な行動計画と関連情報を表示用に整理
AIが生成した行動タイムラインに加え、河川名や現在の水位、警戒レベルのしきい値などの関連情報が付加されます。情報源(気象庁、国土交通省など)や、不確実性に関する注記も整理されます。最終出力には、多摩川の現在の水位4.8m(警戒閾値2.5m/4.0m/5.0m)と、情報源のリストが含まれます。
制作メモ
この作品でAIが重視した制作方針を、公開向けに整理して表示します。
コメント
この作品に対するコメントとAIレビューをまとめて表示します。
既存の災害アプリは情報提示が主だったけど、これは住所ベースで「いつ何をすべきか」までタイムライン化してくれるのが大きな違いだね。判断の負荷を減らすアプローチは他にはあまり見ないかも。
ソース
この作品で保存されているコードと確認用ファイルをまとめて表示します。
主要ファイル
コードプレビュー
/* eslint-disable @next/next/no-img-element */
'use client';
import { useState } from 'react';
import { sampleTrace } from '../data/sample-trace';
import { sampleInput } from '../data/sample-input';
// NOTE: To keep the page self-contained and free of `source/core` imports,
// we redeclare the necessary types here.
type TimelineItem = {
time: string;
action: string;
details: string;
};
type SourceItem = {
name: string;
url: string;
};
type FinalOutput = {
alertLevel: number;
alertLevelDescription: string;
riverStatus: {
name: string;
level: number;
thresholds: {
caution: number;
warning: number;
danger: number;
};
};
summary: string;
timeline: TimelineItem[];
sources: SourceItem[];
uncertainty: string;
};
export default function Home() {
const [currentStep, setCurrentStep] = useState(-1);
const [userAddress, setUserAddress] = useState(sampleInput.address);
const handleReplay = () => {
setCurrentStep(0);
let step = 0;
const interval = setInterval(() => {
step++;
if (step < sampleTrace.length) {
setCurrentStep(step);
} else {
clearInterval(interval);
}
}, 500);
};
const getStepOutput = (stepIndex: number) => {
if (stepIndex < 0 || stepIndex >= sampleTrace.length) return null;
return sampleTrace[stepIndex].output;
};
const finalResult = currentStep === sampleTrace.length - 1 ? (getStepOutput(currentStep) as FinalOutput) : null;
const pipelineSteps = [
{ name: 'データ収集', id: 'fetchData' },
{ name: 'リスク分析とタイムライン生成', id: 'gener
...