ผู้ผลิตชิปเร่งปรับสายการผลิต ก่อนหมดช่วงเงินอุดหนุน
โรงงานรับจ้างผลิตรายใหญ่สามแห่งเลื่อนแผนลงทุนเร็วขึ้นหนึ่งไตรมาส เพราะเชื่อว่าสิทธิประโยชน์รอบนี้จะไม่ถูกต่ออายุ
ฟิลเตอร์ลิสต์บล็อกได้เฉพาะสิ่งที่เคยมีคนเห็นและเขียนกฎเอาไว้แล้ว แต่ตัวนี้อ่านหน้าเว็บจริงๆ ลองดู Jev ไล่ดูทีละองค์ประกอบของเว็บข่าว ให้คะแนนว่าแต่ละอันเป็นโฆษณาแค่ไหน แล้วส่งตัวเลขกลับมาให้โค้ดของคุณตัดสินเอง จากนั้นลองรันหน้าเดียวกันด้วยฟิลเตอร์ลิสต์และด้วย LLM แล้วดูว่าแต่ละแบบต้องแลกด้วยอะไร
หมายเหตุเรื่องแอนิเมชัน: คำตอบของ Jev ถูกไล่แสดงทีละชิ้นเพื่อให้อ่านทัน ของจริงคำถามทั้ง 30 ข้อกลับมาพร้อมกันในรอบเดียว สิ่งที่คุณเห็นไล่ทีละชิ้นคือลูปในโค้ดของคุณที่กำลังเอาคำตอบไปใช้ ไม่ใช่โมเดลกำลังคิด
แปดชิ้นนี้คือตัวตัดสินว่าตัวบล็อกโฆษณาใช้ได้จริงหรือเปล่า ส่วนชิ้นง่ายๆ อย่างหัวเว็บ ข่าวสามชิ้น และฟุตเตอร์ ทุกเครื่องมือทำถูกหมด คอลัมน์จะเติมเองเมื่อคุณรันสแกนแต่ละแบบด้านบน
✓ ทำตามกติกาที่เขียนไว้ · ~ พอรับได้ แต่ไม่ตรงกับกติกา · ✗ ผิด
โค้ดของคุณไล่ดู DOM แล้วสร้าง state ก้อนเล็กๆ หนึ่งก้อนต่อหนึ่งองค์ประกอบ ว่ามันเขียนว่าอะไร ลิงก์ไปไหน ขนาดเท่าไร อยู่ตรงไหนของหน้า ไม่มีการส่งภาพ เพราะ Jev อ่านข้อความและข้อมูลที่มีโครงสร้าง ซึ่งเบราว์เซอร์มีอยู่แล้วทั้งคู่
จากนั้นถามชิ้นละ 2 ข้อ ไม่ใช่ถามว่า “ควรทำอะไรกับสิ่งนี้” เพราะนั่นเป็นการตัดสินใจของคุณ และขึ้นกับการตั้งค่าที่ Jev ไม่รู้ด้วย ถามแค่ว่า มันเป็นโฆษณาแค่ไหน และ มันคือของประเภทอะไร
ในตัวอย่างข้างล่าง คำถามและคำอธิบายตัวเลือกเขียนเป็นภาษาอังกฤษ ส่วน state คือข้อความไทยที่ดึงมาจากหน้าเว็บจริง ซึ่งแปลว่าโมเดลต้องอ่านไทยออก และนั่นคือสิ่งที่คุณต้องทดสอบกับข้อมูลของตัวเองก่อน ไม่ใช่เชื่อตามเดโมนี้
// หนึ่งชิ้นจากทั้งหมดสิบห้าชิ้น
state = {
url: "dailyledger.example/technology",
element: {
tag: "article", classes: "story",
text: "ได้รับการสนับสนุน · Nordvault — 7 สัญญาณว่าเน็ตบ้าน
คุณถูกเจาะไปแล้ว — เราเตอร์ส่วนใหญ่ตั้งค่ามาจาก
โรงงานแบบที่ใครก็ค้นเจอ…",
links: ["nordvault.example/?utm_source=ledger&utm_campaign=q3"],
size: "412x132", slot: "ชิ้นที่ 3 ในคอลัมน์ข่าวหลัก"
},
page: "หน้ารวมข่าวเทคโนโลยี 6 ข่าว 1 แถบข้าง"
}
questions = {
isAd: noul("This element is a paid placement whose purpose is to
promote a product or service, rather than editorial
content the reader came for."),
kind: choice("What kind of element is this?", {
display_ad: "A bought banner or unit from an ad network.",
sponsored_content: "Editorial-looking content paid for by a brand.",
affiliate_block: "Editorial picks that earn a commission on clicks.",
newsletter_modal: "The site asking for an email address.",
cookie_banner: "A consent or privacy prompt.",
house_promo: "The site promoting its own subscription.",
content: "What the reader came for, or site furniture."
})
}
// 96 มิลลิวินาทีต่อมา ได้ครบทั้งสิบห้าชิ้นพร้อมกัน
answers["07"] = { isAd: { noul: 0.93 },
kind: { choice: "sponsored_content", confidence: 0.88 } }
คำตอบที่ได้ยังไม่ได้ตัดสินใจอะไรเลย การตัดสินใจอยู่ในโค้ดของคุณเองสิบเอ็ดบรรทัด และมันคือส่วนที่ผู้ใช้เถียงกันจริงๆ จึงควรอยู่ในที่ที่คุณแก้ได้โดยไม่ต้องไปยุ่งกับโมเดล
function policy(a, settings) {
// อะไรที่ขัดจังหวะการอ่าน ตัดทิ้งหมด ไม่ต้องสนคะแนนโฆษณา
if (a.kind.choice === "cookie_banner") return "hide";
if (a.kind.choice === "newsletter_modal") return "hide";
// มั่นใจว่าเป็นโฆษณา: ซ่อนไปเลย ยกเว้นผู้อ่านตั้งค่าไว้ว่า
// ให้ติดป้ายคอนเทนต์สปอนเซอร์แทนการซ่อน
if (a.isAd.noul >= 0.85)
return (a.kind.choice === "sponsored_content" && settings.labelSponsored)
? "label" : "hide";
// ก้ำกึ่งจริงๆ: หรี่ลงและติดป้าย แต่ไม่ทำให้หายไป
if (a.isAd.noul >= 0.45) return "dim";
return "keep";
}
ฟิลเตอร์ลิสต์คือรายการของสิ่งที่มีคนเคยเห็นมาก่อน ส่วน LLM เข้าใจหน้าเว็บก็จริงแต่ใช้เวลาเป็นวินาทีและคิดเงินเป็นสตางค์ ส่วน Jev อยู่ตรงกลางแบบแคบๆ คือตอบเฉพาะคำถามที่คุณกำหนดไว้ และตอบเร็วพอที่จะรันกับทุกองค์ประกอบของทุกหน้า
| ฟิลเตอร์ลิสต์ | LLM | Jev | |
|---|---|---|---|
| ใช้อะไรจับคู่ | เซเลกเตอร์และ URL ที่อาสาสมัครจดไว้หลังจากเห็นโฆษณานั้นมาแล้ว | ความหมาย โดยอ่านจากข้อความในหน้า | ความหมาย โดยอ่านจากข้อความในหน้า |
| เวลาต่อหนึ่งหน้า | ไม่ถึงหนึ่งมิลลิวินาที | 2–5 วินาที และมาหลังจากหน้าเว็บแสดงผลไปแล้ว | ราว 96 มิลลิวินาที สำหรับทั้งชุด |
| ค่าใช้จ่ายต่อหน้า | ฟรี | ราว $0.012 ตามราคาโมเดลแนวหน้า วันละพันหน้าคือ $12 | ราว $0.0001 วันละพันหน้าคือไม่ถึงหนึ่งบาท |
| โฆษณาที่ยังไม่เคยมีใครเห็น | มองไม่เห็นจนกว่าจะมีคนไปเขียนกฎเพิ่ม | จับได้ | จับได้ |
| คลาสที่เปลี่ยนชื่อหรือสุ่มใหม่ | แพ้ตั้งแต่ขั้นตอนบิลด์ | ไม่เกี่ยว เพราะมันอ่านคำ | ไม่เกี่ยว เพราะมันอ่านคำ |
| โพสต์แบบ “ได้รับการสนับสนุน” | มาร์กอัปเหมือนบทความจริงทุกอย่าง ไม่มีกฎไหนแยกออก | จับได้ | จับได้ และติดป้ายบอกว่าเป็นอะไร |
| ของที่ก้ำกึ่ง | ไม่มีแนวคิดเรื่องก้ำกึ่งเลย | ให้ความเห็นมา แต่ไม่ได้ให้ปุ่มปรับ | ให้ตัวเลขที่ผ่านการปรับเทียบ มาให้คุณตั้งเกณฑ์เอง |
| สิ่งที่โค้ดได้รับ | ค่า true/false ต่อหนึ่งกฎ | ข้อความอิสระหรือ JSON ที่ต้องแกะเอง ส่วนใหญ่เป็นเซเลกเตอร์ CSS ที่พังง่าย | ความน่าจะเป็นและประเภท ต่อหนึ่งองค์ประกอบ |
| รันหน้าเดิมสองครั้ง | เหมือนเดิมเป๊ะ | ชิ้นที่ก้ำกึ่งอาจตอบไม่เหมือนเดิม | ได้การกระจายตัวชุดเดิม |
| ทำงานบนเครื่องผู้ใช้ | ได้ | ไม่ได้ ต้องส่งหน้าเว็บขึ้นเซิร์ฟเวอร์ | ไม่ได้ ต้องส่งหน้าเว็บขึ้นเซิร์ฟเวอร์ |
| เก่งเรื่อง | บล็อกแอดเซิร์ฟเวอร์ที่รู้จักแล้วตั้งแต่ชั้นเน็ตเวิร์ก ฟรี และก่อนโหลดแม้แต่ไบต์เดียว | หน้าเว็บแปลกๆ ที่ยาก งานวิเคราะห์แบบออฟไลน์ และการช่วยร่างกฎกับเกณฑ์ตั้งแต่แรก | ตัดสินทุกองค์ประกอบของทุกหน้า อย่างต่อเนื่อง ในราคาที่ทำแบบนั้นไหว |
ฟิลเตอร์ลิสต์รู้ว่าโฆษณาเมื่อวานหน้าตาเป็นอย่างไร ส่วนโมเดลที่ให้วิจารณญาณบอกได้ว่าองค์ประกอบชิ้นนี้กำลังทำอะไรอยู่บนหน้าเว็บวันนี้ แล้วส่งตัวเลขกลับมาให้โค้ด แทนที่จะส่งความเห็นมา
นี่ไม่ใช่ของมาแทนที่ กฎในฟิลเตอร์ลิสต์บล็อกแอดเซิร์ฟเวอร์ที่รู้จักแล้วได้ตั้งแต่ชั้นเน็ตเวิร์ก ฟรี และก่อนโหลดแม้แต่ไบต์เดียว ส่วนการจัดประเภทองค์ประกอบเกิดขึ้นหลังโฆษณาโหลดมาแล้ว คุณประหยัดความสนใจของผู้อ่าน แต่ไม่ได้ประหยัดแบนด์วิดท์หรือกันการเก็บข้อมูล ดีไซน์ที่สมเหตุสมผลคือใช้กฎก่อน แล้วใช้วิจารณญาณกับทุกอย่างที่ยังไม่มีกฎ
ตัวบล็อกที่ใช้โมเดลย่อมต้องส่งข้อความในหน้าเว็บขึ้นเซิร์ฟเวอร์ ซึ่งเป็นการแลกที่น่าอึดอัดสำหรับผลิตภัณฑ์ประเภทนี้โดยเฉพาะ คำตอบที่ตรงไปตรงมาคือต้องรันบนเครื่องหรือโฮสต์เอง และนั่นจะทำให้ตัวเลขเวลากับค่าใช้จ่ายข้างบนเปลี่ยนไป เรื่องนี้ควรพูดให้ชัด ไม่ใช่ซุกไว้
0.98 ไม่ใช่ข้อพิสูจน์ Jev ตอบนอกเหนือจากตัวเลือกที่คุณกำหนดไม่ได้ พาร์เซอร์ของคุณจึงไม่พัง แต่มันยังเลือกผิดสำหรับองค์ประกอบหนึ่งๆ ได้ และการบล็อกเกินมีต้นทุนจริง ในเดโมนี้ฟิลเตอร์ลิสต์ลบแถบข่าวด่วนทิ้งเพราะกฎแย่ๆ แค่ข้อเดียว ส่วนเกณฑ์ตัวเลขที่ตั้งผิดก็ทำแบบเดียวกันได้ในสเกลที่ใหญ่กว่า
ความน่าจะเป็น เวลา และราคาทุกตัวในแผงข้อมูลสมมติขึ้นเพื่อเดโม ส่วนตัวเลขที่อ้างอิงอยู่เบื้องหลังมาจากที่ TypeSafe เผยแพร่ตอนเปิดตัว คือ 70–500 มิลลิวินาทีต่อหนึ่งรีเควสต์ $42 ต่อโทเคนขาเข้าหนึ่งพันล้าน โทเคนขาออกฟรี และทุกคำตอบมีค่าความมั่นใจที่ผ่านการปรับเทียบ Jev อยู่ในช่วง early access ตั้งแต่ 15 กันยายน 2026
ทุกวันนี้ยังไม่มีตัวบล็อกโฆษณากระแสหลักเจ้าไหนจัดประเภทองค์ประกอบด้วยโมเดลบนคลาวด์ และหน้านี้เป็นเดโมเพื่อการอธิบาย ไม่ใช่ข้อเสนอให้ไปทำ สิ่งที่เป็นของจริงคือรูปร่างของการตัดสินใจ ได้แก่ ลูปไล่ดูองค์ประกอบ คำถามแคบๆ ชิ้นละข้อ ตัวเลขที่ตอบกลับมา และกติกาที่อยู่ในโค้ด
เดโมนี้ตั้งสมมติฐานว่าโมเดลอ่านข้อความไทยบนหน้าเว็บออก ซึ่งเป็นสมมติฐานที่หน้านี้ไม่ได้พิสูจน์ คู่มือของ TypeSafe เองก็แนะนำให้วัดผลกับข้อมูลจริงในโดเมนของคุณก่อนใช้งาน ถ้าจะทำจริงกับเว็บไทย ให้เก็บหน้าตัวอย่างสักห้าสิบหน้า ติดป้ายด้วยมือ แล้ววัดดูก่อน