Zenn
Open6

LLMに今週取り組むべきタスクを提案してもらう仕組みをつくりたい

Onigiri24365Onigiri24365

o1 pro mode と相談して作ったMVPの概要


以下は、今回検討してきた「Notion→(データ取得&整形)→ChatGPT→(結果表示)」という全体の流れを示すMermaidによるシステム構成図の例です。
左から右へ、データの流れと処理のステップを順に表しています。

図の説明

  1. Notion(ロードマップDB・タスクDB)

    • 中長期ロードマップやタスクを管理するためのデータベース群。
    • APIを通じて必要な項目を取得します。
  2. システム本体

    1. Notionからデータ取得 (A1)
      • Notion APIを用いてDBのエントリを取得します。
    2. データ整形・要約 (A2)
      • 優先度や緊急度が低い・完了済みのタスクを除外したり、テキストを要約したりして、LLMに渡す情報量を最適化します。
    3. プロンプト生成 (A3)
      • 整形されたデータをJSONまたは箇条書きなどの形式にまとめ、ChatGPTへ投げるプロンプトを組み立てます。
    4. ChatGPT API呼び出し (A4)
      • OpenAIのAPIをコールし、上記のプロンプトを送信します。
    5. 応答処理&結果表示 (A5)
      • ChatGPTから返ってきた結果をCLIやテキストファイルなどで表示します。
      • 必要に応じてNotionへ書き戻しなどの拡張が可能です。
  3. ChatGPT (GPT)

    • LLM(大規模言語モデル)。
    • 提供されたプロンプトを解析し、優先タスクや理由を返却します。
  4. ユーザー (User)

    • CLIや簡易UIなどを介して「今週やるべきタスクの提案」を確認し、実際のタスク実行につなげます。

このように、各ステップを明確化することで、システムの全体像や役割分担が分かりやすくなります。今後の拡張や保守・運用にも役立ててください。

Onigiri24365Onigiri24365

以下に、これまで検討した内容を「仕様書」としてまとめます。人間が読んでも理解しやすく、またLLMにそのままテキスト入力やファイルとして与えても比較的理解しやすい構成を意識しています。


タスク集中支援ツール仕様書

1. 概要

本システムは、Notionに記録された中長期ロードマップやタスクリストを参照し、ChatGPTへ適切なプロンプトを自動生成・送信することで「今週取り組むべきタスク」などを提案してもらうためのものです。
目的は以下の通りです。

  • 多数のタスク・ロードマップ情報の中から、優先度や緊急度などを踏まえて最適なタスクを選ぶサポートを受ける。
  • 人間が「どれをやるべきか」悩む負荷を軽減し、モチベーションに沿ったタスク選定ができるようにする。

2. 全体フロー概要

  1. Notion からデータ取得

    • 「中長期ロードマップDB」「タスクDB」など、必要な情報をAPIで取得。
    • 絞り込みや要約を実行し、必要最小限のデータのみ抽出。
  2. プロンプト生成

    • 上記のデータを箇条書きやJSON形式に整形。
    • ChatGPTに投げる最終的な文字列(プロンプト)を組み立てる。
  3. ChatGPTへの問い合わせ

    • 整形済みプロンプトをAPI経由で送信し、結果を受け取る。
  4. 結果の表示

    • ターミナル/CLIまたは簡易的なUIなどでChatGPTの回答を表示する。
    • 必要に応じて、回答内容をNotionなどに書き戻す(拡張項目)。

3. データモデル

3.1 中長期ロードマップDB

  • 用途: プロジェクトや製品の中長期的な目標・マイルストーンを管理。
  • サンプルのカラム設計:
カラム名 種類 用途 / 説明
Name / タイトル タイトル (Title) ロードマップの名前やプロジェクト名
概要 / Description テキスト (Text) ロードマップの目的・ゴールを簡単に記述
期間 / Period 日付 or 日付範囲 開始日〜完了予定日
ステータス / Status セレクト (Select) 例: 「計画中」「進行中」「完了」など
優先度 / Priority セレクト (Select) 例: 「High」「Medium」「Low」
担当 / Owner ユーザー (People) 主担当者(複数可の場合はマルチユーザー)
メモ / Notes テキスト (Text) 制約・リスク・関連リンクなどの自由記述

3.2 タスクDB

  • 用途: 日々のタスクやToDoを管理し、優先度・緊急度・やりたい度などを付与する。
  • サンプルのカラム設計:
カラム名 種類 用途 / 説明
Name / タスク名 タイトル (Title) タスクの名前
概要 / Description テキスト (Text) タスク内容を簡単に記述
担当 / Assignee ユーザー (People) タスクの担当者
ステータス / Status セレクト (Select) 例: 「未着手」「進行中」「完了」など
優先度 / Priority セレクト (Select) 例: 「High」「Medium」「Low」
緊急度 / Urgency セレクト (Select) 例: 「High」「Medium」「Low」
やりたい度 / Desire 数値 (Number) or セレクト 個人のモチベーション指標 (1〜5段階など)
期限 / Due 日付 (Date) タスクの締切日や目標日
見積もり時間 / Est.Time テキスト or 数値 ざっくり工数 (例: "2h", "0.5 day" など)
ロードマップ / Roadmap リレーション (Relation) 中長期ロードマップDBとの紐付け
メモ / Notes テキスト (Text) 補足・注意点など

