跳到主要內容

DS 202 · 模組 2

可信 AI Data Science:驗證、重現與治理

把 Module 1 的 AI 協作循環延伸到 debugging、分層驗證、reproducibility 與 provenance、隱私與治理,最後走到一個可稽核的 Independent Lab。

開始第一節
已完成 0 / 5
同步我的進度加入梯次後,進度可跨裝置保存,講師也能看到

資訊

加入後,你已完成的模組編號會連同「學員代碼」傳送給講師,講師可以看到你的進度。請使用講師提供的代碼,不要輸入姓名、公司機密或其他個資。進度資料與該梯次的其他資料一起保存。

學習目標

  • 區分 syntax/runtime errors 與不會報錯的 silent analytical errors
  • 分層驗證來源資料、轉換、方法、輸出與文字聲稱
  • 記錄環境、資料版本、prompt、生成程式、修改與輸出
  • 判斷資料能否提供 AI;採資料最小化、去識別或合成資料
  • 交付分析、prompt log、code review/diff、驗證證據、限制與最終人工核准聲稱

Debugging:錯誤訊息不是唯一錯誤

40 分鐘

Debugging:錯誤訊息不是唯一錯誤

學習目標:區分 syntax/runtime errors 與不會報錯的 silent analytical errors。

「程式沒有報錯」常常被誤認為「分析沒有問題」。但一份分析程式碼可能完全順利執行,卻因為沒有先篩掉 draft 或 superseded 的列、把不同 unit(不同指標)的數值混在一起加總,或是某筆 record_id 因為重新提交而重複出現,導致同一筆資料被算了兩次,產生一個看起來正常、實際上錯誤的結果。這種錯誤 Python 不會報錯,只有靠人主動檢查才會被發現。

Runtime / Syntax Errors

  • 程式無法執行,Python 直接丟出錯誤訊息
  • 通常容易被發現,因為程式會停止
  • 常見原因:欄位打錯字、型態不符、除以零

Silent Analytical Errors

  • 程式順利執行完畢,沒有任何錯誤訊息
  • 只有結果本身不合理,或有人重新驗證才會被發現
  • 常見原因:未篩選 status、把不同 unit 的指標混在一起彙總、record_id 重複計算
一段會順利執行、但答案是錯的程式碼
import pandas as pd

df = pd.read_csv("DS202_Analysis_Package_Practice.csv", parse_dates=["period"])

# 沒有先篩選 status 為 validated,也沒有先依 unit 分組,
# 把不同指標(count、hours、usd...)的數值直接加總在一起
summary = df.groupby("group")["value"].sum()
print(summary)
# 程式完全不會報錯,但這個總和沒有任何業務意義
排查 silent error 的方法
方法在做什麼
列數核對篩選前後、groupby 前後的列數是否符合預期?
小樣本人工核算挑一小群資料自己手算,和程式輸出比對
邊界案例檢查刻意檢查極端值、缺值或重複 record_id 的處理方式
敏感度測試調整篩選條件或分組方式,看結論是否過度脆弱
用列數核對抓出 silent error

篩選前有 480 列,篩選後應該少於 480 列;如果篩選後的列數和篩選前一樣,代表篩選條件根本沒有生效。用這種簡單的列數核對,往往比重新讀一次程式碼更快抓到問題。

  • 篩選前後的列數,是否符合我的預期?
  • 我有沒有挑一小群資料,自己手算一次來比對?
  • 極端值、缺值、或重複出現的 record_id,被怎麼處理了?
  • 如果我換一種合理的篩選或分組方式,結論會不會完全變了?

注意

「這段程式碼可以跑」與「這段程式碼算出正確答案」是兩件完全不同的事。分析除錯不能只看有沒有出現錯誤訊息,還要主動核對列數、抽樣核算,並測試邊界案例。
自我檢測

一段分析程式碼完整執行完畢,沒有出現任何錯誤或警告訊息。這代表分析結果一定正確嗎?

一段分析程式碼完整執行完畢,沒有出現任何錯誤或警告訊息。這代表分析結果一定正確嗎?

