iT邦幫忙

2026 iThome 鐵人賽

DAY 30
0
AI 自動化

AaaS from Scratch: 從一次性定義,到規模化分析系列 第 30 篇

[Day 30] Define Once, Analyze at Scale:這30 天我們做出什麼?

  • 分享至 

  • xImage
  •  

資料分析自動化已經行之有年,固定的 query 可以寫成 SQL / Python 定期執行,BI 工具也早就可以把 dashboard 定義好,再 scheduled refresh。

現在有 Coding Agent,Data Analyst、Product Manager 或其他 technical user,要臨時寫一段 SQL、Python 或產 report,也比以前容易很多。

所以這 30 天想做的,其實不是:

怎麼讓 Agent 幫我們做資料分析?

而是:

怎麼盡量減少資料分析裡重複性的工作,讓真正有意義的分析可以更早開始?

誰會使用這個平台?

target user 不一定是不會 SQL 的人,Product Manager、Operations、Finance 或其他 domain user,很多本來就會 SQL,甚至自己就能完成不少分析。

問題不在於會不會,而是每次做分析時,除了 query 本身,還有很多事情要處理:

  • datasource 在哪裡
  • schema 是什麼
  • business rule 怎麼定義
  • code 在哪裡跑
  • dependency 怎麼準備
  • output 怎麼保存
  • 同一個分析之後怎麼重跑
  • datasource 換掉後還能不能用
  • 修改過的版本結果有沒有變
  • 多個分析怎麼組成一份 report
  • execution resource 怎麼安排

Coding Agent 可以幫忙完成其中很多 task,但如果每次都要重新把這些東西組起來,時間成本是很可觀的。

特別當一些需求是有時效性的,越快越有價值,因此這個平台的目的在於把這些細節串接起來,希望未來不用再花額外的時間做重複的事情。

Analysis 可以先被建立,也可以現場產生

常見的分析,可以先由 Data Analyst 或 domain expert 做成 saved Analysis。

例如:

  • Weekly Active Users
  • Conversion Funnel
  • Session Length
  • Revenue Breakdown

其他人之後可以直接 reuse。

Known Question
→ Saved Analysis
→ Run
→ Report

但實際工作不可能全部都是預先定義好的問題。

譬如今天 user 可能突然想問:

Mobile user 最近 session 變短,是哪些 event type 改變了?

如果沒有現成 Analysis,他不一定要先去找 Data Analyst,也不一定要另外開 Coding Agent,自己確認 database 有沒有正確 expose。

他可以直接在平台裡問 Agent 這些細節,或是直接叫他確認。

畢竟平台本來就已經包含:

  • 有哪些 datasource
  • schema 怎麼取得
  • 有哪些 domain Skills
  • code 要在哪個 sandbox 執行
  • resource limit 是多少
  • report 怎麼產生

如果只是一次性的問題,跑完就結束。

如果後來發現這個問題會一直出現,再把它存成新的 Analysis。

Existing Analysis
→ Reuse

New Question
→ Explore
→ Run
→ Save if reusable
→ Analysis Library grows

所以 Data Analyst 的角色沒有消失,他們可以建立、review、維護比較重要的 Analysis,差別只是其他 user 不需要因為每一個新問題,都先排進 Data Analyst 的工作 queue。

從 Conversation 到 Analysis

前面幾天最重要的一個決定,是讓 Agent 不只回傳答案,而是產生 executable code。

因為 code 可以:

  • inspect
  • rerun
  • test
  • validate
  • version

使用者(Human)在 conversation 裡補 business rule,datasource 提供實際資料,最後才得到一個確認過的 Analysis。

Analysis
=
Intent
+
Confirmed Code
+
Output Guidance

Save 之後,它就不再只是某次 conversation 的結果,而是一個可以重新執行的 artifact。

Generated Code 不直接跑在 Backend

既然 code 是動態產生的,就不能直接丟進 backend process 執行,畢竟還是會有危險程式碼的疑慮。

所以後來加入 Sandbox,把 execution 和 application 本身分開。

我們逐漸建立 Sandbox 的管理系統,例如:

  • lifecycle
  • idle cleanup
  • capacity
  • memory limit
  • execution metrics
  • OOM handling
  • warm sandbox
  • scaling

我們預期遇到 OOM 時,不是直接換更大的 sanbox,而是先理解需要多少infra,然後透過 rewrite execution strategy 來優化,真的還是不夠,再換較大的 sandbox。

Run
→ Measure
→ Rewrite
→ Scale if needed

Context 不需要每次全部塞回去

Conversation 變長之後,另一個問題是 context。

完整 history 當然可以保存,但如果每次 request 都全部送進 model:

  • token 會一直增加
  • old tool calls 會佔掉大量 context
  • 舊結果也可能影響新的 analysis