3.3 取得データのフォーマット例

LLMに送る際には、以下のように箇条書き形式JSON形式でまとめると良い。

例: ロードマップ情報 (JSON)

{
  "roadmaps": [
    {
      "title": "新規製品Aのリリース",
      "period": "2025-04 to 2025-09",
      "goal": "プロトタイプ→ベータ版→正式リリース",
      "priority": "High",
      "status": "In progress"
    },
    {
      "title": "既存製品Bの大規模アップデート",
      "period": "2025-06 to 2025-10",
      "goal": "セキュリティ強化とUIリニューアル",
      "priority": "Medium",
      "status": "Planning"
    }
  ]
}

例: タスク情報 (JSON)

{
  "tasks": [
    {
      "name": "UIデザインのモック作成",
      "priority": "High",
      "urgency": "Medium",
      "desire": 5,
      "due": "2025-03-20",
      "estimatedTime": "10h"
    },
    {
      "name": "DBパフォーマンス調査",
      "priority": "Medium",
      "urgency": "High",
      "desire": 2,
      "due": "2025-03-19",
      "estimatedTime": "5h"
    }
  ]
}

4. 処理フロー詳細

  1. Notionから情報を取得

    1. Notion APIクライアントを利用し、ロードマップDB・タスクDBのレコードを取得。
    2. フィルタ条件に応じて「完了済みを除外」「優先度Lowは除外」など絞り込みを行う。
    3. データが膨大な場合は、所定の上限(件数/文字数)に到達した時点で打ち切り or 要約処理を挟む。
  2. プロンプト用の整形

    1. JSONや箇条書きなど、ChatGPTが解釈しやすい形式を選ぶ。
    2. 優先度・緊急度・やりたい度など必要項目が明確になるように整形。
  3. ChatGPTへの問い合わせ

    1. OpenAI APIなどを使い、ChatGPTのエンドポイントにリクエストを送信。
    2. システム・ユーザーメッセージで役割や希望の出力形式を明示。
      • 例: 「JSON形式で回答して」「上位5つのタスクとその理由を示して」など。
    3. レスポンスを受け取り、ターミナルやテキストファイルに出力。
  4. 結果の確認と活用

    1. ChatGPTが提案したタスクと理由を確認。
    2. 必要に応じてNotionに書き戻す(拡張機能として実装可)。
    3. ユーザーが最終的にどのタスクを採用するか判断し、ステータスを更新。

5. プロンプトの例

以下のような前文に、整形済みデータを差し込み、最後に依頼内容を明記します。

【Systemメッセージ】
あなたは私のタスクマネジメントをサポートするプロのコンサルタントです。

【ロードマップ情報】
{JSON or 箇条書き}

【タスク情報】
{JSON or 箇条書き}

【依頼内容】
- 今週取り組むべきタスクを優先度・緊急度・やりたい度などを考慮して上位5つ選んでください。
- なぜそのタスクを選ぶか理由も示してください。
- 必要に応じて所要時間の目安やロードマップ上の意義を説明してください。
- JSON形式で回答してください。

6. 技術要件

  • Notion API
    • 認証: Integration Token
    • 使用ライブラリ例: @notionhq/client (Node.js), notion-client (Python)など
  • ChatGPT API
    • 認証: OpenAI API Key
    • エンドポイント: https://api.openai.com/v1/chat/completions (ChatGPTモデル使用を想定)
  • 対応言語・環境
    • Python 3.9+ or Node.js 16+ など
    • 依存ライブラリは要件に応じてrequirements.txt / package.json に定義
  • 実行形態
    • MVP段階: CLIまたはスクリプト実行でOK
    • 将来的にWeb UIを追加する可能性あり

7. 運用方法の想定

  1. 定期実行 or 手動実行
    • 毎週月曜日にスクリプトを走らせて「今週の優先タスク提案」を得る、などルーティン化を想定。
  2. データ更新頻度
    • Notion側でタスクが追加・完了されるたびにスクリプトを走らせる運用も可能。
  3. エラー対応
    • Notion APIやChatGPT APIで通信失敗の場合、一定回数リトライし、改善しなければメッセージを表示。

