跳到主要內容

DS 302 · 模組 1

Data Agent 架構:意圖、工具、資料與語意

從判斷何時真的需要 Agent 出發,先把需求轉成分析計畫再執行,給 Agent 窄範圍、allowlisted 的工具,把 metrics 固定在可信的 semantic layer 上,再於 Guided Lab 建立可驗證的 read-only prototype。

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

資訊

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

學習目標

  • 判斷何時需要 Agent,區分自然語言介面與自主分析行動
  • 把需求轉成實體、指標、篩選、期間、分析計畫、證據與 approval needs
  • 使用 allowlisted、窄介面的工具,分離 read 與 write/action tools
  • 以可信 semantic layer 固定 metrics、dimensions、definitions、join paths、units 與 policy
  • 建立 read-only prototype:規劃、查詢、必要時跑 Python、標示資料版本並驗證 totals

Data Agent 是什麼:與 Chatbot / BI / Workflow 的差異

40 分鐘

Data Agent 是什麼:與 Chatbot / BI / Workflow 的差異

學習目標:判斷何時需要 Agent,區分自然語言介面與自主分析行動。

一位主管在對話框打「為什麼六月的轉換率掉了」,並期待一分鐘內得到一個可信、有來源的答案。固定的 BI dashboard 沒辦法回答開放式的追問;沒有資料存取能力的 chatbot 只能用猜的;排程好的 workflow 只能跑它原本被設計要跑的那份報表。Data Agent 介於三者之間:它用自然語言理解需求、規劃需要哪些資料與工具、在有限範圍內執行 read(有時也包含 write)動作,並附上證據回答。多出來的能力也代表多出來的風險,所以第一個設計決策不是「怎麼蓋這個 agent」,而是「這個需求真的需要 agent 嗎,還是 dashboard 或固定 workflow 更安全、也已經足夠」。

Chatbot、BI dashboard、workflow 與 Data Agent 的差異
系統能回答全新的問題嗎?能存取受控資料/工具嗎?典型風險
Chatbot(無資料存取)聽起來流暢,但可能捏造數字不能自信地給出錯誤答案
BI dashboard只能用預建的檢視/篩選能,但範圍固定且事先核准無法回答開放式問題
排程 workflow不能,每次都跑一樣的步驟能,但範圍窄、只服務單一工作不夠靈活,但安全且可稽核
Data Agent能,依需求動態規劃能,透過受控、有權限的工具需要明確的驗證、權限與核准機制
本課程的資料集(透過 Agent 查詢的受控分析沙盒)
import pandas as pd

# clean:本課程使用的受控分析沙盒的一份 read-only 查詢紀錄
df = pd.read_csv("DS302_Analytics_Package_Clean.csv", parse_dates=["event_time", "ingested_at"])
df.shape
df.dtypes
df[["run_id", "source_system", "batch_id", "metric", "value", "schema_version"]].head()

# 先問:這裡真的需要動態規劃的 agent 嗎,還是固定 dashboard 就能回答?
df["source_system"].unique()

把 chatbot 直接接上資料

「直接把 chatbot 接上資料庫,讓它什麼都能答」。沒有人決定過哪些問題真的需要動態規劃、它可以呼叫哪些工具,以及一個可信的答案需要什麼證據。

有理由存在的 Data Agent

動態規劃的必要性
需求真的多樣到固定 dashboard 或 workflow 無法涵蓋。
受控存取
Agent 只能透過明確、有權限的介面接觸資料/工具,而非未受限的原始存取。
可驗證的答案
每個答案都能追溯回特定的查詢、資料版本與定義。
  • 問題的範圍幾乎每天都在變,新的問題無法用現有 dashboard 的篩選器拼出來。
  • 需要在多個資料來源之間動態判斷該查哪一個,而不是永遠查同一張固定的表。
  • 答案必須附上可追溯的查詢與資料版本,而不只是一個單獨的數字。
  • 需要在執行前先徵求人工核准的分支邏輯,排程 workflow 本身無法表達這種條件判斷。
  • 如果固定的 dashboard、報表或 workflow 已經能在可接受的時間內回答大多數問題,就不需要 agent;多加一層 agent 只會多一層風險,卻沒有對應的好處。
實際情境:這個需求真的需要 Agent 嗎?

財務團隊每週都問「哪個 source system 的 batch 完成率最低」,但關心的欄位、期間與 source_system 清單幾乎每次都不同。固定 dashboard 需要為每一種組合預先建立檢視表,維護成本很高;這正是 Data Agent 動態規劃的典型情境,但仍必須給它窄範圍的 read-only 工具,而不是整個資料庫的存取權。

資訊

Human, AI, Human:人決定這個需求是否真的需要 agent、以及它可以使用哪些工具;agent 在這個範圍內規劃並執行;人驗證答案並對後續決策負責。
自我檢測

