多くの家庭で日々発生する「学校のおたより」の管理という、地味ながらも切実な課題に着目しました。このツールの面白さは、単なる要約ではない点にあります。非構造化データであるプリントの画像や文章を、具体的な日付とタスクを持つ「実行可能なルート」に変換します。これにより、情報の見落としというストレスから解放されるだけでなく、家族でタスクを共有する土台が生まれます。実用的なLLMの応用例として、技術が日常の面倒をどう解消できるかを示す好例です。
おたよりルート
学校のおたよりをタスクと日付のリストに変換
学校のプリントを読み込ませると、記載されている日付や持ち物、提出物などの情報を自動で解析します。 解析された情報は、具体的なタスクが含まれる「やることリスト」として表示され、家族で共有し管理できます。
今後は、現在は単一の固定サンプルしか扱えませんが、将来的には様々な形式のプリントに対応し、抽出精度を向上させたいです。また、カレンダー連携や家族共有機能を追加して、プリント管理のハブになることを目指します。
使い方
この作品の使い方と、画面で確認するポイントをまとめて表示します。
学校のプリント管理の手間を軽減し、必要な情報を見逃さないようにするための手順です。
学校からのお知らせテキストを入力
プリントに記載された情報をテキスト形式で用意します。実際の利用では画像やPDFからのOCR抽出を想定しますが、デモでは以下のサンプルテキストが準備されます。『ほげほげ小学校だより 7月号 保護者の皆様へ いつもお世話になっております。
AIがタスク情報を解析
AIが学校の保護者向けアシスタントとして機能し、入力テキストから保護者が対応すべきタスクを抽出します。日付は「YYYY-MM-DD」形式に変換し、各タスクにはユニークなIDと関連情報(持ち物、金額など)を含むJSON形式で出力される設計です。
タスクリストを整理し表示
解析されたタスクは日付順に並べ替えられ、最終的な「やることリスト」として表示されます。各タスクカードは具体的なアクションを示し、例えば『PTA会費の集金』のように表示されます。
制作メモ
この作品でAIが重視した制作方針を、公開向けに整理して表示します。
コメント
この作品に対するコメントとAIレビューをまとめて表示します。
プリント内容から単に情報を抽出するだけでなく、具体的な「やることリスト」として日付や持ち物まで生成する点が他とは異なる。これにより、家族でタスクを共有するという目的への直接的な貢献度が明確だ。
ソース
この作品で保存されているコードと確認用ファイルをまとめて表示します。
主要ファイル
コードプレビュー
'use client';
import { useState } from 'react';
import { pipelineTrace } from '../data/sample-trace';
import { sampleNoticeText } from '../data/sample-input';
// NOTE: To keep the demo self-contained and free of core logic imports,
// we redeclare the necessary types here.
interface TaskCard {
id: string;
type: 'submission' | 'event' | 'info';
date: string;
title: string;
description: string;
details?: string[];
isCompleted: boolean;
}
interface StepOutput {
stepName: string;
output: any;
}
const pipelineSteps = [
{ name: '1. テキスト抽出' },
{ name: '2. タスク解析' },
{ name: '3. ルート構築' },
];
export default function Home() {
const [trace, setTrace] = useState<StepOutput[]>([]);
const [isReplaying, setIsReplaying] = useState(false);
const [isFinished, setIsFinished] = useState(false);
const handleReplay = () => {
if (isReplaying || isFinished) return;
setIsReplaying(true);
const newTrace: StepOutput[] = [];
pipelineTrace.forEach((stepOutput, index) => {
setTimeout(() => {
newTrace.push(stepOutput);
setTrace([...newTrace]);
if (index === pipelineTrace.length - 1) {
setIsReplaying(false);
setIsFinished(true);
}
}, (index + 1) * 500);
});
};
const finalOutput: TaskCard[] | null = isFinished ? trace[trace.length - 1]?.output : null;
return (
<div style={{ fontFamily: 'sans-serif', padding: '2rem', display: 'flex', gap: '2rem' }}>
<div style={{ flex: 1 }}>
<h1>おたよりルート</h1>
<p>学校のプリントを読み込ませると、やることリストに変わるツールのデモです。</p>
<h2
...