LLM 結構化分析平台:從歷史脈絡找到真正的新事件

取得歷史背景之後,下一步不是直接問模型「這則新聞重要嗎」,而是讓模型理解當前資訊與歷史事件之間的關係,再轉換成後續系統可使用的固定欄位。

為什麼需要 LLM 進一步理解事件

前一階段建立的 RAG retrieval pipeline,讓新的金融資訊進入系統時,可以先從歷史資料中找出與它相關的過往內容。但取得歷史背景之後,還需要進一步判斷:現在收到的這則資訊,相較於過去已經知道的內容,究竟帶來了什麼新的變化?

即時資訊流中並不是每一則新發布的消息都代表新的事件。同一件事情可能被不同來源反覆報導,也可能在事件發展過程中持續出現後續消息;有些更新只是重複已知資訊,有些則真正加入了可能改變市場判斷的新內容。

單純依靠關鍵字或文字相似度,很難處理這類差異。兩則文字寫法不同的新聞可能描述同一件事情,而兩則看似相近的新聞,也可能因為其中一個關鍵進展而具有完全不同的意義。

因此,我們在 historical retrieval 之後加入大型語言模型,利用 LLM 的文意理解能力,同時閱讀當前資訊與相關歷史資訊,判斷目前這則消息在既有事件脈絡中的位置。

我們並沒有直接要求模型回答「這則新聞重要嗎?」這樣的問題過於主觀,也很難直接成為後續程式的判斷依據。相反地,我們把實際關心的幾個資訊維度拆成固定欄位,讓模型先理解事件,再描述這則資訊的類型、新穎程度與可能影響。最終希望解決的是:從持續進入系統的大量新訊息中,進一步找出真正帶來新資訊,而且可能具有較大市場影響的內容。

提供給模型的 Context

要判斷一則新聞是不是「新的資訊」,只看當前新聞本身是不夠的。因此,每次進行分析時,我們除了提供 Current News,也會加入前一階段 retrieval pipeline 找出的 Related Historical News,讓模型知道過去曾經出現過哪些與目前事件相關的內容。

其中最重要的是 Current News 與 Related Historical News 之間的關係。Related Historical News 來自上一篇建立的 retrieval pipeline。系統會先利用 embedding 與 BM25 從歷史資料中找出與當前內容較相關的新聞,再將排名較高的結果提供給模型。

這些資料並不代表「一定是同一事件」,而是提供一個有限範圍的歷史背景。LLM 再利用文意理解能力,比較當前資訊與這些歷史內容,判斷目前描述的是既有事件的重複資訊、事件後續,還是歷史資料中尚未出現的重要進展。

LLM 同時接收當前新聞與檢索出的相關歷史新聞,判斷事件關係
Retrieval 先把可能相關的歷史資訊找出來,LLM 再比較當前新聞與歷史內容之間的事件關係。

Retrieval 負責把可能相關的歷史資訊找出來,而 LLM 則負責理解這些資訊與當前新聞之間的事件關係。

將理解結果轉換成結構化欄位

我們沒有讓模型直接輸出一個主觀的「重要/不重要」結果,而是將判斷拆成幾個不同維度。其中主要使用 category、novelty 與 impact 三組資訊。

category 描述目前資訊在事件脈絡中的性質,例如它是一個新的具體事件、既有事件的小幅後續、對過去資訊的回顧,還是單純的評論或雜訊。novelty 則描述當前資訊相較於歷史資料的新穎程度。模型會參考前面提供的 historical context,區分第一次出現的重要事件、具有額外意義的後續資訊,以及沒有帶來明顯新內容的重複資訊。impact 關注的則不是資訊是否新,而是這項事件是否可能對相關金融標的產生足夠明顯的市場影響。

LLM 將 Current News 與 Historical Context 轉換為 category、novelty、impact 的結構化結果
模型不是直接輸出主觀判斷,而是把事件理解拆成 category、novelty 與 impact,讓後續系統可以使用固定欄位處理。

這樣做的目的,是把原本需要閱讀新聞與歷史背景才能形成的判斷,轉換成後續程式可以直接使用的資料。例如,系統可以進一步挑出同時具有較高 novelty、屬於實際事件而非回顧或評論,且具有較大 impact 的資訊。

換句話說,LLM 負責理解文意以及事件在歷史脈絡中的位置,而固定欄位則讓這份理解可以被後續系統利用。