一個團隊想讓 chatbot 用一個沒有任何限制的通用 SQL 工具,回答任何關於正式資料庫的問題。這個計畫最根本缺少的是什麼?

一個團隊想讓 chatbot 用一個沒有任何限制的通用 SQL 工具,回答任何關於正式資料庫的問題。這個計畫最根本缺少的是什麼?

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

Intent → Analysis Plan:先規劃再執行

45 分鐘

Intent → Analysis Plan:先規劃再執行

學習目標:把需求轉成實體、指標、篩選、期間、分析計畫、證據與 approval needs。

學員問 agent「我們這一季表現怎麼樣」,agent 立刻發出一個查詢。表現什麼、對誰而言、哪一段期間、跟什麼基準比?一個模糊的需求如果立刻被執行,只會得到一個模糊、無法驗證的答案。Agent 在呼叫任何工具之前,應該先把需求轉成明確的分析計畫:牽涉哪些實體與指標、適用哪些篩選與期間、要用什麼步驟得出答案、需要什麼證據才能讓人信任這個結果,以及是否有任何步驟需要先經過人工核准。

從模糊需求到明確的分析計畫
# 模糊:沒有計畫,直接執行
# 「我們這一季表現怎麼樣」-> agent 亂猜一個查詢就回傳數字

# 有規劃:先拆解需求,才開始執行
plan = {
    "entities": ["source_system"],
    "metrics": ["conversion_rate", "active_users"],
    "filters": {"schema_version": "v2"},
    "time_range": "2026-Q2",
    "steps": ["load current-quarter rows", "validate against contract", "aggregate by source_system"],
    "evidence_required": ["row count", "dataset_version", "definition of conversion_rate"],
    "approval_needed": False  # read-only 彙總;若是 write/publish 動作則應為 True
}
執行前計畫必須解決的六件事
要素回答的問題
實體 (Entities)這個問題牽涉哪些維度(來源系統、部門、時間)?
指標 (Metrics)哪些可信、有定義的指標能回答這個問題?
篩選 (Filters)實際在範圍內的是哪個子集合的資料?
期間 (Time range)哪一段期間,比較的基準是什麼?
證據需求答案要附上什麼才算可信(列數、資料版本、定義)?
Approval needs有沒有任何步驟需要人工在執行前先核准?
  1. 把需求改寫成一個問題
    在選擇任何工具之前,先把自由文字轉成具體、可檢查的問題。
  2. 解析實體、指標、篩選、期間
    明確填入每一項;如果資訊不足,應該詢問而不是用猜的。
  3. 列出證據需求
    事先決定最終答案必須附上什麼,才能被視為可信。
  4. 標示 approval needs
    把任何寫入、發布或有實質影響的步驟標記為需要人工核准。
  • 把「這一季」解讀成 agent 自己決定的任意 90 天,而不是財務日曆真正定義的那一季。
  • 把一個部門問的「使用者」,誤用成另一個部門對「使用者」的定義。
  • 沒有要求任何 evidence,就把彙總後的單一數字當作最終答案直接呈現。
  • 遇到範圍不清楚的請求時,用一個「看起來合理」的假設悄悄填補,而不是回頭詢問提問者。
規劃前後的對照

需求「這一季轉換率如何」被規劃成 entities=[source_system]、metrics=[conversion_rate]、filters={schema_version: v2}、time_range=2026-Q2 之後,才可以被執行與驗證;如果連 schema_version 都沒有固定,同一個問題在不同時間執行可能回答出兩個不能互相比較的答案。

注意

沒有先規劃就執行的 agent 不是「比較快」,而是不可驗證。如果沒有人能指出答案是根據哪些實體、指標、篩選與證據得出的,不管語氣多自信,這個答案都不能被信任。
自我檢測

一位學員問 Data Agent「我們這一季表現怎麼樣」,agent 立刻回傳一個數字,沒有任何說明。最重要缺少的是什麼?

一位學員問 Data Agent「我們這一季表現怎麼樣」,agent 立刻回傳一個數字,沒有任何說明。最重要缺少的是什麼?

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

Tool Layer:SQL、Python、Retrieval 與 APIs

45 分鐘

Tool Layer:SQL、Python、Retrieval 與 APIs

學習目標:使用 allowlisted、窄介面的工具,分離 read 與 write/action tools。

同事給 agent 一個通用的「run_sql」工具,可以接受任何查詢字串,所以它除了能讀取資料,也能 DROP 一張表,或讀到原本不該碰到的資料表。窄範圍的 tool layer 就是讓 Data Agent 的能力精準對齊「真正被核准的範圍」的那道邊界:與其給一個萬能的 SQL 工具,不如給 agent 好幾個窄範圍的工具,每一個都有明確的 schema、明確的用途,以及固定的 read-only 或 write/action 分類。