8. 今後の拡張アイデア

  1. ChatGPTの回答をNotionへ書き戻し
    • 「推奨タスク」や「優先度再評価の結果」などをNotionの別DBまたはコメントとして保存。
  2. タスク完了報告の自動反映
    • ChatGPTの提案を基にタスクに「完了チェック」を入れると、自動でステータス更新を行う機能。
  3. 時間見積りの調整
    • ChatGPTの回答をもとにタスクの所要時間をアップデートし、実績データを学習させていく。
  4. スコアリングの事前計算
    • (PriorityWeight × priority) + (UrgencyWeight × urgency) + (DesireWeight × desire) など独自アルゴリズムを用いて事前にタスクをスコアリングし、ChatGPTにトップn件だけ渡す。

9. テキストをLLMに渡す際の注意

  • Token削減
    • ロードマップやタスク数が膨大な場合、要約ステップを設ける(ChatGPT自身に前段階で要約させる方法など)。
  • 出力形式の指定
    • JSON形式やMarkdown形式を明記しないと、ChatGPTがフリーテキストで回答してしまう場合がある。
  • 機密情報
    • API経由で外部サーバーに送信するため、機密度の高いデータを取り扱う場合は必要に応じてマスキングやフィルタリングを行う。

10. テスト計画 (簡易)

  1. 小規模データテスト
    • Notion側に少数のロードマップ(1〜2件)・タスク(5〜10件)を登録し、正常に提案を得られるか確認。
  2. 大量データテスト
    • タスクが50件以上ある場合など、ChatGPTがスムーズに回答できるか要約ロジックが動作するかを検証。
  3. 異常系テスト
    • APIキー未設定、Notion DBが見つからない、ChatGPTリクエストがタイムアウトする場合など、適切にエラーメッセージを返すか確認。

付録: プロンプト例 (JSON形式での最終送信例)

{
  "system": "あなたは私のタスクマネジメントを支援するプロのコンサルタントです。",
  "user": "以下の情報を参考に、今週やるべきタスク上位5件をJSON形式で提案してください。\n\n【ロードマップ情報】\n{\n  \"roadmaps\": [\n    {\n      \"title\": \"新規製品Aのリリース\",\n      \"period\": \"2025-04 to 2025-09\",\n      \"goal\": \"プロトタイプ→ベータ版→正式リリース\",\n      \"priority\": \"High\",\n      \"status\": \"In progress\"\n    }\n  ]\n}\n\n【タスク情報】\n{\n  \"tasks\": [\n    {\n      \"name\": \"UIデザインのモック作成\",\n      \"priority\": \"High\",\n      \"urgency\": \"Medium\",\n      \"desire\": 5,\n      \"due\": \"2025-03-20\",\n      \"estimatedTime\": \"10h\"\n    },\n    {\n      \"name\": \"DBパフォーマンス調査\",\n      \"priority\": \"Medium\",\n      \"urgency\": \"High\",\n      \"desire\": 2,\n      \"due\": \"2025-03-19\",\n      \"estimatedTime\": \"5h\"\n    }\n  ]\n}\n\n上位5件のタスクと、その理由や必要なステップを教えてください。"
}
Onigiri24365Onigiri24365

Notionに記録した情報を使ってChatGPTに投げるプロンプトを自動生成する流れを、月曜から金曜(1日3時間を想定)で組み上げるためのスケジュール例を示します。UIなどは最小限とし、まずはNotion ⇒ コマンド実行 ⇒ ChatGPT応答というシンプルなプロトタイプを目指します。


全体像

  1. Notionからのデータ取得
    • Notion APIを使って、ロードマップやタスク一覧など必要な情報を取得する。
  2. データ加工・要約(プロンプト生成)
    • 取得したデータを整形し、ChatGPT用のプロンプト文字列を作成する。
  3. ChatGPT API問い合わせ
    • 自動生成したプロンプトを使ってChatGPTにリクエストし、回答を得る。
  4. 出力結果の表示・確認
    • CLIなどで結果をまとめて表示し、提案されたタスクや理由を確認できる状態にする。

5日間のスケジュール例(1日3時間想定)

Day 1 (月曜, 3h)

1. Notion連携の準備・試験実装

  1. NotionのAPI連携準備(〜1h)
    • Notion APIのドキュメントを確認し、Integration Tokenを取得。
    • 対象となるNotionデータベースを作成 or 既存のものを用意して、適切な権限を付与。
  2. 簡単なデータ取得テスト(〜1h)
    • PythonまたはNode.jsなど、使いやすい言語でNotion APIクライアントをセットアップ。
    • 例: Pythonの場合 notion-client を使い、Node.jsの場合 @notionhq/client を使うなど。
    • データベースから「タイトル/本文/タスク属性」などを取得し、コンソールに表示するまでを確認。
  3. データ構造の設計(〜1h)
    • どのようなカラム名(プロパティ)をNotionに用意し、それをどう使うか簡単に決める。
      • タスク名 / 優先度(Priority) / 緊急度(Urgency) / やりたい度(Desire) など。

Day 2 (火曜, 3h)

