小黃開發日記 02|她是誰(2026-06-13~06-21)

總結摘要
多平台、四個角色、一個分流器,然後在角色之上長出一個人:黃芷棋。她開始記得你,也開始有自己的日常。

第一週結束時,她還是一個會查報價的 bot。第二週,她有了名字、長相、來歷,也開始記得跟她說話的人。這是她從「工具」變成「某個人」的那一週。

ZOE 有了名字之後的第一組定版圖:一身黃、捧著向日葵。

多平台的地基:身分是一個字串

接上 Line 的那天,第一個要解決的是「同一個 id 在兩個平台撞號」。做法很簡單:使用者身分一律寫成 platform:id,例如 telegram:12345、line:Uxxxx。資料庫、記憶、知識庫全部用這個字串當鑰匙,之後加平台都不用改資料結構。

同一天定下一條到今天都沒改過的隱私規則:

  • 群組一律 stateless:不碰持倉、不讀記憶、不留紀錄,只做行情問答。
  • 個人功能只在 1:1:持倉、警報、記憶、知識庫,全部只在私訊裡。

四頂帽子和一個分流器

投資的問題其實分好幾種:「我該存多少緊急預備金」跟「NVDA 財報怎麼看」需要的語氣和工具完全不同。所以做了四個角色:

角色負責
財務經理理財規劃、預算、資產配置
交易導師投資觀念、紀律、心態
個股分析單一標的的行情與基本面
通用閒聊和其他

每一則訊息先交給一個很小的分類器(分流器,用 Haiku),它只輸出一個角色代號,決定這一輪戴哪頂帽子、拿哪些工具。這個分流器在之後幾個月裡會反覆出事,很多坑都跟它有關。

在帽子之上,長出一個人

問題是,四頂帽子各講各的話,感覺像四個客服。所以在角色之上加了一層統一身分:

  • 全名黃芷棋,朋友叫她小黃,英文名 Zoe。芷是香草,喻正直;棋是下棋,喻看長線、不賭明牌;小黃和向日葵是她的陽光。
  • 人物聖經:台灣南部小鎮長大、半工半讀、非財經科系、曾經信過明牌賠過錢,所以打死不報明牌。
  • 定版參考圖:鎖住她的長相,之後所有生圖都拿這幾張當參考。

關鍵設計是紀律和人格同源。「不報明牌、先講風險」不是外掛的免責聲明,而是她這個人的底線。所以溫暖的語氣不會稀釋該有的嚴謹。

她開始記得你

記憶分成三種,各管各的:

  1. 投資取向卡:風險偏好、時間軸、每月可投入、目標。背景會從對話裡慢慢精煉。
  2. 「關於你」頁:記得你這個人,像是你的工作、家人、不吃辣這類事。她自己判斷值得記就寫進去。
  3. 逐輪對話歷史:1:1 的每一輪存進 SQLite,重啟不會斷片。

她有自己的日常

/daily 會讓她即興一天的故事,再用 gpt-image-1 生一張她當天的照片。定版參考圖鎖臉,所以每天的她都是同一個人。之後又加上每晚推送日常和研究筆記、每月選一本書、每月把日記回顧沉澱進長期記憶。

6 月 18 日,她第一次上線,部署在 Railway,只開 Discord。

這週踩到的坑

  • Line 發不出訊息:查了很久,真兇是 ~/.zshrc 裡 export 的舊 token 蓋掉了 .env。環境變數的優先順序,永遠比你以為的更容易出事。
  • 生圖動不動 APIConnectionError:慢模型一次生整張圖,中間的網路層把「太久沒有資料」當成死連線砍掉。改成 streaming(先收部分結果)加退避重試才穩。
  • 每晚推送一直沒送到:去重紀錄是在「排進佇列」那一刻寫的,投遞其實安靜地失敗了,當天的額度就被燒掉、再也不推。改推送時間也沒用。之後所有主動推送都改成送達確認後才記去重。

下一篇:她搬到 Telegram,也變成一個真正的投資夥伴。