工作坊系列
- 工作坊 1:使用 Kiro 建置:他加祿語 學習 App 的提示優先產品設計工作坊
- 工作坊 2:使用 Kiro 建置:他加祿語 學習 App 的教育優先開發技巧工作坊
- 工作坊 3:使用 Kiro 建置:他加祿語 學習 App 的深入開發流程工作坊
- 工作坊 4:使用 Kiro 建置:將 他加祿語 學習 App 在地化為中文變體工作坊
- 工作坊 5:使用 Kiro 建置:他加祿語 卡片的文法與發音補強管線工作坊
- 工作坊 6:使用 Kiro 建置:他加祿語 學習 App 中可審查的獨特額外例句工作坊
- 工作坊 7:與 Kiro 一起開發:重建 CME Direct 風格的量化損益排行榜 UI
- 工作坊 8:與 Kiro 一起開發:重建損益排行榜背後的量化分析引擎
- 工作坊 9:與 Kiro 一起建構:適用於量化排行榜的 AWS AI 驅動交易台助理
對象: 正在建置內容補強管線與教育工具的專業開發者
時間: 2 小時
主要 AWS AI 服務: Kiro
專案輸出: 一個由 Kiro 引導的 deterministic 補強管線,為 他加祿語 卡片加入文法拆解與發音指引。
工作坊摘要

