Views
No views yet
twinkle-ai/gemma-3-4B-T1-it(Gemma 3 4B,台灣語境 fine-tuned 開源模型)上的 QLoRA adapter,用《南投縣信義鄉志》編纂用論文語料庫的合成問答對微調,直接把信義鄉相關知識(歷史、地理、社會、文化、產業)微調進模型權重。src/rag/query_engine.py/src/langchain_pipeline/answer_agent.py),每個論點都附真實段落來源與頁碼。google/gemma-3-4b-pt (Google 原始基底模型)
→ twinkle-ai/gemma-3-4B-T1-it (Liang Hsun Huang、Min Yi Chen、
Wen Bin Lin、Dave Sung 開發;
APMIC、Jerry Wu 贊助;訓練資料含
nvidia/Nemotron-Instruction-Following-Chat-v1、
lianghsun/tw-contract-review-chat、
lianghsun/tw-reasoning-instruct)
→ 本 repo 的 LoRA adapter (用《南投縣信義鄉志》論文語料生成的
合成問答對做 QLoRA 微調,訓練程式碼與
流程見下方 GitHub 連結)Notice: This model is a modification of Gemma, fine-tuned fromtwinkle-ai/gemma-3-4B-T1-it(itself fine-tuned fromgoogle/gemma-3-4b-pt) via LoRA on a synthetic Q&A dataset derived from Xinyi Township Gazetteer research papers. Gemma is provided under and subject to the Gemma Terms of Use found at ai.google.dev/gemma/terms, and use of Gemma is subject to the Gemma Prohibited Use Policy. This is not an official Google product, and is not an official Twinkle AI product.
evaluate.py,20 筆 held-out QA 肉眼比對)發現一個一致的模式:這個規模的 LoRA(可訓練參數僅佔全模型 0.76%)能學到語氣、格式、大致主題範圍,但對長尾的具體事實(專有名詞、確切數字、精確用語)記憶不穩定——模型仍然會用完全自信的語氣回答,而不是坦承不確定,產生「聽起來合理但細節錯誤」的內容(例如捏造人名、講反因果關係、用錯專有名詞)。twinkle-ai/gemma-3-4B-T1-it(gated,需先在 HF 接受授權才能載入)r=16、lora_alpha=16、lora_dropout=0.0,target_modules=["q_proj","k_proj","v_proj","o_proj","gate_proj","up_proj","down_proj"]train_on_responses_only),不浪費訓練訊號在系統提示與問題上gemini-3.1-flash-lite)針對已分類的鄉志論文段落生成的合成問答對,共 9,848 筆訓練樣本、152 筆 held-out 評估樣本;參考答案是 LLM 生成的合成資料,不是人工撰寫或校對過的 ground trutheval_loss=1.961)優於 epoch 1(1.981)與 epoch 3(2.04,train loss 持續下降但 held-out loss 回升,是典型過擬合訊號),因此這個 repo 上傳的是 epoch 2 checkpoint 的權重,不是訓練跑完的最後一個 epoch1from transformers import AutoModelForCausalLM, AutoTokenizer
2from peft import PeftModel
3
4BASE_MODEL = "twinkle-ai/gemma-3-4B-T1-it"
5ADAPTER = "wesleyishere123/gemma-3-4b-xinyi-gazetteer-lora"
6
7tokenizer = AutoTokenizer.from_pretrained(ADAPTER)
8model = AutoModelForCausalLM.from_pretrained(BASE_MODEL, token="hf_你的token")
9model = PeftModel.from_pretrained(model, ADAPTER)
10
11messages = [
12 {"role": "system", "content": "你是熟悉《南投縣信義鄉志》相關知識的在地知識助理,請根據你所學到的信義鄉歷史、地理、社會、文化、產業等知識,用完整、正確的中文直接回答使用者的問題。"},
13 {"role": "user", "content": "布農族的射耳祭有什麼意義?"},
14]
15prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
16inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
17output = model.generate(**inputs, max_new_tokens=300, do_sample=False)
18print(tokenizer.decode(output[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True))