iPAS AI 應用規劃師 中級 科目一

CI 持續整合的核心實踐是什麼?

原題 29

某 AI 開發團隊為提升模型開發效率及品質控制,計畫實施持續整合(Continuous Integration, CI)流程。下列哪一項做法最符合 CI 的核心實踐,且能有效減少整合風險?

白話

一個 AI 開發團隊想導入「持續整合」(Continuous Integration,CI)這套工程流程,目的是提升效率和品質,同時降低整合時出現問題的風險。

問你:哪一項做法最符合 CI 的核心實踐,且能有效減少整合風險?

點選你的答案。

01 總結

一句話總結

CI(持續整合)的核心是:每次有人提交(Commit)程式碼,就自動跑建置、單元測試和靜態分析,讓問題在「剛犯錯的那一刻」就被抓到,而不是等幾天後整合時才發現一堆衝突。

02 情境

先感受問題:5 個工程師同時改程式碼

假設「AI 新創公司晨曦智能」有 5 個工程師,各自負責不同的模型元件:

小明:負責資料前處理模組
小花:負責特徵工程模組
阿偉:負責模型訓練模組
小菁:負責評估指標模組
大衛:負責 API 服務模組

他們同時在各自的分支上工作。問題來了:

  • 小明改了資料前處理的輸出格式
  • 小花的特徵工程模組依賴那個格式,但她不知道小明改了
  • 兩個人的程式碼各自測試都沒問題
  • 等到「星期五下午要合版」才發現:整合後整個 pipeline 跑不起來

這就是「整合地獄」(Integration Hell)。等到最後才合版,衝突堆積如山,找 bug 又急又難。

CI 的哲學是:不要等,每次提交就自動測試,立刻知道有沒有破壞東西。

03 對照

「等很久才整合」的五個坑

  1. 衝突堆積:5 個人各改一週,合版時衝突可能有幾百行,每一個都要手動確認,耗費大量時間。
  2. bug 難追蹤:不知道是誰哪一次 commit 壞掉的,只能從頭一行一行 debug。如果每次提交就測,至少知道「這次提交前沒問題,這次提交後有問題」,問題範圍縮到這次的改動。
  3. 心理壓力放大:「等一週才合版」讓工程師要承擔「累積一週的 bug 可能在星期五爆發」的壓力,反而會讓人更不敢改動。
  4. 手動合版靠人不靠系統:「每天固定時間手動合版」依賴工程師記得執行,有人出差、生病就漏掉,品質不穩定。
  5. 靜態分析被跳過:測試流程繁瑣時,工程師容易為了趕時間跳過靜態程式碼分析(linting、型別檢查),讓潛在問題溜進主分支。
04 解法

每次 Commit 自動觸發,怎麼解

回到晨曦智能。導入 CI 後的流程:

小明修改資料前處理模組,推送(push)到 GitHub。

git push origin feature/data-preprocessing

GitHub Actions 的 CI pipeline 自動啟動:

1. 建置(Build):確認程式碼能編譯、套件能安裝
2. 單元測試(Unit Test):跑 test_preprocessing.py,確認小明的模組輸出格式正確
3. 靜態分析(Static Analysis):flake8 檢查語法、mypy 檢查型別
4. 整合測試(Integration Test):模擬小花的特徵工程模組讀取小明的輸出,確認格式相容

如果任何一步失敗,小明立刻收到通知,在自己的 commit 就修好,不會把問題帶給其他人。

這就是選項 B 講的:每次程式碼提交(Commit)後自動觸發建置、單元測試及靜態程式碼分析

技術版:GitHub Actions CI Pipeline 實際設定

中級考試大概率會考程式碼跟公式,所以這部分你還是要學。但如果現在學起來很痛苦,可以先跳過,等讀完其他題目回頭再來。

CI pipeline 通常用 YAML 設定檔定義。GitHub Actions 的範例:

# .github/workflows/ci.yml
name: CI Pipeline

on:
  push:             # 每次 push 就觸發
    branches: ["**"]
  pull_request:     # PR 建立或更新也觸發
    branches: [main]

