很多 AI 專案一開始都不是死在模型不夠強,而是死在一件更無聊、也更常被低估的事,prompt 明明已經變成產品核心,團隊卻還是把它當一堆散落在程式裡的長字串在管。
剛開始這通常不痛。你先寫一個 extract_resume(),再補一個 JSON schema,之後加 retry、加 fallback、加 enum 描述、加測試案例,最後再把 OpenAI 換成 Anthropic 或 Gemini。每一步都很合理,但走到第十步時,整個專案會開始有一種熟悉的失控感,業務邏輯一半在 prompt,另一半在 parser,剩下那一半又藏在例外處理與 if/else 裡。
BAML 值得看的地方,就在它不是想把 AI 做得更炫,而是很直接地對這個問題下手,把 prompt 從「程式裡的一段字串」拉回「可以被定義、測試、產生型別、切換模型、附帶驗證規則的工程資產」。
先講結論,BAML 很值得現在看,特別是你已經在做文件抽取、分類、資料清洗、審核輔助這種需要結構化輸出、反覆調 prompt、還得在多模型之間切換的任務。 它碰到的是真正會拖慢 AI 專案落地的摩擦成本,而不是 demo 階段的表面問題。但另一面也要先講清楚,它不適合所有人。 如果你的需求只是簡單聊天、單一模型呼叫、或一個小團隊想先快速做出原型,BAML 很可能太重。
English TL;DR:
- BAML is an open-source framework and DSL that turns prompts into typed, testable, maintainable application assets.
- Its real value is not “better prompting,” but reducing the engineering mess around structured outputs, retries, model switching, and validation.
- It is especially compelling for extraction, classification, and workflow-style LLM features that must return reliable schemas.
- But it adds a new language, compiler step, and generated client workflow, so it is not the right default for every AI app.
- In short, BAML matters when prompts stop being experiments and start behaving like production interfaces.
BAML 是什麼,先講人話
如果只用一句話講,BAML 是一套把 LLM prompt 寫成函式與型別定義的語言,加上一層會幫你產生 client、處理結構化輸出、驗證與測試的開源工具鏈。
它的核心想法不複雜。你不是直接在 Python 或 TypeScript 裡拼 prompt 字串,而是先在 .baml 檔裡定義:
- 輸入參數是什麼
- 輸出型別長什麼樣
- 要用哪個模型
- prompt 模板怎麼寫
- 哪些欄位要驗證、哪些規則不能錯
然後再由編譯器產生對應語言的 client 給你的主程式呼叫。
白話一點說,它很像在說,既然 prompt 已經變成介面,那就不要再把它當匿名字串。
這件事聽起來不像革命,但很容易在真正做過產品的人身上打中。因為很多團隊撞到的不是「模型不夠聰明」,而是「模型功能一多,專案就開始很難維護」。
它真正解的痛,不是產生 JSON,而是減少 AI 功能變大後的工程碎裂
這也是 BAML 跟很多「結構化輸出工具」最大的差別。
很多人第一次看這類專案,會以為它只是把 JSON parsing 包得更漂亮。這只對了一半。更現實的是,當 LLM 功能開始從單一 prompt 長成一整套產品能力時,麻煩通常來自下面幾件事:
- prompt 跟 schema 分散在不同地方,改一個欄位要改三四處。
- 模型一換,SDK、回傳格式、tool calling 支援度都不同。
- 輸出不是完全錯,而是「差一點對」,結果 parser 和修補邏輯越寫越多。
- 團隊很難替 prompt 建立像樣的測試與版本管理流程。
- 某些欄位其實有業務規則,但現在只能靠程式後處理硬補。
BAML 的價值,就是把這些原本散在應用程式各層的問題,盡量收斂到同一個地方處理。
官方文件裡很強調幾個點,typed outputs、多模型支援、streaming、retry、client registry、checks/asserts,還有他們自己的 schema-aligned parsing。這些名詞看起來很多,但本質上都在做同一件事,讓你不要每加一個 LLM 功能,就多長出一層膠水程式。
為什麼它現在值得看,不只是概念好聽
截至 2026-04-20 前後,BAML 的 GitHub repo 約有 8k stars、400+ forks,repo 在 2026-04-19 仍有 commit,最近正式 release 0.221.0 則發在 2026-04-15。README、文件站、比較頁、範例與編輯器支援都相當完整,支援 Python、TypeScript、Go、Ruby、Rust,還能透過 REST API 接其他語言。這種狀態代表它已經不是只有概念漂亮的語言玩具,而是一個明顯在往 production toolchain 走的專案。
另一個值得注意的訊號是,它的 default branch 直接叫 canary。這通常說明兩件事,一是團隊更新真的很快,二是產品面仍然在高速演化。這不是壞事,但它會影響採用判斷,後面會再講。
三個很具體的適用場景
場景一,文件抽取或表單解析,欄位很多而且會一直改
這是 BAML 最容易打到價值的地方。
例如你在做履歷抽取、合約欄位解析、保單資料結構化、客服工單整理。這類任務的共通點不是模型多會聊天,而是輸出要能進資料庫、進 workflow、進後台系統。
如果今天只抽姓名與技能,用 OpenAI SDK 加 Pydantic 當然很快。但只要欄位從 3 個變 20 個,還開始出現巢狀結構、enum、條件規則、例外處理,原本看似簡單的 prompt 很快就會變成一個到處漏風的小系統。
BAML 在這種任務的吸引力很直接:
- 型別定義跟 prompt 放在一起
- 輸出格式由工具鏈協助對齊
- 欄位規則可以用
@assert、@check表達 - 測試案例可以直接貼著 prompt 做
- 換模型不需要重寫整套應用層邏輯
如果你是文件 AI 團隊,這種整合不是「比較優雅」而已,而是能不能把 prompt 改版速度維持住的問題。
場景二,分類、路由、審核輔助,規則不是只有 schema 還有業務邏輯
很多 AI 任務不是單純要回 JSON,而是要回一個有商業意義的決策物件。
例如客服訊息分流,除了要分到 billing、refund、urgent 這類 enum,還可能要滿足一些規則:
- 緊急工單一定要帶理由
- 高風險分類一定要附引用依據
- 某些欄位若為空,結果不能直接進下游
這種情境下,BAML 的 @assert 和 @check 很有意思,因為它不是把所有事都丟回應用程式後處理,而是容許你把部分驗證規則和型別一起描述。這讓輸出不只是「長得像 JSON」,而是更接近「符合任務規格的資料」。
這對風控、醫療前處理、法務摘要、客服 QA 都有幫助。因為真正可怕的通常不是模型完全答錯,而是它回了一份看起來能用、其實不能直接進系統的半成品。
場景三,多模型並用的產品團隊,想把 prompt 層跟供應商 API 解耦
還有一種很務實的需求,是團隊已經不只打一個模型。
可能你會用:
- GPT 系列做主力生成
- Claude 處理較長文本或某些推理任務
- Gemini 處理特定多模態場景
- 開源模型做低成本分類或內部任務
這時候真正麻煩的不是「可不可以接」,而是同一個功能若要在不同模型之間切換,應用層會不會變成一坨 provider-specific 邏輯。
BAML 的 client registry、provider 抽象與生成 client,在這裡就有明確價值。它不會神奇地抹平各家模型差異,但至少能讓 prompt 與輸出契約先站在比較穩的位置,再去處理模型選型與 fallback 策略。
如果你是產品團隊或平台團隊,這比「又少寫幾行 SDK 程式」重要得多。因為你真正想守住的,是能力介面,而不是某一家 API 的呼叫細節。
先看一眼這條曲線,BAML 已經不是只有小圈圈在玩
如果只看 GitHub star,當然不能直接等於產品成熟度,但它至少能幫你判斷,這個專案到底只是少數人拿來實驗,還是真的開始進入更多團隊的評估清單。BAML 目前的成長曲線已經不是「只有 prompt engineering 狂熱者在討論」那種量級,而是逐漸被更多實際在做 AI 功能產品化的工程團隊看到。這種專案通常值得提早研究,因為它背後代表的往往不是單一工具熱度,而是一整類工程痛點正在浮上來。
它厲害的地方,不在於重新發明 agent,而是讓 prompt 比較像可維護介面
這也是 BAML 題目值得看的原因。
最近很多熱門專案都在解 agent orchestration、browser automation、模型 serving、長流程控制。BAML 走的是另一條路,它沒有直接跟你競爭誰比較像 Devin,也不是要取代 LangGraph 那種流程編排框架。它比較像是在補 AI 應用裡一塊常被低估、但最後會默默吞掉大量工程時間的中間層。
也就是:prompt interface engineering。
從這個角度看,BAML 很像在把今天的 prompt 開發,從早年 web 開發那種把 HTML、邏輯、事件全塞在字串裡的階段,往比較有結構的工程方式推一步。它不一定會成為最後的標準答案,但它瞄準的問題很真。
但限制也很直接,甚至比優點更該先知道
1. 你得接受一套新 DSL,學習成本不是零
BAML 最明顯的代價,就是你不是多裝一個 library 而已,你是引進一套新語言與編譯流程。
這代表團隊要接受:
- 多一種檔案格式
- 多一個 codegen 步驟
- 多一套 editor / CLI / runtime 心智模型
- 語言版本與生成 client 的同步問題
如果團隊連 prompt 都還在快速摸索,或目前功能很少,這個代價可能不划算。你本來只是在驗證市場,結果卻先把自己帶進工具鏈治理,這就有點本末倒置。
2. 它很適合結構化任務,不是所有 AI 體驗都該先上 BAML
BAML 最亮眼的地方在 structured outputs、驗證、模型切換、測試與 prompt 管理。這意味著它特別適合有明確輸入輸出契約的任務。
反過來說,如果你做的是高度開放式聊天、很重即時對話體驗、強互動工具使用、或整個重點在 agent 長流程協作,那 BAML 可能不是主角。它可以是其中一層,但不會自動取代 orchestration、memory、tool runtime、權限控管那一整層系統。
把它拿去解不是它主要在解的問題,最後很容易變成多一層抽象、少一點清楚。
3. 生成 client 很方便,但跨語言與版本治理會變成新責任
官方支援多語言,這是優勢,也是新的維運面。
只要你的團隊同時有 Python backend、TypeScript frontend、也許還有 Go service,你就得開始在意:
- 生成出來的 client 版本是否一致
- schema 更新後哪些服務要一起升級
- CI 要不要檢查 codegen 差異
- 開發者本機環境是否容易 mismatch
這些都是成熟工程團隊可以處理的事,但它們不是免費的。尤其 repo 目前更新快、release 也密,意味著你若要跟著新功能走,升級節奏本身就要被管理。
4. 它能幫你減少 parsing 混亂,不代表能保證業務正確
這點很重要。
BAML 很擅長幫你把輸出拉回 schema、加上檢查規則、把 prompt 工程化。但它再怎麼做,也不會自動解掉資料品質、檢索錯誤、模型幻覺、引用來源不準這些更本質的問題。
比較務實的看法是,BAML 讓錯誤更容易被發現、被限制、被管理,但不會讓任務本身自動變正確。
如果你的核心瓶頸其實是知識來源亂、grounding 不夠、評估標準不清,先補那一層,通常比先引進一套 prompt DSL 更有價值。
替代方案怎麼看
如果你的需求只是單一語言、少量功能、先求快,直接用 OpenAI SDK 或 Anthropic SDK 搭配 Pydantic、Zod、Instructor 這類方案,通常更輕。
如果你主要在做 agent workflow、狀態流、人工介入與長流程恢復,那 LangGraph 或類似 orchestration 框架比較像主戰場。
如果你要的是前端生成體驗、React hooks、UI streaming 整合,Vercel AI SDK 那套心智模型可能更順手。
BAML 真正站得住的位置,不是全吃,而是落在這個交集上:你需要比 SDK 更穩的 prompt 工程能力,但又不想把整個系統押進單一高階 agent 框架。
結論,什麼團隊現在該看,什麼團隊先不要急
結論很直接。
如果你的 AI 功能已經從單次實驗變成持續迭代的產品模組,而且輸出高度結構化、規則很多、模型常切、prompt 需要像程式碼一樣被測試與維護,那 BAML 很值得現在看。 它不只是幫你少寫 parser,而是把一整塊原本很容易失控的 prompt layer,拉回比較能治理的工程形態。
但如果你現在還在很前期的探索階段,只是做一個聊天功能、功能面還很薄、模型供應商也還沒到需要抽象化的程度,較穩健的做法不是立刻上 BAML,而是先用最小工具把需求跑清楚。 因為 BAML 解的是成長痛,不是所有專案一出生就有的痛。
所以這篇最後的採用判斷是,BAML 不是每個人現在都該上,但對已經開始被 prompt 維護成本拖慢的團隊,它很可能正好切中那個最煩、也最貴的問題。
來源
- GitHub Repo: https://github.com/BoundaryML/baml
- Docs: https://docs.boundaryml.com/
- VSCode Extension / Editor support: https://github.com/BoundaryML/baml/tree/canary/typescript/vscode-ext
- Release notes / Tags: https://github.com/BoundaryML/baml/releases
- Star History: https://www.star-history.com/#BoundaryML/baml&Date