正在載入內容...
```
=LET(
val_I, INDIRECT("I"&ROW()),
val_J, INDIRECT("J"&ROW()),
val_H, INDIRECT("H"&ROW()),
val_G, INDIRECT("G"&ROW()),
val_F, INDIRECT("F"&ROW()),
len_total, LEN(val_I) + LEN(val_J),
is_ignored, COUNTIFS('ignore_author_id'!A:A, val_H) > 0,
is_f_too_much, COUNTIFS('isSuicideLog'!A3:A, val_F) >= 4,
is_recorded, COUNTIFS('actionRecord'!A2:A, val_F) > 0,
IFS(
NOT(ISNUMBER(val_G)), FALSE,
(NOW() - val_G) > 0.5, FALSE,
OR(len_total <= 30, len_total >= 1000), FALSE,
OR(val_J = "", is_ignored, is_f_too_much, is_recorded), FALSE,
OR(val_I = "error", val_J = "error"), FALSE,
REGEXMATCH(val_I & val_J, "[ぁ-んァ-ン]|[个这为么国对们产发拥专关号实则]|[가-힣ㄱ-ㅎㅏ-ㅣ]"), FALSE,
TRUE, isSuicide_ALL(val_I, val_J, 'isSuicide();'!$B$8)
)
)
```
這是一套非常嚴謹且考量到 **API 成本與執行效率**的自動化篩選與判定系統。
從這兩段程式碼來看,這主要用於一個論壇或社群平台,用來**自動偵測並過濾是否有使用者發布具有自殺傾向的貼文 (isSuicide)**。
為了讓你清楚理解,我將它分為 **Google Sheets 試算表公式 (前端條件過濾)** 與 **Google Apps Script (後端 AI 判定)** 兩個部分來具體拆解。
---
## 第一部分:Google Sheets 公式拆解
這個公式使用了 `LET` 函數來定義變數,並結合 `IFS` 函數建立了一道道「守門員機制」。只有當所有基本條件都符合時,才會將資料送給 AI 進行判定,藉此**省下大量的 AI 呼叫成本與處理時間**。
### 1. `LET` 變數定義區 (讀取當前列的資料與狀態)
公式開頭利用 `INDIRECT("欄位"&ROW())` 動態抓取「公式所在該列」的各欄位資料,並進行初步計算:
* **`val_I` (欄位 I)**:通常代表貼文的 **標題 (Title)**。
* **`val_J` (欄位 J)**:通常代表貼文的 **內文 (Body)**。
* **`val_H` (欄位 H)**:代表 **作者 ID**。
* **`val_G` (欄位 G)**:代表 **發文時間戳記 (Timestamp)**。
* **`val_F` (欄位 F)**:代表 **貼文 ID** 或唯一識別碼。
* **`len_total`**:計算標題 (I) 與內文 (J) 的**總字數**。
* **`is_ignored`**:檢查這名作者 (val_H) 是否存在於 `'ignore_author_id'` (白名單或忽略名單) 工作表中。如果是,回傳 True。
* **`is_f_too_much`**:檢查這篇貼文 (val_F) 在 `'isSuicideLog'` 工作表中是否已經被判定過 4 次(可能是為了避免無限迴圈或重複分析)。
* **`is_recorded`**:檢查這篇貼文在 `'actionRecord'` 工作表中是否已經有處理紀錄。如果是,代表已經處理過。
### 2. `IFS` 邏輯過濾區 (7 道防線)
接下來,公式利用 `IFS` 逐一檢查條件。只要觸發任何一個 `FALSE`,就會立刻停止並回傳 FALSE (不處理此貼文),只有全數通過才會進入最後的 AI 判定:
1. **時間格式檢查**:`NOT(ISNUMBER(val_G)), FALSE`
* 如果發文時間 (欄位 G) 不是有效的數字/時間格式,直接略過。
2. **時效性檢查**:`(NOW()-val_G)>0.5, FALSE`
* `0.5` 代表半天 (12 小時)。如果這篇貼文已經發布超過 12 小時,就不再進行即時的自殺防範分析(可能已由人工處理或失去時效)。
3. **字數極端值檢查**:`OR(len_total<=30, len_total>=1000), FALSE`
* 如果總字數太少(小於等於 30 字,可能資訊量不足)或太多(大於等於 1000 字,可能浪費 AI token),則不予處理。
4. **狀態與黑名單檢查**:`OR(val_J="", is_ignored, is_f_too_much, is_recorded), FALSE`
* 如果「內文空白」、「作者在忽略名單內」、「該貼文分析超過 4 次」、「已經有處理紀錄」,只要滿足其中一項,就跳過。
5. **錯誤訊息檢查**:`OR(val_I="error", val_J="error"), FALSE`
* 如果系統抓取到的標題或內文顯示 "error",表示爬蟲或抓取資料失敗,直接跳過。
6. **語言與字元過濾 (Regex)**:`REGEXMATCH(val_I&val_J, "[ぁ-んァ-ン]|[个这为么国对们产发拥专关号实则]|[가-힣ㄱ-ㅎㅏ-ㅣ]"), FALSE`
* 這是一道語系防火牆。如果標題或內文包含**日文假名**、**特定的簡體中文字**、或是**韓文**,就略過不處理。這表示系統只針對「繁體中文」或特定的在地社群運作。
7. **最終通行 (觸發 AI)**:`TRUE, isSuicide_ALL(...)`
* 如果以上 6 關全部安全通過(沒有被回傳 FALSE),公式最後才會呼叫自訂函數 `isSuicide_ALL`,並傳入標題 (`val_I`)、內文 (`val_J`),以及存放在 `'isSuicide();'!$B$8` 的 **System Prompt (系統提示詞)**。
---
## 第二部分:Google Apps Script 拆解
這段 JavaScript 函數 `isSuicide_ALL(title, body, systemPrompt)` 展現了非常出色的「漏斗式 AI 驗證機制」(Funnel Verification)**,主要目的是為了**平衡判斷準確度與 API 呼叫成本。
```javascript
function isSuicide_ALL(title, body, systemPrompt) {
// 第一關:輕量級模型過濾
let isFirstTrue = isSuicide_poe_gpt54nano(title, body, systemPrompt);
if (isFirstTrue !== true) return false;
// 第二關:中階模型確認
let isSecondTrue = isSuicide_poe_claudehaiku45(title, body, systemPrompt);
if (isSecondTrue !== true) return false;
// 第三關:旗艦模型最終裁決
let isThirdTrue = isSuicide_poe_claudeopus48(title, body, systemPrompt);
return isThirdTrue;
}
```
### 運作邏輯解析:
這是一個「一票否決制」的闖關遊戲。作者串接了 Poe API 上的三個不同等級的 AI 模型:
1. **第一關 (GPT Nano)**:速度最快、成本最低。如果輕量級的 GPT 認為這篇貼文**沒有**自殺傾向 (`!== true`),程式就直接 `return false` 結束,不浪費時間跟金錢。
2. **第二關 (Claude Haiku)**:如果第一關覺得「有危險」,會交由速度同樣快但理解力稍強的 Claude Haiku 進行複查。如果 Haiku 認為沒事,一樣直接終止並回傳 `false`。
3. **第三關 (Claude Opus)**:只有當前兩關的 AI 都亮起紅燈 (`true`),系統才會把資料送給目前最聰明、但也最昂貴的旗艦模型 Claude Opus 做最後的「終審」。Opus 的判斷結果就是最終結果。
### 總結
這整套系統的設計思維非常成熟:
* **在 Google Sheets 階段**:先用不用花錢的試算表函數,把格式錯誤、時間太久、字數極端、非目標語言、已處理過的資料全部擋下。
* **在 Apps Script 階段**:把真正需要 AI 判斷的貼文,用「便宜 AI > 中等 AI > 昂貴 AI」的分級過濾機制處理。
這樣的設計既能確保**判斷的嚴謹度**(需要三個 AI 都同意才算數),又能**將營運成本壓到最低**(只有極少數高度疑似的貼文會動用到 Claude Opus)。