ออกแบบแผนการเรียนรู้ที่ไม่จมไปกับข้อมูลล้นเกิน — จำกัดการจูน RAG/LLM ให้เหลือ 'สามอย่าง เจาะลึก' และถือ 'วัดผลให้ได้' เป็นหน่วยการเรียนรู้
บทนำ
สาขานี้มีเครื่องมือและเทคนิคที่ต้องเรียนรู้มากเกินไป การประเมินผล การค้นคืน (retrieval) การจัดอันดับใหม่ (reranking) การไฟน์จูน การสังเกตการณ์ (observability) — แต่ละอย่างมีไลบรารีมาตรฐานหลายตัว และชื่อใหม่ ๆ ก็ไหลเข้ามาแทบทุกสัปดาห์ ถ้าไล่ตามทั้งหมด สุดท้ายทุกอย่างจะจบแบบครึ่ง ๆ กลาง ๆ ดังนั้นก่อนจะเริ่มเรียนรู้ ผมจึงออกแบบไว้ก่อนว่า จะทิ้งอะไรและจะเจาะลึกอะไร บทความนี้คือบันทึกการออกแบบแผนการเรียนรู้นั้นเอง
หัวข้อที่ใช้คือ RAG (Retrieval-Augmented Generation) ส่วนตัวที่ผมใช้งานอยู่ — กลไกคล้ายความทรงจำระยะยาวภายนอกที่ค้นคืนบันทึกในอดีตด้วยความหมาย ส่วนพื้นฐานของ RAG เองขอฝากไว้ที่บทความนี้
คืนที่ AI แก้ไขฉัน 5 ครั้ง - ปรัชญาการออกแบบเพื่อให้ RAG ส่วนตัวเป็นเพื่อนคุณเป็นเวลา 5 ปี
บทความนี้ยังเป็นเรื่องของ “RAG ที่วัดผลได้” ซึ่งเป็นคู่กับ “RAG ที่ไม่พัง” และ “RAG ที่ไม่ปนเปื้อน” บนฐานที่ไม่พังและไม่ปนเปื้อนนั้น จะวัดและพัฒนาทักษะของตัวเองอย่างไร — นั่นคือการออกแบบในบทความนี้ ขอวางประเด็นสำคัญไว้ก่อน
- ไม่แตะเครื่องมือแบบกว้างและตื้น จำกัดให้เหลือ สามอย่าง เจาะลึก (การประเมินผล/การค้นคืน/การไฟน์จูน) ส่วนที่เหลือให้หยุดแค่ “รู้ไว้”
- ไม่จบแค่ “อ่านแล้ว” ถือว่า เชื่อมต่อกับข้อมูลจริงของตัวเองแล้ววัดผลให้ได้ เป็นหน่วยที่เล็กที่สุดของการเรียนรู้
- วางการประเมินผล (วิธีการวัด) ไว้เป็นอันดับแรก เพราะถ้าวัดไม่ได้ การปรับปรุงการค้นคืนหรือการไฟน์จูนก็จะจบแค่ “รู้สึกว่าดีขึ้น”
ทำไมจึงจำกัดให้เหลือ “สามอย่าง เจาะลึก”
สิ่งที่อยากหลีกเลี่ยงที่สุดคือการแตะเครื่องมือ 20 ตัวแบบตื้น ๆ แล้วรู้สึกว่า “รู้คร่าว ๆ ทุกอย่าง” เป็นกับดักที่ตกได้ง่าย ยิ่งแตะมากยิ่งนับจำนวนได้เยอะ แต่ฝีมือที่วัดผลได้จริงกลับไม่เพิ่มขึ้นแม้แต่อย่างเดียว
ผมจึงเรียงเครื่องมือมาตรฐานตามชั้น แล้วสำรวจว่าตัวเองมีอะไรอยู่แล้วและอะไรยังบางอยู่ ผลที่ได้คือสิ่งที่ต้องเติมไม่ใช่ “จำนวนเครื่องมือ” แต่คือ ขาที่ยังบางสามขา ได้แก่ การวัด การเปรียบเทียบ และการสร้างข้อมูล การจำกัดขอบเขตออกมาเป็นแบบนี้
ขอบเขตการเรียนรู้การจูน RAG/LLM
│
┌─────────┬───────────┼───────────┬─────────────┐
▼ ▼ ▼ ▼ ▼
ประเมิน(E) ค้นคืน(R) FT(F) จัดกระบวน …อื่นๆอีกมาก
│ │ │ การ(O) (ไม่แตะแบบตื้น)
═══╪══════════╪══════════╪═══ │
สามเสาที่จะเจาะลึก (E→R→F) รู้ไว้เฉยๆ
│ (ไม่ลงทุนเกิน)
└──▶ แต่ละเสา = 1 หน่วย: "วัดด้วยข้อมูลจริง" (หัวข้อถัดไป)
สามเรื่องที่จะเจาะลึกคือ การประเมินผล การค้นคืน และการไฟน์จูน ส่วนการจัดกระบวนการ (orchestration หรือกรอบที่เชื่อมส่วนประกอบหลายส่วนเข้าด้วยกัน) ผมตัดสินใจว่าแค่ระดับ “อ่านออกและอธิบายได้” ก็เพียงพอ เหตุผลจะอธิบายทีหลัง แต่โดยสรุปคือส่วนนี้ผมมีแนวคิดอยู่ในมือแล้วจากการสร้างเองมาก่อน ดังนั้นแค่ “แปล” ให้เข้ากับคำศัพท์ของกรอบมาตรฐานก็เพียงพอแล้ว
การสำรวจสิ่งที่มีและสิ่งที่ขาด (แผนที่จุดยืนปัจจุบัน)
นี่คือการสำรวจสต็อกที่เป็นพื้นฐานของการจำกัดขอบเขต นำมาแสดงตามจริง ไม่ใช่การให้คะแนนตัวเอง แต่เป็นแผนที่สำหรับออกแบบที่เรียงอย่างตรงไปตรงมาว่า “ชั้นไหนมีอะไรอยู่ และอะไรยังบาง”
| ชั้น | เครื่องมือมาตรฐาน | สถานะปัจจุบันของผม | ความหนา |
|---|---|---|---|
| การประเมินผล | Ragas / DeepEval | สร้างตัวตัดสินความเกี่ยวข้องเอง (รายละเอียดด้านล่าง) | บาง (การทำให้เป็นมาตรฐาน/การทดสอบถดถอยอัตโนมัติยังไม่มี) |
| การสังเกตการณ์ (Observability) | LangSmith / Langfuse | log สร้างเอง แต่โครงสร้างพื้นฐานสำหรับ trace ยังไม่มี | บาง |
| การค้นคืน/การจัดอันดับใหม่ | pgvector / reranker หลายแบบ | ใช้ hybrid search + reranking ในการทำงานจริง | มีแกนหลักอยู่แล้ว (ยังไม่มีการเปรียบเทียบแบบเคียงข้าง) |
| การเชื่อมต่อ (O) | LangChain / LlamaIndex | สร้างเองแบบอิสระแล้ว | มีแนวคิดอยู่แล้ว (ยังไม่มีคำศัพท์มาตรฐาน) |
| พื้นฐาน/FT | QLoRA / LoRA | ฝึกและใช้งานจริงกับ RAG ส่วนตัวแล้ว | มีของจริงอยู่แล้ว (การออกแบบข้อมูลและการประเมินผลยังบาง) |
จุดที่ยังบางมีสามจุด ได้แก่ (A) การทำให้การวัดผลเป็นมาตรฐานและอัตโนมัติ (B) การเปรียบเทียบวิธีการค้นคืนแบบเคียงข้าง (C) การออกแบบข้อมูลสำหรับการไฟน์จูน ผมเรียงลำดับแทร็กการเรียนรู้ตามลำดับที่จะเติมเต็มสามจุดนี้
รูปแบบการเรียนรู้ — ทำให้ “วัดผลให้ได้” เป็นหนึ่งหน่วย
ผมกำหนดขั้นตอนร่วมสำหรับทุกแทร็กไว้เป็นแบบแผนเดียวตั้งแต่แรก นี่คือแก่นของการออกแบบ
① อ่าน (เอกสารทางการ・แนวคิด)
│
▼
② รันด้วยข้อมูลจริงของตัวเอง ◀─────────┐
│ (ไม่จบแค่ข้อมูลของเล่น/ทิวทอเรียล)
▼ │ วัดไม่ได้ = ยังรันไม่จริง
③ วัดผล (ให้ตัวเลขออกมาด้วยข้อมูลที่มีเฉลย) ─┘
│ ถึงจุดนี้เท่านั้นจึงเรียกว่า "เข้าใจแล้ว" ได้
▼
④ เขียนบทความ (ตกผลึกสิ่งที่เรียนรู้ + พอร์ตโฟลิโอ)
ผมไม่เรียก “① อ่านแล้ว” ว่า “เข้าใจแล้ว” หน่วยหนึ่งจะถือว่าเสร็จสมบูรณ์ก็ต่อเมื่อไปถึง ③ วัดผลด้วยข้อมูลจริงของตัวเอง เท่านั้น ต่อให้รันได้กับข้อมูลตัวอย่างในทิวทอเรียล นั่นก็ไม่ใช่ “ทำให้ทำงานได้แล้ว” เป็นเพียงแค่ “ลอกตามได้” เท่านั้น หากวัดแล้วไม่สามารถให้ตัวเลขออกมาได้ ก็ต้องย้อนกลับไปที่ ② — เส้นทางย้อนกลับนี้ถูกฝังไว้ในแบบแผนตั้งแต่ต้น เป็นแนวคิดเดียวกับวินัยที่บันทึกความสำเร็จ/ความล้มเหลวของ RAG ส่วนตัวเป็นหนึ่งชุด “จนกว่าจะรับมือจนสำเร็จ”
ทำไมจึงวางการประเมินผลไว้เป็นอันดับแรกก่อนสิ่งอื่นใด
ผมจัดลำดับให้กับสามเสาหลัก: การประเมินผล (E) → การค้นคืน (R) → การไฟน์จูน (F) การที่วางการประเมินผลไว้เป็นอันดับแรกมีเหตุผลที่ชัดเจน
ต่อให้เปลี่ยนวิธีค้นคืนหรือไฟน์จูนใหม่โดยไม่มีไม้บรรทัดสำหรับวัด สิ่งที่พูดได้เกี่ยวกับดี-ไม่ดีก็มีแค่ “รู้สึกว่าดีขึ้นเหมือนกัน” เท่านั้น ในความเป็นจริง การปรับปรุงการค้นคืนสามารถพูดเป็นตัวเลขได้ก็เพราะผมวาง “การวัดผล” ไว้ก่อน ผมนำ hybrid search เข้ามาใช้ แล้วขยับ recall (อัตราการนึกออก) ในตอนที่สำคัญที่สุดจาก 0.2 ไปเป็น 1.0 — ตัวเลข “0.2 → 1.0” นี้พูดได้ก็ต่อเมื่อมีไม้บรรทัดอยู่แล้วเท่านั้น วิธีวางไม้บรรทัดนั้นเขียนไว้ในบทความนี้
E: ฐานการประเมินผล (ไม้บรรทัด)
│ ถ้าไม่มีสิ่งนี้ ↓ จะบอกดี-ไม่ดีเป็นตัวเลขไม่ได้
┌────┴────┐
▼ ▼
R: การค้นคืน F: การไฟน์จูน
(เปรียบเทียบ) (ฝึกฝน)
R หรือ F ที่ไม่มีไม้บรรทัดก็ไม่ต่างอะไรจากการพนัน ผมจึงวางการประเมินผลไว้เป็นอันดับแรก ที่นี่คือจุดที่บางที่สุดตอนนี้ และเป็นจุดที่เมื่อเติมเต็มแล้ว การตัดสินใจที่เหลือทั้งหมดจะกลายเป็นตัวเลข เป็นจุดที่ให้ผลตอบแทนต่อการลงทุนสูงที่สุด
เนื้อหาของสามเสาหลัก และ O ที่แค่ “รู้ไว้เฉยๆ”
ผมเรียง “แนวคิดที่ต้องเรียนรู้ / ผลงานที่จะสร้าง / เงื่อนไขความสำเร็จ” ของแต่ละแทร็กไว้ เงื่อนไขความสำเร็จทั้งหมดกำหนดด้วย ตัวเลขหรือผลงานที่ใช้งานได้จริง
| เสาหลัก | แนวคิดที่ต้องเรียนรู้ (ย่อยคำที่เจอครั้งแรก) | ผลงานที่จะสร้าง | เงื่อนไขความสำเร็จ |
|---|---|---|---|
| E การประเมินผล | Faithfulness (คำตอบซื่อสัตย์ต่อหลักฐานหรือไม่ = ไม่ได้กุเรื่องขึ้นมาเอง) recall/precision ของบริบท LLM-as-judge (ให้ LLM เองเป็นผู้ให้คะแนน) การทดสอบถดถอย (regression test) | ฐานการประเมินผลที่เชื่อมต่อ golden set (ข้อมูลที่มีเฉลย) เข้ากับ Ragas (ไลบรารีสำหรับประเมินผล) พร้อม regression suite ที่เปรียบเทียบก่อน-หลังการเปลี่ยนแปลงโดยอัตโนมัติ และทำให้ trace มองเห็นได้ด้วย Langfuse (ฐานที่รันแบบ self-host สำหรับแสดงภาพกระบวนการ) | เมื่อเปลี่ยนค่าสัมประสิทธิ์ของ hybrid search หรือ reranker แล้ว สามารถตัดสินดี-ไม่ดีด้วยตัวเลขได้ |
| R การค้นคืน | dense vector (ดึงด้วยความใกล้เคียงเชิงความหมาย) / sparse vector (ดึงด้วยการตรงกันของคำ) / hybrid, reranker (เครื่องมือจัดเรียงผลลัพธ์ที่ค้นได้ใหม่ตามความเกี่ยวข้อง) chunking (วิธีตัดแบ่งเอกสาร) การแปลงคำค้น | สร้างการค้นคืนเวอร์ชัน pgvector (extension สำหรับค้นคืนแบบ vector บน Postgres) แล้วเปรียบเทียบเคียงข้างกับเวอร์ชันเดิมด้วยข้อมูลชุดเดียวกัน (recall, precision, ความเร็ว) | อธิบายได้ ด้วยตัวเลขที่วัดจริง ว่า “ทำไมจึงเลือกวิธีไหน” |
| F การไฟน์จูน | การออกแบบชุดข้อมูล (ความหลากหลาย/ป้องกันการรั่วไหล) การแบ่งสำหรับประเมินผล LoRA/QLoRA (เทคนิคไฟน์จูนแบบประหยัดหน่วยความจำ) | ออกแบบข้อมูลใหม่อย่างตั้งใจ แล้วฝึกใหม่ ประเมิน/เปรียบเทียบด้วยข้อมูลที่ไม่ได้ใช้ฝึก (hold-out) | อธิบายได้ ด้วยตัวเลข ว่า “ทำไมจึงจัดโครงสร้างข้อมูลแบบนี้ และความแม่นยำเปลี่ยนไปอย่างไร” |
ตัวตัดสินความเกี่ยวข้องที่ผมสร้างเองใน E และโมเดลที่ไฟน์จูนแล้วใน F เป็นของจริงที่มีอยู่ในมือแล้ว ขอฝากรายละเอียดไว้ที่บทความการทำแต่ละอย่าง
วางตัวตัดสินความเกี่ยวข้องขนาดเล็กไว้หน้า RAG — ไม่ส่งทุกอย่างที่ค้นเจอผ่านไปทั้งหมด
Fine-Tune RAG ส่วนตัวด้วยแค่แล็ปท็อป RTX 2070
เป้าหมายของ E คือ การเชื่อมต่อและแทนที่ตัวตัดสินที่สร้างเองนี้ด้วยไม้บรรทัดมาตรฐานอย่าง Ragas เป็นงานของการย้ายสัญชาตญาณที่ตัวเองคิดค้นขึ้นไปไว้บนมาตรวัดร่วมที่เปรียบเทียบกับคนอื่นได้
ในทางกลับกัน เรื่องที่สี่คือ O (orchestration) ผมจะไม่เจาะลึก เพราะผมมี activation layer และ wiring layer ที่สร้างขึ้นเองแบบอิสระ แนวคิดตัวมันเองอยู่ในมืออยู่แล้ว
ฉีด ‘สิ่งที่ควรนึกถึงตอนนี้’ ให้ AI ทุกเทิร์น — ชั้นกระตุ้นความจำ (Activation Layer) ของ RAG ส่วนตัว
ดังนั้น O จึงถือว่าแค่ระดับที่ “อ่าน” กรอบมาตรฐานอย่าง LangChain ออก และ “อธิบายกลไกที่สร้างเองด้วยคำศัพท์ของมันได้” ก็เพียงพอ ผมจะลอกโค้ดตามแค่ชิ้นเดียวเล็ก ๆ แล้วจะไม่ลงทุนเพิ่มไปมากกว่านั้น
แอนตี้แพทเทิร์นที่กำจัดไว้ล่วงหน้า
ถ้ามองกลับกัน การออกแบบนี้ก็คือการเรียงลิสต์ “ความล้มเหลวที่มักทำโดยไม่ตั้งใจ” ไว้ล่วงหน้า แล้วผูกมาตรการรับมือไว้กับแต่ละข้อ
- แตะเครื่องมือแบบกว้างและตื้น: แตะ 20 ตัวแต่วัดผลไม่ได้สักตัว → จึงจำกัดให้เหลือสามอย่างที่เจาะลึก และให้ O แค่รู้ไว้เฉยๆ
- ปรับปรุงโดยไม่วัดผล: หยุดอยู่แค่ “รู้สึกว่าดีขึ้น” → จึงวางการประเมินผล (E) ไว้เป็นอันดับแรก
- พอใจกับข้อมูลของเล่น: จบแค่ตัวอย่างในทิวทอเรียล → จึงถือว่า “เชื่อมต่อกับข้อมูลจริงของตัวเองแล้ววัดผลให้ได้” เป็นหน่วยการเรียนรู้
- ลงทุนเกินตัวกับกรอบการทำงาน: พยายามเชี่ยวชาญไลบรารีที่ใช้เชื่อมต่อ → เนื่องจากมีแนวคิดอยู่ในมือแล้วจากการสร้างเอง แค่แปลให้เข้ากับคำศัพท์มาตรฐานก็เพียงพอ
ทั้งสี่ข้อเป็นความล้มเหลวประเภทที่ต้องกำจัดด้วยการออกแบบ ไม่ใช่ด้วยความรู้ ถ้ากำจัดไว้บนแผนที่ก่อนเริ่มเรียนรู้ เวลาที่ต้องเสียไปหลังจากเริ่มวิ่งแล้วก็จะลดลง
การเรียนรู้ก็เช่นกัน จะเรียกว่า “ก้าวหน้า” ได้ก็ต่อเมื่อวัดผลได้แล้วเท่านั้น
แกนหลักของแผนงานนี้มีอันเดียว ไม่ปนกัน ระหว่าง “อ่านแล้ว” กับ “ทำได้แล้ว” และถือว่าเป็นหนึ่งหน่วยก็ต่อเมื่อได้วัดด้วยข้อมูลจริงของตัวเองแล้วเท่านั้น และวางไม้บรรทัดสำหรับวัด (การประเมินผล) ไว้ก่อนสิ่งอื่นใด เมื่อมีไม้บรรทัดแล้ว ทั้งการค้นคืนและการไฟน์จูนก็จะเปลี่ยนจาก “การพนัน” เป็น “การวัดผล” และสามารถเดินหน้าไปพร้อมกับยืนยันความก้าวหน้าเป็นตัวเลขได้
นี่คือบทที่สามของแนวคิดเดียวกันกับเรื่องการรักษาความทรงจำไม่ให้พังและแก้ไขไม่ให้ปนเปื้อน ไม่พัง ไม่ปนเปื้อน และวัดผลได้ — ต่อเมื่อครบทั้งสามอย่างนี้เท่านั้น ความทรงจำภายนอกจึงจะเปลี่ยนจากสิ่งที่ “เพิ่มขึ้นเฉยๆ” ไปเป็นสิ่งที่ “ถูกฝึกฝน” ฝั่งที่ไม่พังและฝั่งที่ไม่ปนเปื้อนเขียนไว้ในบทความคู่กันสองบทความ
และกลไกตรวจสอบประจำสัปดาห์ที่รักษาทั้งหมดนี้ให้สมบูรณ์ ผมเขียนไว้ในบทความนี้