2. プロンプト生成の下準備

  1. データ取得部分の拡張(〜1h)
    • 「中長期のロードマップ用」「過去数ヶ月の実績用」「現在のタスクリスト用」など、複数のNotionデータベースまたはページから取得できるようにする。
    • 簡単に区別できるよう、データ取得関数を分けて実装。
  2. データ加工・要約ロジックの下準備(〜1h)
    • まだ詳細な要約処理は後回しでもOK。まずは取得したデータをJSON形式や箇条書きなどに整形してコンソール出力してみる。
    • 行数が多い場合は一旦上限を設けるなど、トークン過多を防ぐ仕組みをざっくり入れておく。
  3. プロンプトの基本テンプレートを作成(〜1h)
    • 例:
      あなたは私のタスクマネジメントを支援するアシスタントです。
      以下の情報を参考に、今週取り組むべきタスク上位5つとその理由を提案してください。
      
      1. 中長期ロードマップ(要約): {ROADMAP_DATA}
      2. 過去の実績: {PAST_DATA}
      3. タスクリスト: {TASK_LIST}
      
    • {}の部分にNotionから取得したデータを埋め込む仕組みをスクリプト内に用意。

Day 3 (水曜, 3h)

3. ChatGPT APIへの接続と動作確認

  1. ChatGPT APIのセットアップ(〜1h)
    • OpenAIのAPIキーを取得 (.envファイルなどで管理)。
    • Pythonの場合はopenaiライブラリ、Node.jsの場合はopenai npmパッケージを使うなど。
    • テスト用にシンプルなプロンプトを送って、応答をコンソールに出すところまで確認。
  2. プロンプト自動生成 + API呼び出し(〜1h)
    • Day2で作成したプロンプトテンプレートとNotionから取得・整形したデータを組み合わせ、ChatGPTに送るロジックを追加。
    • コマンド例:
      $ python main.py --generate-plan
      
      のように実行すると、ChatGPTへ問い合わせ → コンソールに結果を表示。
  3. 簡易動作テスト(〜1h)
    • テスト用にNotionの各データベースにサンプルデータを数件入力して結果をチェック。
    • 応答が期待に近い形か確認。必要に応じてプロンプト文言を調整してみる。

Day 4 (木曜, 3h)

4. 出力改善・要約導入などのブラッシュアップ

  1. 出力フォーマット整形(〜1h)
    • LLMから返ってきたテキストをCLI上で見やすい形に加工する(箇条書き、行区切りなど)。
    • タスク名や理由のみを抽出して表示したい場合は、ChatGPT側に「JSON形式で返して」と促すなど。
  2. 要約・絞り込み処理の導入(〜1h)
    • 過去の実績やタスク一覧が多い場合に、事前に1〜2行に要約する簡易ロジックを入れる。
    • ChatGPT自身に「100文字程度に要約して返して」と頼む方法や、Notion上でハイライトを別プロパティにまとめる方法などを検討。
  3. エラーハンドリング・例外処理(〜1h)
    • Notion APIが失敗した場合のリトライや、ChatGPTからのエラー時のハンドリング。
    • 引数や設定ファイルが無い場合のメッセージを整備しておく。

Day 5 (金曜, 3h)

5. ドキュメント整備・仕上げ

  1. 最終テストと微調整(〜1h)
    • 実際にロードマップやタスクリストを変更してみて、どのように動作するかを確認。
    • プロンプトや絞り込み条件の調整で、より適切な回答が得られるかテスト。
  2. README/ドキュメント作成(〜1h)
    • プロジェクトのセットアップ方法 (Notion連携, ChatGPT APIキー設定, コマンド実行例) を簡潔に記述。
    • 利用上の注意や拡張アイデア、参考URLなどもまとめる。
  3. 今後のToDo整理(〜1h)
    • 次にやりたい機能・改善案を箇条書きでリスト化。
    • 例:
      • ChatGPT回答をNotionに書き戻す処理
      • CLIをWeb UI化する拡張
      • タスクの完了報告をスクリプト経由で行い、翌週提案に反映する
    • 最低限MVPが完成したら、チームや関係者に共有しフィードバックをもらう。

追加のポイント

  1. Notionデータ構造はシンプルに

    • まずは「ロードマップ用」「実績用」「タスク一覧用」の3つのデータベースを作り、カラムも最低限にする。
    • 運用しながら必要に応じて項目を追加すると、スムーズに試せます。
  2. ChatGPTのレスポンスを安定化させるには

    • Systemメッセージやプロンプトに「あなたはプロのプロジェクトマネージャーです」など役割を明確化すると、より的確な提案が返ってきやすいです。
    • 出力形式をJSONで指定して整形しやすくするのもおすすめです。
  3. Token節約の考慮

    • Notionの内容が膨大になるとAPIコールが長文になりがちなので、要約や絞り込みのタイミングを工夫する。
    • 例えば、あらかじめ「優先度が高いタスクのみ」「過去2週間の実績のみ」などに限定してChatGPTに渡すなど。
  4. 拡張のしやすさ

    • MVPの時点では「Notion → CLI → ChatGPT → CLI表示」でOK。
    • 後にブラウザUIを足す、Notionに自動書き戻し機能を追加するなど拡張しやすいよう、関数を分割してコードを書いておくと良いでしょう。

