ข้ามไปเนื้อหาหลัก

คู่มือประเมินคุณภาพการค้นหาด้วย nDCG ก่อนปรับแต่งน้ำหนัก Ranking

เรียนรู้วิธีการล็อกฐานข้อมูลและการให้คะแนนความเกี่ยวข้อง (Relevance) เพื่อให้การปรับแต่งระบบค้นหาใน PostgreSQL สามารถวัดผลได้จริง

เรียบเรียงโดย AI
Inewgen
12 Aug 2026ที่มา: Dev.to4 นาทีอ่าน (0 ครั้ง)อัปเดตล่าสุด 29 Aug 2026
แชร์
คู่มือประเมินคุณภาพการค้นหาด้วย nDCG ก่อนปรับแต่งน้ำหนัก Ranking

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง

ขนาดตัวอักษร
  • ห้ามปรับแต่งน้ำหนัก ts_rank กับตารางข้อมูลสดที่กำลังเปลี่ยนแปลงตลอดเวลา
  • ตรึง corpus ด้วยการสร้างตาราง Snapshot ข้อมูลเพื่อใช้เป็นฐานทดสอบเดียวกัน
  • ดึง Search Query จริง 30 ถึง 50 คำจาก Log และ Support Tickets มาใช้งาน
  • ใช้ดัชนีวัดผล nDCG@k เพื่อประเมินความถูกต้องของลำดับการค้นหา

ก่อนที่คุณจะลงมือเปลี่ยนค่าน้ำหนัก ts_rank แม้แต่ค่าเดียว สิ่งสำคัญที่สุดคือการล็อกฐานข้อมูล (Freeze your corpus) แล้วนำการจัดอันดับปัจจุบันไปเทียบกับชุดข้อมูลประเมินที่มีการให้เกรดไว้แล้ว มิฉะนั้นคุณกำลังเปรียบเทียบเป้าหมายสองอย่างที่เคลื่อนไหวไปพร้อมกัน ทั้งน้ำหนักชุดใหม่และเอกสารชุดใหม่ ทำให้ไม่มีวันรู้เลยว่าตัวแปรไหนกันแน่ที่ส่งผลต่อการเปลี่ยนแปลง การทำฮาร์ดแวร์จำลองการถดถอยความเกี่ยวข้อง (Relevance regression harness) จะเปลี่ยนความรู้สึกที่ว่าระบบค้นหาแย่ลงตั้งแต่ช่วงวันอังคาร ให้กลายมาเป็นตัวเลขที่สามารถนำมาเทียบความแตกต่างได้ ในลักษณะเดียวกับที่ชุดทดสอบโค้ดเปลี่ยนความรู้สึกที่ว่าโปรแกรมพังให้กลายเป็นเครื่องหมายถูกสีแดง

ในบทความก่อนหน้านี้เกี่ยวกับการทดสอบโหลดของดัชนี Full-text บน Postgres ผู้อ่านท่านหนึ่งได้ให้ความเห็นที่คมคายว่า หากคุณปรับแต่งน้ำหนักโดยอิงกับตารางข้อมูลจริงที่ใช้งานอยู่ คุณกำลังเทียบระบบสองระบบที่เปลี่ยนแปลงพร้อมกัน บทความนี้จึงเป็นการนำเสนอวิธีปฏิบัติจริงในการรวบรวมเกรด การล็อกฐานข้อมูล และการคำนวณคะแนน

การทำความเข้าใจเรื่องคุณภาพการค้นหาแตกต่างจากการเขียน Unit Test ทั่วไปที่มักยืนยันผลลัพธ์แบบตรงไปตรงมา เช่น การเช็คว่าผลลัพธ์รวมเท่ากับ 42 แต่ความเกี่ยวข้องเป็นเรื่องของลำดับความสำคัญ ตัวอย่างเช่น สำหรับคำค้นหา postgres connection pool คู่มือ pgbouncer ควรแสดงผลอยู่เหนือบันทึกการเปลี่ยนแปลงที่ไม่เกี่ยวข้อง และบทความเจาะลึกควรอยู่อันดับต้นๆ ทั้งหมดนี้คือการตัดสินใจเกี่ยวกับลำดับ ซึ่งลำดับเหล่านี้มักเสื่อมถอยไปเงียบๆ การปรับน้ำหนักหัวข้อเพื่อแก้ปัญหาหนึ่งจุด แต่อาจทำให้การค้นหาอีกสามคำแย่ลงโดยไม่มีใครสังเกตจนกระทั่งผู้ใช้งานจริงพบปัญหา