隨著 conversation 越來越長,context window 會被大量歷史訊息和 tool results 佔掉。

恰好這次競賽期間 TypesafeAI 推出了 Jev。

它的輸出方式和一般 LLM 不太一樣,很適合拿來做 bounded classification,例如:

  • 哪個 Skill 比較 relevant
  • 哪些 history turns 和目前 request 有關

所以後來把它用在:

  • Skill Routing
  • Context Management

Conversation history 還是完整保留,只是每次真正進 context window 的內容會先做 selection。

Full History
→ Relevant Turns
→ Agent Context

實際測試也看到,conversation 越長,這個優化效果越明顯。

這邊潛在的風險是,在更專業或低容錯的領域,Jev 能不能維持同樣的表現還需要更多測試。Context selection 一旦漏掉重要資訊,省下 token 的同時也可能影響結果。

Save Analysis 之後,問題才真正開始

Analysis 可以保存之後,很快就碰到下一件事:

同一份 recipe 換到另一個 datasource,還跑得動嗎?

Schema compatible 不代表 execution strategy compatible。

小資料上把幾百萬 rows 拉進 sandbox 可能沒事,換到 production-sized table 就可能直接 OOM。

所以後來加了:

  • Pre-run Check
  • Finding
  • Rewrite
  • Validation

System 像是醫院檢傷分類一樣先歸類問題,:

  • data movement
  • sandbox memory
  • runtime

再讓 Agent 針對那個問題 rewrite。

但 rewrite 完不能直接存。

Candidate 還要和原本版本在同一份資料上比較 output,確認 calculation 沒被改掉,通過後才存成下一個 version。

因此一個 Analysis 最後不只是 code,還有:

  • recipe
  • versions
  • runs
  • validation
  • optimization history
  • lineage

一個 Analysis 不夠,就組成 Workflow

實際 report 通常不只有一張 chart。

所以後來把多個 saved Analysis 組成 Workflow。

Analysis
   ↓
 Batch
   ↓
 Report

Workflow 本身沒有另外做一套 execution engine,每個 node 還是走原本的 Analysis runtime,換句話說 Workflow 整合了前面所做的:

  • validation
  • datasource mapping
  • sandbox
  • measurements

Parallel Execution 之後才看到真正的 Bottleneck

Scaling up 碰到的第一個問題是如果有很多分析要執行,要怎麼做才是最優組合?

第一次同時跑 7 個 Analysis,整個 Workflow 花了 51 秒,但所有 script 加起來 CPU time 只有大約 7 秒,所以我們建了 Performance Page 來找出瓶頸在哪邊。

拆解之後發現主要時間其實花在:

  • sandbox startup
  • repeated sandbox creation
  • sandbox round trips
  • waiting

因此我們希望減少開新 Sandbox 的次數,讓原本的可以繼續使用,所以後來才改成:

  • reusable lanes
  • longest first
  • fetch data early
  • startup overlap
  • fewer sandbox calls
  • warm sandboxes

最後同樣 7 個 Analysis:

  • 51s → 16s
  • 7 sandboxes → 2 reusable lanes

Analysis 本身幾乎沒有改,改的只是怎麼去規劃執行他們。

最後再把 Workflow 接回 Chat

到 Day 29,Analysis、Workflow、Report、Scheduler 都已經存在。

所以最後把它們再接回 Chat。

User 可以直接說:

幫我做一份 Monday Report,把 Users、Content、Business 分成三個 section,然後直接跑。

Agent 會:

  • 找 saved Analyses
  • 建 Workflow
  • 設 datasource
  • 建 sections
  • run
  • 在 Chat 顯示 live canvas

需要進一步修改時,再按 Open workflow 回到完整 Workflow page。

這時候 Chat 比較像整個平台的入口,可以在這邊做絕大部分的操作。

而 Deterministic 的部分如:execution、validation、versioning、scheduling,仍然由後面的 system 負責。

不是所有事情都需要交給 Agent,越 deterministic 的工作,越適合留在 code 裡。

回頭看這 30 天

把段時間的東西放在一起後,是一個完整規模化數據分析的 lifecycle:

Ask a Question
↓
Explore with Data
↓
Create Analysis
↓
Save
↓
Validate
↓
Version
↓
Reuse
↓
Compose Workflow
↓
Schedule / Execute
↓
Measure
↓
Optimize
↓
Report

BI、SQL、Python、Coding Agent 都已經能解決其中一部分。

這次做的事情,是把這些原本分散的能力放進同一個 Analysis lifecycle 裡,常見問題可以直接 reuse,新的問題可以直接探索,不斷重複執行的再變成下一個 reusable Analysis。

這也是整個系列的標題:

Define Once, Analyze at Scale.


上一篇
[Day 29] Build Workflow from Chat
系列文
AaaS from Scratch: 從一次性定義,到規模化分析 共 30 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言