以上が、Notionのデータを活用してChatGPTのプロンプトを自動生成し、優先タスクの提案を得るMVPを**月曜から金曜の5日間(1日3時間程度)**で構築する大まかな流れです。最初は動くものを作り、改善点を洗い出しながら少しずつ発展させていけば、使いやすいツールに仕上がると思います。

Onigiri24365Onigiri24365

一旦実装した

https://gitlab.com/onigiri243651/taskfocus/-/tree/44356da538b41709776a4ff16e0b012717d23fcd

実装フロー

  1. README.md に仕様を記述
  2. Cursor の Agent モードで「TypeScriptで実装して」と指示
  3. 実行してエラーになったらターミナルの内容を Cursor Agent に連携してから「修正して」と指示
  4. 上記でほぼ実装されたので、プロンプトとかの細かいところは手で修正

ハマったところ

  • Notion DB から Integration に接続許可をだしてなく、データが取得できない状態になっていた

今のところこんな感じ

登録されているタスクが4件しかないので、ロードマップから必要なタスクを提案してくれたりしている。

$ npm run dev

> taskfocus@1.0.0 dev 
> ts-node src/index.ts

TaskFocus: タスク集中支援ツールを起動しました
Notionからデータを取得中...
ロードマップデータベースID: 1b9c2512-a896-800b-9b63-ed86d88202bf
5件のロードマップを取得しました
タスクデータベースID: 1b9c2512-a896-8070-bd51-cb8bbdfeb7a6
利用可能なプロパティ名: [ '重要度', '期限', 'ざっくり見積もり', 'ロードマップ', 'ステータス', 'やりたい度', '概要', '名前' ]
4件のタスクを取得しました
ChatGPTに問い合わせ中...
[
  {
    'タスク名': '大学の履修届提出',
    '重要度': 'High',
    'やりたい度': 0.9,
    '期限': '2025-03-19',
    '見積時間': '2h',
    'ステータス': '未着手',
    'ロードマップ': undefined
  },
  {
    'タスク名': '集中すべきタスクを提案してくれるAIツールのMVP作成',       
    '重要度': 'High',
    'やりたい度': 1,
    '期限': '2025-03-21',
    '見積時間': '10h',
    'ステータス': '未着手',
    'ロードマップ': 'AI Agent 関連のサービスを個人で立ち上げてマネタイズ化'
  },
  {
    'タスク名': '2025年のロードマップを策定',
    '重要度': 'Medium',
    'やりたい度': 0.98,
    '期限': '2025-03-21',
    '見積時間': '2h',
    'ステータス': '未着手',
    'ロードマップ': 'AI Agent 関連のサービスを個人で立ち上げてマネタイズ化'
  },
  {
    'タスク名': '把握すべき基礎用語・知識の範囲を決める',
    '重要度': 'Medium',
    'やりたい度': 0.95,
    '期限': '2025-03-30',
    '見積時間': '1.5h',
    'ステータス': '未着手',
    'ロードマップ': '機械学習:レコメンド・マッチングの基礎用語・知識を把握'
  }
]
あなたは私のタスクマネジメントをサポートするプロのコンサルタントです。

【ロードマップ情報】
[
  {
    "タイトル": "大学でAIの基礎とマネジメントの基礎を身につける",
    "期間": "2023-10-01~2027-09-30",
    "目標": "",
    "重要度": "High"
  },
  {
    "タイトル": "XRで自分にとって心地よい空間を作成できるようになる",
    "期間": "2025-03-17~2025-12-31",
    "目標": "2025年中には建築ビジュアライゼーション関連の一通りの基礎的なスキルを身につける",
    "重要度": "Medium"
  },
  {
    "タイトル": "AI Agent 関連のサービスを個人で立ち上げてマネタイズ化",
    "期間": "2025-03-17~2025-12-31",
    "目標": "2025年中には1万/月を目指す",
    "重要度": "High"
  },
  {
    "タイトル": "AIを使った開発手法に関するキャッチアップ習慣化",
    "期間": "2025-03-17~2025-06-30",
    "目標": "",
    "重要度": "High"
  },
  {
    "タイトル": "機械学習:レコメンド・マッチングの基礎用語・知識を把握",
    "期間": "2025-03-17~2025-04-20",
    "目標": "",
    "重要度": "Medium"
  }
]