從一個不受限的工具到窄範圍、allowlisted 的工具
# 錯誤做法:一個工具接受任意 SQL,不分 read 或 write,可碰任何資料表
def run_sql(query: str) -> pd.DataFrame:
    return db.execute(query)  # 沒有 allowlist,沒有分離 read/write

# 正確做法:窄範圍、目的明確、有明確 schema 的 read-only 工具
def query_metric_summary(source_system: str, metric: str, time_range: str) -> pd.DataFrame:
    """Read-only。只能查詢事先核准的 analytics_sandbox 檢視表。"""
    ALLOWED_SOURCE_SYSTEMS = {"crm", "billing", "support", "web_analytics", "ops"}
    if source_system not in ALLOWED_SOURCE_SYSTEMS:
        raise ValueError(f"source_system not allowlisted: {source_system}")
    return sandbox_view.query(source_system=source_system, metric=metric, time_range=time_range)

def publish_report(report_id: str, content: dict) -> None:
    """Write/action 工具。執行前需要人工核准(見第 9 節)。"""
    raise PermissionError("publish_report requires an approved run; see approval workflow")
窄範圍工具 schema 如何降低風險
寬鬆工具的風險窄範圍 schema 如何幫忙
一個「read」請求卻意外造成 write/deleteRead 與 write/action 工具是分開的 function,權限也分開
查詢到未核准的資料表或來源明確的 allowlist 拒絕任何超出核准範圍的請求
agent 可能傳入無法預期的參數窄範圍、型別明確的 schema 限制了 agent 能嘗試傳入的內容
無法追查是哪個工具造成問題每一次工具呼叫都有各自的名稱並被記錄下來
  • 每個工具只做一件被清楚命名的事,名稱本身就是它的使用範圍說明。
  • Read 工具與 write/action 工具必須是不同的 function,擁有各自的權限與各自的 allowlist。
  • 參數使用明確型別與列舉值,而不是接受自由格式字串讓 agent 自己拼查詢條件。
  • 任何未被明確核准的 source_system、資料表或欄位,預設一律拒絕,而不是預設允許。
  • 每一次工具呼叫都要被記錄,包含呼叫者、參數與資料版本,才能在事後被稽核。
一個被拆開的工具目錄

與其給一個 run_sql,課程使用的沙盒提供 query_metric_summary(唯讀)、list_source_systems(唯讀)與 publish_report(write/action,需要核准)三個獨立工具,每個都有自己的 schema 與分類,agent 無法用其中一個工具做到另一個工具才被允許做的事。

注意

一個「什麼都能做」的工具在開發上很方便,但在營運上很危險。如果一個工具的名稱無法精確描述它被允許碰觸的範圍,就應該假設它的範圍太寬。
自我檢測

Agent 被賦予一個通用的「run_sql」工具,可以對任何資料表執行任意查詢,不論 read 或 write。這種設計最主要的風險是什麼?

Agent 被賦予一個通用的「run_sql」工具,可以對任何資料表執行任意查詢,不論 read 或 write。這種設計最主要的風險是什麼?

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

Semantic Layer 與 Trusted Metrics

45 分鐘

Semantic Layer 與 Trusted Metrics

學習目標:以可信 semantic layer 固定 metrics、dimensions、definitions、join paths、units 與 policy。

兩個部門同一天問 agent「轉換率」,卻得到兩個不同的數字,因為一個團隊的查詢把退款訂單算進去,另一個沒有,而且沒有人把任何一種定義寫下來。如果沒有共用的 semantic layer,一個可以自由寫 SQL 的 agent,每一次都會悄悄地重新發明每個指標的定義。Semantic layer 把 metric 公式、dimension 定義、join path、units 與存取政策固定在同一個地方,agent 必須查詢它,而不是自己猜。

透過 semantic catalog 解析指標,而非隨手寫 SQL
SEMANTIC_METRICS = {
    "conversion_rate": {
        "formula": "converted_sessions / total_sessions",
        "unit": "ratio (0-1)",
        "owner": "analytics-platform-team",
        "grain": "source_system x batch_id"
    },
    "active_users": {
        "formula": "count(distinct entity_id where last_event <= 30 days)",
        "unit": "count",
        "owner": "analytics-platform-team",
        "grain": "source_system x batch_id"
    }
}

def resolve_metric(name: str) -> dict:
    if name not in SEMANTIC_METRICS:
        raise ValueError(f"metric not in semantic layer, cannot resolve a trusted definition: {name}")
    return SEMANTIC_METRICS[name]
