嗨大家,我是 Debuguy。
前面我們完成了從 0 到 1 的產品雛形,也在 Day 1 階段選擇了 GenKit 作為我們的 LLM 抽象層。GenKit 內建的 Developer UI 在開發時確實很讚,可以快速看到 trace、測試 flow、debug 問題。
然後內心就會有個懶惰的小惡魔說著:
「咦?既然 GenKit Developer UI 這麼好用,那直接拿到 Production 用不就好了?」
GenKit 其實可以直接讀取 trace 檔案來顯示 UI。
也就是說,技術上我確實可以:
「看吧,沒那麼難嘛!」
但當我認真想要這樣做時,越想越覺得不對勁...
然後我看了一下 GenKit 怎麼儲存 trace 資料:
所有資料都存成檔案。
而且更可怕的是,當你打開 Developer UI 時,它會把所有 trace 檔案都載入記憶體。
在本地開發時這沒什麼問題,trace 數量有限。但如果你把這個部署到 K8s:
Pod Status: OOMKilled
Reason: Container exceeded memory limit
Last State: Terminated
Exit Code: 137
「%$#@!,Pod 又掛了?」
「查一下...原來是有人開了 GenKit UI 把所有 trace 檔案都讀進記憶體了」
「那開大一點記憶體?」
「開多大?trace 會一直累積,難道要開 32GB?」
這就是為什麼它叫 Developer UI,不是 Production UI。
「這個月 LLM 花了多少錢?」
「哪個 prompt 的效果最好?」
「為什麼這個請求特別慢?」
「可以幫我匯出上週的使用報告嗎?」
你會發現 Developer UI:
這些都是 production 環境必須要有的功能。
GenKit Developer UI 就像你在家裡用的小烤箱:
它的設計初衷就是本地開發工具,不是 production monitoring platform。
這不是 GenKit 的問題,而是工具定位的問題。就像你不會拿螺絲起子去敲釘子一樣,工具要用在對的地方。
官方的 observability 教學是使用 Firebase 但這對我來說不是最合適的選項
因此我要另尋他路
好消息是,GenKit 基於 OpenTelemetry 標準。
這意味著什麼?
你可以把 trace 資料送到任何支援 OpenTelemetry 的 observability platform。
這就是為什麼當初選擇 GenKit 的好處之一 — 它沒有把你鎖在自己的生態系裡。OpenTelemetry 就像是工業標準的插頭,換個插座(observability platform)也能用。
想想看如果當初選擇了某個把你鎖死的框架,現在要換 monitoring 工具就得砍掉重練。
在開始找替代方案前,我先列出了三個不可妥協的條件:
「和 LLM 的對話內容可能包含公司機密、個人隱私...這些東西要傳到第三方服務?」
這不只是技術問題,更是信任問題。
Open Source 至少讓我們能:
就算是 Open Source,如果只能用 SaaS 服務也不行。
我們需要能夠:
這點是技術層面的考量。
因為 GenKit 基於 OpenTelemetry,如果 observability platform 也支援,整合就會很簡單:
不是因為它有多酷炫的功能,而是因為它符合我們的底線需求。
而且實際用下來,發現它該有的都有:
Developer UI 很棒,但它就是 Developer UI。
Production 環境需要的是專業的 observability platform,而不是開發工具。
好在,因為我們一開始就選對了方向(GenKit + OpenTelemetry),現在要接上 Langfuse 也不會太痛苦。
這就是為什麼選擇符合標準的工具這麼重要 — 不會被 vendor lock-in,有更多的彈性。
接下來的幾天,我們就來實際把昨天提到的 LiteLLM
& Langfuse
架設起來接上去
LLM 的發展變化很快,目前這個想法以及專案也還在實驗中。但也許透過這個過程大家可以有一些經驗和想法互相交流,歡迎大家追蹤這個系列。
也歡迎追蹤我的 Threads @debuguy.dev