從歷史資訊找到真正的新事件

前一階段的 RAG retrieval 解決了如何從大量歷史新聞中找到與當前資訊相關的內容。取得這些 historical context 後,下一步就是利用 LLM 理解當前新聞與歷史資訊之間的關係。

對我們而言,LLM 在這裡最重要的用途是利用模型對自然語言與上下文的理解能力,判斷目前這則資訊相對於過去已知資訊,究竟帶來了什麼新的變化。

例如,同一項監管政策可能在短時間內被不同媒體或社群帳號反覆報導。每一則都是系統新收到的資料,但不代表每一則都是新的事件。如果歷史資訊中已經出現相同事件,而目前新聞只是再次轉述,就不應該被當成新的市場資訊重新處理。

模型會將理解結果整理成幾個結構化欄位。其中 category 用來描述目前資訊屬於新的事件、既有事件後續、回顧性資訊或其他類型;novelty 用來判斷這則資訊相對於歷史內容帶來多少新的資訊;impact 則描述事件可能具有的市場影響程度。

這樣的設計讓模型先回答「這是什麼資訊,以及它和過去的資訊有什麼關係」,再由後續程式根據這些欄位進行篩選。大量重複報導、既有事件的再次轉述與影響程度較低的內容可以被排除,而相對於歷史出現新變化、同時具有較大潛在影響的事件則可以進入後續處理流程。

Schema Validation 如何保護後續流程

結構化輸出的價值在於後端可以直接讀取欄位,但前提是模型輸出的格式、欄位型別與 enum 值必須符合規格。因此我們在 LLM 輸出後加入 schema validation,成功時才讓結果進入後續流程;失敗時則可以拒絕使用、重新要求模型輸出,或記錄錯誤供除錯。

LLM structured output schema validation 的成功與失敗運行紀錄
Schema validation 運行紀錄:確認 LLM 回傳內容能否被後端當成固定格式資料使用。
驗證情境結果原因
格式完整且欄位值合法成功JSON 格式正確、欄位型別正確,impact、category、novelty 都落在允許範圍內。
JSON 語法錯誤失敗例如最後一個欄位後方多出逗號,系統無法解析。
impact enum 不合法失敗例如輸出 bullish,但規格只接受 large 或 small。
category 或 novelty enum 不合法失敗例如 category 輸出 macro、novelty 輸出 new,兩者都不在允許列表內。
欄位型別錯誤失敗例如 summary 是空值,或 reason_log 變成陣列;兩者在規格中都必須是字串。

目前處理結果

截至 2026 年 5 月,系統已累積分析 25,352 筆金融資訊。其中 6,513 筆被判斷具有較高的新穎性,575 筆被判斷具有較大的潛在市場影響,最終共有 206 筆通過完整的資訊篩選條件。

MetricResult
Total News Analyzed25,352
New / High-novelty Events6,513
Large-impact Events575
Selected Events206

從目前的實際處理結果來看,最終只有約 0.81% 的輸入資訊通過完整篩選。尤其在同一項 ETF 申請、監管政策、交易所事件或資安事故被不同來源持續轉述的情況下,模型可以參考相關歷史資訊,將其中部分內容辨認為既有事件的重複報導或後續資訊,而不是每次都視為一個全新的事件。

目前能確認什麼,還不能確認什麼

這些數據目前只能說明系統的篩選行為與資訊縮減程度,還不能直接視為模型判斷的準確率。我們目前尚未建立足夠規模的人工標註資料,因此無法可靠計算 novelty precision、recall 或市場影響判斷的正確率。

這類評估本身也不容易建立 ground truth。「是否具有新資訊」需要放回當時的歷史脈絡判斷,而「是否具有重大市場影響」又受到整體市場、其他同時發生的資訊、流動性與短期交易行為等因素影響,無法單純用新聞發布後的價格變化判定模型是否正確。

因此,目前我們比較能確認的是:加入歷史 context 後,LLM 已經能對持續流入的新聞進行一定程度的事件區分與重複資訊過濾,將大量原始資訊縮小成較少的候選事件。至於模型對事件新穎性與市場影響的判斷究竟有多準確,仍需要後續建立更完整的 evaluation dataset 才能進一步驗證。

LLM 在這裡已經可以初步把當前資訊放回歷史脈絡中理解,再將事件類型、新穎程度與可能影響轉成後續系統可以使用的結構化資料。
返回文章列表 回到首頁