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

生成式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結合正規方法護欄之運作示意圖。
圖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)在傳統測試中很難觸發。

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

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

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

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

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

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

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

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

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

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

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

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

表1 三種可嚴格驗證的證據類型比較
證據類型 定義與語義 應用實例
屬性(Properties/Invariants) 系統在任何可達狀態下都必須永遠滿 足的全局條件(Invariant) 「銀行總存款不得為負數」、「兩名使用者 不可同時取得同一筆鎖定資源」
範例運行(Example Runs) 定義系統的「快樂路徑」(Happy Path)或特定業務交錯序列 「Alice轉帳給Bob、取消交易、再重新扣款 的完整動作序列是否可行」
見證(Witnesses) 證明某些特定狀態確實可以到達,防 止規格因過度約束而無效 「證明系統確實存在可以成功完成併購清算 結算的具體狀態路徑」

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協議的形式化建模。

={
balances' = balances.setBy
}
all {
from_acc != to_acc,
amount > 0,

性的

}
}
action step = {

的轉帳金額

}
// 7. 總金額守䚻不變量

實體範例:銀行帳戶系統

// 扣除指定帳戶的存款餘額

與工具鏈比較

(account, curr => curr - amount)

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

// 5.轉帳動作 (Transfer Action)
action transfer(from_acc: str,

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

to_acc: str, amount: int): bool = {
module Bank {
定義狀態變數 (State
// 1.
// 先進行提款行為再進行存款行
Variables)
為,then表示提款與存款行為必須是原子
var balances: str -> int
// 定義帳戶集合
withdraw(from_acc, amount).
pure val ACCOUNTS = Set("Alice", "Bob") then(deposit(to_acc, amount)),
// 2. 初始化動作 (Init Action)
action init = {
// 將Alice與Bob的初始餘額皆設為100 // 6. 步進轉移 (Step Action)
balances' = ACCOUNTS.mapBy(_ => 100)
} nondet sender = ACCOUNTS.oneOf()
nondet receiver = ACCOUNTS.
// 3.存款行為
exclude (Set(sender)).oneOf()
action deposit(account, amount) nondet amount = 1.to(100).
oneOf() // 任意挑選一個1到100之間
={
// 增加指定帳戶的存款餘額
balances' = balances.setBy
(account, curr => curr + amount) transfer(sender, receiver, amount)
}
// 4. 提款行為
action withdraw(account, amount) 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反例輸出結果。
圖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,代表沒有發現帳戶餘額為負數的違規狀態。

表2 工具鏈雙核心對比
嫲鯱笞䏞 quint run(隨機模擬器) quint verify(符號模型檢查器)
䏁㾵堥ⵖ 隨機模擬(Stateful Fuzz-ing/PBT) 符號模型檢查(Apalache & Z3 SMT求解器)
䱳程倰䒭 概率式:隨機挑選動作與參數漫遊N條 路徑 窮舉式:將Quint邏輯轉為SMT方程式,窮舉指定步數 內所有狀態
劢涮植Bug䠑巒 不代表沒有Bug;僅代表該次隨機抽樣 未偵測到錯誤 數學上的100%保證;證明在設定步數內絕無漏洞
㛂遤鸠䏞 極快(幾毫秒至數秒),直接於Node.js 執行 較慢(數秒至數分鐘),需要Java與SMT執行環境
⿾⢿鮨騋ㅷ颶 軌跡長度較長,帶有隨機性 產出最短反例軌跡(Shortest Trace),最適利於除錯
剓⢕⢪欽儘堥 開發階段即時REPL快速除錯 CI/CD Branch Protection與合併前終極審核

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所示。

1. 核心功能與Agent Skills分工

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

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

‧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會根據專案當前進度自動分析並建議下一步的規格編寫、測試或驗證動作。

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

範式轉移: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所示。

筆者立場是比較贊同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工具並非要取代程式設計師,而是將工程師的角色從「打字員」昇華為「系統架構師與驗證體系建構者」。

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

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

「面對這場變革,最關鍵的觀點是: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所示,未來高品質軟體自動化開發工廠的標準工作流將是:

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鋪設軌道並邁向正確方向的工程團隊。