於是,有了後續 Route D 到 Route H 的加碼實驗。結果卻完全出乎意料——雲端大模型慘遭滑鐵盧,而一個不需要懂文字、只負責「畫點點」的 Embedding 模型,反而成了這場加碼賽真正的 MVP。
雲端大模型的滑鐵盧:Route F, G, H
本以為把推文丟給幾百億參數的模型,它能看透所有弦外之音。但殘酷的現實是,在這個需要處理一萬多筆資料的批量任務上,它們輸得一塌糊塗。
- Route G (mistral-nemotron):我們原本預期雲端模型一定比本地模型強,但它在本地子樣本驗證(n=200)中只拿了 0.715。相比之下,你筆電裡那顆小小的本地模型
gemma4:e2b卻有 0.766。這打破了「雲端必勝」的迷思:Gemma 家族對這個分類提示的理解力,顯然比這版雲端模型更對味。 - Route H 與 Route F (70B 與 49B Reasoning 模型):這裡我們遇到了批量呼叫雲端 API 最怕的噩夢——速率限制與長時間連線不穩定。
Route G 一開始 8 併發直接被 429 Too Many Requests 打爆,改成嚴格序列執行+每次呼叫間隔 8 秒才穩定下來,200 筆跑了將近一小時。Route F (meta/llama-3.3-70b-instruct) 本身單次呼叫就要 60 秒,第一次嘗試跑了 2.85 小時後,尾端開始出現 Connection error(127/200 無法解析),懷疑是長時間存活的 HTTP 連線變得不穩定;第二次改善後的嘗試中途被強制終止,沒有跑完。Route H (nemotron-super-49b-v1.5) 是一個 reasoning 模型,會先在內部「思考」一長串 chain-of-thought 才吐出最終答案,我們給了 600 tokens 的預算,大多數時候夠用,但仍有 18/200 筆超出預算被截斷、無法解析成 0 或 1,整整跑了 7.2 小時,分數落在 0.667。
結論很明確:用生成式的 Zero-shot 去解幾萬筆的分類題,就像是用一台精密但過熱的超級電腦去算九九乘法表——殺雞用牛刀,而且刀還卡死了。
真正的主角:Route E (nemotron-3-embed-1b)
就在生成式模型全軍覆沒時,另一條雲端路線卻以 0.83113 的超高分強勢回歸,甚至比肩花了幾個小時微調的 DistilBERT。而它跑完一萬多筆訓練與測試資料的時間:只要 9 分鐘。
這條路線用的是 NVIDIA NIM 上的 nemotron-3-embed-1b,一個 Embedding(嵌入)模型。
科普專區:什麼是 Embedding?為什麼它贏過生成式?
如果你去問 ChatGPT 或是 Llama,它們的運作方式是「生成式 (Generative)」——你問一句,它逐字逐字吐出回答。這種做法需要消耗大量的運算資源來「思考」下一個字是什麼。
但 Embedding 模型不一樣,它是一個極致的閱讀理解機,但不負責講話。
想像一下,如果我們把所有人類的情緒與語意,畫在一個有 1000 個維度的宇宙空間裡: 當 Embedding 模型讀到 "A massive earthquake just hit Japan",它不會回答你任何話,它只會在這個 1000 維的宇宙中,打下一個精準的座標點 $(x, y, z...)$。 當它讀到 "I just bombed my math test",它會在宇宙的另一個遙遠角落,打下另一個座標點。
它所做的事情,就是把複雜的推文,降維/轉換成一組純數學座標。
當一萬筆推文都被變成座標後,接下來就簡單了——我們派出 Route A 用過的古老技術 Logistic Regression。它的工作,就是在這個空間裡畫一條線,把代表「真災難」的座標群,跟「假災難」的座標群切開。
這是一個完美的互補:讓最懂語意的 Embedding 模型負責理解,讓運算最快的 Logistic Regression 負責畫線分類。 沒有 Timeout,沒有胡言亂語的解析錯誤,只有極致的速度與準確度。
誠實的但書:這個高分,會不會是預訓練語料「偷看過」這份資料?
nlp-getting-started 不是什麼冷門資料集——它底層那份「Disasters on Social Media」原始資料,在 Kaggle 上有獨立公開的版本(就是我們前面拆解「答案洩漏」那則 notebook 用的同一份),而且是 Kaggle 最知名的入門教學題目之一,數以千計的公開 notebook、部落格、GitHub repo 都貼過完整的 text, target 對照。
nemotron-3-embed-1b 是一個吃過大規模網路爬蟲語料的 2026 年模型,有實質可能在預訓練階段就掃過這份資料的某個公開副本。這跟前面提到的「答案洩漏」是同一個根源——只是這次不是有人刻意合併答案檔,而是模型的訓練語料本身可能已經隱含吸收了它。
但這裡要區分兩種不同性質的「見過」:一種是模型單純看過大量「災難社群討論」培養出的語言直覺(合理的泛化能力,不算作弊);另一種是模型具體記住了「這則推文+別人標註的答案」這種討論內容(如果被爬進語料,就是貨真價實的資料污染)。我們沒有工具區分是哪一種——沒有一份結構相同但從未公開過的災難推文資料集可以拿來對照測試,NVIDIA 也沒有公開訓練語料的完整組成。
老實說這個結論會打折:Route E 在這份知名公開資料集上的高分,不能直接當作「Embedding API 在任何任務上都能贏過微調模型」的證據。如果你要在自己的專案上複製這個做法,該用的是自己的私有、從未公開過的資料——那才是真正公平的檢驗。
Ensemble 策略的演進與數學巧思
既然有了專精社群語言的 BERTweet (Route D,拿到了本週最高的 0.83941) 和 Embedding 模型 (Route E),我們能不能把前面的 TF-IDF (Route A) 加進來,做一個三個諸葛亮的 Ensemble(模型集成)?
Ensemble 不是簡單的加減乘除,我們在這裡學到了一個關於「被霸凌」的教訓。
失敗的嘗試:A + D 的「一票否決」
在早期的嘗試中,我們試著將 A 和 D 用 0.35 A + 0.65 D >= 0.5 的方式加權平均。 聽起來很合理對吧?但我們忘了一個致命的細節:Route D 的 Kaggle 產出檔案,只有 0 或 1 的最終預測,沒有存下原始的機率(信心水準)!
在線性加權中,如果 D 投了 1 (乘上 0.65 = 0.65),就算 A 覺得絕對不是災難 (機率 0),總分依然是 0.65,大於門檻的 0.5。 反之,如果 D 投了 0 (總分起步為 0),就算 A 覺得 100% 是災難 (0.35 * 1 = 0.35),總分依然小於 0.5。
結果:這個 Ensemble 其實什麼都沒做,Route D 變成了一個一票否決的霸凌者,100% 碾壓了 Route A。
優雅的解法:A + D + E 的數學巧思
為了限制這個只會投 0 和 1 的霸凌者,我們在最新的腳本中拉入了 Route E(它能提供連續的機率),並實作了兩種完全不需要找驗證集調參、卻絕對有效的防霸凌機制:
- 嚴格多數決 (Majority Vote)
三個模型一人一票,只要有兩票是 1 就是 1。這剝奪了 D 的權重優勢,讓三個模型地位完全對等。
- 混合機率平均 (Probability Blend)
公式是:(proba_A + proba_E + pred_D) / 3 >= 0.5 這是一個非常優雅的數學平衡! 如果 D 預測是 0,A 和 E 必須兩者都非常確信是災難 (相加 >= 1.5,平均信心水準大於 75%),才能聯手推翻 D 的決定。 反之,如果 D 預測是 1,A 和 E 也必須極端不看好 (平均低於 25%) 才能否決。
這樣既保留了 D 本身超高的準確率,又允許 A 和 E 在「擁有極度共識時」進行修正。實測發現,混合機率平均法在 3000 多筆推文中,極度保守地只改動了 D 原本的 21 筆預測,精準地扮演了最後一道防線的角色。
結語
一週的實驗下來,我們學到的遠比幾個分數多:
- 面對大量短文本分類,API Embedding + 淺層模型,是兼顧成本、速度與高分的最佳解。
- 盲目相信雲端巨獸的 Zero-shot 能力,換來的是速率限制、連線不穩定,以及遠比小模型更長的等待時間。
- Ensemble 時,永遠要注意模型輸出的連續性,不要讓二元預測毀了你精心的加權設計。
下一週,共振站會帶來什麼新的坑?我們拭目以待。