สวัสดี!
หากคุณมาที่นี่ อาจเป็นเพราะคุณต้องการปรับแต่งโมเดล AI แบบโอเพนซอร์สอย่างละเอียด สำหรับการใช้งานของคุณเอง (แชทบอท, ผู้ช่วยในการเขียนโค้ด, ผู้เชี่ยวชาญเฉพาะด้าน ฯลฯ) นี่คือภาพรวมที่เรียบง่ายและเป็นมิตรกับผู้เริ่มต้น ซึ่งคุณสามารถนำไปใช้ได้โดยตรงในบริบทของ Laravel และการพัฒนาเว็บทั่วไป
1. "การปรับแต่งโมเดล AI แบบ Open Source อย่างละเอียด" คืออะไร
การปรับแต่งอย่างละเอียด คือการใช้โมเดลที่ได้รับการฝึกฝนล่วงหน้าแล้ว (เช่น LLaMA‑2, Mistral หรือโมเดลบน Hugging Face) และทำการฝึกอบรมซ้ำเล็กน้อยด้วยข้อมูลของคุณเอง เพื่อ:
- ปรับให้เข้ากับโดเมนของคุณ (กฎหมาย, การเงิน, การแพทย์, เกม ฯลฯ)
- สอนน้ำเสียงและสไตล์ของคุณให้กับโมเดล
- ปรับปรุงงานเฉพาะ (QA, การเขียนโค้ด, การจัดประเภท, การสนับสนุน ฯลฯ)
แทนที่จะฝึกอบรมทุกอย่างตั้งแต่เริ่มต้น (ซึ่งมีค่าใช้จ่ายสูงและใช้เวลานาน) คุณสามารถนำโมเดลพื้นฐานที่ทรงพลังมาใช้ซ้ำและทำให้มีความเชี่ยวชาญเฉพาะด้านมากขึ้น
2. ตัวเลือกหลักในการปรับแต่งอย่างละเอียด
โดยหลักแล้วมีแนวทางทั่วไปสามแนวทาง:
2.1 การปรับแต่งอย่างละเอียดแบบเต็มรูปแบบ
- อัปเดตน้ำหนักของโมเดลทั้งหมด
- ข้อดี: ความยืดหยุ่นและประสิทธิภาพสูงสุด
- ข้อเสีย: ต้องการ GPU จำนวนมาก เวลา และพื้นที่จัดเก็บ
โดยทั่วไปแล้ววิธีนี้มากเกินไป ยกเว้นว่าคุณเป็นสถาบันวิจัยหรือบริษัทขนาดใหญ่
2.2 LoRA / PEFT (การปรับแต่งอย่างละเอียดที่มีประสิทธิภาพในแง่ของพารามิเตอร์)
- ตรึงโมเดลพื้นฐานและฝึกอบรมเฉพาะเลเยอร์การปรับตัวขนาดเล็ก (เมทริกซ์ LoRA)
- ใช้ไลบรารีเช่น:
ข้อดี:
- ความต้องการ VRAM ต่ำกว่ามาก
- เร็วกว่า
- คุณสามารถแชร์เฉพาะอะแดปเตอร์ ไม่ใช่ทั้งโมเดล
ข้อเสีย:
- มีความสามารถในการแสดงออกน้อยกว่าการปรับแต่งอย่างละเอียดแบบเต็มรูปแบบเล็กน้อย แต่โดยทั่วไปก็เพียงพอ
2.3 QLoRA (LoRA ที่มีการหาปริมาณ)
- รวมการหาปริมาณ (เช่น 4 บิต) เข้ากับ LoRA
- โหลดโมเดลพื้นฐานด้วยความแม่นยำต่ำ (
int4หรือint8) - ฝึกอบรมอะแดปเตอร์ LoRA ไว้ด้านบน
- โหลดโมเดลพื้นฐานด้วยความแม่นยำต่ำ (
ข้อดี:
- คุณสามารถปรับแต่งโมเดลขนาดใหญ่บน GPU เพียงตัวเดียว ได้ (แม้แต่ GPU ทั่วไปเช่น 24 GB)
- เป็นที่นิยมอย่างมากสำหรับโมเดลประเภท LLaMA
แนะนำสำหรับนักพัฒนาแต่ละรายส่วนใหญ่
3. การเลือกโมเดลพื้นฐานแบบ Open Source
จะหาโมเดลได้จากที่ไหน:
ตัวเลือกทั่วไป:
- แชท / ผู้ช่วย:
mistralai/Mistral-7B-Instruct-v0.2meta-llama/Llama-3-8b-instruct(หากใบอนุญาตและการเข้าถึงเหมาะกับกรณีการใช้งานของคุณ)
- โค้ด:
codellama/CodeLlama-7b-Instruct-hfdeepseek-ai/deepseek-coder-6.7b-instruct
สิ่งที่ต้องตรวจสอบ:
- ใบอนุญาต (เชิงพาณิชย์เทียบกับไม่ใช่เชิงพาณิชย์)
- ขนาดของโมเดล (7B เป็นจุดเริ่มต้นที่ดี)
- Instruction‑tuned เทียบกับ base: เลือกโมเดล instruct/แชทสำหรับแชทบอท
4. การเตรียมข้อมูลสำหรับการปรับแต่งอย่างละเอียด
รูปแบบของข้อมูลของคุณมีความสำคัญมากกว่าที่คนทั่วไปคิด
4.1 คุณควรใช้ข้อมูลประเภทใด
ตัวอย่าง:
- บันทึกการแชทของการสนับสนุนลูกค้า
- เอกสารคำถามที่พบบ่อย
- บทความฐานความรู้
- ที่เก็บโค้ด + คำอธิบาย
- บทความวิจัยเฉพาะโดเมน
ทำความสะอาดข้อมูลของคุณ:
- ลบ PII / ข้อมูลลับ (คีย์ API, อีเมล, รหัสผ่าน)
- ลบข้อความที่ซ้ำกัน
- แก้ไขปัญหาการจัดรูปแบบที่ชัดเจน
4.2 รูปแบบคำสั่งทั่วไป
สำหรับโมเดลแชท รูปแบบทั่วไป บน Hugging Face คือ:
{
"instruction": "อธิบายสั้น ๆ ว่าการปรับแต่งอย่างละเอียดคืออะไร",
"input": "",
"output": "การปรับแต่งอย่างละเอียด คือการใช้โมเดลที่ได้รับการฝึกฝนล่วงหน้าแล้วและทำการฝึกอบรมซ้ำด้วยข้อมูลของคุณเอง..."
}
หรือรูปแบบแชทที่เหมือนจริงมากขึ้น:
{
"messages": [
{"role": "system", "content": "คุณคือผู้ช่วยที่ให้ความช่วยเหลือเกี่ยวกับคำถามด้านบัญชี"},
{"role": "user", "content": "ฉันจะบันทึกการชำระเงินของใบแจ้งหนี้ได้อย่างไร"},
{"role": "assistant", "content": "ในการบันทึกการชำระเงินของใบแจ้งหนี้ คุณต้อง..."
]
}
บันทึกในรูปแบบ .jsonl (หนึ่งอ็อบเจ็กต์ JSON ต่อบรรทัด), .json หรือเป็นชุดข้อมูล Hugging Face
5. ตัวอย่างขั้นต่ำ: การปรับแต่งอย่างละเอียดด้วย Hugging Face + LoRA
โดยทั่วไป คุณจะต้องมี:
- Python 3.10+
- GPU (ในอุดมคติ >= 16 GB VRAM สำหรับ 7B, 24 GB สบายกว่า)
- ไลบรารี:
transformersdatasetspeftbitsandbytesaccelerate
5.1 การติดตั้ง Dependencies
pip install "transformers>=4.39.0" "datasets" "accelerate" "peft" "bitsandbytes"
5.2 สคริปต์ QLoRA อย่างง่าย (เชิงแนวคิด)
from datasets import load_dataset
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer
from peft import LoraConfig, get_peft_model
import torch
model_name = "mistralai/Mistral-7B-Instruct-v0.2"
dataset_path = "path_or_hf_dataset" # ตัวอย่าง: "my-username/my-dataset"
tokenizer = AutoTokenizer.from_pretrained(model_name)
tokenizer.pad_token = tokenizer.eos_token
model = AutoModelForCausalLM.from_pretrained(
model_name,
load_in_4bit=True,
device_map="auto"
)
dataset = load_dataset(dataset_path, split="train")
def format_example(example):
user = example["instruction"]
answer = example["output"]
prompt = f"User: {user}
Assistant:"
return {"input_ids": tokenizer(prompt, truncation=True, padding="max_length", max_length=512)["input_ids"],
"labels": tokenizer(answer, truncation=True, padding="max_length", max_length=512)["input_ids"]}
tokenized = dataset.map(format_example, remove_columns=dataset.column_names)
lora_config = LoraConfig(
r=16,
lora_alpha=32,
target_modules=["q_proj", "v_proj"],
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM"
)
model = get_peft_model(model, lora_config)
training_args = TrainingArguments(
output_dir="./mistral-finetuned",
per_device_train_batch_size=2,
gradient_accumulation_steps=8,
learning_rate=2e-4,
num_train_epochs=3,
fp16=True,
logging_steps=10,
save_steps=500,
save_total_limit=2,
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized
)
trainer.train()
model.save_pretrained("./mistral-finetuned-lora")
tokenizer.save_pretrained("./mistral-finetuned-lora")
นี่คือข้อมูลอ้างอิงที่เรียบง่าย สำหรับการใช้งานจริง โปรดดู:
6. การผสานรวมโมเดลที่ปรับแต่งอย่างละเอียดของคุณเข้ากับแอปพลิเคชัน Laravel
เมื่อคุณมีโมเดลที่ปรับแต่งอย่างละเอียดแล้ว คุณต้องให้บริการและเรียกใช้จาก Laravel
6.1 วิธีต่างๆ ในการให้บริการโมเดลของคุณ
- Microservice FastAPI / Flask (Python)
- เรียกใช้การอนุมานด้วย
transformersหรือ vLLM - เปิดเผย endpoint
/generate
- เรียกใช้การอนุมานด้วย
- Text Generation Inference (TGI)
- Hugging Face TGI ได้รับการปรับให้เหมาะสมสำหรับการให้บริการ LLM
- Ollama (สำหรับบางโมเดล)
- Ollama ทำงานบน macOS/Linux และมี API HTTP ที่เรียบง่าย
6.2 Endpoint การอนุมานพื้นฐาน (ตัวอย่าง Python + FastAPI)
from fastapi import FastAPI
from pydantic import BaseModel
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
app = FastAPI()
model_name = "./mistral-finetuned-lora"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype=torch.float16,
device_map="auto"
)
class GenerateRequest(BaseModel):
prompt: str
max_new_tokens: int = 256
temperature: float = 0.7
@app.post("/generate")
def generate(req: GenerateRequest):
inputs = tokenizer(req.prompt, return_tensors="pt").to(model.device)
output = model.generate(
**inputs,
max_new_tokens=req.max_new_tokens,
temperature=req.temperature,
do_sample=True,
pad_token_id=tokenizer.eos_token_id
)
text = tokenizer.decode(output[0], skip_special_tokens=True)
return {"result": text}
เรียกใช้สิ่งนี้บนเครื่องที่มี GPU
6.3 การเรียกใช้โมเดลจาก Laravel
ใน Laravel ให้ใช้ Http::post() (จาก Illuminate\Support\Facades\Http) เพื่อสื่อสารกับบริการ Python ของคุณ:
use Illuminate\Support\Facades\Http;
$response = Http::post('http://your-python-host:8000/generate', [
'prompt' => 'อธิบายว่าการปรับแต่งอย่างละเอียดคืออะไร',
'max_new_tokens' => 256,
'temperature' => 0.7,
]);
$result = $response->json()['result'] ?? null;
คุณสามารถห่อหุ้มสิ่งนี้ไว้ในคลาสบริการ (เช่น App\Services\AIClient) และเรียกใช้จากคอนโทรลเลอร์ของคุณได้
7. เคล็ดลับในการรับผลลัพธ์การปรับแต่งอย่างละเอียดที่ดีขึ้น
- เริ่มต้นจากเล็กๆ: เริ่มต้นด้วยโมเดล 7B และชุดข้อมูลขนาดเล็ก (ตัวอย่าง 1k ถึง 10k)
- สอดคล้องกับ Prompts ของคุณ: ใช้โครงสร้างเดียวกันกับตอนที่อนุมาน
- ประเมินบ่อยๆ:
- สร้างชุดคำถามประเมินขนาดเล็ก
- ตรวจสอบคำตอบหลังจากการรันการฝึกอบรมแต่ละครั้ง
- หลีกเลี่ยงการเรียนรู้มากเกินไป:
- ใช้ชุดตรวจสอบความถูกต้อง
- ตรวจสอบว่าโมเดลเริ่มจดจำหรือไม่
- จัดทำเอกสารการกำหนดค่าของคุณ:
- อันดับ LoRA, อัตราการเรียนรู้, ยุค, รุ่นชุดข้อมูล
- สิ่งนี้จะช่วยคุณในการสร้างการรันที่ดีซ้ำ
8. เครื่องมือและเฟรมเวิร์กทั่วไปที่ควรสำรวจ
- ระบบนิเวศ Hugging Face:
- vLLM – การบริการด้วยความเร็วสูง: https://github.com/vllm-project/vllm
- Axolotl – ชุดเครื่องมือปรับแต่ง LLM อย่างละเอียด: https://github.com/OpenAccess-AI-Collective/axolotl
- Deepspeed / FSDP สำหรับการฝึกอบรมขนาดใหญ่: DeepSpeed
9. เมื่อไม่จำเป็นต้องปรับแต่งอย่างละเอียด
ในบางกรณี คุณสามารถได้รับสิ่งที่คุณต้องการได้โดย:
- Prompt engineering (คำแนะนำและตัวอย่างที่ดีกว่า)
- RAG (Retrieval‑Augmented Generation) – การป้อนเอกสารภายนอกในขณะที่ทำการร้องขอ โดยไม่ต้องเปลี่ยนน้ำหนัก
- ใช้ Haystack, LlamaIndex หรือ LangChain
RAG มักจะง่ายต่อการบำรุงรักษาและอัปเดตมากกว่าการปรับแต่งอย่างละเอียดแบบเต็มรูปแบบ โดยเฉพาะอย่างยิ่งสำหรับความรู้ที่มีการพัฒนาอย่างรวดเร็ว
10. ขั้นตอนต่อไป
หากคุณเพิ่งเริ่มต้น:
- เลือกโมเดล instruct บน Hugging Face
- สร้างชุดข้อมูลคำสั่งขนาดเล็กจากโดเมนของคุณเอง
- เรียกใช้การปรับแต่งอย่างละเอียดสั้นๆ โดยใช้ QLoRA + PEFT
- ให้บริการโมเดลของคุณผ่าน API Python ขนาดเล็ก
- เรียกใช้จาก Laravel โดยใช้
Http::post()และสร้างอินเทอร์เฟซ
บอกฉัน:
- กรณีการใช้งานของคุณคืออะไร (แชทบอท, ผู้ช่วยเขียนโค้ด, เครื่องมือภายใน ฯลฯ)
- คุณสามารถเข้าถึงฮาร์ดแวร์ประเภทใด (GPU / RAM)
ฉันสามารถให้แผนการปรับแต่งอย่างละเอียดทีละขั้นตอนที่ปรับให้เหมาะกับการกำหนดค่าที่แน่นอนของคุณได้