Fine-Tune RAG ส่วนตัวด้วยแค่แล็ปท็อป RTX 2070
Fine-Tune RAG ส่วนตัวด้วยแค่แล็ปท็อป RTX 2070
ทำไมถึงอยากให้ทำงานในเครื่องทั้งหมด
my-rag-brain เก็บทุกอย่าง: บันทึกความคิดส่วนตัว บันทึกการตัดสินใจในงาน สิ่งที่สังเกตเห็น ผมไม่อยากส่งข้อมูลพวกนั้นไปให้ cloud API
อยากให้ทำงานในเครื่อง
Tiny-Critic คืออะไร
chunk ที่ RAG ดึงมาจาก ChromaDB ไม่จำเป็นต้องเกี่ยวข้องกับคำถามเสมอไป แม้ระยะทางจะใกล้ แต่เนื้อหาอาจคลาดเคลื่อนได้
Tiny-Critic คือโมเดลขนาดเล็กที่ตัดสินแบบไบนารีอีกครั้งว่า chunk ที่ดึงมาแล้วนั้นเกี่ยวข้องกับคำถามหรือไม่ และลบอันที่ไม่เกี่ยวข้องออก เพื่อลดบริบทก่อนส่งให้ LLM
สร้างข้อมูลฝึก
สร้างข้อมูลที่มีป้ายกำกับจากบันทึก RAG ที่มีอยู่ (คู่ระหว่างคำถามกับ chunk ที่ตี)
# ปรับสมดุล 2,114 คู่ให้เหลือ 1,036 คู่ (yes/no = 50:50)
positives = [(q, chunk, 1) for q, chunk in relevant_pairs]
negatives = [(q, chunk, 0) for q, chunk in irrelevant_pairs]
balanced = positives[:518] + negatives[:518]
ข้อมูลฝึกที่เอนเอียงจะลู่เข้าหาด้านเดียว การปรับสมดุลเป็นสิ่งจำเป็น
เทรนแบบ 4-bit quantization ด้วย QLoRA
ใช้ Qwen2.5-3B-Instruct แบบ 4-bit quantized กับ LoRA adapter โครงสร้างนี้ทำงานได้บน VRAM 8GB ของ RTX 2070 Max-Q
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.float16,
)
model = AutoModelForSequenceClassification.from_pretrained(
"Qwen/Qwen2.5-3B-Instruct",
quantization_config=bnb_config,
num_labels=2,
)
model = get_peft_model(model, LoraConfig(
r=8, lora_alpha=32,
target_modules=["q_proj", "v_proj"],
lora_dropout=0.05,
bias="none",
))
ผลลัพธ์
| รายการ | ค่า |
|---|---|
| ข้อมูลฝึก | 2,114 คู่ → ปรับสมดุลเหลือ 1,036 คู่ |
| เวลาเทรน | ประมาณ 1 ชั่วโมง 53 นาที (RTX 2070 Max-Q) |
| Loss สุดท้าย | 1.454 |
| Token accuracy | ประมาณ 76% (สูงสุด ประมาณ 81%) |
76% ไม่ได้สมบูรณ์แบบ แต่ในฐานะตัวกรองที่ทำงานโดยไม่มีค่าใช้จ่ายสำหรับปัญหา chunk ที่ไม่เกี่ยวข้องหลุดเข้ามา มันทำงานได้ดีเพียงพอ
ทำไมถึงไม่ใช้คลาวด์
ทั้งการเทรนและการอนุมานทำงานบน GPU ที่อยู่ตรงหน้า บันทึกส่วนตัวไม่ได้ออกไปไหน
นี่ไม่ใช่เรื่องความปลอดภัยมากนัก แต่เป็นเรื่องความรู้สึกที่ว่าข้อมูลของตัวเองอยู่ภายใต้การควบคุมของตัวเอง การตัดสินใจว่าจะใส่อะไรใน RAG ไม่ถูกจำกัดด้วยข้อกำหนดบริการของบุคคลที่สาม
บทความที่เกี่ยวข้อง
- เรื่องที่สังเกตว่าพฤติกรรมของ Gemini ตรงกับปรัชญาการออกแบบ RAG ของตัวเอง อยู่ใน AI ไปถึงแนวคิดการออกแบบเดียวกับที่ผมมี
- การนำการออกแบบให้กลับไปดูแหล่งที่มาได้ (source_origin) มาใช้งาน อยู่ใน สิ่งที่ Gemini มีแต่ผมไม่มี — รู้ตัวก็ต่อเมื่อใช้งานจริง
- บันทึกการยกระดับคุณภาพการค้นหาแบบขับเคลื่อนด้วยการวัดผล อยู่ใน RAG ที่มีแค่ vector search “ลืมในตอนที่สำคัญที่สุด” — ทำให้ recall ขึ้นจาก 0.2 เป็น 1.0 ด้วย hybrid search + การวัดผล
- ปรัชญาการออกแบบเบื้องหลัง RAG ส่วนตัวทั้งหมดนี้ อยู่ใน คืนที่ AI แก้ไขฉัน 5 ครั้ง - ปรัชญาการออกแบบเพื่อให้ RAG ส่วนตัวเป็นเพื่อนคุณเป็นเวลา 5 ปี