กับดักอีกอย่างคือตัวข้อมูลที่เพิ่มขึ้นตลอดเวลา ตารางบทความของคุณมีแถวใหม่เพิ่มขึ้นทุกชั่วโมง หากคุณวัดผลการจัดอันดับของวันนี้กับตารางของวันนี้ และเทียบกับสัปดาห์ก่อนกับตารางของสัปดาห์ก่อน ความแตกต่างที่เกิดขึ้นจะถูกปนเปื้อนด้วยตัวเอกสารเอง คุณจึงต้องทำให้ฐานข้อมูลหยุดนิ่งเพื่อแยกแยะการเปลี่ยนแปลงของการจัดอันดับให้ออกอย่างเด็ดขาด

ขั้นตอนแรกคือการบันทึกคอลัมน์ที่ระบบจัดอันดับอ่านออกมาเป็นตารางที่มีวันที่กำกับ ซึ่งนี่จะเป็นชุดข้อมูลประเมิน (Evaluation fixture) ของคุณที่ไม่เคยเปลี่ยนแปลง ทำให้ทุกทางเลือกในการจัดอันดับถูกวัดผลเทียบกับข้อมูลนำเข้าที่เหมือนกันทุกประการ:

-- One-time: capture the corpus as it was on this date.
CREATE TABLE eval_corpus_2026_08 AS
SELECT id, title, body, search_vector
FROM articles;

-- Run any candidate ranker against the frozen table, not the live one.
SELECT id
FROM eval_corpus_2026_08
WHERE search_vector @@ websearch_to_tsquery('english', :query)
ORDER BY ts_rank_cd(search_vector, websearch_to_tsquery('english', :query)) DESC
LIMIT 10;

เมื่อคุณต้องการทดสอบการให้น้ำหนักแบบใหม่ คุณจะต้องเปลี่ยนแค่ส่วน ORDER BY เท่านั้น และห้ามเปลี่ยนส่วน FROM โดยเด็ดขาด นั่นคือระเบียบปฏิบัติทั้งหมด: ขยับทีละหนึ่งตัวแปรต่อการทดลองหนึ่งครั้ง เก็บตาราง Snapshot ไว้ในที่เก็บบันทึกเพื่อให้ฐานข้อมูลตั้งต้นสามารถทำซ้ำได้บนทุกเครื่องรวมถึงระบบ CI

ไม่อยากพลาดข่าวใหม่?

สมัครรับสรุปข่าวสารใหม่ทางอีเมล ไม่บ่อยจนรำคาญ

โฆษณา

database query analytics chart workspace

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง

คุณจำเป็นต้องมีชุดข้อมูลแถว (query, document, grade) โดยที่ grade จะมีค่าตั้งแต่ 0 คือไม่เกี่ยวข้องกันเลย ไปจนถึง 3 คือสมบูรณ์แบบ กฎปฏิบัติสองข้อที่จะช่วยให้เรื่องนี้ไม่ต้องกลายเป็นการทำโปรเจกต์วิจัยขนาดใหญ่มีดังนี้:

  • ดึงคำค้นหาจาก Log การใช้งานจริง แทนการคิดขึ้นมาเอง โดยดึงคำค้นหายอดนิยมบวกกับคำค้นหายาวๆ ที่ยากและเจอปัญหาบ่อยจากตั๋วสนับสนุน (Support tickets) จำนวน 30 ถึง 50 คำค้นหาจริงมีค่ามากกว่าคำค้นหาที่คิดขึ้นเองนับพันคำ
  • ให้เกรดเฉพาะกลุ่มผลลัพธ์ (Pool) แทนที่จะตรวจตารางทั้งหมด คุณไม่สามารถติดป้ายกำกับเอกสารทุกฉบับสำหรับทุกคำค้นหาได้ ให้รันระบบจัดอันดับทั้งหมดที่คุณต้องการเทียบ แล้วดึงผลลัพธ์ 10 อันดับแรกมารวมกัน ให้เกรดเฉพาะเอกสารที่ปรากฏในผลลัพธ์ยอดนิยมเหล่านั้น
30-50จำนวนคำค้นหาจริงขั้นต่ำที่ควรใช้
10จำนวนผลลัพธ์สูงสุดต่อตัวเลือกที่นำมาทำ Pooling

เลือกดัชนีวัดผลที่ตรงกับการใช้งานส่วนติดต่อผู้ใช้ของคุณ สำหรับการค้นหาบทความหรือเอกสารทั่วไป nDCG@k คือค่าที่ควรนำมาใช้เป็นเกณฑ์ตัดสิน เนื่องจากให้รางวัลกับการวางเอกสารระดับ 3 ไว้เหนือระดับ 2 และเหนือระดับ 1 พร้อมทั้งลดทอนคะแนนลงเมื่อเลื่อนลงไปข้างล่างหน้าเว็บ โดยมีการคำนวณเชิงคณิตศาสตร์เพื่อแปลงคะแนนให้อยู่ในช่วง 0 ถึง 1 อย่างสวยงาม

"relevance is a property of an ordering over a fixed corpus, so you cannot measure it without freezing the corpus first."

Dev.to

ที่มา: Dev.to

ความคิดเห็น

แสดงความคิดเห็น
0/2000

พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้