程式開發 AI 正規方法 LLM

Quint讓規範成為終極護欄 模型檢查找出隱藏漏洞

AI Agent接軌正規方法 驗證閉環強化程式可信度

2026-09-08
生成式AI與Coding Agent大幅降低程式碼產製成本,卻同步提高驗證邏輯正確性的難度。本文說明以正規方法與模型檢查建立驗證機制,並介紹可執行規範語言Quint,透過隨機模擬、符號模型檢查與反例軌跡找出邏輯漏洞。更可將規範建模、AI程式碼生成、驗證與修復串成工作流,強化自動化軟體開發的可信度。

隨著生成式AI(GenAI)與AI Coding Agent(如Cursor、Claude、Codex、GitHub Copilot等)的爆炸式成長,軟體開發產業迎來了前所未有的生產力大爆發。AI能在數秒內生成數百行結構完整的程式碼、樣板套件(Boilerplate Code)與單元測試。然而,這場效率革命背後卻隱藏著巨大的隱憂:「編寫程式碼的成本已趨近於零,但驗證程式碼正確性的成本卻幾何級數上升」。

從程式碼暴增到認知債務的危機

業界正迅速面臨OpenAI聯合創始人Andrej Karpathy所描述的「氛圍編碼」(Vibe Coding)與「認知債務」(Cognitive Debt)困境——開發者越來越依賴直覺與AI對話來產出程式碼,卻無法理解每一行程式碼在極端邊界條件下是否隱藏死鎖(Deadlock)、競爭條件(Race Conditions)或狀態紊亂。尤其在金融科技(DeFi)、雲端基礎設施、分散式系統與資安關鍵領域,單一邊界漏洞就可能造成數百萬美元的損失。

為了破解AI時代的行為黑箱與邏輯脫軌,過去被視為頂尖學術界與少數國防航太專家的高門檻技術,正規方法(Formal Methods)與模型檢查(Model Checking),正以全新的姿態重新走進主流軟體工程。本文將探討正規方法的歷史脈絡,深度解析現代可執行規範語言Quint,透過實際銀行轉帳範例,拆解其動態模擬與SMT符號證明機制,並結合Uncle Bob的測試驗證論述與Tessl的「軟體工廠」(Dark Factory)未來發展,揭示AI Coding Agent為何必須仰賴正規方法作為終極護欄,如圖1所示。

圖1  AI Coding Agent結合正規方法護欄之運作示意圖。

正規方法的歷史脈絡與現代工業演進

