曹德偉
Production 14 個月運作 Architecture

Brain — 跑了 14 個月的私人知識系統。

為自己蓋的 AI infrastructure,從 daily-driven 中學設計。

14 個月運作
24/7on production
dailydriven
5OSS extracts
TL;DR
  • 入口:Telegram Bot / REST API / MCP server。
  • 核心:SQLite + FTS5 + 向量混合搜尋 + 熱度衰減記憶層。
  • 部署:CF Workers + EC2 + GitHub Actions,全 production。
  • 產出:從 Brain 抽出 5 個 獨立 OSS modules(forget-rag、mcp-fts5-starter 等)。

01 系統架構

Brain 不是 demo,是我每天用的東西。為了維持 daily-driven,它必須做到三件事:多入口(手機、桌機、Claude Code session 都能進)、單一真相(vault + SQLite 是 source of truth,其他都是 view)、以及不會壞(cron + GitHub Actions 是 backbone,real-time push 是奢侈品)。

三層架構 — Entry / Core / Storage + 橫切監控
[ENTRY LAYER] [CORE LAYER] [STORAGE LAYER] Telegram Bot 主入口 REST API PWA / 排程 MCP Server Claude Code Knowledge Processor (Python) ingestion · parsing · linking · hybrid retrieval · daily-digest Vault (.md files in Obsidian) + SQLite (FTS5 + 向量索引) + forget-rag 三層梯度 [MONITORING] instrumentation store detector judge alerter → 完整故事看 MCP Monitoring Retrospective

三個入口都直連 core layer,不經過彼此。這是設計選擇,不是巧合——任何一個入口掛了,其他兩個還能用。Daily-driven 的 system 最怕單點失敗,因為單點失敗會逼你開電腦修,而開電腦修這件事本身就是 daily-driven 的反義詞。

02 5 個關鍵設計選擇

這 5 個選擇是 Brain 跟「另一個 RAG demo」差最多的地方。每一個都是 trade-off,每一個都在 14 個月的 daily-driven 中真的被驗證過。

Choice 01

為什麼 SQLite + FTS5 而非 vector DB?

啟動 cost 低、樹莓派跑得動、不用 docker compose 起 4 個 service。FTS5 解 80% 搜尋場景。剩下 20% 才接 Gemini embeddings 做 hybrid。決策原則:start with the simplest thing that works。如果有一天 SQLite 撐不住了,那是個好問題——但還沒到那一天。

Choice 02

為什麼 熱度衰減 + 三層儲存 而非無限保留?

Brain 跑 14 個月,舊筆記變 noise。RAG 撈到 2024 年的舊草稿打斷正在做的事。L1(熱)/ L2(溫)/ L3(歸檔)不刪除舊資料,只是讓 RAG 預設只看 L1+L2。能不能搜到 L3 是用戶顯式選擇。Production knowledge system 的合理 default 是「最近的最重要」,不是「全部都重要」。這個 module 後來抽出來變成 forget-rag

Choice 03

為什麼 TG Bot 是主入口而非 Web UI?

我在哪、Bot 在哪。手機上、辦公室、家裡——同一個 chat。Web UI 要設計 UX、處理 session、做 auth;Bot 直接用 Telegram 的 infra,省 90% 工。trade-off 是一次只能服務我一個人——但 Brain 本來就是私人系統。當需求是 daily-driven 的個人 productivity,從工程量回推入口設計才對。

Choice 04

為什麼 daily-driven cron 而非 real-time push?

日報 / 週報 / 維護任務全是 cron。實時 push 要處理 backpressure / retry / dead letter queue,cron 只要 retry-on-fail 就好。錯誤面積差一個數量級。trade-off 是 latency——但個人知識系統不需要 sub-second,需要的是不會壞。Brain 上線 14 個月,cron 任務的恢復成本接近零;real-time push 一壞就要花一整個下午查 queue。

Choice 05

為什麼 ship MCP 監控但 14 天後砍計畫

Phase 0 上線後 audit 發現 instrumentation 只抓到 0.22% 流量。沒救了——剩下 99.78% 走 Bot/REST 直呼核心,根本不過 MCP。當下我有兩個選擇:花一個月修 instrumentation 架構,或承認假設錯、砍掉 Phase 1 的 BQML benchmark 計畫,把這次經驗寫成 retrospective。我選後者。Sunk cost 是最危險的 anti-pattern,14 天後的 audit 就是設計來破除它的。

完整故事看 MCP Monitoring Retrospective

03 這個系統證明我能在 AI 新創做什麼

Portfolio 不是「給你看程式碼有多漂亮」,是把抽象能力翻譯成可驗證的 claim。Brain 跑了 14 個月,下面三條是它證明的東西——每一條都有 evidence,不是 buzzword:

Claim 01 設計 production 級 AI infrastructure。 14 個月真的在跑,不是 demo。多入口、單一真相、cron-as-backbone,從頭自己設計、自己 ship、自己 maintain。
Claim 02 在 cost / complexity 之間權衡。 SQLite 不是 sexy 的選擇,但是對的選擇。Vector DB / Kubernetes / 微服務都是「之後再說」的奢侈品;個人系統的對的 default 是start small
Claim 03 Ship 後願意 audit 自己。 MCP 監控的 retrospective 是 evidence。14 天後跑 coverage audit、發現假設錯、砍掉自己的計畫——能 kill 自己的計畫比能寫程式更稀缺。
如果你正在徵人 · If you're hiring

你的 AI 新創需要的不是另一個寫 demo 的人,
是一個會把 demo 推進 production、再 audit 自己的人。

Brain 跑了 14 個月。多入口、混合搜尋、熱度衰減、cron-as-backbone,全自己設計自己 ship。它不是在 GitHub 上躺著的 starter repo——是我每天在用的 daily-driven 系統。

「程式在跑」≠「系統有效」是我學到最關鍵的洞察。如果你的 AI 新創需要一個會設計 production AI infra、會在 cost 和 complexity 之間做選擇、會 audit 自己的 Solution Architect——我們可以聊聊。

我不寫 ML model,也不號稱資深架構師。
「能 kill 自己的計畫比能寫程式更稀缺」是我的核心優勢。


zx2241384@gmail.com · 開放遠端 / 台北