重點: 能完成步驟不代表結果可信;本節的能力必須能被驗證、重做並清楚說明。

Verification Ladder:Data → Code → Method → Claim

45 分鐘

Verification Ladder:Data → Code → Method → Claim

學習目標:分層驗證來源資料、轉換、方法、輸出與文字聲稱。

只驗證「程式輸出的數字」是不夠的,因為錯誤可能發生在更早或更晚的環節:來源資料本身有沒有問題?轉換過程有沒有邏輯錯誤?選用的統計方法是否適合這份資料?最後,AI 或同事寫出的文字聲稱,有沒有比程式實際輸出的數字更誇大或更確定?Verification ladder 把驗證拆成四層,一層一層往上檢查。

Verification Ladder 的四個層級
層級要驗證什麼這份資料包的例子
Data(資料)來源資料的完整性、期間涵蓋範圍、已知限制是否涵蓋完整期間?sensitive_flag 與 source_version 的定義是否清楚?
Code(程式)轉換、篩選、聚合邏輯是否符合分析需求篩選條件是否正確套用?groupby 的欄位與聚合函式是否正確?
Method(方法)選用的統計或分析方法是否適合這份資料與問題用平均值還是中位數更能代表這組資料?樣本數是否足夠?
Claim(聲稱)最終文字結論是否忠實反映程式輸出,沒有過度延伸「A 組表現最差」是否只是這個期間的觀察,而非普遍結論?
從 Data 到 Code 的驗證範例
# Data 層:確認期間涵蓋範圍
df["period"].min(), df["period"].max()

# Code 層:確認篩選條件確實生效(只保留已核可、且屬於同一指標的列)
mask = (df["status"] == "validated") & (df["unit"] == "usd") & (~df["sensitive_flag"])
filtered = df[mask]
assert len(filtered) < len(df), "篩選條件可能沒有生效"

# Method 層:檢查資料是否高度偏態,決定平均或中位數是否合適
filtered.groupby("group")["value"].agg(["mean", "median", "std"])
Claim 層的落差範例

程式輸出是「A 組這個月平均略低於其他組,樣本數只有 8 筆」,但 AI 寫出的摘要卻是「A 組表現明顯且持續低於其他組」。Code 層完全正確,問題出在 Claim 層:文字聲稱比證據強烈太多。

  • Data:這份資料本身完整嗎?有沒有已知的限制?
  • Code:轉換與篩選邏輯,真的做到我要求的事了嗎?
  • Method:這個統計方法,適合這份資料和這個問題嗎?
  • Claim:最後寫出來的話,有沒有比數字本身更誇張?

注意

常見的失敗模式是:Code 層驗證得很仔細,卻直接跳過 Method 與 Claim 層。程式碼完全正確,但選錯統計方法,或是最後的文字結論比數字實際顯示的更肯定、更誇張。
自我檢測

AI 產出的摘要寫著「A 組的表現明顯且持續低於其他組」,但程式輸出只顯示 A 組在這一個月份的平均值略低於其他組,且樣本數很小。這個落差最適合用 verification ladder 的哪一層來檢查?

AI 產出的摘要寫著「A 組的表現明顯且持續低於其他組」,但程式輸出只顯示 A 組在這一個月份的平均值略低於其他組,且樣本數很小。這個落差最適合用 verification ladder 的哪一層來檢查?

重點: 能完成步驟不代表結果可信;本節的能力必須能被驗證、重做並清楚說明。

Reproducibility、Prompt Log 與 Provenance

35 分鐘

Reproducibility、Prompt Log 與 Provenance

學習目標:記錄環境、資料版本、prompt、生成程式、修改與輸出。

三個月後,主管問:「這個結論是怎麼算出來的?」如果沒有留下紀錄,你可能連自己都無法重現當初的分析:用的是哪一版資料?當時給 AI 的 prompt 是什麼?AI 生成的程式碼有沒有被手動修改過?Provenance(來源紀錄)就是把這些資訊留下來,讓分析可以被重現、被追蹤,也讓別人能看懂這個結論是怎麼得出來的。

