手把手教你:用 Python + Ollama 輕松完成 LLM 微調
作為一名對 AI 和機器學習充滿熱情的人,我花了不少時間研究怎么讓強大的語言模型更好地完成特定任務。今天,我想分享一份詳細的指南,教你如何用 Python 微調 LLM(大型語言模型),然后用 Ollama 這個工具在本地運行微調后的模型。這份指南基于我看到的一個實際操作教程,但我會加上詳細的解釋和例子,讓它更全面、更適合新手。

什么是 LLM 微調?
想象一下,你請了個世界級大廚,他啥菜都會做,但還得學會你家的獨門菜譜。你不用從頭教他做飯,只需要給他看幾道你的菜就行。這就是微調!
微調是拿一個已經預訓練好的 LLM(比如 GPT 或 Llama),它已經很懂得通用語言了,然后針對你的特定任務“調校”一下。你給它喂一些你領域的例子,它就會調整自己的知識,專門為這個領域發光發熱。
它咋工作的?從一個懂得英語(或其他語言)的 base model 開始,給它一堆“輸入”(比如一個問題)和“輸出”(比如完美答案)的配對。模型會調整內部 weights 來匹配這些例子。
跟 prompting 的區別?Prompting 就像臨時給指令(比如“寫得像莎士比亞”),而微調是永久改變模型,讓它表現更穩定。
跟 parameter tuning 的區別?Parameter tuning 是調整像“temperature”(輸出多有創意)這樣的設置,就像調車上的收音機。微調則是給引擎升級,讓它能跑越野。
舉個例子:假設你想讓 LLM 從亂糟糟的郵件里提取信息。沒微調前:Prompt: “從‘嗨,我是 John。訂個披薩。’中提取名字和訂單。”輸出:可能很隨機,比如“Name: John, Food: Pizza”或者只是個總結。微調后:用 100 封郵件例子訓練。現在它總會輸出 JSON 格式:??{"name": "John", "order": "pizza"}??。

什么時候需要微調 LLM?
別啥都微調,這就像買跑車去買菜,得看情況用:
?需要一致的格式/風格:Prompting 搞不定嚴格的輸出,比如 JSON 或法律文檔。
?領域專屬數據:模型沒見過你的小眾領域(比如醫學術語或公司日志)。
?省錢:用一個小的、微調過的模型,替代像 GPT-4 這樣的大模型。

優點和缺點:

微調的替代方案:
?Prompt Engineering:快又免費,但不穩定。
?Retrieval-Augmented Generation (RAG):實時加外部數據(比如先搜文檔再回答)。
?從頭訓練:只有像 OpenAI 這樣的大公司才玩得起,需要海量數據和算力。
微調 LLM 的完整步驟
下面是全流程。我們會用 Unsloth(一個免費、開源、快速微調工具)和 Google Colab(免費的云端 GPU,不用高端硬件)。Base model 用 Phi-3 Mini(又小又快)。
流程圖:

