~/blog/spec-as-code-amazon-kiro-ai-testing-2026.md
AI 自動化與智慧應用 · 2026 / 03 / 05

規格即程式碼 (Spec as Code):使用 Amazon Kiro 打造高可測試性的 AI 專案

Eric — 浪花科技創辦人 / AI 架構師
Eric
浪花科技創辦人 · AI 架構師
規格即程式碼 (Spec as Code):使用 Amazon Kiro 打造高可測試性的 AI 專案
目錄 table-of-contents.md

用「規格即程式碼」把 AI Agent 關進可驗證的圍欄

規格書寫得再厚,也攔不住一個會產生幻覺的 AI Agent——當它握有操作資料庫、呼叫 API、甚至執行退款的權限,「它會不會把公司賣了」就是上線前必須回答的工程問題。Word/PDF 規格管不住非決定性的 AI,可行的解法只有一條:把業務邏輯寫成可執行、可進 Git、可在 CI/CD 跑 Pass/Fail 的規格即程式碼(Spec as Code),本文用 Amazon Kiro 實際走一遍。

本文會說明三件事:為什麼自然語言規格在 AI 時代會失效、Amazon Kiro 如何把規格變成可執行的行為驗證、以及如何把它接進 Laravel 測試與 CI/CD 流水線。文末附上一段可直接套用的退款代理人範例。

如果不算上昨天晚上被我不小心弄掛的測試伺服器,今天應該是個美好的一天。

回到 2024 年,那時我們還在為 Prompt Engineering(提示詞工程)爭論不休,大家都在討論要怎麼「哄」AI 說出正確的話。到了 2026 年,情況完全變了。現在我們談的是 Agentic Workflow(代理人工作流):AI 不再只是聊天機器人,它們有權限操作資料庫、發送 API 請求,甚至幫客戶退款。這也帶來了一個讓資深工程師背脊發涼的問題——你怎麼確定 AI 代理人不會因為「幻覺」而做出災難性的操作?

這就是為什麼 AWS 推出的 Amazon Kiro、以及它背後的 規格即程式碼 (Spec as Code) 概念,會成為開發圈的熱門話題。

為什麼 Word 文件管不住 2026 年的 AI Agent?

傳統軟體的邏輯是「決定性」的:if (a > b) 永遠是大於,不會今天大於、明天看心情變小於。但 LLM(大型語言模型)是機率模型,本質上是非決定性 (Non-deterministic) 的——同一句輸入,可能產生不同措辭、甚至不同的決策路徑。這正是它能跟人對話的原因,也是它難以驗證的根源。

假設產品經理 (PM) 在規格書上寫著:「AI 客服應該語氣溫和,並且只在確認訂單狀態為『已發貨』時,才能提供物流單號。」這句話對人類工程師很好懂,但對 AI 來說充滿漏洞:

  • 什麼叫「語氣溫和」?這是一個沒有可量測邊界的形容詞。
  • 如果訂單狀態是「準備中」,但 AI「覺得」快發貨了,能不能給單號?
  • 如果使用者用 Prompt Injection(提示詞注入)騙 AI 說自己是管理員呢?

問題的本質:規格留在文件裡,就無法被執行

Word 或 PDF 規格的根本缺陷,不只是「模糊」,而是它無法被機器驗證。它躺在共享資料夾裡,跟程式碼脫節,沒有版本控制、沒有測試、沒有人為它的正確性負責。當 AI 的行為偏離規格時,沒有任何自動化機制會發出警報。

Spec as Code 的哲學下,我們不再寫模糊的自然語言規格,而是把這些業務邏輯轉換成「可執行的測試代碼」。Amazon Kiro 就是為這個目的而生的——它是一個專門針對 AI Agent 行為的驗證引擎。

Amazon Kiro 是什麼?AI 專案的「邏輯憲法」

你可以把 Amazon Kiro 想像成 AI 時代的 PHPUnit 或 Jest,差別在於:它測試的不是函數的返回值,而是 AI 的「意圖 (Intent)」與「邊界 (Boundary)」。傳統單元測試問的是「輸入 A 是否得到輸出 B」;Kiro 問的是「在這個情境下,AI 是否走進了被允許的決策路徑、有沒有踩到紅線」。

Kiro 允許我們使用一種類似 YAML 的聲明式語言(Kiro Spec Language, KSL)來定義 AI 的行為準則。這些準則會被編譯成一組監控器 (Monitors),直接掛載在 Amazon Bedrock 或你的自建模型推論管道上。

Spec as Code 的三個核心優勢

  • 可測試性 (Testability):規格不再是靜態文件,而是可以跑 Pass/Fail 的測試腳本。規格變成了驗收條件本身。
  • 版本控制 (GitOps):規格跟著程式碼一起進 Git Repo。PM 想改規格就得發 Pull Request,每一次行為調整都有提交紀錄、有人審查、誰都別想賴帳。
  • 即時阻斷 (Guardrails):Kiro 可以在 Runtime(執行階段)攔截違反規格的 AI 回應——也就是說,它不只在測試時把關,上線後仍是一道護欄。

