小黃開發日記 01|小黃誕生(2026-06-13)

總結摘要
第一天:從一個空資料夾,一口氣長到能跑的 Discord 投資 bot。分層架構、工具綁死使用者、會自己長大的知識庫。

2026 年 6 月 13 日,第一個 commit 叫 phase 1 skeleton — config + SQLite storage layer。那時候她還沒有名字,只是一個「學習用的 Discord 投資 bot」:查美股和加密貨幣的報價、記持倉、設到價警報。這篇記錄第一天的骨架,因為後來長出來的所有東西,都還站在這幾層上面。

ZOE 最早的小黃是動漫畫風。那時她還只是一個會查報價的 bot。

一天之內的五層

第一天照著事先寫好的 PLAN.md,由下往上一層一層疊:

1
2
3
4
5
6
7
8
9
Discord bot + 排程            ← 收訊息、定時檢查警報
        │
Claude tool-use 迴圈           ← 模型決定要叫哪個工具、叫幾次
        │
工具層                          ← 報價、持倉、警報、技術指標(SMA/RSI)
        │
行情資料層                      ← 多來源備援+快取+用量統計
        │
設定 + SQLite                  ← 持倉、警報、使用者資料
  • 行情資料層:美股走 yfinance,掛掉就換 Finnhub、Alpha Vantage;加密貨幣走 Binance。每個來源後面都有快取,免費額度才不會一下就燒光。
  • 工具層:每個工具都是一個普通的 Python 函式,加上一段給模型看的說明。
  • tool-use 迴圈:把使用者的話和工具清單一起交給 Claude,它決定要不要叫工具;工具結果再塞回去,直到它決定可以回答。

第一個重要決定:工具綁死使用者

持倉、警報這種工具,「是誰的」不是模型說了算。程式在呼叫工具時自己帶入使用者 id,模型的參數裡根本沒有「使用者」這一欄。

這樣就算有人在對話裡說「幫我看一下某某人的持倉」,模型也沒有任何辦法指定別人。這個原則後來一路延伸:群組不碰個人資料、會改東西的動作要主人親口同意。說到底都是同一句話:安全靠程式結構,不靠模型乖不乖。

同一天還接上的東西

  • 選股方法論:整合開源的 serenity-skill,推薦一律附風險與免責。
  • 網路搜尋+獨立查證:查到的東西交給另一個子代理再查一次,降低「一本正經地講錯」。
  • SEC 財報:直接讀官方資料,不靠二手整理。
  • 對話驅動的知識庫(LLM Wiki):這是後來她「記性」的起點。每一輪對話先原樣記下來,背景再用 LLM 批次蒸餾成一頁頁互相連結的 markdown(市場知識共用一份,個人筆記每人一份)。回答時她會先翻自己的筆記,知識會複利。整個資料夾可以直接用 Obsidian 打開。

第二個重要決定:本地用訂閱,對外才用 API key

開發期間我們會跟她講非常多話。如果每一句都走 Anthropic API,按量計費很快就痛了。所以從第一天就做了兩個後端:

  • cli:透過 Claude Agent SDK,用本機已登入的 Claude Code 訂閱跑。測試、日常都走這條。
  • api:Anthropic Messages API,給部署到雲端時用。

這個決定一直沿用到今天,後來還長出第三、第四種主腦(Codex、本地模型),但「怎麼呼叫主腦」始終只是可以抽換的一層。

第一天的心得

一天能從零長到能跑,靠的是先把層切好。每一層只往下依賴,不往上 import。四個多月後做架構體檢時,結論是「不需要重切架構」,底層到現在都沒有往上依賴過。那份體檢會在最後一篇提到。

下一篇:她有了名字。