步驟 1:收集數據
這步很關鍵,垃圾數據 = 垃圾模型。需要 JSON 格式的輸入-輸出配對。
示例數據集(用于 HTML 提取,比如從網頁代碼里提取產品信息):文件: ??extraction_dataset.json???
內容(簡化版,500 個例子中的 2 個):
[
{
"input":"<div><h2>Product: Laptop</h2><p>Price: $999</p><span>Category: Electronics</span><span>Manufacturer: Dell</span></div>",
"output":{"name":"Laptop","price":"$999","category":"Electronics","manufacturer":"Dell"}
},
{
"input":"<div><h2>Product: Book</h2><p>Price: $20</p><span>Category: Literature</span><span>Manufacturer: Penguin</span></div>",
"output":{"name":"Book","price":"$20","category":"Literature","manufacturer":"Penguin"}
}
]小貼士: 如果需要,可以用 AI 生成數據,但最好用真實數據,效果更佳。
步驟 2:設置環境
用 Google Colab 來用免費 GPU。
? 打開 Colab:去??colab.research.google.com??。
? 上傳你的 JSON 文件。
? 連接 T4 GPU:Runtime > Change runtime type > T4 GPU。
? 安裝依賴(在 Colab cell 里跑):
!pip install "unsloth[colab-new] @ git+https://github.com/unslothai/unsloth.git"
!pip install --no-deps xformers "trl<0.9.0" peft accelerate bitsandbytes輸出: 安裝包(大概 2 分鐘)。如果提示,重啟 runtime。
檢查 GPU:
import torch
print(torch.cuda.is_available()) # 應該輸出:True
print(torch.cuda.get_device_name(0)) # 比如 Tesla T4步驟 3:加載模型
選一個 base model(比如 Phi-3 Mini)。
代碼:
from unsloth import FastLanguageModel
model_name = "unsloth/Phi-3-mini-4k-instruct"
max_seq_length = 2048 # 根據需要調整
model, tokenizer = FastLanguageModel.from_pretrained(
model_name,
max_seq_length=max_seq_length,
load_in_4bit=True
)輸出: 下載模型(小型模型大概 5-10 分鐘)。
步驟 4:預處理數據
把輸入格式化成單一字符串。
代碼:
import json
from datasets import Dataset
# 加載數據
withopen("extraction_dataset.json", "r") as f:
data = json.load(f)
# 格式化函數
defformat_prompt(item):
returnf"{item['input']}\n{json.dumps(item['output'])}<|endoftext|>"
# 創建格式化列表
formatted_data = [{"text": format_prompt(item)} for item in data]
dataset = Dataset.from_list(formatted_data)
# 打印示例
print(formatted_data[0]["text"])輸出示例:
<div><h2>Product: Laptop</h2><p>Price: $999</p><span>Category: Electronics</span><span>Manufacturer: Dell</span></div>
{"name": "Laptop", "price": "$999", "category": "Electronics", "manufacturer": "Dell"}<|endoftext|>步驟 5:添加 LoRA Adapters
LoRA 讓微調更高效(只訓練一小部分)。
代碼:
model = FastLanguageModel.get_peft_model(
model,
r=16, # Rank
target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"],
lora_alpha=16,
lora_dropout=0,
bias="none",
use_gradient_checkpointing="unsloth",
random_state=3407
)輸出: “Unsloth: Patched 32 layers…”(很快)。
LoRA 是什么?Low-Rank Adaptation:給模型加“側掛”層,只訓練 ~1% 的參數,省時間和內存。
步驟 6:訓練模型
用 SFTTrainer 訓練。
代碼:
from trl import SFTTrainer
from transformers import TrainingArguments
trainer = SFTTrainer(
model=model,
tokenizer=tokenizer,
train_dataset=dataset,
dataset_text_field="text",
max_seq_length=max_seq_length,
args=TrainingArguments(
per_device_train_batch_size=2,
gradient_accumulation_steps=4,
warmup_steps=5,
max_steps=60, # 調整以訓練更多
learning_rate=2e-4,
fp16=not torch.cuda.is_bf16_supported(),
bf16=torch.cuda.is_bf16_supported(),
logging_steps=1,
optim="adamw_8bit",
weight_decay=0.01,
lr_scheduler_type="linear",
seed=3407,
output_dir="outputs",
),
)
trainer.train()輸出: 進度條顯示 loss 下降(500 個例子大概 10 分鐘)。
步驟 7:測試推理
跑個快速測試。
代碼:
FastLanguageModel.for_inference(model)
messages = [{"role": "user", "content": "<div><h2>Product: Phone</h2><p>Price: $500</p><span>Category: Gadgets</span><span>Manufacturer: Apple</span></div>"}]
inputs = tokenizer.apply_chat_template(messages, tokenize=True, add_generation_prompt=True, return_tensors="pt").to("cuda")
outputs = model.generate(inputs, max_new_tokens=256, use_cache=True)
print(tokenizer.batch_decode(outputs)[0])輸出:
User: <div><h2>Product: Phone</h2><p>Price: $500</p><span>Category: Gadgets</span><span>Manufacturer: Apple</span></div>
Assistant: {"name": "Phone", "price": "$500", "category": "Gadgets", "manufacturer": "Apple"}如果結果不穩定,多訓練幾次!
步驟 8:導出到 GGUF 格式給 Ollama
保存成 Ollama 支持的格式。
代碼:
model.save_pretrained_gguf("fine_tuned_model", tokenizer, quantization_method="q4_k_m")然后下載:在 Colab 文件里右鍵 > 下載(10-20 分鐘)。
步驟 9:為 Ollama 創建 Modelfile
安裝 Ollama(去 ??ollama.com??)。
在終端:
cd ~/Downloads
mkdir ollama-test
mv unsloth.Q4_K_M.gguf ollama-test/
cd ollama-test
touch Modelfile
nano Modelfile # 粘貼以下內容Modelfile 內容:
FROM ./unsloth.Q4_K_M.gguf
PARAMETER temperature 0.8
PARAMETER top_p 0.9
PARAMETER stop "<|endoftext|>"
TEMPLATE "{{ .Prompt }}"
SYSTEM "You are a helpful AI assistant."創建模型:
ollama create html-extractor -f Modelfile步驟 10:在 Ollama 中運行
ollama run html-extractorPrompt: 粘貼 HTML 示例。輸出: 提取的 JSON(本地運行,隱私安全!)。
最佳實踐和常見問題
?數據質量:用多樣化的例子,防止 overfitting。
?評估:用沒見過的數據測試。
?擴展:用更大的模型(比如 Llama 3.1)效果更好。
?常見問題:數據集太小會導致“hallucinations”,多加數據!
微調的倫理問題
? 避免偏見數據(比如用多樣化的數據源訓練)。
? 隱私:用匿名數據進行微調。
總結
微調 LLM 就像給你的 AI 項目加了個超級技能,把通用工具變成專屬專家!按照這篇指南的簡單步驟——收集好數據、設置環境、用 Unsloth 訓練、用 Ollama 部署,你就能打造出精準、一致的定制模型,滿足你的獨特任務需求。不管是從 HTML 提取數據、寫小眾客服回復,還是解決領域專屬難題,微調讓新手也能輕松上手!
本文轉載自??AI大模型觀察站??,作者:AI研究生

