Prompt / Code Provenance Log 應該記錄的欄位
欄位記錄的內容
環境Python 版本、主要套件版本(如 pandas)、執行日期
資料版本使用的檔案名稱與 source_version(例如 DS202_Analysis_Package_Clean.csv)
Prompt實際送給 AI 的完整 prompt 文字
AI 生成的程式碼AI 原始回覆的程式碼版本
人工修改你對 AI 生成程式碼做了哪些修改,以及修改的原因
最終輸出最終使用的程式碼版本與其產出的數字或圖表
在 Notebook 開頭記錄可重現性資訊
import sys, pandas as pd

print("Python:", sys.version)
print("pandas:", pd.__version__)
print("資料版本:DS202_Analysis_Package_Clean.csv")
print("Prompt 摘要:見 provenance log 第 3 列")
# 之後每一次修改 AI 生成的程式碼,都在 log 中新增一列,寫下修改原因
沒有 provenance 會發生什麼事

三個月後被問「這個數字怎麼算出來的」,卻發現沒有人記得當時用的是哪一版資料、prompt 寫了什麼,也不確定 AI 生成的程式碼有沒有被手動改過。重新分析後,數字和當初的結論不一樣,卻沒有人說得出原因。

  • 這次分析用的是哪一個版本的資料檔案?
  • 當時送給 AI 的完整 prompt 內容是什麼?
  • AI 原本生成的程式碼,哪些部分被人工改過、為什麼改?
  • 最終拿去做決策的那個數字,對應的是哪一版程式碼?

注意

沒有 provenance,一份分析就算當初是對的,也無法在事後被檢查、被重現、或被交接給別人。特別是當結論被拿去做重大決策時,「這個數字是怎麼來的」必須有紀錄可查。
自我檢測

記錄 prompt 與 AI 生成程式碼的 provenance log,最主要的價值是什麼?

記錄 prompt 與 AI 生成程式碼的 provenance log,最主要的價值是什麼?

重點: 能完成步驟不代表結果可信;本節的能力必須能被驗證、重做並清楚說明。

Privacy、Sensitive Data 與 AI Governance

35 分鐘

Privacy、Sensitive Data 與 AI Governance

學習目標:判斷資料能否提供 AI;採資料最小化、去識別或合成資料。

同事想把整份服務支援資料包貼給外部 AI 工具,方便它「看到全貌」。但資料裡的 sensitive_flag 欄位標記了某些列涉及需要特殊處理的資訊,這些列不應該未經授權就被送到外部服務。在把任何資料交給 AI 之前,第一個問題永遠是:「這份資料,可以離開原本的系統、被貼到這個工具裡嗎?」

把資料交給 AI 前的判斷步驟
步驟要確認的事
檢查授權與政策這份資料是否已被授權可以用於這個 AI 工具?所屬機構的規範是否允許?
檢查 sensitive_flag是否有列被標記為需要特殊處理?這些列是否必須被排除或另外處理?
資料最小化這次分析真的需要整份資料嗎,還是只需要彙總後的統計量?
去識別或合成能否用去識別化的欄位、彙總數字或合成資料,取代原始明細資料?
在把資料交給 AI 前先做最小化處理
# 錯誤做法:把整份含有 sensitive_flag 列的明細資料直接貼給外部 AI 工具

# 較安全的做法:先排除敏感列,並只提供彙總後的統計量
safe = df[~df["sensitive_flag"]]
aggregate = safe.groupby("group")["value"].agg(["mean", "count"])
# 只把彙總後的 aggregate 提供給 AI 工具,而不是逐列的原始明細
一個應該先暫停的情境

同事已經打開外部 AI 工具的視窗,準備把整份資料包貼進去,這時才發現裡面有好幾列 sensitive_flag 為真。這個時候應該先暫停貼上,回頭確認授權與資料最小化的做法,而不是先貼上去再說。

  • 這份資料、這個用途,是否已經被授權可以交給這個 AI 工具?
  • 裡面有沒有 sensitive_flag 為真的列?這些列會不會被一併貼上去?
  • 這次分析,是不是只需要彙總後的統計量,而不需要逐列明細?
  • 有沒有去識別化或合成資料的版本,可以取代原始明細?