為什麼「宣告式」是對的選擇?

這裡有一個值得停下來想的設計取捨:為什麼是 YAML 這種宣告式 (Declarative) 語言,而不是再寫一段程式?因為宣告式規格描述的是「應該成立的事實」,而不是「執行的步驟」。它讓非工程背景的 PM 也能讀懂、審查與貢獻規格,同時把「驗證怎麼跑」這件事交給引擎去處理。這跟基礎設施即程式碼 (Infrastructure as Code) 用 YAML 描述「我要什麼狀態」、而不是「怎麼一步步架起來」是同一套思維。

實戰:用 Kiro 定義一個「退款代理人」

假設我們要開發一個自動退款的 AI Agent,來看看傳統規格與 Kiro Spec 的差異。

傳統規格(自然語言):

「當使用者要求退款時,檢查訂單是否超過 7 天。如果超過,婉拒並說明政策;如果未超過,詢問原因並執行退款 API。」

這段話讀起來很完整,但它沒有定義「訂單天數從哪裡查」、「拒絕後 AI 會不會無限道歉」、「萬一被注入攻擊怎麼辦」。這些缺口在文件裡看不見,卻會在 production 環境裡爆炸。

Amazon Kiro Spec(Spec as Code):

version: "2026-01"
agent: "RefundAgent_v3"

guardrails:
  input_validation:
    - rule: "detect_pii" # 偵測個資
      action: "mask"

  logic_flows:
    - intent: "request_refund"
      steps:
        - check: "order_age"
          source: "api:order_service.get_details"
          condition: "<= 7 days"

          on_pass:
            - action: "ask_reason"
            - constraint: "tone_empathetic" # 強制同理心語氣

          on_fail:
            - response: "policy_rejection"
            - constraint: "no_apology_loop" # 禁止陷入道歉迴圈

  security:
    - rule: "prevent_prompt_injection"
      sensitivity: "high"

差異在哪?這份 Kiro Spec 把原本藏在自然語言裡的隱性假設全部攤開成明確的欄位:

  • source:天數不是靠 AI「記得」或「推測」,而是強制從 order_service.get_details 這個可信來源取得。
  • condition:7 天的判斷是一個明確的布林條件,不留模糊空間。
  • on_pass / on_fail:兩條路徑各自有明確的後續動作與語氣約束(同理心、禁止道歉迴圈)。
  • security:把防注入直接寫進規格,而不是寄望模型自己很聰明。

最重要的是——它是可執行的。這份檔案不只是給人看的,它是測試與護欄的依據。

如何把 Kiro 整合進 CI/CD 流水線?

在浪花科技,我們要求所有 AI 功能在上線前都必須通過 Kiro 的自動化測試。對於使用 WordPress 或 Laravel 開發後端的團隊來說,這其實非常容易整合。

我們通常會在 Laravel 的測試流程中,透過 AWS SDK 呼叫 Kiro 的 Simulation API。這樣做的關鍵好處是:可以在不消耗昂貴 Token、不真的呼叫退款 API 的情況下,模擬大量對話情境。換句話說,你是在一個沙盒裡反覆審問 AI「如果客戶這樣說,你會怎麼做」,而不是拿正式環境當試驗場。

Laravel 整合範例

// tests/Feature/AiAgentTest.php

use Aws\Kiro\KiroClient;
use Tests\TestCase;

class AiAgentTest extends TestCase
{
    public function test_refund_logic_compliance()
    {
        $kiro = new KiroClient([
            'region' => 'us-east-1',
            'version' => 'latest'
        ]);

        // 讀取我們的 Spec 檔案
        $specContent = file_get_contents(base_path('kiro/refund_agent.yaml'));

        // 模擬一個超過 7 天的退款請求
        $simulation = $kiro->runSimulation([
            'spec' => $specContent,
            'inputs' => [
                ['role' => 'user', 'content' => '我買了這雙鞋 10 天了,我想退款']
            ],
            'mock_context' => [
                'order_date' => now()->subDays(10)->toIso8601String()
            ]
        ]);

        // 斷言:AI 必須拒絕,且不能呼叫退款 API
        $this->assertEquals('REJECT', $simulation['outcome']);
        $this->assertNotContains('call_tool:refund_api', $simulation['agent_actions']);

        // 斷言:Kiro 的評分機制認為 AI 遵守了規格
        $this->assertTrue($simulation['compliance_score'] > 0.95);
    }
}

這段程式碼的重點在於:我們不再人工檢查 AI 回答得順不順,而是由 Kiro 根據 Spec 自動判斷 AI 是否「違規」。如果 AI 在訂單已滿 10 天的情況下竟然答應退款,CI/CD Pipeline 就會直接亮紅燈,阻止這次部署。

把它變成上線前的「最後一道閘門」