長久以來,軟體工程界一直存在一個大哉問:「軟體工程師是真正的工程師嗎?」正規方法專家Hillel Wayne在接受The Pragmatic Engineer訪問時提到(https://newsletter.pragmaticengineer.com/p/formal-methods-with-hillel-wayne),在其進行的《Crossover Project》研究中指出,傳統土木與機械工程擁有嚴密的物理學與材料學公式(如500頁的卡扣設計手冊),而軟體工程的「材料」雖然異常一致(邏輯與位元),卻因為系統複雜度的交錯而極易產生微小的併發漏洞。

1. 傳統形式驗證的痛點與突破

過去的形式驗證(如Coq/Rocq、Isabelle/HOL、TLA+)著重於數學定理證明,語法充滿抽象數學符號、學習曲線陡峭,且與實際程式碼開發流程嚴重脫節。因此,正規方法長期被侷限於極高風險的少數場景(如NASA航太控制、晶片驗證、TLS密碼學協定解析器EverParse)。

然而,亞馬遜AWS(Amazon Web Services)在2015年發表的工程實踐論文(https://www.amazon.science/publications/how-amazon-web-services-uses-formal-methods)徹底打破了這個僵局:

‧AWS S3 ShardStore儲存引擎:AWS團隊在S3 ShardStore的每一次部署前,均使用輕量級正規方法與Shuttle模型檢查器執行崩潰一致性(Crash Consistency)與並行檢查。

‧35步極端漏洞的發現:AWS報告揭露,在關鍵分散式系統中,TLA+成功找出一個必須經過35個極端狀態交錯步驟才會觸發的深層邏輯漏洞。該漏洞通過了傳統的設計審查、人工Code Review與大規模單元測試,若非正規化模型檢查,人類絕無可能在線上事故發生前發現它。

‧Nitro Isolation Engine與Cedar語言:2026年AWS更公開Nitro隔離引擎基於Isabelle/HOL的33萬行機器檢查數學證明;而AWS授權引擎Cedar則直接採用Dafny形式建模,並與Rust實作進行數億次的差分隨機測試(Differential Testing)。

2. 關鍵洞見:從單元測試到系統思考

Hillel Wayne在與The Pragmatic Engineer的對談中還提到,多數工程師極度不擅長處理並發覺問題與競爭條件,因為「時間間隔漏洞」(Time-of-check to time-of-use,TOCTOU)在傳統測試中很難觸發。

傳統單元測試(Unit Test)只能驗證開發者「已經想到」的情境;屬性測試(Property-Based Testing)能自動丟入隨機亂數挑戰邊界;而以TLA+為代表的正規化規範(Formal Specification)則能站在系統層次,列舉狀態機的所有可能轉換,從根本上掃除邏輯盲區。

Quint:正規方法的現代化與可執行規範

儘管TLA+功能強大,但其基於LaTeX與古典時序邏輯的數學語法,使得絕大多數主流軟體工程師與AI模型望而卻步。為了解決此一痛點,由Informal Systems(Cosmos生態系)研發並於2024年獨立營運的Quint(https://quint.sh/)應運而生,詳細發展歷史請見圖2。

圖2  Quint的技術演進與架構定位。

1. Quint的設計核心與語法革新

Quint的核心哲學是將TLA+的語義轉化為接近TypeScript/Rust/C系語言的現代函數式語法。它是一門專為工程師與AI Agent設計的可執行規範語言(Executable Specification Language)。

Quint擁有以下三大核心特色:

‧語法親和力:捨棄繁雜的數學符號,採用工程師熟悉的var、action、val、map與高階函數,顯著降低學習曲線。

‧嚴謹的模式(Modes):Quint嚴格區分純函數(pure def)、狀態讀取(val)、狀態轉移動作(action)與時間邏輯(temporal),徹底消除隱蔽的側邊效應。

‧Prime算子('):繼承TLA+的狀態轉移核心,x' = x + 1明確代表「下一個狀態中的x等於當前x加1」。

2. 建立信心的三類可量化證據

Quint將軟體系統的「邏輯信心」轉化為三種可嚴格驗證的證據類型,如表1所示。

3. 學術論文與後端SMT推理引擎

Quint並非單純的語法糖,其背後擁有堅實的學術與工程支撐:

‧Apalache SMT符號求解器:Quint的後端直接對接Igor Konnov等人在ISoLA/OOPSLA發表的Apalache引擎(https://apalache-mc.org/)。Quint規格會被編譯為Apalache IR,並調用Microsoft Research的Z3 SMT求解器進行數學證明(https://www.microsoft.com/en-us/research/project/z3-3/)。

‧CosmWasm智慧合約自動轉譯(arXiv:2501.12972, 2025, https://arxiv.org/abs/2501.12972):最新學術研究顯示,LLM可與Quint結合,自動將Rust/CosmWasm程式碼轉譯為Quint模型,並透過Quint模擬器進行幻覺修復。

‧產業案例:Quint已被廣泛應用於ZKsync Governance(驗證超過50個安全不變量)、Tendermint BFT共識機制、MonadBFT與Alpenglow協議的形式化建模。

實體範例:銀行帳戶系統與工具鏈比較

為了深入理解Quint如何捕捉邏輯漏洞,這裡以經典的銀行轉帳系統(bank.qnt)作為實務範例。

1. 銀行系統Quint規格原始碼

module Bank {   // 1. 定義狀態變數 (State         Variables)   var balances: str -> int     // 定義帳戶集合   pure val ACCOUNTS = Set("Alice", "Bob")     // 2. 初始化動作 (Init Action)   action init = {     // 將Alice與Bob的初始餘額皆設為100     balances' = ACCOUNTS.mapBy(_ => 100)   }     // 3. 存款行為   action deposit(account, amount) = {     // 增加指定帳戶的存款餘額     balances' = balances.setBy (account, curr => curr + amount)   }     // 4. 提款行為   action withdraw(account, amount) = {     // 扣除指定帳戶的存款餘額     balances' = balances.setBy (account, curr => curr - amount)   }     // 5. 轉帳動作 (Transfer Action)   action transfer(from_acc: str, to_acc: str, amount: int): bool = {     all {       from_acc != to_acc,       amount > 0,       // 先進行提款行為再進行存款行 為,then表示提款與存款行為必須是原子 性的       withdraw(from_acc, amount). then(deposit(to_acc, amount)),     }   }     // 6. 步進轉移 (Step Action)   action step = {     nondet sender = ACCOUNTS.oneOf()     nondet receiver = ACCOUNTS.    exclude (Set(sender)).oneOf()     nondet amount = 1.to(100). oneOf() // 任意挑選一個1到100之間 的轉帳金額       transfer(sender, receiver, amount)   }     // 7. 總金額守恆不變量   val total_money_conserved = {     ACCOUNTS.fold(0, (sum, acc) => sum + balances.get(acc)) == 200   }     // 8. 帳戶餘額不可為負數   val no_negatives = ACCOUNTS. forall(acc => balances.get(acc) >= 0) }

2. 關鍵前置條件(Guard)與漏洞觸發實驗

接著,執行quint run bank.qnt --invariant=total_money_conserved時,檢查總金額是否永遠都是200元,命令列會回傳[ok] No violation found。

但是,當執行quint run bank.qnt --invariant=no_negatives時,如圖3所示,檢查帳戶餘額是否永遠大於0元,命令列會回傳[violation] Found an issue錯誤,並印出完整的反例執行軌跡(Trace):

圖3  Quint反例輸出結果。

1. 狀態0:[State 0] { balances: Map("Alice" -> 100, "Bob" -> 100) }

2. 狀態1:[State 1] { balances: Map("Alice" -> 13, "Bob" -> 100) }

3.狀態2:[State 2] { balances: Map("Alice" -> 13, "Bob" -> 187) }

4. 狀態3:[State 3] { balances: Map("Alice" -> -53, "Bob" -> 187) }

5. 狀態4:[State 4] { balances: Map("Alice" -> -53, "Bob" -> 253) }

為什麼隨機模擬器會報錯?

因為此時的transfer動作缺少了餘額檢查的前置條件(Guard)。在狀態3中,Alice的餘額僅剩13元,不足以支付轉帳需求,但由於沒有Guard阻擋,交易仍被強制執行,導致狀態4中Alice餘額降為-53元,觸發了no_negatives帳戶餘額不可為負數的違規。

修復漏洞:加入前置條件(Guard)並重新驗證 為了修復這個透支漏洞,在transfer動作中補上關鍵的前置條件Guard(balances.get(from_acc) >= amount):

// 5. 轉帳動作 (Transfer Action)   action transfer(from_acc: str, to_acc: str, amount: int): bool = {     all {       from_acc != to_acc,       amount > 0,     balances.get(from_acc)  >= amount, // <- 補上前置條件 (Guard):餘額必須足夠!       // 先進行提款行為再進行存款行 為,then表示提款與存款行為必須是原 子性的       withdraw(from_acc, amount). then(deposit(to_acc, amount)),     }   }

再次執行模擬指令:quint run bank.qnt --invariant=no_negatives 加入Guard後,當轉帳金額大於餘額時,Quint會將該動作評估為false並判定為「無效轉移」(Disabled Action),引擎會直接攔截並阻止該非法交易發生。因此再次執行模擬時,命令列會回傳[ok] No violation found,代表沒有發現帳戶餘額為負數的違規狀態。

3. 工具鏈雙核心對比:quint run vs quint verify

Quint工具鏈提供兩種截然不同的驗證機制,分別適用於開發期與CI/CD合併期,如表2所示。

Quint LLM Kit:AI Agent的規格寫作與驗證加速器

為了降低採用Quint的學習門檻,Informal Systems開發了開源套件Quint LLM Kit(https://github.com/quint-co/quint-llm-kit),這是專門為大型語言模型與AI Coding Agent設計的技能工具包(Agent Skills)和容器化開發環境,旨在讓AI能夠無縫進行Quint規範的建模、驗證與程式碼生成,如圖4所示。

圖4  Quint LLM Kit與AI Agent協同運作流程圖。

1. 核心功能與Agent Skills分工

Quint LLM Kit提供了三大靈活的Agent Skills,能夠直接整合至Claude Code、Cursor、VS Code + Copilot、Gemini CLI以及OpenCode等熱門AI開發工具中:

‧quint-lang技能:注入完整的Quint語意規範、CLI命令手冊與分散式協定設計模式,讓AI模型掌握精確的Quint語法與型態推導規則。

‧quint-modeling技能:支援從自然語言需求、功能說明書、既有程式碼(如Rust、Go、TypeScript)甚至傳統TLA+規範中,自動反向工程合成並生成Quint正規化模型。

‧quint-execute-spec技能:以已通過驗證的Quint規範為唯一真理來源,指引AI Coding Agent撰寫出符合規範約束的目標語言實作程式碼。

2. 雙重整合路徑與使用方式

Quint LLM Kit提供兩種靈活的部署途徑,滿足不同開發環境的需求:

輕量級Agent Skills模式(推薦使用npx方式、跨平台、免Docker) 可直接將技能套件安裝至現有的AI編輯器或Agent CLI中:

‧Claude Code插件安裝:

/plugin marketplace add quint-co/ quint-llm-kit /plugin install quint-llm-kit

‧npx一鍵加入:

npx skills add quint-co/quint-llm-kit

‧Universal安裝腳本(macOS/Linux):

curl -fsSL https://raw. githubusercontent.com/quint-co/ quint-llm-kit/main/install.sh | bash

Docker-Native開發環境模式(整合MCP Server)

包含預先配置好的Docker容器,內建Quint CLI、Quint LSP(Language Server Protocol)以及MCP Server(quint-lsp與quint-kb),提供即時的語意檢查與知識庫查詢。

‧快速啟動環境:

# 建置包含代理人與MCP伺服器的  Docker鏡像   make build # 指定專案目錄運行容器環境   make run DIR=~/my-project

‧引導式工作流(/spec:next):

在容器環境中執行/spec:next,Agent會根據專案當前進度自動分析並建議下一步的規格編寫、測試或驗證動作。

範式轉移:Uncle Bob的驗證哲學與軟體工廠的未來

AI Coding Agent的普及,正引發軟體工程史上最激烈的哲學辯論:「人類開發者是否還需要逐行閱讀AI生成的程式碼?」

1. 兩大陣營的理念對立

‧堅持「閱讀程式碼」陣營(Mitchell Hashimoto/HashiCorp創辦人):主張開發者必須完全理解提交的每一行程式碼。若放棄閱讀,將導致「Vibe滑坡」(Vibe Slumping)——人類監管因疲勞而放鬆,最終喪失調試(Debugging)能力與系統掌控權(https://x.com/mitchellh/status/2072738025344565262)。

‧以「約束體系」取代審查陣營(Robert C. Martin/Uncle Bob):《Clean Code》作者Uncle Bob提出了適應AI時代的反傳統主張:「我不讀程式碼,我建構嚴密的驗證體系。」當AI產出程式碼的成本趨近於零時,人類應將精力從耗時的「掃視程式碼」轉移到「設置不可逾越的數學與自動化驗證關卡」(https://x.com/unclebobmartin/status/2080257779395154409),如圖5所示。

圖5  Mitchell Hashimoto與Uncle Bob之驗證範式對比。

筆者立場是比較贊同Uncle Bob的觀點,透過建立嚴密的自動化驗證體系來取代人工審閱。這反映了軟體工程定義的轉變,AI Coding流程勢必要整合正規方法才能加速開發跟完整測試驗證,軟體工程也將邁向傳統土木與機械領域的工程方法,擁有嚴密周延的規劃流程和詳盡的計算與規格書,開發者重心將從單純的編寫程式,轉向建構更龐大且低成本的軟體品質保障體系。

2. Tessl的「軟體工廠」(Dark Factory)實踐

Tessl公司發布的「軟體工廠」模式展示了Uncle Bob哲學的終極型態。軟體工廠是一個全自動化的軟體生產線,AI Agent自主處理從Linear工單讀取、Daytona沙盒開發、執行測試到自動PR合併的全流程(https://www.youtube.com/watch?v=APYUJoQkVUo)。

以下是Tessl軟體工廠的驚人數據:

‧95%無人審查程式碼:在軟體工廠自身的程式碼庫中,高達95%的程式碼完全由Agent生成並自動合併,未經人工閱讀。

‧極致交付效率:兩名工程師在週末期間,軟體工廠自主交付並合併了150個PR;全公司異地會議一週內產出了516個PR。

‧三層驗證控制面(Verification Plane):

1.確定性驗證(Deterministic Verification):Lint規則、型別系統、單元測試、Quint正規化模型(Formal Models)。

2. 驗證器(Verifiers):以自然語言與LLM定義布林架構檢查。

3. Agent審查(Agentic Review):使用CodeRabbit與安全Agent進行同儕審查。

軟體工廠的核心教條:「自主權是贏得的,而不是直接開啟的」(Autonomy is earned, not enabled)。軟體工廠曾嘗試憑藉傳統單元測試將Python重寫為Elixir,卻因測試未涵蓋邊界而失敗。這證明了「驗證層的完備度(正規化與測試),決定了AI自主性的上限。」

結語:AI Coding Agent的終極護欄與邏輯羅盤

站在軟體工程範式轉移的十字路口,AI Coding工具並非要取代程式設計師,而是將工程師的角色從「打字員」昇華為「系統架構師與驗證體系建構者」。

如同之前的專欄文章的結語,「掌握三大類型AI編程工具‧碼農開發品質效率齊升」(https://www.netadmin.com.tw/netadmin/zh-tw/technology/AEBE44C6F89A481DAF229645DAA9516B):

「面對這場變革,最關鍵的觀點是:AI是增強而非替代,AI編碼工具的目標是賦能開發者,將他們從重複性勞動中擺脫出來,專注於更具創造性、戰略性和複雜性的任務。人類開發者在系統架構設計、業務邏輯理解、使用者需求洞察、創新性問題解決等方面的價值依然無可替代。」

受益於研究所發表過Formal Method/Model Checking相關論文(https://dl.acm.org/doi/abs/10.1093/ietisy/e89-d.6.1914),立即意識到現今AI Coding流程勢必要整合正規方法才能加速開發跟完整測試驗證,伴隨大語言模型的持續發展趨勢,LLM雖然擅長高熵的直覺推論與程式碼生成,但缺乏邏輯一致性。

而以Quint為代表的正規方法與SMT求解器(符號邏輯)則具備100%的確定性與數學嚴謹度,目前AI Coding Agent開發模式,已跟之前倡導的敏捷軟體開發流程大不相同,敏捷開發流程重視的是快速開發迭代,未來軟體工程將更重視:程式的可觀察性、可驗證性、可維護性,這將是軟體工程革命性的典範轉移(Paradigm Shift)。

如圖6所示,未來高品質軟體自動化開發工廠的標準工作流將是:

圖6  AI軟體開發驗證工作的流程圖。

1.需求意圖定義與規範編寫(Requirement & Formal Specification):人類工程師定義業務需求與意圖,先將需求轉換為可執行的Quint正規化規範。

2.規範層符號驗證(Specification Level Verification):透過Apalache/Z3符號驗證與求解器進行模型檢查,確保規範邏輯與不變量在數學上完全無誤。

3.AI代碼生成與合約實作(Code Generation with Guardrails):將驗證通過Quint規範的需求規格書作為Guardrail Prompt輸入給AI Coding Agent,自動生成包含函數合約(Function Contracts)的實作程式碼。

4. 程式碼層二次正規化驗證與自動修復(Formal Methods Guardrail & Auto-repair):將實作程式碼送入驗證控制面進行對比與合約檢查:

‧驗證失敗:自動產生Bug Report與反例(Counterexample),回饋給AI Coding Agent進行自我修正與精煉。

‧驗證通過:獲得經數學驗證的程式碼(Verified Code),無縫經由高信任CI/CD Pipeline自動發布至生產環境。

世界上最昂貴的程式碼漏洞,往往不是語法錯誤,而是經過完美測試卻仍違背系統設計本意的邏輯盲區,透過Quint這種現代可執行規範語言,才能在享受AI帶來高效生產力的同時,築起不可摧毀的軟體正確性護欄。軟體開發的未來,屬於那些懂得利用正規方法為AI鋪設軌道並邁向正確方向的工程團隊。

<本文作者:鄭淳尹,Docker.Taipei社群共同發起人,國泰金控技術架構師,曾任台北富邦銀行雲端系統部架構師、微軟MVP、momo購物網架構師、臺北榮民總醫院資訊工程師、玉山銀行資訊處專員、宏碁eDC維運工程師。開源技術愛好者,曾在多間大學資工系擔任Docker容器技術講師,並翻譯審閱多本容器技術書籍。>


追蹤我們Featrue us

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!