【タスク情報】
[
  {
    "タスク名": "大学の履修届提出",
    "重要度": "High",
    "やりたい度": 0.9,
    "期限": "2025-03-19",
    "見積時間": "2h",
    "ステータス": "未着手"
  },
  {
    "タスク名": "集中すべきタスクを提案してくれるAIツールのMVP作成",
    "重要度": "High",
    "やりたい度": 1,
    "期限": "2025-03-21",
    "見積時間": "10h",
    "ステータス": "未着手",
    "ロードマップ": "AI Agent 関連のサービスを個人で立ち上げてマネタイズ化"
  },
  {
    "タスク名": "2025年のロードマップを策定",
    "重要度": "Medium",
    "やりたい度": 0.98,
    "期限": "2025-03-21",
    "見積時間": "2h",
    "ステータス": "未着手",
    "ロードマップ": "AI Agent 関連のサービスを個人で立ち上げてマネタイズ化"
  },
  {
    "タスク名": "把握すべき基礎用語・知識の範囲を決める",
    "重要度": "Medium",
    "やりたい度": 0.95,
    "期限": "2025-03-30",
    "見積時間": "1.5h",
    "ステータス": "未着手",
    "ロードマップ": "機械学習:レコメンド・マッチングの基礎用語・知識を把握"
  }
]

【依頼内容】
- 今週取り組むべきタスクを重要度・期限・やりたい度などを考慮して最大上位5つ選んでください。
- 期限が迫っているものは最優先で選んでください。
- 一週間でタスクに割ける時間は最大でも10時間程度です。
- なぜそのタスクを選ぶか理由も示してください。
- 必要に応じて所要時間の目安やロードマップ上の意義を説明してください。

=== 今週のおすすめタスク ===
以下は、今週取り組むべきタスクを重要度、期限、やりたい度を考慮して選んだ上位5つのタスクです。これらのタスクを選んだ理由も併せて説明します。

1. **大学の履修届提出**
   - **期限**: 2025-03-19
   - **重要度**: High
   - **やりたい度**: 0.9
   - **見積時間**: 2h
   - **理由**: 期限が最も近く、重要度も高いため、最優先で取り組むべきタスクです。大学での学びは長期的なキャリア形成において重要です。

2. **集中すべきタスクを提案してくれるAIツールのMVP作成**
   - **期限**: 2025-03-21
   - **重要度**: High
   - **やりたい度**: 1
   - **見積時間**: 10h
   - **理由**: 期限が迫っており、重要度が高いタスクです。また、やりたい度も高く、ロードマップ「AI Agent 関連のサービスを個人で立ち上げてマネタイズ化」に直結しています。一週間の最大時間(10時間)をこのタスクに充てることを検討してください。

3. **2025年のロードマップを策定**
   - **期限**: 2025-03-21
   - **重要度**: Medium
   - **やりたい度**: 0.98
   - **見積時間**: 2h
   - **理由**: 期限が近いため優先度が高く、やりたい度も非常に高いです。このタスクはロードマップの具体的な方向性を決定するため、重要です。ただし、時間が限られているため、MVP作成の進捗次第で取り組みを検討してください。

4. **把握すべき基礎用語・知識の範囲を決める**
   - **期限**: 2025-03-30
   - **重要度**: Medium
   - **やりたい度**: 0.95
   - **見積時間**: 1.5h
   - **理由**: やりたい度が高く、期限に少し余裕がありますが、ロードマップ「機械学習:レコメンド・マッチングの基礎用語・知識を把握」に関連しており、今後の学習の指針となります。今週中に少しでも時間を割けるように調整してください。

このように、期限が迫っているものを優先しつつ、やりたい度とロードマップの関連性を考慮して選定しました。限られた時間を有効に使い、最もインパクトのあるタスクに取り組むことが重要です。

処理が完了しました。上記のタスクに取り組みましょう!

TODO

  • タスク候補を20件くらい入れたらどうなるか確認
  • 上記を確認しながらいい感じになるようにプロンプト等を工夫
  • 不必要なデバッグ出力を抑制
  • OpenAI 以外のLLMも利用できるようにして、いろいろなモデルで比較検討したい
Onigiri24365Onigiri24365

2025/03/18 作業ログ

https://gitlab.com/onigiri243651/taskfocus/-/tree/9988b4d1488ecae25f212e98ebd6915ca56c7f22

  • 複数のLLMに対応(LangChain.js)
  • LLMからの解答をJSON形式に変更
  • スコア付けを依頼
  • LangSmithに対応
  • タスク候補数を20以上にして確認
    • 特に問題なさそう

プロンプトのアップデート

const prompt = `あなたは私のタスクマネジメントをサポートするプロのコンサルタントです。

【ロードマップ情報】
${JSON.stringify(roadmapsForDisplay, null, 2)}

【タスク情報】
${JSON.stringify(tasksForDisplay, null, 2)}

【依頼内容】
- 今週取り組むべきタスクを重要度・期限・やりたい度などを考慮して、合計時間が${weeklyTaskHours}時間程度になるように選んでください。
- 今日の日付は${new Date().toLocaleDateString('ja-JP', { year: 'numeric', month: '2-digit', day: '2-digit' })}です。
- 期限が迫っているものは最優先で選んでください。
- なぜそのタスクを選ぶか理由も示してください。
- 関連するロードマップがあれば、ロードマップ上の意義を説明してください。
- 着手するおすすめの曜日を示してください。
- タスクを選定し終わったら、これらのタスクを選んだ理由をくわしく説明してください。また、取り組み方のアドバイスや、ポジティブな応援メッセージもお願いします。`

