メインコンテンツへスキップ
見出し画像

日報は書くだけ、まとめはAIが。KV×D1×LLMで作る進捗の自動可視化

    こんにちは!Accel-Hack (アクセルハック)開発チームです。

    社内AIアシスタント「Airi」の開発プロセスをお届けする開発記ブログ。
    第17回目の今回は、チームの活動を見える化する report機能 をお届けします。

    前回の Vol.16 では、Airi が毎朝ニュースを届ける仕組みを紹介しました。

    今回のテーマも自動化ですが、光を当てるのはチームそのもの――日報と週報です。
    日報は、書くのも面倒なら、集めて振り返るのはもっと面倒。

    この「集める・まとめる」という重たい部分を、Airi がまるごと引き受けます。

    しかも、これまでの連載で作ってきた KV・D1・LLM という3つの道具が、ここで美しく合流するのです。



    1. 「書く」に集中してもらうために

    日報には二つの手間があります。

    一つは書く手間、もう一つは、書かれたものを集めて振り返る手間です。
    前者はメンバー各自の仕事ですが、後者――全員の日報を眺めて進捗をまとめ、週次で傾向を見る作業――は、放っておくと誰の担当でもなくなり、形骸化していきます。

    そこで Airi が引き受けたのが、この後者のすべてです。

    メンバーには「書く」ことだけに集中してもらい、集計・要約・振り返りはAIが担う。

    この役割分担を、Airi は三段構えの自動ジョブで実現しています。


    2. 三段構えの全体像

    report機能は、一日の中で異なる時間帯に動く3つのジョブで成り立っています。

    画像

    「毎朝・器を用意し」「毎晩・一日をまとめ」「週次・変化を振り返る」。
    この流れを、順に見ていきましょう。


    3. 毎朝:日報という“器”を用意する

    まず毎朝のジョブが、その日の日報スレッドをチャンネルごとに立てます。
    「本日の日報です、ここに書いてね」という投稿を Airi が自動で行い、メンバーはそのスレッドにぶら下げる形で日報を書きます。

    このとき地味に大切なのが、立てたスレッドの目印(thread_ts)を Vol.7 の KV に保存しておくことです。

    const response = await api.slack.chat.postMessage({
      channel: channelId,
      text: threadText,
    });
    // その日の投稿先を覚えておく(夜の集計ジョブが同じスレッドを読むため)
    await kv.put(getReportThreadTsKeyForChannel(todayJST, channelId), response.ts, {
      expirationTtl: REPORT_THREAD_TTL_SECONDS,
    });

    この「目印」があるおかげで、夜の集計ジョブは「今日はどのスレッドを読めばいいか」を迷わず特定できます。

    1日限りの短命な情報なので、期限付きで気軽に置ける KV がうってつけです。


    4. 毎晩:LLMが一日をまとめ、D1に貯める

    夜になると、集計ジョブが動き出します。
    KV に控えておいた目印を頼りに、その日の日報スレッドの投稿を読み込み、LLM に要約させます。

    ここでも Vol.16 と同じく、Zod スキーマで出力の形を固定します。

    LLM は各メンバーの投稿から、進捗率・評価スコア・要約文を構造化データとして抽出します。

    const summarySchema = z.object({
      target_date: z.string(),
      summary: z.array(
        z.object({
          user_id: z.string(),
          progress: z.number(),
          score: z.number(),
          text: z.string(),
        }),
      ),
    });

    そして抽出した結果は、Vol.8 の D1(Drizzle) に「進捗サマリ」として蓄積していきます。

    ボットの投稿や空メッセージはあらかじめ除外し、書き漏れがあった人はそっと記録しておいて、後から気づけるようにもしています。

    こうして毎晩、一日ぶんの進捗が構造化されてデータベースに積み上がっていきます。


    5. 週次:AIが「先週 vs 先々週」を比較する

    三段目は、週の始まり(月曜)に動きます。
    ここが report機能のハイライトです。

    週次ジョブは、D1 に貯めた先週と先々週、2週間ぶんの進捗サマリを読み出し、再び LLM に渡します。

    今度のお願いは「要約」ではなく「比較」。

    各メンバーについて、先週と先々週を見比べ、進捗の推移を 「向上・安定・低下」 のいずれかで判定させるのです。

    progress_status: z.enum(["improved", "stable", "declined"])
      .describe("進捗の推移(向上、安定、低下)"),

    その結果を Vol.12 の Block Kit で見やすく整形し、週報として投稿します。
    単に「今週何をしたか」を並べるのではなく、先週と比べてどう変化したかを示す。


    この「変化の可視化」こそ、毎晩コツコツ D1 に貯めてきたデータがあって初めて可能になる芸当です。


    6. 適材適所:KVとD1の使い分け

    改めて振り返ると、report機能はストレージの使い分けの好例になっています。
    「今日のスレッドはどれか」というその日限りの目印は KV に、「進捗の記録」という積み上げて後で分析するデータは D1 に。

    Vol.7・Vol.8・Vol.11 で少しずつ培ってきた「短命なものと長命なものを分ける」という考え方が、ここで一つの完成形を迎えました。

    道具が揃ってくると、機能はこうして自然に組み上がっていきます。


    7. おわりに

    今回は、日報・週報を題材に、「書くのは人、まとめるのはAI」という役割分担を、三段構えのジョブで実現する話をお届けしました。

    毎朝スレッドを立て、毎晩LLMで要約してD1に貯め、週次でその蓄積を比較する。

    KV・D1・LLM という部品が噛み合うことで、メンバーはただ日報を書くだけで、チームの1週間が自動で振り返られていきます。

    次回は、働き方そのものを支える機能です。

    「Vol.18: あえてDBを使わない!リモートワーク申請をKVで捌く設計判断」 として、Cloudflare KV を使ったリモートワーク申請の保存と、ホームタブでの履歴表示の仕組みをお届けします。
    お楽しみに!



    この記事は以下の体制で作成されました。

    • ドラフト作成・執筆: Airi (社内AIアシスタント)

    • アイデア出し・レビュー: CTO

    • デザイン: 事務スタッフ

    Accel-Hackでは、テクノロジーを駆使して世の中の課題を解決していく仲間を募集しています。
    私たちの取り組みに少しでも興味を持っていただけたら、ぜひ採用ページや会社サイトも覗いてみてくださいね。


    あなたへのおすすめ