jobs:
  ci:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: "3.11"

      - name: Install dependencies
        run: pip install -r requirements.txt

      - name: Static analysis (flake8 + mypy)
        run: |
          flake8 src/ --max-line-length=100
          mypy src/ --ignore-missing-imports

      - name: Unit tests
        run: pytest tests/unit/ -v --tb=short

      - name: Integration tests
        run: pytest tests/integration/ -v --tb=short
Step 1 純故事版
  1. 工程師 push 程式碼
  2. GitHub 接到通知,自動去雲端開一台乾淨的機器
  3. 機器按照 YAML 食譜:裝套件、跑 linter、跑測試
  4. 全過:綠燈,PR 可以合版;任何一步失敗:紅燈,通知工程師回去修
Step 2 中文 ↔ 程式碼對照
故事設定
每次 push 就觸發on: push: branches: ["**"]
裝套件pip install -r requirements.txt
靜態語法檢查flake8 src/
型別檢查mypy src/
跑單元測試pytest tests/unit/
Step 3 符號角色表
on: push
觸發條件。設成「每次 push」就是 CI 的核心,確保沒有任何 commit 能逃過測試。
flake8
Python 靜態分析工具,檢查語法格式、潛在錯誤,不需要執行程式就能找問題。
mypy
Python 型別檢查工具,確認函式簽名和型別標注一致,抓出型別不符的 bug。
pytest
Python 測試框架,跑 tests/ 目錄下的所有測試函式,確認功能正確。
runs-on: ubuntu-latest
在乾淨的 Ubuntu 雲端機器上跑,每次都是全新環境,避免「在我電腦上沒問題」的假象。
Step 4 完整公式對應

本題沒有數學公式,這個 Step 跳過。CI 的核心是工程流程設計,不是數學。

Step 5 自我複述

蓋住設定檔,說出 CI pipeline 的 4 個必要步驟:

  1. 觸發:每次 push 就啟動
  2. 建置:裝套件,確認環境能建起來
  3. 靜態分析:不跑程式就找語法/型別問題
  4. 測試:跑單元測試和整合測試,確認功能正確
05 陷阱

為什麼其他選項是錯的

A在主分支(Main Branch)每日固定時間手動合併並執行完整測試流程

字面在說什麼

每天設定一個時間(例如下午 5 點),工程師手動把各自的分支合進主分支,然後跑測試。

為什麼不對

「每日固定時間」和「手動合併」這兩點都違背 CI 的核心精神。CI 強調「持續」:不是一天一次,而是每次提交都觸發。一天一次意味著問題可能累積 8 小時才被發現;手動執行意味著靠人記得做,一旦有人忘記或省略,品質保證就破功了。CI 必須是自動化的,不依賴人的記憶或紀律。

誰會選錯

聽說「每天要整合」就以為 A 是對的考生。記住:CI 的「持續」不是「每天定時」,是「每次 commit 立刻」。頻率差了幾十倍,問題發現的速度也差幾十倍。

C於模型訓練完成後,定期安排開發團隊回顧並合併程式碼

字面在說什麼

等模型訓練完成(可能是幾天或幾週後),再召集團隊一起回顧這段時間的程式碼,然後做合版。

為什麼不對

這完全是「等很久才整合」的反模式。AI 模型訓練可能跑好幾天,這期間累積的程式碼衝突和 bug 可能多到難以清理。「回顧後合併」也是手動人工流程,沒有自動測試。這個選項更接近「Code Review」(程式碼審查)的概念,而不是 CI。

誰會選錯

把「Code Review」和「CI」混在一起的考生。Code Review 是人工審查邏輯,CI 是自動化測試基礎設施,兩個是不同層次的品質保證機制,可以並存但功能不同。

D透過自動化部署腳本,將模型在特定時間點批次釋出到測試環境

字面在說什麼

寫一個自動化腳本,在固定時間(例如每週一)把模型部署到測試環境。

為什麼不對