JSON形式で返答してもらう

https://js.langchain.com/docs/how_to/structured_output/

import { BaseChatModel } from "@langchain/core/language_models/chat_models";
import { z } from "zod";

// タスク推薦のスキーマを定義
const taskRecommendationSchema = z.object({
  recommendations: z.array(
    z.object({
      id: z.string().describe("タスクのID"),
      name: z.string().describe("推奨タスクの名前"),
      reason: z.string().describe("タスクを選んだ理由"),
      score: z.number().describe("タスクのおすすめ度(0~100)"),
      recommendedDay: z.string().describe("着手するおすすめの曜日"),
    })
  ),
  comment: z.string().optional().describe("これらのタスクを選んだ理由"),
});

const structuredLlm = this.model.withStructuredOutput(taskRecommendationSchema);
const response = await structuredLlm.invoke([
  ["system", "あなたは私のタスクマネジメントをサポートするプロのコンサルタントです。常に指定されたJSON形式で回答してください。"],
  ["human", prompt]
]);

レスポンス例

{
  recommendations: [
    {
      id: '1b9c2512-a896-8050-a2f1-fce313d78500',
      name: '集中すべきタスクを提案してくれるAIツールのMVP作成',
      reason: '重要度が高く、期限が迫っており、進行中のため、早急に進める必要があります。',
      score: 95,
      recommendedDay: '2025-03-19'
    },
    {
      id: '1b9c2512-a896-8010-a16f-fcb686ada3b1',
      name: 'AI Agent開発 2025年のロードマップを策定',
      reason: 'AI Agent個人開発マネタイズという重要なロードマップに関連し、期限が近いため速やかに着手するべきです。',
      score: 85,
      recommendedDay: '2025-03-20'
    },
    {
      id: '1bac2512-a896-80ff-8326-f9faf70f6911',
      name: 'AWS試験申し込み',
      reason: 'やりたい度が高く、期限が近いため、早めに済ませておくと良いでしょう。',
      score: 75,
      recommendedDay: '2025-03-21'
    },
    {
      id: '1b9c2512-a896-80b6-a416-e2491b775501',
      name: '機械学習の把握すべき基礎用語・知識の範囲を決める',
      reason: '機械学習の基礎に関するタスクであり、重要度とやりたい度も高いため、早めに取り組むことが有益です。',
      score: 80,
      recommendedDay: '2025-03-22'
    },
    {
      id: '1b9c2512-a896-80c6-91f3-fb7d6d6155f8',
      name: '「スマホ片手にフリースタイルでAI Agentでコーディングする環境をつくる」をやってみる',
      reason: 'AIでの開発手法キャッチアップの一環であり、やりたい度が高いことから、モチベーションを維持しやすいでしょう。',
      score: 80,
      recommendedDay: '2025-03-23'
    }
  ],
  comment: '今回の選択では、最も期限が迫っているタスクを優先しつつ、重要度とやりたい度も考慮しました。特に「集中すべきタスクを提案してくれるAIツールのMVP作成」は進行中で最優先です。また、「AI Agent開発 2025年のロードマップを策定」や「AWS試験申し込み」な 
ど、早めに取り組むことで他のタスクの準備が整うものも選びました。各タスクはそれぞれのロードマップに関連しており、あなたの長期的な目標達成に寄与します。取り組む際は、計画的に時間を配分し、集中して一気に仕上げることで効率を上げましょう。頑張ってください!あ
なたの努力が素晴らしい結果をもたらすことを信じています!'
}

TODO

  • Notionにレコメンド結果を反映
Onigiri24365Onigiri24365

2025/03/20 の作業

https://gitlab.com/onigiri243651/taskfocus/-/tree/b78879cf544f48e8157c9b99192ed306ebee4183

機能アップデート

  • 推薦タスク毎にタスク実行手順も提案してくれるようにプロンプトを修正
  • プロンプト生成処理を分離、ディレクトリ構成をリファクタリング
  • ドキュメントのアップデート
  • LLMの結果取得に失敗した際はリトライするように修正

開発手法についてのメモ

  • コミットメッセージにどんなプロンプトを使ったを記録することにした
  • コード量が増えてきて、Cursorにの実行結果に対しての一貫性を保つための修正指示も増えてきたため Project Rules を作成
    • ちゃんと機能するかは別途検証する必要あり

.cursor/rules/base-rule.mdc

---
description: TaskFocusのコーディング規約とプロジェクト構造に関するルール
globs:
alwaysApply: true
---

## プロジェクト概要
TaskFocusは、NotionのロードマップとタスクデータをLLM(ChatGPT、Claude等)と連携し、最適なタスク選択を支援するNode.js+TypeScriptで実装されたツールです。

