Sentence Transformers 6.0 รับ late interaction เป็นพลเมืองชั้นหนึ่ง — โหลด ColBERT ได้ตรง ๆ และแก้บั๊กเงียบที่ทำ reranker พังเพราะ half precision
วันที่ 18 สิงหาคม 2026 Hugging Face ปล่อย Sentence Transformers 6.0 (ยืนยันบน PyPI เวลา 13:33 UTC วันเดียวกัน) ซึ่งเป็นเมเจอร์รีลีสที่เพิ่ม โมเดลชนิดที่สี่ เข้ามาในไลบรารี ต่อจาก dense encoder, sparse encoder และ reranker — ชนิดใหม่ชื่อ MultiVectorEncoder สำหรับงาน retrieval แบบ late interaction ที่รู้จักกันในชื่อ ColBERT
สำหรับทีมที่ทำ RAG อยู่ นี่ไม่ใช่ฟีเจอร์เสริมเล็ก ๆ เพราะที่ผ่านมาการจะใช้ late interaction ในงานจริงหมายถึงการต้องไปพึ่งไลบรารีแยกอย่าง PyLate หรือ ColBERT ต้นฉบับ แล้วเขียนโค้ดคนละทรงกับ pipeline embedding ที่มีอยู่ รีลีสนี้ยุบทุกอย่างมาอยู่ใต้ API เดียวกัน — และแถมด้วยการแก้บั๊กที่ผมคิดว่าน่ากลัวกว่าฟีเจอร์ใหม่เสียอีก
MultiVectorEncoder: หนึ่งเวกเตอร์ต่อหนึ่งโทเคน แทนที่จะบีบทั้งเอกสารเหลือเวกเตอร์เดียว
หัวใจของ late interaction คือการ ไม่บีบข้อความทั้งก้อนให้เหลือเวกเตอร์เดียว แต่เก็บเวกเตอร์ไว้หนึ่งตัวต่อหนึ่งโทเคน แล้วให้คะแนนด้วยตัวดำเนินการ MaxSim — สำหรับแต่ละโทเคนใน query ให้หาค่า similarity สูงสุดเทียบกับโทเคนใด ๆ ในเอกสาร แล้วรวมค่าสูงสุดเหล่านั้นเข้าด้วยกัน
ผลที่ได้คือข้อมูลการจับคู่ระดับโทเคนไม่หายไป ซึ่งช่วยมากในสองสถานการณ์ที่ dense embedding มักพลาด: query ที่มีหลายเงื่อนไขพร้อมกัน และ ข้อมูลนอกโดเมนที่โมเดลไม่เคยเทรน ราคาที่จ่ายคือดัชนีใหญ่ขึ้นอย่างมีนัยสำคัญ
ตัวเลขที่ Hugging Face รายงานบน NanoBEIR (13 ชุดข้อมูล) คือ multi-vector ทำ mean NDCG@10 ที่ 68.68% เทียบกับ 67.64% ของ dense model ที่ขนาดใกล้เคียงกัน — ต่างกันราวหนึ่งจุด ซึ่งควรอ่านว่า “ดีขึ้นแต่ไม่ใช่ก้าวกระโดด” ในภาพรวม ประโยชน์จริงจะไปโผล่ตอนเจอ query ยาก ๆ และข้อมูลนอกโดเมนมากกว่าค่าเฉลี่ย
สิ่งที่ต้องรู้ก่อนใช้:
- encode แบบไม่สมมาตร — ต้องเรียก
encode_query()และencode_document()แยกกัน เพราะทั้งสองฝั่งใช้ prefix และเพดานความยาวคนละแบบ ไม่ใช่encode()ตัวเดียวจบเหมือน dense model.similarity()คำนวณ MaxSim ให้ ครอบทุกคู่โทเคนของ query กับ document- โหลดเช็กพอยต์เดิมได้ตรง ๆ ทั้งจาก PyLate และ Stanford-NLP ColBERT รวมถึงโมเดลตระกูล ColPali สำหรับ visual document retrieval (จับคู่ query ที่เป็นข้อความกับ ภาพหน้าเอกสาร โดยไม่ต้อง OCR)
- บีบดัชนีได้ด้วย token pooling —
HierarchicalTokenPoolingลดขนาดดัชนีลง 2–4 เท่าโดยคุณภาพตกเล็กน้อย ซึ่งเป็นตัวแปรสำคัญที่สุดว่าคุณจะเอา late interaction ขึ้นโปรดักชันไหวหรือไม่ - ต่อกับ vector DB หลักได้ ทั้ง Qdrant, Weaviate, Vespa และ LanceDB
- รองรับไม่เฉพาะข้อความ — ครอบภาพ เสียง และวิดีโอด้วย
ในบอร์ดที่ทีมทดสอบไว้ ฝั่งข้อความมีโมเดลผ่านการทดสอบ 29 ตัว โดย lightonai/LateOn นำที่ 0.6868 บน NanoBEIR (โมเดลตระกูลนี้เราเคยเขียนถึงตอน LightOn ปล่อย mLateOn/mDenseOn เมื่อ 31 ก.ค.) ส่วนฝั่ง visual document retrieval มี 22 ตัว โดย webAI-ColVec1.1-8b นำที่ 0.6580 บน NanoViDoRe
บั๊กเงียบที่ควรอ่านก่อนฟีเจอร์ใหม่: half precision ทำอันดับพัง
ส่วนที่ผมคิดว่าสำคัญที่สุดของรีลีสนี้ ไม่ใช่ของใหม่ แต่คือ การแก้คลาสของบั๊กที่พังแบบไม่มีเสียง
เดิมการคำนวณคะแนนใน half precision ทำให้อันดับผลลัพธ์เพี้ยนได้โดยไม่มี error, ไม่มี warning และไม่มีอะไรบอกว่าระบบทำงานผิด ตัวเลขที่ทีมยกมาแรงมาก: reranker ที่รันด้วย bfloat16 บน NanoBEIR ได้ NDCG@10 เพียง 0.1849 แต่หลังแก้ให้สะสมค่าเป็น float32 กลับขึ้นไปที่ 0.6795
นั่นคือความต่างระหว่าง “ระบบ retrieval ที่ใช้งานได้” กับ “ระบบที่แทบสุ่มผลลัพธ์” — และมันเกิดขึ้นเงียบ ๆ ในทีมที่เปิด bf16 เพื่อประหยัด VRAM ตามสูตรทั่วไป เวอร์ชัน 6.0 บังคับสะสมค่าเป็น float32 ในสามจุด: logits ของ CrossEncoder ก่อนเข้า activation, การคำนวณคะแนน similarity และการรวมค่าใน MaxSim
ถ้าคุณรัน reranker ด้วย fp16/bf16 อยู่ในโปรดักชันตอนนี้ นี่คือเหตุผลให้ไปวัดคุณภาพระบบตัวเองใหม่วันนี้ ไม่ใช่รอรอบอัปเกรดหน้า
ของเสียที่ต้องยอมรับ: breaking changes ชุดใหญ่
6.0 เป็นเมเจอร์รีลีสจริง ๆ และมีของที่พังเมื่ออัปจาก 5.x:
- ต้องการ
transformers>=5.0.0(เดิม 4.41+) และtorch>=2.2(เดิม 1.11+) — ข้อนี้อาจเป็นตัวบล็อกจริงสำหรับทีมที่ยังตรึง transformers v4 ไว้เพราะโมเดลอื่นในสแตก - list ของ chat message ถูกตีความเป็นบทสนทนาเดียว — ถ้าจะส่งเป็น batch ต้องห่อแต่ละอันไว้ใน list ของตัวเอง จุดนี้พังแบบเงียบได้ถ้าไม่ระวัง
- custom module ต้องใส่
trust_remote_code=True similarityและsimilarity_pairwiseเปลี่ยนจาก property เป็น methodCrossEncoder.rankคืนค่าเป็น Python float แทน numpy scalar
ฝั่งความเร็วมีของแถม: การรวม multi-column loss ให้ยิง forward pass เดียวทำให้เทรนเร็วขึ้น 1.22–1.26 เท่า ในงานมาตรฐาน และการ inference บน GPU ด้วย fp16 + Flash Attention ให้ throughput เพิ่ม 2.44 เท่า
มุมมอง AI Curator
รีลีสนี้เป็นตัวอย่างที่ดีของสิ่งที่ผมเรียกว่า “ข่าวที่สำคัญกว่าที่หัวข้อทำให้รู้สึก” — คนส่วนใหญ่จะอ่านผ่านเพราะเห็นว่าเป็นแค่ minor tooling แต่บรรทัดที่ควรทำให้คุณสะดุ้งคือ 0.1849 → 0.6795
ลองคิดตามว่ามันแปลว่าอะไรในทางปฏิบัติ: มีทีมจำนวนไม่รู้เท่าไรที่รัน reranker ด้วย bf16 มาหลายเดือน เห็นระบบ “ทำงานได้” ไม่มี error ใน log ผู้ใช้บ่นว่าคำตอบไม่ค่อยตรงบ้างแต่ก็โทษว่าเป็นธรรมชาติของ RAG แล้วก็ไปไล่ปรับ prompt, เปลี่ยน chunk size, เพิ่ม context — ทั้งที่ต้นตอคือ numerical precision ในการให้คะแนน นี่คือโหมดความล้มเหลวที่แพงที่สุดในระบบ AI: มันไม่ crash มันแค่แย่ลง และไม่มีเครื่องมือมาตรฐานตัวไหนบอกคุณ
บทเรียนที่กว้างกว่าตัวไลบรารีคือ ถ้าทีมของคุณไม่มี eval set ของตัวเองที่รันได้ทุกครั้งที่เปลี่ยนอะไรในสแตก retrieval คุณจะไม่มีวันเจอบั๊กประเภทนี้ — ไม่ว่าจะอัปเกรดไลบรารี เปลี่ยน dtype เปลี่ยนการ์ด หรือย้าย vector DB ชุดทดสอบ 50–100 คู่ query/คำตอบที่คนในทีมคัดเองยังมีค่ามากกว่าการไล่ตามคะแนน MTEB ของคนอื่น
ส่วนคำถามว่า “แล้วควรย้ายไป late interaction ไหม” คำตอบของผมคือ อย่าเพิ่งย้ายทั้งระบบ แต่ควรลองกับ query ที่คุณรู้ว่าพังอยู่แล้ว ตัวเลขบน NanoBEIR ที่ต่างกันหนึ่งจุดไม่คุ้มกับดัชนีที่ใหญ่ขึ้นหลายเท่าถ้ามองที่ค่าเฉลี่ย แต่กรณีที่ late interaction ชนะขาดคือ query หลายเงื่อนไขและข้อมูลนอกโดเมน ซึ่งบังเอิญเป็นสองอย่างที่ ภาษาไทยเจอหนักเป็นพิเศษ — เพราะโมเดล embedding ส่วนใหญ่เห็นข้อมูลไทยน้อยมากตอนเทรน ทำให้เอกสารภาษาไทยแทบทุกชุดเป็น “นอกโดเมน” โดยปริยาย งานวิจัยของ LightOn ที่เราเขียนถึงเมื่อสิ้นเดือน ก.ค. ก็ชี้ทางเดียวกันว่า late interaction ข้ามไปยังภาษาที่ไม่เคยเทรนได้ดีกว่า dense อย่างมีนัยสำคัญ
และสำหรับทีมไทยที่ทำ RAG บนเอกสารราชการหรือเอกสารสแกน — ส่วนที่ผมว่าน่าลองที่สุดในรีลีสนี้คือ ColPali/visual document retrieval เพราะเอกสารไทยจำนวนมหาศาลอยู่ในรูป PDF สแกนที่ OCR ไทยยังพังเป็นประจำ การค้นจากภาพหน้าเอกสารตรง ๆ โดยข้ามชั้น OCR ไปเลย เป็นทางที่แก้ปัญหาที่ต้นทางมากกว่าการไปไล่แก้ผลลัพธ์ OCR ทีหลัง — และตอนนี้มันอยู่ใน API เดียวกับที่ทีมคุณใช้อยู่แล้ว
แหล่งข่าว
อ่านเพิ่มในหมวด เครื่องมือนักพัฒนา
Betelgeuse รัน Qwen3.8 Flash Next ขนาด 68GB บน RTX 3060 กับแรม 16GB ส่วน Basalt วัดให้เห็นว่าเอนจินที่เร่งด้วยแฟล็กลัดทำให้โมเดลลืมของ
Betelgeuse ฟอร์ก llama.cpp ที่เปิดเมื่อ 31 ต.ค. ดึง expert จาก NVMe เข้า VRAM ตามต้องการ อ้าง 22 tok/s แบบไม่ทิ้ง expert แต่ README เตือนเองว่ายังทดลองและตัวเลขมาจากคนละรอบ วันเดียวกันผู้พัฒนา Basalt เผยผลวัดว่าแฟล็กเร่งความเร็วทำคุณภาพ Q8 ตกไปใกล้ Q2
กฎห้ามโคลนเกมของ Claude Code เริ่มกระทบงานจริง บริษัทรับทำเกมกระดานร้องงานลูกค้าหยุด แต่รายงานหลายชิ้นปนกับตัวกรองไซเบอร์คนละเรื่อง
ต่อจากที่เราพบกฎนี้ในไบนารี Claude Code ผู้ใช้เริ่มรายงานว่างานเชิงพาณิชย์ถูกปฏิเสธ และ Tom's Hardware กับ Mashable หยิบไปรายงาน แต่เมื่อไล่ issue ที่อ้างถึง พบว่าหลายรายการเกิดก่อนกฎจะมา จึงน่าจะเป็นตัวกรองด้านไซเบอร์ ส่วน Anthropic ยังไม่ชี้แจง
Claude Code ส่ง transcript ของ background agent ให้โมเดลทุก ~30 วินาทีเพื่อเขียนสถานะ 3–5 คำ ผู้วัดรายงานกินราว 16% และยังปิดแบบทางการไม่ได้
รายงานอิสระพบว่าฟีเจอร์ agent_summary ของ Claude Code ส่ง transcript เต็มของ background agent ไปถามสถานะทุก ~30 วินาที คิดเป็น 16.4% ของค่าใช้จ่ายในระบบของผู้วัด Issue เปิดมาตั้งแต่ ส.ค. ยังไม่มีสวิตช์ปิดที่รองรับ เราตรวจพบโค้ดนี้ใน 2.1.314 และพบกฎใหม่เรื่องเกมที่ไม่อยู่ใน changelog