本工作坊帶領開發者為 他加祿語 卡片補強文法筆記與發音支援。參與者使用 Kiro 定義 deterministic 邊界、建立詞彙表、產生輔助文字、修補結構化內容或 HTML,並驗證覆蓋率。練習強調可審查的語言輔助:自動化可以準備說明,但面向學習者的文法、發音指引與例句仍需人工把關,才能清楚、準確、一致且實用。
工作坊目標
開發者會建置一條管線,用來擷取 他加祿語 句子、加入文法說明、產生發音指引、修補 HTML 或結構化卡片資料,並驗證覆蓋率。
2 小時議程
| 時間 | 模組 | 開發者成果 |
|---|---|---|
| 0–10 分鐘 | Kiro 設定 | 已建立 steering 與 spec |
| 10–25 分鐘 | 補強合約 | 定義 helper 輸出格式 |
| 25–45 分鐘 | 詞彙表 | 建立本機詞彙定義 |
| 45–65 分鐘 | 發音 | 加入 curated map 與 fallback |
| 65–90 分鐘 | HTML 修補 | 補強額外例句區塊 |
| 90–110 分鐘 | 驗證 | 檢查缺少的 span 與 section |
| 110–120 分鐘 | Hook 與審查 | 自動化檢查並建立交接 |
步驟 1 — 建立補強邊界的 Kiro steering
開發者操作
- 在 Kiro 中產生 steering 文件。
- 加入補強流程專用規則。
- 請 Kiro 判斷哪些部分應該 deterministic,哪些部分需要人工審查。
- 在撰寫 script 前先提交 steering。
Kiro 提示範例
為 他加祿語 文法與發音補強管線建立 steering 文件。請使用 deterministic Python helper、主題詞彙表、發音對照表、fallback 規則、BeautifulSoup 修補、驗證檢查,以及母語人士審查提醒。
系統設計決策
- 在寫程式前明確定義步驟 1 — 建立補強邊界的 Kiro steering: 專業開發者使用 AI 輔助工程時,不應依賴隱含假設。工作坊先把規則寫進 steering 或 spec,讓 Kiro 擁有可延續的專案脈絡。這會讓產生的程式碼更一致,讓審查者有具體內容可檢查,也避免在每次對話中重複說明。此決策也協助新開發者理解檔案為何存在、解決什麼問題,以及哪些行為被允許或禁止。
- 讓實作保持 deterministic 且可審查: Kiro 可以協助產生程式碼、測試與文件,但工作坊輸出應該可重現。Deterministic script、明確設定、穩定 schema 與驗證報告,會讓結果更容易除錯。當每次轉換都有可見的輸入與輸出時,開發者就能審查 diff、重新執行檢查,並向另一位工程師解釋系統。這對語言學習內容特別重要,因為正確性與文化脈絡仍需要人工審查。
- 把驗證綁進工作流程,而不是只放在最後 demo: 工作坊把驗證視為系統設計的一部分。每個步驟都有檢查、報告或 hook,讓缺陷能靠近造成問題的變更被發現。這種做法讓 Kiro 同時扮演 coding assistant 與品質審查者,而開發者仍掌握控制權。結果是一套實用的專業流程:用 spec 規劃、用 steering 引導、小步實作、驗證輸出,並記錄交接。
程式碼範例 — .kiro/steering/enrichment.md
# 補強 Steering
- 文法與發音補強必須保持 deterministic。
- 已知字詞使用詞彙表 dictionaries。
- 常見字詞使用發音 maps。
- 未知字詞使用透明的 fallback 規則。
- 補強期間不得重寫 他加祿語 句子。
- Helper 輸出在母語人士審查前標記為 draft。
- 每次批次處理後列印驗證計數。
程式碼說明
- 商業邏輯: Steering 檔案定義補強範圍與品質期待。
- 程式碼邏輯: Kiro 產生 script、測試、hook 與文件時,會把此檔案當作持續存在的脈絡。
- 預期結果: Kiro 產生的補強程式碼應保留 他加祿語 句子,並加入可審查的輔助區塊。
步驟 2 — 建立本機文法詞彙表
開發者操作
- 建立
glossary.py。 - 加入常見字詞與活動常用外來詞。
- 加入透明的 fallback 行為。
- 請 Kiro 產生詞彙表測試。
Kiro 提示範例
建立一個適合初學者的 他加祿語 詞彙表模組。包含 po、opo、saan、ang、paki、puwede、salamat、tubig、bayad、workshop、badge、registration、volunteer。回傳簡短說明,並為未知字詞提供 fallback 文字。
系統設計決策
- 在寫程式前明確定義步驟 2 — 建立本機文法詞彙表: 專業開發者使用 AI 輔助工程時,不應依賴隱含假設。工作坊先把規則寫進 steering 或 spec,讓 Kiro 擁有可延續的專案脈絡。這會讓產生的程式碼更一致,讓審查者有具體內容可檢查,也避免在每次對話中重複說明。此決策也協助新開發者理解檔案為何存在、解決什麼問題,以及哪些行為被允許或禁止。
- 讓實作保持 deterministic 且可審查: Kiro 可以協助產生程式碼、測試與文件,但工作坊輸出應該可重現。Deterministic script、明確設定、穩定 schema 與驗證報告,會讓結果更容易除錯。當每次轉換都有可見的輸入與輸出時,開發者就能審查 diff、重新執行檢查,並向另一位工程師解釋系統。這對語言學習內容特別重要,因為正確性與文化脈絡仍需要人工審查。
- 把驗證綁進工作流程,而不是只放在最後 demo: 工作坊把驗證視為系統設計的一部分。每個步驟都有檢查、報告或 hook,讓缺陷能靠近造成問題的變更被發現。這種做法讓 Kiro 同時扮演 coding assistant 與品質審查者,而開發者仍掌握控制權。結果是一套實用的專業流程:用 spec 規劃、用 steering 引導、小步實作、驗證輸出,並記錄交接。
程式碼範例 — glossary.py
import re
DEFINITIONS = {
"po": "politeness marker used to show respect",
"opo": "polite form of yes",
"saan": "where; asks for a place or direction",
"ang": "focus marker before the main noun or idea",
"paki": "please; softens a request",
"puwede": "may or can",
"salamat": "thank you",
"tubig": "water",
"bayad": "payment",
"workshop": "English loanword used locally for a workshop session",
"registration": "English loanword used for event check-in"
}
def token_key(word):
return re.sub(r"[^a-zA-ZñÑáéíóúÁÉÍÓÚ]", "", word).lower()
def explain_word(word):
key = token_key(word)
return DEFINITIONS.get(key, f"needs review; useful local word: {word}")
def grammar_breakdown(sentence):
seen = set()
output = []
for word in sentence.split():
key = token_key(word)
if key and key not in seen:
seen.add(key)
output.append((word.strip(".,?!"), explain_word(word)))
return output[:6]
程式碼說明
- 商業邏輯: 詞彙表會為已知字詞產生一致的初學者文法筆記,並為未知字詞產生透明的 fallback 筆記。
- 程式碼邏輯: 它會正規化 token、查詢字典、避免重複,並最多回傳六個字詞說明。
- 預期結果: 呼叫
grammar_breakdown('Saan po ang registration?')會回傳 Saan、po、ang 與 registration 的說明。
步驟 3 — 使用 curated 與 fallback 規則產生發音
開發者操作
- 建立
pronunciation.py。 - 為高頻字詞加入 curated 發音。
- 為未知字詞加入母音 fallback。
- 請 Kiro 測試已知與未知 token。
Kiro 提示範例
為 他加祿語 卡片建立發音 helper。常見字詞使用 curated 發音,未知字詞使用透明的 fallback 規則。請回傳完整發音指引與字詞層級 chunks。
系統設計決策
- 在寫程式前明確定義步驟 3 — 使用 curated 與 fallback 規則產生發音: 專業開發者使用 AI 輔助工程時,不應依賴隱含假設。工作坊先把規則寫進 steering 或 spec,讓 Kiro 擁有可延續的專案脈絡。這會讓產生的程式碼更一致,讓審查者有具體內容可檢查,也避免在每次對話中重複說明。此決策也協助新開發者理解檔案為何存在、解決什麼問題,以及哪些行為被允許或禁止。
- 讓實作保持 deterministic 且可審查: Kiro 可以協助產生程式碼、測試與文件,但工作坊輸出應該可重現。Deterministic script、明確設定、穩定 schema 與驗證報告,會讓結果更容易除錯。當每次轉換都有可見的輸入與輸出時,開發者就能審查 diff、重新執行檢查,並向另一位工程師解釋系統。這對語言學習內容特別重要,因為正確性與文化脈絡仍需要人工審查。
- 把驗證綁進工作流程,而不是只放在最後 demo: 工作坊把驗證視為系統設計的一部分。每個步驟都有檢查、報告或 hook,讓缺陷能靠近造成問題的變更被發現。這種做法讓 Kiro 同時扮演 coding assistant 與品質審查者,而開發者仍掌握控制權。結果是一套實用的專業流程:用 spec 規劃、用 steering 引導、小步實作、驗證輸出,並記錄交接。
程式碼範例 — pronunciation.py
import re
PRON = {"salamat": "sah-lah-maht", "po": "poh", "saan": "sah-ahn", "kayo": "kah-yoh", "tubig": "too-beeg", "bayad": "bah-yahd", "pumasok": "poo-mah-sohk"}
VOWELS = {"a": "ah", "e": "eh", "i": "ee", "o": "oh", "u": "oo"}
def clean(word):
return re.sub(r"[^a-zA-ZñÑ]", "", word).lower()
def fallback(word):
return "".join(VOWELS.get(ch, ch) for ch in clean(word)) or word
def pronounce_word(word):
return PRON.get(clean(word), fallback(word))
def pronunciation_guide(sentence):
chunks = [(w.strip(".,?!"), pronounce_word(w)) for w in sentence.split() if clean(w)]
return {"full": " ".join(sound for _, sound in chunks), "chunks": chunks}
程式碼說明
- 商業邏輯: Helper 會替每一句 他加祿語 句子提供可練習的發音指引。
- 程式碼邏輯: 已知字詞使用 curated 值;未知字詞使用母音 fallback;輸出同時包含完整形式與 chunk 形式。
- 預期結果: 呼叫
pronunciation_guide('Paki-check po kung pumasok ang bayad.')會回傳可讀的發音指引與字詞 chunks。
步驟 4 — 加入詞彙表覆蓋率報告
開發者操作
- 掃描所有 他加祿語 句子。
- 統計已知與未知 token。
- 匯出高頻未知字詞。
- 請 Kiro 建議詞彙表新增項目,並交由審查者核准。
Kiro 提示範例
建立詞彙表覆蓋率報告。掃描 他加祿語 句子、統計詞彙表中找不到的字詞、依頻率排序未知 token,並匯出 JSON 報告供審查者核准。未經審查前,不要自動新增定義。
系統設計決策
- 在寫程式前明確定義步驟 4 — 加入詞彙表覆蓋率報告: 專業開發者使用 AI 輔助工程時,不應依賴隱含假設。工作坊先把規則寫進 steering 或 spec,讓 Kiro 擁有可延續的專案脈絡。這會讓產生的程式碼更一致,讓審查者有具體內容可檢查,也避免在每次對話中重複說明。此決策也協助新開發者理解檔案為何存在、解決什麼問題,以及哪些行為被允許或禁止。
- 讓實作保持 deterministic 且可審查: Kiro 可以協助產生程式碼、測試與文件,但工作坊輸出應該可重現。Deterministic script、明確設定、穩定 schema 與驗證報告,會讓結果更容易除錯。當每次轉換都有可見的輸入與輸出時,開發者就能審查 diff、重新執行檢查,並向另一位工程師解釋系統。這對語言學習內容特別重要,因為正確性與文化脈絡仍需要人工審查。
- 把驗證綁進工作流程,而不是只放在最後 demo: 工作坊把驗證視為系統設計的一部分。每個步驟都有檢查、報告或 hook,讓缺陷能靠近造成問題的變更被發現。這種做法讓 Kiro 同時扮演 coding assistant 與品質審查者,而開發者仍掌握控制權。結果是一套實用的專業流程:用 spec 規劃、用 steering 引導、小步實作、驗證輸出,並記錄交接。
程式碼範例 — glossary_coverage.py
import json
from collections import Counter
from glossary import DEFINITIONS, token_key
def coverage_report(sentences, output="glossary-coverage.json"):
unknown = Counter()
total = 0
for sentence in sentences:
for word in sentence.split():
key = token_key(word)
if not key:
continue
total += 1
if key not in DEFINITIONS:
unknown[key] += 1
payload = {"totalTokens": total, "knownDefinitionCount": len(DEFINITIONS), "unknownTokenCount": sum(unknown.values()), "topUnknown": unknown.most_common(30)}
with open(output, "w", encoding="utf-8") as file:
json.dump(payload, file, indent=2, ensure_ascii=False)
return payload
程式碼說明
- 商業邏輯: 報告會告訴開發者與審查者哪些詞彙缺口最重要。
- 程式碼邏輯: 它會將句子 token 化、把正規化 token 與詞彙表 key 比對、統計未知字詞,並寫出 JSON 輸出。
- 預期結果: 執行報告後會產生一份已排序的未知 token 清單,審查者可核准後續定義。
額外動手開發實驗
這些實驗是 工作坊 5 — 文法與發音補強管線 的專屬內容。它們會用詞彙表治理、發音信心度、修補來源追蹤、審查者匯出與回歸檢查,延伸 deterministic 補強流程。重點是補強品質,而不是一般 workspace 設定。
動手實驗 A — 為審查治理加入詞彙表決策狀態
開發者操作
- 請 Kiro 將詞彙表從簡單的定義 map 擴充成可審查記錄。
- 加入
approved、needs-review與blocked決策狀態。 - 更新
explain_word,讓 blocked 字詞不會產生面向學習者的說明。 - 為已核准、未知與封鎖的詞彙表項目產生測試。
Kiro 提示範例
將詞彙表重構為可審查的 glossary records。
每筆記錄應包含 definition、partOfSpeech、decisionState、reviewerNote 與 lastReviewedAt。
Approved 項目可以出現在學習者輸出中。
Needs-review 項目應標記為 draft。
Blocked 項目應排除在面向學習者的文法筆記之外。
請為所有 decision state 建立測試。
系統設計決策
- 詞彙表治理能保護學習者輸出: 文法說明是教學內容,所以字詞定義不只需要文字,也需要審查狀態。
- Blocked 項目必須 fail closed: 如果審查者封鎖某個說明,補強管線應略過它或安全標示,而不是直接發布。
- 結構化記錄支援未來審查工具: 固定記錄格式可匯出為 CSV、交由母語人士審查,再匯入管線。
程式碼範例 — glossary_records.py
from dataclasses import dataclass, asdict
from typing import Literal
DecisionState = Literal["approved", "needs-review", "blocked"]
@dataclass(frozen=True)
class GlossaryRecord:
term: str
definition: str
partOfSpeech: str
decisionState: DecisionState = "needs-review"
reviewerNote: str = "Needs native-speaker review."
lastReviewedAt: str | None = None
GLOSSARY: dict[str, GlossaryRecord] = {
"po": GlossaryRecord(
term="po",
definition="politeness marker used to show respect",
partOfSpeech="particle",
decisionState="approved",
reviewerNote="Common beginner-safe explanation.",
lastReviewedAt="2026-06-01"
),
"bayad": GlossaryRecord(
term="bayad",
definition="payment",
partOfSpeech="noun",
decisionState="needs-review"
)
}
def learner_definition(term: str) -> dict:
record = GLOSSARY.get(term.lower())
if record is None:
return {"term": term, "definition": "needs review", "decisionState": "needs-review"}
if record.decisionState == "blocked":
return {"term": record.term, "definition": "blocked from learner output", "decisionState": "blocked"}
return asdict(record)
程式碼說明
- 商業邏輯: 記錄模型會區分已核准的學習內容、草稿說明與 blocked 說明。
- 程式碼邏輯:
GlossaryRecord儲存審查 metadata,learner_definition則依決策狀態回傳安全輸出。 - 預期結果: 補強流程可以持續進行,同時清楚標記哪些詞彙筆記已核准、仍是草稿或已被封鎖。
動手實驗 B — 加入發音信心度與審查者旗標
開發者操作
- 請 Kiro 將信心度 metadata 加入發音輸出。
- 將 curated 發音標記為
high信心度,將 fallback 發音標記為low信心度。 - 匯出低信心度 token 供審查。
- 加入驗證門檻,限制可接受的低信心度 token 比例上限。
Kiro 提示範例
為發音 helper 加入發音信心度。
Curated map 項目應回傳 confidence high。
Fallback 項目應回傳 confidence low,且 reviewRequired 為 true。
請依頻率建立低信心度 token 報告。
如果超過 25% 的 token 發音為 low confidence,驗證應失敗。
系統設計決策
- Fallback 輸出應保持透明: Fallback 發音有助於覆蓋率,但不應看起來和 curated 指引一樣可信。
- 信心度支援優先排序: 審查者可以先處理高頻且低信心度的 token。
- 門檻讓品質可衡量: 當太多輸出依賴 fallback 規則時,管線可以讓驗證失敗。
程式碼範例 — pronunciation_confidence.py
import re
from collections import Counter
PRON = {"salamat": "sah-lah-maht", "po": "poh", "saan": "sah-ahn"}
VOWELS = {"a": "ah", "e": "eh", "i": "ee", "o": "oh", "u": "oo"}
def clean(word: str) -> str:
return re.sub(r"[^a-zA-ZñÑ]", "", word).lower()
def fallback(word: str) -> str:
return "".join(VOWELS.get(ch, ch) for ch in clean(word)) or word
def pronounce_token(word: str) -> dict:
key = clean(word)
if key in PRON:
return {"word": word, "sound": PRON[key], "confidence": "high", "reviewRequired": False}
return {"word": word, "sound": fallback(word), "confidence": "low", "reviewRequired": True}
def low_confidence_report(sentences: list[str]) -> dict:
low = Counter()
total = 0
for sentence in sentences:
for word in sentence.split():
result = pronounce_token(word)
if clean(word):
total += 1
if result["confidence"] == "low":
low[clean(word)] += 1
return {"totalTokens": total, "lowConfidenceTokens": sum(low.values()), "topLowConfidence": low.most_common(20)}
程式碼說明
- 商業邏輯: 發音輸出現在會告訴審查者哪些指引是 curated,哪些需要審查。
- 程式碼邏輯: Helper 會回傳結構化 token metadata,以及低信心度字詞的排序報告。
- 預期結果: 補強管線可以產生完整發音覆蓋,同時優先安排人工審查。
動手實驗 C — 為每張已修補卡片加入補強來源追蹤
開發者操作
- 請 Kiro 為每張已補強卡片標記 pipeline version、source file、card ID 與補強時間戳記。
- 將 provenance 呈現為隱藏註解或結構化 JSON sidecar。
- 加入驗證,確認每張已補強卡片都有 provenance。
- 產生 diff 報告,列出新補強的卡片。
Kiro 提示範例
為 HTML 修補加入補強 provenance。
每張被文法或發音修補的卡片,都要記錄 cardId、sourceFile、enrichmentVersion、enrichedAt、grammarTermCount 與 pronunciationTokenCount。
請將 provenance 寫入 enrichment-provenance.json,並驗證每張已修補卡片都出現在其中。
系統設計決策
- 修補需要可追蹤性: 當 HTML 在產生後被修改,開發者需要知道哪個 script 改了哪張卡片。
- Sidecar 檔案避免 UI 雜訊: 審查者與開發者可以檢查 provenance,而不會干擾面向學習者的頁面。
- 版本化支援回歸審查: 當 enrichment version 改變時,可以觸發受影響卡片的精準審查。
程式碼範例 — enrichment_provenance.py
from datetime import datetime, timezone
import json
from pathlib import Path
ENRICHMENT_VERSION = "grammar-pron-v1"
def provenance_record(card_id: str, source_file: str, grammar_terms: int, pronunciation_tokens: int) -> dict:
return {
"cardId": card_id,
"sourceFile": source_file,
"enrichmentVersion": ENRICHMENT_VERSION,
"enrichedAt": datetime.now(timezone.utc).isoformat(),
"grammarTermCount": grammar_terms,
"pronunciationTokenCount": pronunciation_tokens
}
def write_provenance(records: list[dict], path: str = "enrichment-provenance.json") -> None:
ordered = sorted(records, key=lambda item: (item["sourceFile"], item["cardId"]))
Path(path).write_text(json.dumps(ordered, indent=2, ensure_ascii=False), encoding="utf-8")
程式碼說明
- 商業邏輯: Provenance 讓工作坊後的補強修補仍可稽核。
- 程式碼邏輯: 記錄會排序以產生穩定 diff,並以 UTF-8 JSON 寫出。
- 預期結果: 審查者可以把每個文法或發音區塊追溯回來源檔案與管線版本。
動手實驗 D — 建立文法筆記長度與可讀性驗證器
開發者操作
- 請 Kiro 為初學者文法筆記建立可讀性規則。
- 將每個定義限制為短片語或短句。
- 除非已核准,否則標記包含進階術語的筆記。
- 匯出失敗項目,包含 card ID、term 與 reason。
Kiro 提示範例
建立一個適合初學者文法筆記的驗證器。
每個 definition 最多 18 個英文單字。
除非 allowAdvanced 為 true,否則標記 enclitic、absolutive、ergative、morphosyntax、aspect 等進階術語。
請回傳 JSON failures,欄位包含 cardId、term、definition 與 reason。
系統設計決策
- 初學者可讀性可以測試: 文法筆記可以用機械方式檢查長度與進階術語。
- 驗證器能補足人工審查: Script 會在審查者花時間處理細節前,先抓出明顯過於複雜的內容。
- Allowlist 保留彈性: 當進階筆記被明確核准時,仍可以存在。
程式碼範例 — validate_grammar_notes.py
ADVANCED_TERMS = {"enclitic", "absolutive", "ergative", "morphosyntax", "aspect"}
def word_count(text: str) -> int:
return len([part for part in text.split() if part.strip()])
def validate_note(card_id: str, term: str, definition: str, allow_advanced: bool = False) -> list[dict]:
failures = []
if word_count(definition) > 18:
failures.append({"cardId": card_id, "term": term, "reason": "definition too long"})
lowered = definition.lower()
if not allow_advanced:
blocked = sorted(word for word in ADVANCED_TERMS if word in lowered)
if blocked:
failures.append({"cardId": card_id, "term": term, "reason": f"advanced terminology: {', '.join(blocked)}"})
return failures
程式碼說明
- 商業邏輯: 驗證器會讓 helper 文字維持適合初學者。
- 程式碼邏輯: 它會檢查字數與被封鎖的進階術語,並回傳結構化失敗項目。
- 預期結果: 過長或過度技術性的文法筆記會在發布前被標記。
動手實驗 E — 為 HTML 修補建立補強 snapshot 測試
開發者操作
- 請 Kiro 建立一個只含一張卡片的小型 fixture HTML 檔案。
- 針對 fixture 執行 patcher。
- Assert 文法、發音、審查筆記與 provenance 標記都存在。
- 除非 patcher 本來就對版面敏感,否則避免做整頁 snapshot。
Kiro 提示範例
為 HTML enrichment patcher 建立回歸測試。
使用一個只含一張卡片與一個 Natural 他加祿語 span 的小型 fixture。
修補後,請 assert 文法拆解、發音指引、草稿審查筆記與卡片 provenance marker 都存在。
不要比對整份 HTML 文件。
系統設計決策
- Patcher 很容易被破壞: 一個小小的 selector 變更,就可能讓補強內容悄悄不再出現。
- 精準 assertion 可降低脆弱度: 測試應保護必要區塊,而不是因為無害的格式變更而失敗。
- Fixture-driven 測試會記錄假設: 未來開發者可以看見預期的 HTML 形狀。
程式碼範例 — tests/test_enrichment_patch.py
from bs4 import BeautifulSoup
def add_enrichment(html_text: str) -> str:
soup = BeautifulSoup(html_text, "html.parser")
card = soup.select_one(".sentence-card")
grammar = soup.new_tag("section", **{"class": "grammar-breakdown"})
grammar.string = "Grammar breakdown: draft"
pronunciation = soup.new_tag("section", **{"class": "pronunciation-guide"})
pronunciation.string = "Pronunciation guide: draft"
card.append(grammar)
card.append(pronunciation)
card.append(soup.new_string("\n<!-- enrichmentVersion: grammar-pron-v1 -->\n"))
return str(soup)
def test_patcher_adds_required_enrichment_sections():
html = "<article class='sentence-card'><span lang='tl'>Saan po?</span></article>"
patched = add_enrichment(html)
assert "grammar-breakdown" in patched
assert "pronunciation-guide" in patched
assert "enrichmentVersion: grammar-pron-v1" in patched
程式碼說明
- 商業邏輯: 測試會保護產生卡片中的必要補強區塊。
- 程式碼邏輯: 最小 fixture 會被修補,並用精準 assertion 檢查。
- 預期結果: Selector 或 patcher 回歸會在完整批次執行前被發現。
動手實驗 F — 為補強決策匯出審查者 packet
開發者操作
- 請 Kiro 將詞彙表缺口、低信心度發音與過長文法筆記合併成一份審查者 packet。
- 同時寫出 JSON 與 CSV 輸出。
- 包含
suggestedAction值,例如approve-definition、fix-pronunciation與shorten-note。 - 依 action type 加入摘要統計。
Kiro 提示範例
建立 enrichment reviewer packet。
合併 glossary unknowns、low-confidence pronunciation tokens 與 grammar-note readability failures。
匯出 enrichment-review-packet.json 與 enrichment-review-packet.csv。
每一列都應包含 issueType、tokenOrTerm、exampleSentence、frequency、suggestedAction 與 reviewerDecision。
系統設計決策
- 審查者 packet 可降低審查摩擦: 單一 artifact 比分散的 console output 更容易審查。
- Suggested action 讓 triage 更快: 審查者可以核准、修正、封鎖或要求重寫,而不必解讀原始驗證 log。
- 空白 reviewerDecision 保留人工權限: 管線只準備工作項目,不宣稱已完成最終核准。
程式碼範例 — review_packet.py
import csv
import json
from collections import Counter
from pathlib import Path
COLUMNS = ["issueType", "tokenOrTerm", "exampleSentence", "frequency", "suggestedAction", "reviewerDecision"]
def write_review_packet(rows: list[dict], json_path="enrichment-review-packet.json", csv_path="enrichment-review-packet.csv") -> dict:
summary = Counter(row["suggestedAction"] for row in rows)
payload = {"summary": dict(summary), "items": rows}
Path(json_path).write_text(json.dumps(payload, indent=2, ensure_ascii=False), encoding="utf-8")
with open(csv_path, "w", newline="", encoding="utf-8") as file:
writer = csv.DictWriter(file, fieldnames=COLUMNS)
writer.writeheader()
for row in rows:
writer.writerow({column: row.get(column, "") for column in COLUMNS})
return {"json": json_path, "csv": csv_path, "summary": dict(summary)}
程式碼說明
- 商業邏輯: 審查者 packet 會把補強問題轉成可審查工作項目。
- 程式碼邏輯: 它會寫出穩定的 JSON 與 CSV 輸出,並摘要 suggested actions。
- 預期結果: 母語人士與課程審查者可以從同一份整合 packet 開始工作。
參考架構備註
- 本工作坊強調的 Kiro 能力:補強 steering、deterministic 詞彙表記錄、發音信心度報告、HTML 修補 provenance、驗證產生、fixture-based 回歸測試,以及 reviewer-packet 文件。
- 產品範圍:為 他加祿語 學習卡片提供文法與發音 helper 文字。Helper 輸出在 他加祿語 母語人士審查前都維持 draft。
- 執行範圍:先建立本機 Python 補強管線。之後可選擇加入自動化,在封裝靜態學習 artifact 前於 CI 執行相同 validators。
