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