嗯...最近在看一些 AI 的東西,發現一個蠻有趣的現象。
我們現在用的那些 AI,像是 ChatGPT 啊什麼的,很會寫詩、聊天、寫報告。但你把它丟到一個真實的工廠環境,它可能就...當機了。真的,不是開玩笑。
你跟它說:「欸,我們產線的 OEE 掉下去了,好像是那台 CNC 車床的主軸有問題,等下要去調一下進給率,不然那個震紋 (chatter) 太嚴重。」
一個普通的 AI 大概會滿頭問號。OEE 是什麼?吃的嗎?CNC?主軸?震紋?它可能會以為你在說什麼外星語。因為它們學的都是網路上的維基百科、新聞文章,很廣,但不深。你知道嗎,你叫它做根本原因分析 (root cause analysis),它可能真的會跟你討論樹根 (root) 的問題,而不是機器為什麼會壞掉。超荒謬,但就是這樣。
所以,就有人在想,我們能不能...自己養一個「懂工廠」的 AI?一個專門為製造業打造,聽得懂老師傅在講什麼、看得懂機器說明書的 AI。這東西,有人叫它 FactoryBERT。
所以,這東西到底要幹嘛?
簡單講,就是讓 AI 變成一個更聰明的助手。工廠裡有很多方法來提升品質,像是大家可能聽過的「六標準差 (Six Sigma)」。這不是什麼新潮的玩意,老實說,它就是一套很系統化的方法,用來減少不良品、改善流程,讓工廠運作更有效率。
以前這些都要靠工程師慢慢分析數據、畫圖表。但如果 AI 能看懂那些生產日誌、檢測報告,它也許就能更快地指出問題可能在哪裡。不過前提是,它得先學會「說人話」...不,是「說工廠話」。
這就是整個專案的起點。我們要教一個 AI,從頭學起,怎麼在工廠裡「生存」。
實作指引:怎麼從零打造一個工廠腦?
這過程有點像養一個小孩...從給他教材、教他識字,到讓他學會思考。我自己是覺得可以分成幾個階段來看。
第一步:餵它吃「工廠的語言」
AI 能多聰明,完全看你給它什麼樣的資料。要訓練一個 FactoryBERT,它的「課本」就不能是網路小說或新聞。它要讀的是這些:
- 📄 技術手冊: 什麼 ISO 標準啊、機台操作說明書啊... 就是那些厚厚一本,平常沒人想看的東西。 -
- 🏭 生產日誌: 機器的感測器數據、停機紀錄、良率報告。這些就像是機器的「日記」。
- 📝 品質改善報告: 剛剛提到的六標準差分析報告、各種 RCA、PFMEA 文件。這些是解決問題的「病歷」。
- 💬 老師傅的筆記: 這超重要。維修紀錄、交接班的聊天紀錄、操作員寫下的注意事項... 這些充滿「黑話」的非結構化資料,才是精髓。
基本上就是把這些東西全部打包成文字檔,準備當作它的精神糧食。下面這段 code 只是個示意,就是把那些 txt 檔讀進來的感覺。
### 示意:把所有文字資料載進來
from datasets import load_dataset
# 想像一下 "manufacturing_data.txt" 是一個超大的檔案
# 裡面裝滿了上面說的那些手冊、日誌等等
dataset = load_dataset("text", data_files={"train": "manufacturing_data.txt"})
第二步:教它認得「行話」(客製化分詞器 Tokenizer)
這一步,我自己是覺得最關鍵,也最常被忽略的一步。BERT 這種模型在讀文章前,會先用一個叫「Tokenizer」的東西把句子切成一個個的詞。問題來了,通用的 Tokenizer 不認識製造業的行話。
比方說,它看到 "Kanban" (看板),可能會把它切成 `["Kan", "##ban"]`。看到 "Six Sigma",可能會切成 `["Six", "##Sig", "##ma"]`。這等於是把一個完整的專有名詞給肢解了,AI 就很難學到這個詞真正的意思。
說到這個,這在處理混合語言的時候問題更大。像在台灣的工廠,文件裡常常是中文夾雜英文,例如「這批貨的 `yield rate` 要達到 98%」或是「聯絡一下 `vendor` 確認 `lead time`」。如果你用一個純中文或純英文的 Tokenizer,基本上就是一場災難。更別說像是「台達電 (Delta)」或「研華 (Advantech)」這種中英文夾雜的公司名或產品型號了。
所以,我們得訓練一個專門給工廠用的 Tokenizer。讓它知道 "OEE"、"CNC"、"Kanban" 這些都是一個完整的單字,不准亂切。這點,我覺得比對岸單純用簡體中文訓練模型要複雜,但也更有價值,因為這才貼近台灣產業的真實情況。Hugging Face 這個平台提供了很好的工具,但實際應用還是要考慮在地化的細節。
下面這段 code 就是在做這件事:讀取我們前面準備的全部資料,然後從中學習一份新的「單字表」。
from tqdm import tqdm
from transformers import BertTokenizerFast
# 因為資料量可能很大,所以我們得分批讀取
def batch_iterator(batch_size=10000):
for i in tqdm(range(0, len(dataset['train']), batch_size)):
yield dataset['train'][i : i + batch_size]["text"]
# 先載入一個基礎版的 tokenizer 當作範本
bert_tokenizer = BertTokenizerFast.from_pretrained("bert-base-uncased")
# 核心:從我們的資料(text_iterator)去學習一個全新的單字表
# vocab_size 大概是說我們希望單字表裡有多少詞,3萬多算是個常見的數字
new_tokenizer = bert_tokenizer.train_new_from_iterator(
text_iterator=batch_iterator(), vocab_size=30522
)
# 存起來,以後就用這個專屬的 tokenizer 了
new_tokenizer.save_pretrained("./FactoryBERT-Tokenizer")
第三步:讓它玩填空遊戲(遮罩語言模型 MLM)
好,現在 AI 認得單字了。那要怎麼讓它「理解」句子呢?BERT 用的方法很像我們小時候玩的填空遊戲,專業術語叫「遮罩語言模型 (Masked Language Modeling)」。
就是隨機把一句話裡的某些單字蓋住(變成 `[MASK]`),然後叫 AI 猜猜看蓋住的是什麼字。
原始句子: 「CNC 車床偵測到主軸震動問題。」
填空題目: 「CNC [MASK] 偵測到主軸 [MASK] 問題。」
一開始 AI 當然都亂猜,但猜錯了就修正,猜錯了就修正... 千百萬次之後,它就會慢慢學到:「哦,原來『CNC』後面常常接『車床』」、「『主軸』後面跟『震動』一起出現的機率很高」。它就這樣,從大量的填空遊戲中,學會了單字跟單字之間的關係,也就是語感。
第四步:設定大腦的架構(模型配置)
在開始訓練前,我們要先定義這個 AI 大腦的「規格」。這部分通常看 code 會覺得很頭痛,都是一堆數字。但其實可以用比較直觀的方式去理解。
from transformers import BertConfig, BertForMaskedLM
config = BertConfig(
vocab_size=30522, # 我們 tokenizer 裡總共有多少單字
hidden_size=768, # 每個單字的「描述維度」
num_hidden_layers=12, # 有幾層「思考層」
num_attention_heads=12, # 每層有幾個「注意力小組」
intermediate_size=3072, # 思考過程中的「暫存記憶體」
)
model = BertForMaskedLM(config)
這幾個參數是什麼意思呢?
- hidden_size=768: 你可以想像成,為了描述一個單字,我們用了 768 個「特徵標籤」。比如,「車床」這個詞,它在「是個名詞」、「是個工具」、「跟金屬有關」、「跟旋轉有關」...等等 768 個維度的標籤上,都會有不同的數值。這個數字越大,AI 對單字的理解就越細膩。
- num_hidden_layers=12: 這代表 AI 有 12 層的深度思考能力。第一層可能只看到單字,第二層看到詞組,第三層看到句子結構...一層一層往上,理解越來越複雜的語意。BERT-base 模型就是 12 層,這算是一個標準規格。
- num_attention_heads=12: 這是我覺得最酷的部分。在每一層思考層裡面,還有 12 個「注意力小組」同時在讀這個句子。比如,一個小組可能專門注意「主詞和動詞」的關係,另一個小組專門注意「名詞和形容詞」的關係。像「CNC 車床的主軸」,有個小組會把注意力放在「主軸」屬於「車床」,另一個小組可能把注意力放在「CNC」修飾「車床」。它們各司其職,最後再把情報匯總。多頭並進,效率很高。
- intermediate_size=3072: 這個是在每一層思考層內部的一個「草稿區」。它會先把 768 維的資訊放大到 3072 維,進行更複雜的運算和非線性轉換(可以想像成腦力激盪),然後再把它壓縮回 768 維,傳給下一層。就是一個讓思考更充分的設計。
總之,這些設定就是在蓋一棟 12 層樓高、每層樓都有 12 個會議室的大樓,讓 AI 在裡面處理語言資訊。
第五步:開始漫長的學習(訓練)
設定好之後,就是把資料餵給模型,設定好學習率、要跑幾輪...然後,按下 `trainer.train()`,接著就是漫長的等待。這一步非常耗費計算資源跟時間,可能要跑好幾天甚至好幾週。
訓練完之後,我們可以做個小測驗,看看它學得怎麼樣。一樣用填空題:
# 示意 code
from transformers import pipeline
fill_mask = pipeline(
"fill-mask",
model="./FactoryBERT", # 我們訓練好的模型
tokenizer="./FactoryBERT-Tokenizer" # 我們自訂的 tokenizer
)
result = fill_mask("The [MASK] detected a [MASK] in the motor.")
print(result)
如果它猜出來的結果是類似 `The sensor detected a failure in the motor.` (感測器偵測到馬達故障),而不是 `The cat detected a nap in the motor.` 之類的鬼東西... 那就代表,恭喜,它至少學會了工廠的基本詞彙和語境。
一個很實際的問題:我該從頭蓋,還是站在巨人肩上?
看到這裡,你可能會想...哇,這也太麻煩了吧。又要準備一堆資料,又要調參數,又要花大錢租 GPU 跑好幾天。我有沒有更簡單的辦法?
有的。這就帶出了一個重要的決策點:你要「從頭預訓練 (Pre-training)」還是只是「微調 (Fine-tuning)」?
我整理了一個簡單的比較表,讓你感受一下這兩者的差別。
| 考慮面向 | 從頭預訓練 (Pre-training,像蓋 FactoryBERT) | 微調現有模型 (Fine-tuning) |
|---|---|---|
| 適用時機 | 你的領域有大量獨特行話,跟通用語言差很多。像法律、醫療、還有這次的製造業。 | 你的任務只是通用語言的一個子集。比如做客服聊天機器人、寫行銷文案。 |
| 資料需求 | 超級多!TB 等級的純文字資料都不嫌多。越多,模型學得越好。 | 相對少很多。幾千、幾萬筆「標記好的」資料(例如:這句話是正面/負面情緒)就夠了。 |
| 成本與時間 | 非常高。你需要強大的 GPU,訓練時間以天或週計算。真的是在燒錢。 | 低很多。一般的 GPU 甚至 CPU 都有機會,訓練時間可能幾小時就搞定。 |
| 風險 | 高。如果資料不夠乾淨、參數沒調好,很容易訓練失敗,錢和時間都白花了。 | 低。因為模型本身已經很聰明了,你只是教它一個新技能,比較不容易整個搞砸。 |
簡單說,如果你的產業「黑話」真的多到不行,通用模型完全聽不懂,那你才需要考慮「從頭預訓練」這條路。不然,大部分情況下,拿一個已經很強的預訓練模型(比如 Google 或 OpenAI 發布的那些)來做「微調」,是更經濟實惠的選擇。
最後一步:針對特定任務進行「特訓」(微調)
好,假設我們的 FactoryBERT 已經通過了填空測驗,它現在是一個「懂製造業的通才」。但我們通常需要它做更具體的事,比如「預測一台機器是不是快要壞了」。
這時候就需要「微調 (Fine-tuning)」。我們拿 FactoryBERT 當基底,在它上面再加一個小小的分類頭 (classification head),然後用「有標籤的資料」(比如:過去 1000 筆機器數據,其中 50 筆後來真的故障了)來訓練這個分類頭。
這過程有個小技巧,就是「凍結層」。
想像一下,FactoryBERT 的 12 層大腦已經學會了製造業的語言基礎,這是很寶貴的知識。我們不希望在訓練新任務時把它們搞亂。所以,我們可以把前面幾層(比如 1-8 層)「凍結」起來,讓它們的參數不變,只訓練最後那幾層跟新加的分類頭。
from transformers import AutoModelForSequenceClassification
# 載入我們預訓練好的 FactoryBERT,並告訴它我們要做一個 5 分類的任務
model = AutoModelForSequenceClassification.from_pretrained("./FactoryBERT", num_labels=5)
# 凍結前面大部分層,只讓模型在最後幾層微調,保留基礎語言能力
for param in model.base_model.encoder.layer[:-4].parameters():
param.requires_grad = False
這樣做的好處是,訓練會更快、更穩定,而且也比較不容易忘記它原本學會的語言知識。這就像教一個會英文的人學法律,你不需要讓他重學 ABC,你只需要教他法律術語和邏輯就好。
所以,這東西能取代工程師嗎?
嗯...我覺得不會。至少短期內不會。
AI 不會自己跑到機台旁邊聽聲音、聞味道。但它可以成為一個超級強大的助手。一個能 24 小時不休息,快速讀完過去十年維修報告、分析數百萬筆感測器數據,然後給工程師一個提醒:「欸,根據數據來看,三號產線那台馬達的震動頻率跟上個月燒掉那台有點像喔,要不要去檢查一下?」
說到底,它就是個工具。一個讓聰明的人類可以更快、更準確地做出判斷的工具。這條路還很長,但感覺方向是對的。
對了,如果換作是你,你想為你自己的專業領域(不管是烘焙、法律、園藝還是寫小說)打造一個專屬 AI,你覺得第一個、也是最重要必須教會它的「行話」會是什麼?可以在下面留言分享一下,感覺會很有趣。😂
