🌐 ライブデモ
Streamlit Community Cloud で常時稼働中。インストール不要・ブラウザから即アクセス可能。 サンプルデータ(会議文字起こし・タスク一覧・カレンダー)が同梱されているので、ログインなしで全機能を試せます。
背景
プロジェクト管理の現場では「会議で決まったことを手動でタスク管理ツールに転記する」「スケジュールの衝突に気づかず後から手直し」という作業が慢性的に発生する。
特に複数プロジェクトを掛け持ちするメンバーが多い環境では、誰かの予定変更が連鎖的に他のタスクに影響するにも関わらず、それを把握するのは手動では限界がある。
このツールは「会議 → タスク更新 → スケジュール最適化」の一連の流れを自動化し、プロジェクトリーダーの判断作業を支援する。
できること
| 機能 | 説明 |
|---|---|
| 【コア機能】 | |
| 要件抽出(ルールベース) | 会議文字起こしからキーワードでタスク・宿題・決定事項・会議候補を自動分類 |
| 要件抽出(AI) | OpenAI / GitHub Copilot APIで文脈を理解した高精度な自然言語抽出 |
| スケジュール最適化 | タスクの依存関係からクリティカルパスを算出、最短完了経路を可視化 |
| 衝突検出 | メンバーの休暇・会議重複を自動検出してアラート |
| 代替日程提案 | 衝突タスクに対して実行可能な代替スケジュールを自動生成 |
| 遅延予測 | 進捗率・経過日数から完了予測日を算出 |
| 【UI・操作機能】 | |
| Ganttチャート(ドラッグ対応) | タスクをドラッグで動かしてスケジュールを直感的に編集 |
| 提案の承認/却下 | 確信度付きの提案を1件ずつUIで承認または却下 |
| ボトルネック検出 | 保留・遅延・ブロック中のタスクを自動ハイライト |
| Excel入出力 | 非エンジニアでも使えるExcelフォーマットでの入出力 |
技術構成
project-optimizer/
├── app.py # 1,336行:Streamlit UI エントリポイント
├── src/
│ ├── extractor.py # ルールベース要件抽出
│ ├── ai_extractor.py # AI(Copilot/OpenAI)要件抽出
│ ├── matcher.py # タスク×カレンダーの衝突検出
│ ├── optimizer.py # タスク更新判定・確信度・ボトルネック分析
│ ├── scheduler.py # クリティカルパス・代替日程・遅延予測
│ └── exporter.py # Excel/JSON出力
├── components/
│ └── gantt_editor/ # ドラッグ可能カスタムGanttコンポーネント
├── tests/ # 52テスト(6ファイル)
└── data/
├── project.json # タスク定義
├── calendar_mock.json # カレンダーデータ
├── transcript.txt # 会議文字起こしサンプル
└── project_template.xlsx # Excel入力テンプレート
合計: 2,425行のPythonコード(約3週間で構築)+ 52件の自動テスト(カバレッジ対象: 抽出・スケジュール・衝突検出の主要ロジック)
処理フロー
① 入力
会議文字起こし(.txt)
タスク一覧(.json / .xlsx)
カレンダー(.json)
↓
② 要件抽出
ルールベース:キーワードマッチ
AI方式:自然言語理解 → 宿題/保留/決定/会議候補に分類
↓
③ 分析
クリティカルパス計算
衝突検出(休暇・会議重複)
遅延予測・ボトルネック特定
↓
④ 最適化提案(確信度スコア付き)
代替スケジュール案
タスク更新案
会議候補日程
↓
⑤ 承認/却下 → Excel/JSON出力
実装のポイント
ルールベースとAIの切り替え
要件抽出には2つの方式を実装し、用途に応じて選択できる設計にした。
# ルールベース(高速・低コスト)
results = extract(transcript_text)
# AI方式(高精度・API必要)
results = ai_extract(transcript_text, api_key=key)
ルールベースは「宿題」「〜してください」「確認します」などのキーワードパターンで分類。AIは文脈を理解して「明示されていないが次のアクションが発生する発言」も抽出できる。
クリティカルパス算出
タスクの依存関係をDAG(有向非循環グラフ)として構築し、最長経路を動的計画法で算出。
def calc_critical_path(tasks: list[Task]) -> list[str]:
# 依存関係グラフ構築 → トポロジカルソート → 最早・最遅完了時刻算出
# → CP上のタスクID一覧を返す
CPタスクはUIで赤くハイライトされ、遅延が全体に影響することを視覚的に示す。
ドラッグ可能Ganttチャート
Streamlitのカスタムコンポーネント機能を使い、React製のGanttエディタを組み込んだ。タスクをドラッグして日程を変更すると、リアルタイムで依存タスクへの影響が反映される。
効果
| 作業 | 従来の工数 | ツール導入後 | 削減率 |
|---|---|---|---|
| 会議議事録からのタスク起こし | 30〜60分/回 | 2〜5分 | 90% |
| スケジュール衝突の確認 | 15〜30分/週 | 即時自動検出 | 95% |
| 代替日程の検討 | 30〜60分/件 | 5〜10分 | 85% |
| Gantt更新作業 | 20〜40分/回 | ドラッグ操作のみ | 80% |
※ 数値は社内プロジェクトリーダー3名へのヒアリングに基づく推計値。
技術選定の理由
- Streamlit: Pythonだけでインタラクティブなビジネスアプリを構築できる。非エンジニアへのデモが容易。
- uv: パッケージ管理をuvで統一し、
uv sync一発でセットアップ完了。 - Plotly: インタラクティブなGanttチャートと予測グラフ。
- AI切り替え設計: APIキーがない環境でもルールベースで動作保証。段階的なAI導入が可能。