iPAS 備考專區 登入

iPAS AI 應用規劃師 中級 科目一 AI 技術應用與規劃・114 年第二次・L21・第 27 題

巢狀 JSON 日誌怎麼做時序特徵萃取?

原題

某企業需分析半結構化的系統日誌(JSON 格式),以提取關鍵的時序特徵供故障預測模型使用。考量日誌結構複雜且包含巢狀欄位(Nested Fields),下列哪一種策略最有效且實務可行?

白話

一家企業的系統每天產生大量「日誌」(log),格式是 JSON。這些 JSON 結構很複雜,裡面有「欄位裡面還有欄位」(巢狀欄位,Nested Fields)的情況。

他們要從這些日誌裡抽出跟「時間順序」有關的特徵,用來預測系統故障。

問你:哪一種做法最有效且實務可行?

一句話總結

處理巢狀 JSON 日誌要做時序特徵的正確做法:先用遞迴函式把巢狀欄位展開,再按時間窗口切段、聚合成統計特徵,這樣才能同時保留結構資訊和時序規律。

情境

先感受問題:伺服器日誌長什麼樣

假設「雲端運算公司雷鳴科技」的伺服器每秒產生一筆 JSON 日誌,長這樣:

{

"timestamp": "2024-03-15T10:00:01Z",

"server_id": "srv-007",

"metrics": {

"cpu": {"usage": 87.3, "temp": 72},

"memory": {"used_gb": 14.2, "total_gb": 16},

"disk_io": {"read_mb": 230, "write_mb": 45}

},

"errors": [{"code": "E502", "count": 3}]

}

注意 metrics 裡還有 cpu、memory、disk_io,每個下面還有更多欄位。這就是「巢狀欄位」。

雷鳴科技想預測:未來 30 分鐘內伺服器會不會故障?

要預測故障,光有「某一秒的快照」不夠,必須看「過去 10 分鐘 CPU 使用率的趨勢」「過去 5 分鐘 E502 錯誤累積幾次」這類時序特徵。

舊方法

單純扁平化或直接塞 RNN 為什麼做不好

兩個直覺做法,都有各自的坑:

  1. 直接扁平化轉 CSV,計算均值次數:把巢狀結構壓平後,metrics.cpu.usage 雖然變成一個欄位,但扁平化只抓「這一瞬間」的值,再算均值也只是「10 分鐘內 CPU 的平均」,抓不到「CPU 從 40% 快速爬升到 87% 然後突然掉下來」這種趨勢模式,而故障往往出現在趨勢異常時。
  2. RNN 直接吃原始 JSON 字串:RNN 要吃「數值序列」,不能直接吃原始文字。把 JSON 當字串丟進去,模型看到的是 {"cpu" 這些字元,而不是數值,完全沒有意義。就算強行 tokenize,JSON 的括號、引號也是雜訊,不是信號。
  3. 只留時間戳記,其他都丟:把所有感測器數據都丟掉,只剩「幾點幾分」,根本無法預測故障。時間本身不是故障原因,異常的 CPU 溫度和錯誤碼才是。
  4. 巢狀欄位沒有統一展開,部分遺漏:如果手動一層一層取欄位,很容易漏掉某個深層欄位,或者碰到 errors 這種陣列(array)不知道怎麼處理。
  5. 時間窗口沒有設計:不管是扁平化還是其他方法,如果沒有「時間窗口」的概念,就只能用單筆快照做預測,完全沒有時序資訊。

新方法

遞迴展開 + 時間窗口聚合,怎麼解

回到雷鳴科技。正確做法分兩個步驟:

步驟一:遞迴函式展開巢狀欄位

寫一個函式,從 JSON 的最外層開始往內走,碰到「欄位的值還是一個字典」就繼續往下走,直到拿到純數值為止。展開後變成:

metrics.cpu.usage = 87.3

metrics.cpu.temp = 72

metrics.memory.used_gb = 14.2

metrics.disk_io.read_mb = 230

errors.E502.count = 3

步驟二:按時間窗口聚合

把過去 10 分鐘(600 筆)的展開欄位,按「時間窗口」切成一個特徵向量:

cpu_usage_mean = 71.2 (10 分鐘平均)

cpu_usage_max = 87.3 (10 分鐘最高)

cpu_usage_slope = +2.3 (上升趨勢)

E502_count_sum = 12 (10 分鐘累積錯誤數)

這樣就同時捕捉到「目前狀態」和「過去 10 分鐘的趨勢」,把它們送進故障預測模型,準確率大幅提升。

這就是選項 C 講的:設計遞迴函式展開巢狀欄位,並基於時間窗口(Time Window)進行聚合與特徵萃取。

錯選項

為什麼其他選項是錯的

A先將 JSON 資料扁平化轉成 CSV,再對欄位計算統計量(如均值、次數)作為特徵

字面在說什麼

把 JSON 壓平成一張二維表格(CSV),再對每個欄位算平均值、次數,當作特徵送進模型。

為什麼不對

「扁平化轉 CSV」和「計算統計量」這兩個步驟本身都沒有錯,問題是這個選項沒有提到時間窗口。題目明確說要「時序特徵」,但 A 的統計量是針對整個資料集算的(例如所有時間的 CPU 均值),不是「過去 10 分鐘的趨勢」,抓不到時序規律,無法支撐故障預測。

誰會選錯

做過資料清理、知道「JSON 要先轉 CSV」的考生,看到 A 覺得很熟悉就選了。記住:缺了「時間窗口」的聚合,算出來的統計量沒有時序意義,不是「時序特徵」。

B使用遞歸神經網路(RNN)直接輸入原始 JSON 字串進行時序特徵抽取

字面在說什麼

把 JSON 原始文字當成序列,直接餵進遞歸神經網路(Recurrent Neural Network,RNN)讓模型自己學特徵。

為什麼不對

RNN 的輸入是數值向量,不是文字字串。原始 JSON 字串裡充滿大括號、引號、冒號等結構字元,模型看到的是字元序列,而不是感測器數值。要讓 RNN 有意義地學時序模式,必須先把 JSON 轉成數值特徵,不能直接丟字串。這個選項跳過了最關鍵的特徵工程步驟。

誰會選錯

知道「時序資料要用 RNN」的考生,看到「時序特徵」就想到 RNN,再看到「直接輸入」覺得省事就選了。記住:RNN 解決的是模型架構問題,但資料前處理(把 JSON 轉成乾淨數值)是另一個問題,不能跳過。

D只保留時間戳記欄位,忽略其他巢狀內容以簡化特徵工程

字面在說什麼

把 JSON 裡只有「幾點幾分」這個欄位留下來,其他的感測器數據、錯誤碼全部忽略,以減少工程複雜度。

為什麼不對

故障預測需要知道「伺服器在哪個時間點的狀態是什麼」,時間戳記只告訴模型「現在是幾點」,完全沒有狀態資訊。把 CPU 溫度、記憶體使用率、錯誤碼全部丟掉,就像只看「今天是星期幾」就要預測「這個人今天會生病嗎」,根本做不到。

誰會選錯

被「簡化特徵工程」這個說法吸引,覺得「少做點事也算一種方法」的考生。記住:簡化本身沒有錯,但如果簡化掉了所有有意義的資訊,模型就失去預測能力,這不是工程取捨,而是根本做不出來。

變形題

同個考點下次怎麼變形

延伸

想再往下看,這 5 個

答案、題目或解析有問題?回報這題

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

看官方原文 PDF

原題 © 經濟部產業發展署,AITerms.tw 僅作教學解析使用,本站解析以 CC BY-NC-SA 4.0 授權。