這描述的是 CD(Continuous Delivery 或 Continuous Deployment,持續交付/部署),不是 CI。CI 的重點在「建置和測試」,確認程式碼正確;CD 的重點在「部署」,把通過測試的版本送到環境。另外,「特定時間點批次釋出」也不符合「持續」的精神,持續部署是「通過測試就自動部署」,不是「每週固定時間」。

誰會選錯

聽過「CI/CD」但分不清 CI 和 CD 邊界的考生。記住:CI = 整合(測試)、CD = 交付(部署)。D 選項在做 CD 的事,但題目問的是 CI。

06 變形

同個考點下次怎麼變形

變形 1 邊界

如果每次 commit 都跑完整測試套件需要 30 分鐘,CI 還實用嗎?

直覺

等 30 分鐘才知道測試結果,工程師不是一直在等嗎?

答案

有解決方案:1. 分層測試策略,每次 commit 只跑快速的單元測試(幾秒),整合測試只在合版時或定時跑;2. 平行化跑測試,把不同模組的測試分配到多台機器同時跑;3. 只跑「受這次 commit 影響的測試」(Test Impact Analysis)。30 分鐘的測試套件拆分後,大部分 commit 能在 2-3 分鐘內得到回饋。

變形 2 反例

什麼情況下 CI 反而會拖慢開發速度?

直覺

CI 是好東西,應該不會拖慢?

答案

有幾個常見情況:1. 測試套件太慢,工程師被迫等待;2. 測試太脆弱(flaky tests),偶爾隨機失敗,讓人失去信任開始忽略 CI 結果;3. CI 太嚴格設了過多規則(例如測試覆蓋率必須 100%),在早期探索階段反而阻礙實驗。好的 CI 要快速(2-5 分鐘)、可靠(不誤報)、合理嚴格(針對重要路徑)。

變形 3 升級版

AI 專案的 CI 跟一般軟體 CI 有什麼不同?

直覺

AI 專案有訓練過程,不是只有程式碼,CI 要多做什麼?

答案

AI 專案的 CI 除了一般的程式碼測試,還需要:1. 資料驗證(Data Validation):確認輸入資料格式正確、沒有異常分佈;2. 模型冒煙測試(Model Smoke Test):用小批次資料快速跑完訓練流程,確認沒有形狀錯誤(shape mismatch);3. 指標回歸測試(Metric Regression Test):確認更新後的模型效能不低於基準線;4. 依賴版本鎖定:確認 PyTorch、TensorFlow 版本一致,避免不同環境的數值差異。

變形 4 跨領域

CI 的概念在硬體開發(例如晶片設計)有對應的實踐嗎?

直覺

CI 感覺是軟體的東西,硬體設計每次改完要 tape-out 驗證,不可能一樣快?

答案

硬體有對應概念,叫做「持續驗證」(Continuous Verification)或「持續整合設計」(Continuous Integration Design)。雖然實際製造出晶片要幾個月,但在 EDA 工具裡的功能模擬(Functional Simulation)和靜態時序分析(STA)可以在每次 RTL(暫存器傳輸層)改動後自動跑,類似軟體的單元測試,讓設計問題盡早被發現。

變形 5 評估指標

怎麼評估 CI 流程的健康程度?

直覺

導入 CI 之後,怎麼知道它運作得好不好?

答案

幾個關鍵指標:1. Pipeline 執行時間(Build Duration):理想是 2-5 分鐘,超過 10 分鐘就需要優化;2. 建置失敗率(Build Failure Rate):偶爾失敗是正常的(代表 CI 在做工),但超過 30% 代表程式碼品質有問題或測試太脆弱;3. 平均修復時間(Mean Time to Repair, MTTR):從 CI 紅燈到修好的時間,越短越好;4. Flaky Test Rate:隨機失敗的測試比例,超過 5% 就要清理。

07 延伸

想再往下看,這 5 個

出處

iPAS 經濟部產業人才能力鑑定 ・ 114 年第二次 iPAS AI 應用規劃師 中級 科目一 第 29 題

查看官方原文 PDF