注意

「這個 AI 工具很方便」不能取代「這份資料是否可以被送到這裡」的判斷。除非獲得授權,切勿將機密的機構資料、個人資料或標記為敏感的列,貼入 AI 工具或未經核准的環境。
自我檢測

你想請外部 AI 工具協助分析一份包含 sensitive_flag 為真的列的資料。最適當的第一步是什麼?

你想請外部 AI 工具協助分析一份包含 sensitive_flag 為真的列的資料。最適當的第一步是什麼?

重點: 能完成步驟不代表結果可信;本節的能力必須能被驗證、重做並清楚說明。

Independent Lab

55 分鐘

Independent Lab:可稽核的 AI-Assisted Workflow

學習目標:獨立交付分析、prompt log、code review/diff、驗證證據、限制與最終人工核准聲稱。

資訊

實作任務:使用實作資料,獨立選定一個分析問題,完整走過本課程的循環:Human Question → AI Proposal → Executable Analysis → Verification → Revision → Evidence,並交付一份可稽核的 AI-Assisted Workflow + Verification Record。沒有公布答案,你的推理過程與驗證才是被檢視的重點。
  1. 定義分析問題
    寫下你要回答的問題、對應的決策,以及會用到的欄位與其定義。
  2. 請 AI 提案並產生程式碼
    用結構化 prompt 請 AI 提出分析方法並實作,並保留完整 prompt 與原始輸出。
  3. Read before run 與 debug
    執行前逐項檢查程式碼,並區分語法錯誤與可能的 silent analytical error。
  4. 分層驗證
    依 verification ladder 檢查 Data、Code、Method、Claim 四個層級,至少各留下一項具體驗證紀錄。
  5. 記錄 provenance
    完成一份 prompt/code provenance log,記錄環境、資料版本、prompt、AI 輸出與你的修改。
  6. 確認隱私與治理
    檢查是否有 sensitive_flag 為真的列,並說明你如何處理(排除、彙總或去識別)。
  7. 交付最終聲稱
    寫下一個有界限、與證據一致的結論,並說明誰需要在使用前核准這個結果。
  • 一個清楚陳述的分析問題與對應決策
  • 完整的 prompt / code provenance log
  • 至少一項 code review 或 diff(AI 原始輸出與你修改後版本的差異)
  • 依 verification ladder 四層各至少一項驗證證據
  • 至少一項限制與一項隱私/治理判斷(是否有敏感列、如何處理)
  • 一個經過人工核准的最終聲稱,以及核准者角色的說明
一個不能被稽核的交付範例

某份交付只附上最終結論和一張圖表,沒有 prompt log、沒有分層驗證紀錄,也沒有寫出誰核准了這個結論。審核的人完全無法判斷這個數字是怎麼來的,也無法重新檢查任何一個步驟,只能退回要求補齊紀錄。

  • 我的 prompt log,能不能讓別人看懂 AI 當時到底被要求做什麼?
  • 我有沒有針對 Data、Code、Method、Claim 四層,各留下至少一項具體證據?
  • 我有沒有誠實記錄哪些判斷仍需要業務端或主管核准?
  • 如果現在被問「這個數字怎麼來的」,我能不能立刻找到答案?

注意

「AI 提案聽起來合理」不等於「這個工作流程可以稽核」。沒有 prompt log、沒有分層驗證紀錄、沒有清楚的人工核准說明,這份成果就無法被稽核或交接。

完成

如果 AI 協助撰寫分析程式碼或草擬結論文字,請自己逐項核對:prompt 與 context 是否完整、程式碼是否被你讀過並理解、驗證是否涵蓋 Data 到 Claim 四層,以及最終聲稱是否誠實反映限制而非過度承諾。AI 可以加快草擬速度;驗證與最終核准仍是人的責任。

重點: 能完成步驟不代表結果可信;本節的能力必須能被驗證、重做並清楚說明。

接下來做什麼?