## コーディング規約

### 1. プロジェクト構造
- `/src`: ソースコードディレクトリ
  - `/src/index.ts`: メインアプリケーションエントリポイント
  - `/src/types/`: 型定義
  - `/src/services/`: サービス実装
    - `/src/services/notion.ts`: Notionデータ操作サービス
    - `/src/services/llm/`: LLMサービス実装
      - `/src/services/llm/base.ts`: LLM基本クラス
      - `/src/services/llm/factory.ts`: LLMファクトリークラス
      - `/src/services/llm/index.ts`: LLMサービスのエクスポート
      - `/src/services/llm/models/`: 各LLMモデル実装
      - `/src/services/llm/features/`: LLM機能実装
- `/docs`: ドキュメントディレクトリ
- `/dist`: ビルド後の出力先ディレクトリ

### 2. 命名規則
- **クラス**: PascalCase (例: `NotionService`, `LLMServiceFactory`)
- **関数/メソッド**: camelCase (例: `getTaskRecommendations`, `validateConfig`)
- **変数**: camelCase (例: `notionConfig`, `llmService`)
- **定数**: UPPER_SNAKE_CASE (例: `DEFAULT_MAX_TOKENS`)
- **インターフェース**: PascalCase (例: `TaskRecommendation`, `Roadmap`) ※接頭辞「I」は使用しない
- **型**: PascalCase (例: `NotionConfig`, `LLMConfig`)
- **ファイル名**: 基本的にkebab-case (例: `task-recommendation.ts`)、ただしクラス名に合わせる場合は例外あり

### 3. モジュール構造
- 1ファイル1クラス/1機能を基本とする
- 機能を表すクラスの場合、ファイル名はクラス名を小文字にしたものにする (例: `NotionService` → `notion.ts`)
- インデックスファイル(`index.ts`)は、モジュールの公開APIをエクスポートする用途に限定する
- サービスのインターフェースと実装は分離し、依存性注入を活用する

### 4. エラーハンドリング
- エラーは適切にcatchし、意味のあるエラーメッセージを表示する
- 致命的なエラーは`process.exit(1)`で終了する
- APIリクエストなどでは適切なリトライロジックを実装する
- カスタムエラークラスを作成して、エラータイプを明確にする
- 例外は最上位レイヤーでキャッチし、ユーザーフレンドリーなメッセージに変換する

### 5. 設定管理
- すべての設定は`.env`ファイルで管理し、`.env.example`にサンプルを提供する
- 環境変数はアプリケーション起動時に検証し、必須項目が欠けている場合は明確なエラーメッセージを表示
- 設定は専用のConfigクラスで一元管理し、型安全性を確保する
- zodなどを使用して環境変数の型を検証する

### 6. API通信
- APIキーは環境変数から読み込む
- 外部APIとの通信は適切なエラーハンドリングとリトライメカニズムを実装
- レート制限に配慮し、バックオフ戦略を実装する
- API通信のタイムアウト設定を適切に行う
- API応答のキャッシュ戦略を検討する

### 7. LLM連携
- 複数のLLMプロバイダに対応できる抽象化レイヤーを維持
- プロンプトは別ファイルで管理し、テンプレート化する
- 出力形式は明確に指定し、JSONなどの構造化データとして扱う
- LLMの応答パース処理は堅牢に実装し、予期せぬフォーマットにも対応する
- トークン使用量の最適化とコスト管理を考慮する

### 8. 型安全性
- すべてのデータ構造に適切な型定義を与える
- 特に外部APIとのインタフェースには詳細な型定義を実装
- 汎用的な型は`types/index.ts`にまとめる
- any型の使用を最小限に抑え、unknown型を適切に活用する
- 型アサーションよりも型ガードを優先して使用する

### 9. コードスタイル
- コード整形には`prettier`を使用
- リンティングには`eslint`を使用
- インデントは2スペース
- セミコロンは使用
- 文字列はシングルクォート(`'`)を基本とする
- 複雑なオブジェクトや配列は複数行で記述
- 関数の引数は3つ以下を目安にし、それ以上は設定オブジェクトを使用する

### 10. ドキュメンテーション
- 関数やクラスにはJSDoc形式のドキュメントコメントを付ける
- パブリックAPIには詳細な使用方法のコメントを記述する
- 複雑なロジックには適宜コメントを追加
- TODO/FIXMEコメントにはIssue番号や対応予定内容、担当者を明記
- `README.md`には環境構築手順、使用方法、主要機能の説明を含める

## 依存関係
- Node.js 16以上
- TypeScript 4.9以上
- Notion API Client (`@notionhq/client`)
- OpenAI API及び他LLMプロバイダのAPI
- dotenv (環境変数管理)
- zod (スキーマ検証)
- ESLint & Prettier (コード品質)
作成者以外のコメントは許可されていません