「在 AI 工程中,僅靠模型自律並不足以百分之百防堵 LLM 脫口說出不當用語或龐大數字。最穩健的生產級架構,是在程式碼層級與 Prompt 約束中加入硬性規則。」
先前,我們探討了三階段分析管道的運作。今天我們將深入 daily_analysis.py 中的 Post-processing(後處理)與數據標準化機制,解析我們如何在程式碼發送至 Telegram 與知識庫之前,對數據與系統用語進行二次淨化。
在 daily_analysis.py 中,為了防止 TWSE 回傳的 raw data(如 123456789012)直接被帶入 Prompt 或報告中,我們在 pre-process/post-process 階段使用了正則表達式進行 9 位數以上的數字補位與格式轉換:
Python
# PRE-PROCESS & POST-PROCESS: Format large numbers in market data
import re as _re
def _fmt(val):
"""Convert raw number strings to readable format."""
if not isinstance(val, str):
return val
clean = val.replace(',', '').strip()
try:
num = float(clean)
if num >= 1_000_000_000_000:
return f"約 {num/1_000_000_000_000:.2f} 兆元"
elif num >= 100_000_000:
return f"約 {num/100_000_000:.1f} 億元"
except (ValueError, TypeError):
pass
return val
tw_summary_parts = [_re.sub(r'[\d,]{9,}', lambda m: _fmt(m.group(0)), p) for p in tw_summary_parts]
除了數字格式化之外,為了徹底防止 LLM 在報告中印出「根據知識庫...」、「無具體新聞」等暴露系統底層實現的露餡詞彙,我們在 daily_analysis.py 的 Core Execution Rules 中明確規定了系統用語的硬性替換邏輯:
Python
# 摘自 daily_analysis.py 中的 Core Execution Rules
"3. 數據格式化:金額大於億一律四捨五入換算為億元或兆元(保留小數點後1-2位)。絕對禁止輸出原始多位數數字。\n"
"5. 隱藏系統語言:絕對禁止提及「知識庫」「投資框架」「新聞列表為選單」「無具體新聞」等。新聞不足時直接以「從量價結構與籌碼動向觀察」帶過。\n"
當新聞數據不足時,指令強制要求模型不得輸出「無新聞」,而是自動替換為專業的金融觀點:「從量價結構與籌碼動向觀察」,確保產出品質高度穩定。
透過 daily_analysis.py 內建的 _fmt 轉換與系統語言硬性隱藏規則,我們完成了 Angelina Agent 輸出的最後一塊品質保證:
1. 極致數據可讀性:長位數金額在進入與產出階段皆完成「億元/兆元」自動轉譯。
2. 消滅系統暴露:禁止模型提及內部運算機制,維護金融分析報告的專業感。
明天(Day 18)我們將深入探討 daily_analysis.py 中 send_telegram() 的訊息切分邏輯,以及如何處理 UTF-8 Byte-Safe 的 3800-Byte 精確切分!
明日預告:【Day 18】推播優化:Telegram 訊息 UTF-8 Byte-Safe 精確切分演算法