Semantic layer 固定住、不讓 agent 自行發揮的內容
要素為什麼必須集中固定
Metric 公式同一個指標名稱在任何地方都必須代表同一種計算方式
Dimension 定義像「active」或「本季」這類分類必須有一個共同認可的意義
Join pathsAgent 不應該自己發明資料表之間的關聯方式
Units同一個比率被報成百分比還是小數,答案可能差 100 倍
存取政策哪些角色能看到哪些指標/維度,與定義存放在同一個地方一起被強制執行

沒有 semantic layer

  • 每個團隊、甚至每一次查詢,都重新定義同一個指標名稱。
  • Join path 由 agent 自己猜,不同次執行可能用不同的資料表關聯方式。
  • 單位混用(比例 vs 百分比),答案可能相差 100 倍卻沒有人發現。

有可信 semantic layer

  • 指標公式、owner 與 grain 集中定義,所有查詢都指向同一個來源。
  • Join path 由 semantic layer 固定,agent 只能選擇已核准的路徑。
  • 單位與存取政策跟定義放在一起,被一致地強制執行。
一次因為沒有 semantic layer 而發生的分歧

Billing 團隊把 conversion_rate 定義成 converted_sessions / total_sessions,Marketing 團隊卻把退款訂單排除在分母之外,兩份報告同一天呈現給管理層,數字卻不一致;導入 semantic layer 的 resolve_metric 之後,兩個團隊的查詢都必須透過同一個公式解析,分歧才消失。

資訊

當 agent 只能透過 semantic layer 解析指標時,「conversion_rate」不論是哪個部門、哪一次 session、哪一次 agent 執行提出的問題,意義都一致。
自我檢測

兩個部門同一天問 Data Agent「轉換率」,卻得到兩個不同的數字,因為 agent 每次都重新寫一段 SQL。這背後最根本的設計缺口是什麼?

兩個部門同一天問 Data Agent「轉換率」,卻得到兩個不同的數字,因為 agent 每次都重新寫一段 SQL。這背後最根本的設計缺口是什麼?

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

Guided Lab:可驗證的 Read-Only Data Agent

65 分鐘

Guided Lab:可驗證的 Read-Only Data Agent

學習目標:在教師引導下,建立 read-only prototype:規劃、查詢、必要時跑 Python、標示資料版本並驗證 totals。

資訊

實作問題:如果同事問你的 prototype 同一個問題兩次,它每次都會產出計畫、查詢、資料版本與驗證步驟,還是只會回傳一個數字?
  1. 規劃 (Plan)
    針對一個範例需求,在寫任何查詢之前先寫出實體、指標、篩選、期間與證據需求。
  2. 查詢 (Read-only)
    只呼叫窄範圍、allowlisted 的 read 工具查詢沙盒,絕不使用通用查詢工具。
  3. 必要時執行 Python
    如果工具本身的輸出還需要進一步彙總,把邏輯獨立成一個小而明確的 function。
  4. 標示資料版本
    把 schema_version 與實際使用的列數,跟答案一起記錄下來。
  5. 驗證 totals
    在呈現答案前,至少用一個獨立的預期值交叉檢查一項總計。
Guided Lab 應包含的最少內容(請填入你自己的輸出結果)
項目要回報的內容
分析計畫你在查詢前寫下的實體、指標、篩選、期間與證據需求
Read-only 工具呼叫你呼叫了哪個窄範圍工具,以及它強制執行了什麼 allowlist
標示的資料版本你的答案是根據哪個 schema_version 與列數得出的
執行的驗證你在信任這個總計之前執行了什麼獨立檢查
仍待人工判斷的項目至少一項需要業務端確認的假設或決策
  • 直接呈現彙總後的數字,卻沒有記錄用到的 schema_version 與列數。
  • 只做一次查詢就假設結果正確,沒有用第二個獨立方法交叉檢查總計。
  • 把「程式沒有報錯」當成「邏輯正確」的證明,而沒有實際檢查輸出是否合理。
  • 省略了「如果換一個人重跑,會得到同樣答案嗎」的自我檢查。

注意

「查詢執行完並回傳一個數字」不等於「答案已被驗證」。每個 prototype 的答案都需要標示資料版本並通過獨立驗證步驟,否則還不能算可信。

完成

完成後請自問:如果換一個人,能不能在同一個資料版本上重跑你 prototype 的計畫與查詢,得到同樣已被驗證過的答案?
自我檢測

你完成了 Guided Lab,你的 prototype 回傳了一個附有計畫與標示資料版本的答案,但你從未用獨立的預期值檢查過回傳的總計。這樣算完成本節的核心能力嗎?

你完成了 Guided Lab,你的 prototype 回傳了一個附有計畫與標示資料版本的答案,但你從未用獨立的預期值檢查過回傳的總計。這樣算完成本節的核心能力嗎?

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

接下來做什麼?