AI Engineer Europe 2026 · 工作坊 · 2026-05-07 · 103 分
帶模型從零寫 Effect 應用
Vibe Engineering Effect Apps · Michael Arnaldi,Effectful
Michael Arnaldi 在現場從空 repo 起手,把 Effect 原始碼放進專案讓模型自己讀,再用 AGENTS.md、lint 規則與 patterns 檔,一步步帶模型做出一支 to-do API。
概要
- 直接 clone 原始碼給模型Michael Arnaldi 認為寫程式用的模型是被訓練去讀寫程式碼,不是讀人類文件或沒見過的 MCP server,所以把 Effect 的 repo 直接放進專案,當成模型自己的程式碼來讀。
- 模型不會持續學習Michael 說模型訓練完就固定,今天交代的事明天不會記得;能做的只是在固定大小的上下文視窗裡追加訊息,視窗越大也不一定越好,所以要在流程上補強。
- 先研究、寫成 patterns 檔,再實作每要用一塊功能(HTTP API、SQL、測試),先請模型去 Effect repo 研究並存成 patterns 檔,再用 AGENTS.md 指過去。Michael 也不用 plan mode,改成先討論出 spec,再用 Ralph loop 一小塊一小塊做。
- 模型犯的錯就寫成 lint 規則Michael 一邊看模型的產出,一邊把不喜歡的寫法禁掉,例如
as型別斷言、用 SQL 型別參數代替驗證、用純字串當 ID,把它比喻成顧著一個拿刀亂跑的初階工程師。 - GPT 與 Opus 各有脾氣Michael 現在多半用 GPT-5.4,原因之一是 Anthropic 限制了自己想用的工具環境;也提到 Opus 在 UI 上比 Codex 強,兩者在多數任務上差不多。
- evals 與 workflows 是下一步Effect 團隊想每天跑 evals 檢查文件和範例的效果,也在考慮微調模型;時間不夠,沒有做到 workflows 與 cluster,只解釋了為什麼 AI 讓它們更重要。
原話
▶ 07:57“there's no more knowledge that comes into the model every day”
模型每天都不會有新知識進來
▶ 08:33“The reality is you are basically appending messages onto a fixed-size array which is called the context window.”
實際上就是把訊息一直追加到一個固定大小的陣列,那就叫上下文視窗
▶ 48:48“our job should be to set up the repositories in ways that the models can act good on it”
我們的工作應該是把 repo 整理成模型能做好事的樣子
▶ 1:23:54“usually just ask the model why you did that, is there any alternative”
看到怪的地方,通常就直接問模型為什麼那樣做、有沒有別的做法
▶ 1:31:01“Why does this rule exist? Because the model did that.”
為什麼有這條規則?因為模型真的這樣做過。這是借朋友的比喻:法規裡那些很具體的條文,背後都是有人真的做過那件事
延伸
- Michael 說 Effect 的 workflows 與 cluster 還放在 unstable 的部分;這場沒有實作,只說明了概念。
- Michael 提到團隊實驗過只給單一 execute 工具的 coding agent:模型不能直接改檔,只能寫 TypeScript 去執行。
- Michael 認為 patterns 最好針對使用的模型生成:GPT 家族的 5.2、5.3、5.4 差不多,Opus、Sonnet、Haiku 也很像,所以可以做一個先問你用哪個模型、再調整內容的 CLI。
章節
點時碼直接跳到原片的那一段。
- 開場:什麼都沒準備Michael 說既然是 vibe engineering,就該從零開始,所以完全沒有事先準備,並問現場聽眾對 AI 工具與 Effect 的熟悉程度。
- 不再手寫程式Michael 說自己大約從「late this summer」起就不手寫程式,平常做的是 library 層級的底層程式碼;原本以為 AI 在那裡派不上用場,後來發現想錯了。
- 模型不會持續學習模型訓練完就固定,隔天不會記得今天的指示;上下文視窗只是不斷追加訊息的固定大小陣列,100 萬 tokens 的視窗不一定有幫助。
- 把原始碼放進專案寫程式用的模型是靠強化學習練出來的,擅長讀寫程式碼;放在 node_modules 或 git ignore 的目錄裡,模型都不太看,所以最有效的辦法是直接 clone repo。
- 目標與模型選擇空專案要做 vitest、有 OpenAPI 文件的 HTTP server 與型別安全的 client;Michael 用 GPT-5.4,最初用 Sonnet 4,並說開放權重模型落後前沿模型三到六個月。
- 專案初始化與 TSGO請模型建出 bun、vitest 與型別檢查的設定,裝上還沒正式釋出的 Effect v4 beta,並嘗試改用 TSGO 編譯器;這段花了不少時間處理套件與 VS Code 設定。
- 診斷全設成 error把 language service 的診斷等級全部改成 error,讓模型把它們當錯誤處理;也提到 effect.solutions 這個入門網站,但 Michael 覺得直接 clone repo 比較有效。
- subtree 與 AGENTS.md把 Effect repo 以 subtree 放進專案,開新 session 請模型寫 AGENTS.md,列出指令與 repo 位置,並禁止跑 watch 模式與 dev server。
- 用 lint 擋模型走捷徑Michael 的 accountability repo 禁止
as、any、unknown;結果禁掉 unknown 後模型改用as never as X,所以乾脆禁掉as。 - 規格驅動與 Ralph loop先請模型研究 HTTP API 並存成檔案;Michael 不用 plan mode,改成先討論 spec,再用 bash 迴圈每次只做一個小任務;另外提到只給單一 execute 工具的實驗。
- 整理 repo 是工程師的工作Michael 認為工程師的工作該是把 repo 整理到模型能做好事;接手舊專案時,先讓模型探索,再 clone 主要函式庫並產生 best practice 檔。
- 檢查 vitest 設定確認測試用的 runtime,發現 vitest 連 repos 底下的 Effect 測試也跑,加了忽略;模型為了讓測試通過去改測試,Michael 說這是典型錯誤。
- to-do API 計畫與儲存層先和模型討論 to-do API 的計畫並存成檔案;儲存改用 Effect 的 SQL 搭 SQLite,同樣先產生 patterns,讓人能自選要用 Effect 的哪些部分。
- Q&A:patterns 該怎麼提供聽眾問框架作者能否官方提供 patterns;Michael 說 AGENTS.md 並非真正的標準,對 GPT 和 Claude 的下指令方式也不同,並提到微調開源模型的想法。
- GPT 與 Opus 的脾氣GPT 會一直停下來問,但輸出不錯;Opus 愛走捷徑,放過一個
any就到處是any,所以 Michael 用上千行的 lint 檔管著。 - 自訂 lint 規則的例子禁止給 SQL 用型別參數、強制用品牌型別當 ID、禁止用
as與建構子繞過驗證,要求把驗證放在 schema 的邊界。 - 為何轉用 OpenAIMichael 想用 OpenCode 和自己寫的 TypeScript 去接 AI SDK,Anthropic 的政策不允許,所以改用 OpenAI;UI 任務上 Opus 比 Codex 強。
- 檢視產出的程式看模型做的 SQL client 與 API,抓到重複的程式碼、純字串 ID 與 struct/class 的偏好問題,也提到正在試語意程式碼搜尋。
- 伺服器、測試與 API 文件模型補上 client、live handler、伺服器入口、測試與 OpenAPI 文件;Michael 說之後會要求改用 it.layer,並把資料庫檔加進 gitignore。
- 清理測試的壞 pattern模型寫了手動建 layer 又包 Effect.scoped 的多餘寫法;Michael 說看到怪的地方就問模型為什麼,並談測試資料庫用 transaction 回滾的做法。
- 測試 pattern 與 skills回顧目前流程,再請模型寫 testing 的 patterns;談 slash command 與 skills 的差別,以及 skills 塞太多會污染上下文。
- 具體規則與 patterns 驗證很具體的規則背後都是模型真的做過的事;聽眾問如何測試 patterns,Michael 認為可以標記哪些要執行、哪些只是參考檔案。
- evals 與微調Effect repo 打算每天跑 evals 並出報告;程式風格沒有絕對好壞,他們用人寫的範例與模型產出相比、由 LLM 打分,也在研究微調。
- 為何需要 workflows 與 cluster以註冊流程為例,寫資料庫再寄信沒有交易保證;Effect 的 workflows 建在 Effect Cluster 上,AI 讓流程變長,伺服器更容易在中途失敗。
- 結論:從空 repo 到可用 APIMichael 說講了一個多小時,從一個不懂 Effect 的空 repo 做出可用的 API,這也是工作坊「just clone the repo」的重點。
名詞
- Effect
- 這場示範用的 TypeScript 函式庫,做法是把它的原始碼放進專案給模型讀
- AGENTS.md
- 放在專案裡的指示檔,列出可用指令、Effect repo 的位置與 patterns 檔
- patterns 檔
- 請模型研究 Effect repo 後存下來的做法整理,之後實作時當參考
- Ralph loop
- 用簡單的 bash 迴圈,每次只讓模型做一個小任務就結束
- Geoffrey Huntley
- Ralph loops 的作者;Michael 說「拿刀在家裡亂跑的小孩」這個比喻出自 Geoffrey
- OpenCode
- Michael 這場用的 coding agent 環境,搭配 GPT-5.4
- TSGO
- Michael 想換上的 TypeScript 編譯器,用來做型別檢查
- effect.solutions
- Keith Langton 做的 Effect 入門網站,用 CLI 讓模型讀 Effect 內容
- accountability
- Michael 自己玩的 repo,放了大量禁止模型走捷徑的 lint 規則
- Effect Cluster
- 讓流程在伺服器掛掉後換到別處繼續跑的叢集機制,Effect 的 workflows 建在它上面
- Temporal
- Michael 舉例的 workflow 方案,說過去 12 個月因為大家都在產品裡導入 AI 而更受關注