實務上,建議把這類 Spec 測試掛進 pull request 的必過檢查 (required check):

  1. PM 或工程師修改 kiro/*.yaml 規格,發出 Pull Request。
  2. CI 自動跑 Kiro 模擬,涵蓋正常路徑與各種邊界/攻擊情境。
  3. 任一情境的 compliance_score 不達標,或 AI 做出被禁止的動作,PR 就無法合併。
  4. 合併後,同一份規格繼續作為 Runtime 護欄掛在推論管道上。

這樣一來,「行為正確性」就跟「程式碼正確性」一樣,被納入了同一條輸送帶。

Spec Engineering:從 Prompt 到 Spec 的演進

很多人問我,2026 年工程師的價值在哪裡?我的看法是:如果你還在一個字一個字地調 Prompt,那其實滿危險的。現在的趨勢是 Spec Engineering(規格工程)

我們的工作,是設計精確的邏輯邊界,讓 AI 在這個圍欄裡自由發揮。Prompt 決定 AI「怎麼講」,Spec 決定 AI「能不能做、做了算不算數」。Spec as Code 讓我們把對業務邏輯的理解,轉化為 AI 無法跨越的「程式碼圍欄」。

Amazon Kiro 只是這波浪潮的開始。它解決了企業導入 Agentic AI 最害怕的「不可預測性」問題。透過 Spec as Code,我們終於可以像管理傳統軟體一樣,管理那些會「思考」的程式碼。

給開發者的三個務實建議

  1. 學習宣告式語言:熟悉 YAML 或 JSON Schema,這是在跟 AI 定義規則時的通用語言。
  2. 思維轉變:從「怎麼寫 Code 實現功能」轉變為「怎麼寫 Spec 驗收功能」。先問「怎樣才算對」,再問「怎麼做」。
  3. 關注 AWS Bedrock Agents 與 Kiro 的整合:這是目前企業級 AI 較成熟的落地路徑之一。

寫這篇文章的時候,我又看了一眼終端機。還好,Kiro 幫我擋下了一個差點讓測試環境資料庫被清空的 Agent 操作。這就是 Spec as Code 的價值——它讓我在面對一群「聰明過頭」的 AI 代理人時,晚上還能睡得著覺。

您的 AI 專案需要更嚴謹的架構設計嗎?

如果您的企業正在導入 AI Agent,卻擔心不可控的風險,或想了解如何實作 Spec as Code 來提升專案穩定性,歡迎找我們聊聊。浪花科技在 AI 整合上累積了第一線經驗,能協助您打造既聰明又安全的系統。

立即聯繫浪花科技,預約技術諮詢

延伸閱讀

// FAQ

常見問題

什麼是規格即程式碼(Spec as Code)?
規格即程式碼是把業務邏輯寫成可執行、可進 Git、可在 CI/CD 跑出 Pass/Fail 的規格,而非停留在 Word 或 PDF 文件中。它的目的是用機器可驗證的方式約束非決定性的 AI Agent 行為,讓規格本身就成為驗收條件與護欄。
為什麼傳統的 Word 或 PDF 規格書管不住 AI Agent?
LLM 本質上是機率模型,屬於非決定性,同一句輸入可能產生不同措辭或決策路徑,難以驗證。而 Word 或 PDF 規格的根本缺陷在於它無法被機器驗證,與程式碼脫節、沒有版本控制與測試,當 AI 行為偏離規格時不會有任何自動化機制發出警報。
Amazon Kiro 是用來做什麼的?
Amazon Kiro 是一個專門針對 AI Agent 行為的驗證引擎,可類比為 AI 時代的 PHPUnit 或 Jest,差別在於它測試的是 AI 的意圖與邊界,而非函數的返回值。它使用類似 YAML 的宣告式語言(KSL)定義行為準則,這些準則會被編譯成監控器,掛載在推論管道上。
為什麼 Spec as Code 採用 YAML 這類宣告式語言而不是寫程式?
宣告式規格描述的是「應該成立的事實」而非「執行的步驟」,這讓非工程背景的 PM 也能讀懂、審查與貢獻規格,同時把「驗證怎麼跑」交給引擎處理。這與基礎設施即程式碼(Infrastructure as Code)用 YAML 描述目標狀態的思維一致。
如何在不消耗 Token、不呼叫正式 API 的情況下測試 AI Agent 行為?
可在測試流程中透過 AWS SDK 呼叫 Kiro 的 Simulation API,在沙盒環境中模擬大量對話情境。這樣能在不消耗昂貴 Token、不真的呼叫退款等正式 API 的情況下,反覆驗證 AI 在各種輸入下是否走進被允許的決策路徑。
~/roamer-tech/newsletter // FREE
// newsletter

訂閱免費電子報

把 AI 自動化、企業系統設計與 WordPress / Laravel 開發的真實案例和可直接照做的技巧,整理成電子報寄給你。只寄精選內容、不灌垃圾信,一鍵就能退訂。

$
// final.exec()

準備好讓你的網站開始為你工作了嗎?