我一開始只是想抄近路。
那時候我盯上的,是 Lexi。
同樣是 Llama 3.1 8B,速度跟原版差不多,手感也沒散掉,但整體回答就是比較直接。這種差別很怪。你很難拿一句 benchmark 說清楚,可是用過幾輪之後,你會知道它不是同一種口氣。
我原本以為這件事不深。
改一點 prompt,掛一層 LoRA,再不然做個小微調,應該差不多就到了。
後來真的一路跑下去,我才發現自己一開始連題目都切錯了。
我以為我在做一件事,叫做「改模型」。
實際上,我是在不同樓層之間來回亂跑,卻一直把它們當成同一層。
有時候我只是換了台詞。
有時候是在改導演給演員的角色小紙條。
有時候是在重寫劇本格式。
再往下,我開始碰演員的肌肉記憶。
最底下那層,才是演員原本的大腦。
它們最後看起來都像「模型變了」。
但那根本不是同一種變。
這篇是整個系列真正的起點。
不是先教你打指令,也不是先上 LoRA 數學,而是先把地圖攤開。因為後來我學到一件很實際的事:如果你連自己到底改到哪一層都還沒分清楚,後面每一步都會花雙倍力氣,還不一定走對方向。
這不是平面問題,是一整棟樓
我後來找到一個最順手的理解方式。
把整個本地 LLM 系統想成一個拍片現場。
單次請求,像演員今天臨時拿到的新台詞。
System Prompt,像導演開拍前塞給演員的角色小紙條。
TEMPLATE,是劇本格式,決定台詞、角色標籤、場記怎麼排。
MESSAGE,像幾段示範演出,讓演員知道這齣戲平常怎麼講話。
PARAMETER,比較像拍攝風格設定,節奏要保守一點,還是放一點,重複要不要壓住。
把這些東西綁成一整份可重複使用的包裝藍圖,就是 Modelfile。
再往下,才輪到 LoRA / Adapter。
這一層比較像改演員的肌肉記憶。不是重養一個人,而是針對某些反應方式,再做一層附加訓練。
最底下那層,是 base model weights。
也就是演員原本的大腦與受訓底子。
這張圖一立起來,很多事情突然就不糊了。
因為你真正該問的,不再是「我要不要改模型」,而是:
我這次想改的,到底是哪一層?
最外面那層,最容易讓人誤判
最淺的一層,其實就是你每次打進去的 prompt。
這一層非常好用。
你今天想讓它短答,可以直接講。
你想讓它先給結論,也可以當場要求。
它像臨時台詞,來得快,也退得快。
它的好處很直白:便宜、快、壞了也最好收。
問題也很直白:它不穩,而且不留下來。
今天你這樣寫,它今天配合你。
明天你換一輪對話,或者自己忘了補那句要求,它就又回到原本那個樣子。
所以單次請求很適合做局部控制,
不適合被誤認成「模型真的學到了」。
這是我一開始最常犯的錯。
某次 prompt 效果很好,我就會高估它,覺得方向對了。其實很多時候只是那一次問法剛好踩中。
System Prompt 比單次請求穩,但還是在外面
System Prompt 強很多。
差別不在於它比較神,而在於它比較像預設角色設定,而不是臨時加台詞。
你可以把這一層拿來放:
- 語氣
- 語言偏好
- 回答習慣
- 不要做什麼
- 預設角色
例如:
- 優先用繁體中文
- 技術問題先講結論
- 沒有要求時不要主動丟程式碼
- 不要亂補不確定的名詞
這些東西很適合放在 system prompt。
比你每次都手打一遍 user prompt,穩得多。
但它還是不是深層記憶。
它會被長上下文稀釋,也會被模板和模型本身的慣性拉扯。
所以它很重要,但還是外層。
Modelfile 不是 system prompt 換個名字
我一開始也搞混過。
那時候我以為 Modelfile 不就是比較長的 system prompt。
後來才知道,這樣看太淺了。
Modelfile 比 system prompt 大一層。
它不是一張角色小紙條,而是整份拍片企劃書。
在 Ollama 裡,它可以碰到底模、模板、訊息示範、生成參數,必要時還能把 adapter 一起包進來。
也因為這樣,我後來整個判斷翻過來了。
如果你的目標是:
- 保住原版 Llama 3.1 的底子
- 讓手感更接近你要的樣子
- 但又不想太早動到權重
那最先值得碰的,通常不是 LoRA。
而是 Modelfile。
這件事我一開始完全不信。
是我自己把模型訓歪過幾輪之後,才慢慢換回來的判斷。
TEMPLATE 和 tokenizer,比很多人想的還要致命
如果 System Prompt 是導演紙條,
TEMPLATE 就是劇本格式。
這一層很常被當成小事。
但對 chat model 來說,它根本不是小事。
模型不是看見「人類正在聊天」就自動知道格式。
它最後真正吃進去的,是 tokenizer 切出來、又按照某個 chat template 排好的 token 序列。
這也是為什麼你有時候會覺得模型沒明顯報錯,卻就是哪裡怪怪的。
不是因為它突然變笨。
很可能只是你餵它的劇本格式,跟它原本習慣的格式不一樣了。
這一層很陰。
因為它錯了,不一定會大聲爆炸。
很多時候它只會讓模型安靜地退化。
MESSAGE 和 few-shot:不是規則,是示範
有些東西你不想寫成硬規定。
你只是想讓模型抓到一種口氣。
這時候 MESSAGE,或者更一般地說 few-shot,就很有用。
它不像 system prompt 那麼像明文規則。
也不像 LoRA 那樣真的去改肌肉記憶。
它更像是開拍前先放幾段 sample 給演員看,讓他自己抓到節奏。
這一層在你想做的事情裡其實很關鍵。
因為你很多真正想要的東西,像:
- 回答短一點
- 先講結論
- 少一點空話
- 更像技術助理
很多時候,靠這一層就已經能推動不少,還不用急著去碰權重。
PARAMETER 改的是手感,不是大腦
temperature、top_p、repeat_penalty、num_ctx 這些東西,也很容易被高估。
它們當然有用。
你一調,體感常常會變。
但它們改的比較像是拍攝風格,不是模型的大腦。
你可以把 temperature 調低,讓它少一點發散。
你也可以把 repeat_penalty 拉高,讓它少一點碎碎念。
但如果模型本身已經被訓歪,這些參數再怎麼調,也不太可能把它救回原廠。
這也是我後來越來越在意的一件事:
改手感的層,和改大腦的層,不要混。
LoRA / Adapter:真正開始碰肌肉記憶
真正開始變深,是到 LoRA 這一層。
我後來最喜歡的理解方式,不是把 LoRA 當成「小模型」,
而是把它看成:附加在原模型上的可訓練習慣層。
它不是整顆重做。
也不是只在外面包一層 prompt。
它比較像是:保留演員原本的大腦,只針對某些反應模式,再做一層附加訓練。
也因為這樣,它才會比 prompt 深,
但通常又比 full fine-tune 便宜很多。
問題是,便宜不代表不危險。
我後來真的跑過之後才知道,LoRA 最容易騙人的地方就在這裡。
它看起來像一條很漂亮的中間路,結果資料太少、方向太偏、驗收太晚時,照樣可以把模型拉進很奇怪的口音裡。
我後來就真的做出過這種東西。
流程全部成功,模型卻一路開始亂補名詞,甚至整體智力感往下掉。
那時候我才第一次真正把一句話聽進去:
會跑,不等於好用。
最底下那層:base weights
再往下,就是最深的一層。
這裡是模型原本的大腦。
包括語言能力、知識分佈、推理底子,還有很多你很難一句話說清楚,但真的存在的使用平衡。
尤其像 Llama 3.1 Instruct 這種底模,本來就不是生肉。
它已經是 instruction-tuned 的成品。
也就是說,你不是在空白畫布上畫畫。
你是在一個原本就畫得不錯的作品上改筆觸。
這也是我後來最在意的一個反轉:
想保住原版模型的聰明程度,第一優先通常不是更深,而是先少碰權重。
這句話不是保守。
是我把模型弄歪過之後,換回來的判斷。
所以到底該先改哪一層
如果把整篇壓成一個實際能用的判斷框架,我現在會這樣分:
如果你只是想試語氣、試格式、試回答長短,先從單次請求開始。
如果你想讓模型預設比較直接、比較穩,先改 System Prompt / Modelfile。
如果你想讓模型帶著某種穩定風格,而且手上真的有夠乾淨、夠一致的資料,再考慮 LoRA / Adapter。
如果你想改的是可更新、會變動的事實或文件內容,不要急著往權重塞,先想 外部記憶。
只有當你真的知道自己在做什麼,而且也能接受成本與風險,才去碰 base weights。
這不是唯一的分法。
但它至少比把所有事情都叫「改模型」好多了。
回頭看,Lexi 給我的教訓不是怎麼把模型改野
我一開始會一路鑽進 LoRA、merge、量化,說到底還是因為我太快把目標定成「我要做出一個像 Lexi 的東西」。
後來回頭看,我才發現 Lexi 給我的真正教訓,其實不是怎麼把東西改得更野。
而是另一件完全不同的事:
如果你真正想保住原版的智力感和速度,很多時候你最該先學的,是外層包裝,而不是權重改造。
因為問題常常不在模型大腦不夠好。
而是在你給它的劇本、角色小紙條、示範演出和拍攝設定,根本就還沒調對。
我原本以為自己是在學怎麼改模型。
後來才知道,我其實先該學的是:
怎麼分清楚自己到底在改哪一層。
下一篇要進哪裡
地圖先畫到這裡。
但只知道樓層還不夠。
因為接下來真正麻煩的問題才會出現:
如果不同樓層適合裝不同東西,那模型的「記憶」到底該放在哪一層?
哪些東西該放在上下文,哪些該放在外部記憶,哪些才值得寫進 LoRA 或權重?
那就是下一篇。