Cua ปล่อย cua-s1-forms: โมเดล computer-use 706,048 พารามิเตอร์ ไฟล์ 2.8 MB ที่ทำงานกรอกฟอร์มชนะ Jev API 99.7% ต่อ 83.6%
18 ก.ย. 2026 โค้ด libs/cua-s1 ถูก merge เข้า trycua/cua (MIT, 24.4k ดาว) และวันเดียวกันนั้นเช็กพอยต์ cua-s1-forms ก็โผล่ขึ้น Hugging Face — โมเดล 706,048 พารามิเตอร์ ไฟล์ 2.8 MB ที่ไม่ได้ถูกออกแบบมาให้คุยกับคุณ และไม่ generate ข้อความแม้แต่ตัวเดียว งานของมันแคบมาก: ดูฟอร์มบนหน้าจอหนึ่งช่อง แล้วบอกว่าควรเติมค่าอะไรลงไป วันที่ 19 ก.ย. ทีมเอาขึ้น Show HN และภายในวันเดียวก็มีคนแปลงเป็น ONNX และ CoreML ต่อ
นี่คือชิ้นล่าสุดของกระแส “System One model” ที่เราตามมาทั้งสัปดาห์ (TypeSafe Jev, jevlike, Bespoke Nimble, Laya) แต่ชิ้นนี้ต่างออกไปตรงที่มันไม่ได้อยู่บนเบนช์มาร์กกระดาษ — มันต่อตรงเข้ากับ cua-driver ซึ่งเป็นตัวคุมเดสก์ท็อปจริง และตัวเลขที่ทีมรายงานคือการวัดแบบตัวต่อตัวกับ Jev API ที่โฮสต์อยู่จริง บนงานเดียวกัน: 99.7% ต่อ 83.6%
สถาปัตยกรรม: 2 เลเยอร์ กว้าง 128 กับ option-attention
โมเดลไม่ใช่ LLM ย่อส่วน มันคือ classifier ที่ออกแบบให้ทำงานเดียว:
- Byte-level embedding + Transformer encoder 2 เลเยอร์ กว้าง 128, 4 heads วิ่งแยกกันสองฝั่ง — ฝั่งหนึ่งอ่าน context ของ element อีกฝั่งอ่านข้อความของแต่ละตัวเลือก
- ใช้
AttentionHeadแบบเดียวกับ jevlike: ตัวเลือกแต่ละอันกลายเป็น query ยิงเข้าไปใน context tokens ได้ attended context vector ออกมา แล้ว dot product ร่วมตัวเดียวแปลงคู่ (option, attended-context) เป็น logit หนึ่งค่า จบด้วย softmax เหนือจำนวนตัวเลือกที่ยังมีชีวิตอยู่ - หนึ่ง forward pass ต่อหนึ่ง element ไม่มี autoregressive decoding ไม่มี token-by-token
สัญญา input/output เหมือน Jev ของ TypeSafe เป๊ะ ๆ — context ถูกตัดที่ 224 ไบต์ หน้าตาประมาณนี้:
TASK fill the form from the document, then submit
FORM Northwind Clinic - New Patient Registration
ELEMENT Edit "Phone number" value=""
ตัวเลือก (ตัดที่ 96 ไบต์ต่ออัน) คือหนึ่งรายการต่อหนึ่ง entity ที่ดึงมาจากเอกสารต้นทาง บวกสาม action ตายตัว: fill Tel: (503) 555-0142, fill DOB: 03/14/1987, …, check, click, skip
ผลลัพธ์คือความน่าจะเป็นหนึ่งค่าต่อหนึ่งตัวเลือก ทุก element ที่กดได้บนฟอร์มถูกให้คะแนนแยกกันและขนานกันใน batch เดียว ส่วนลำดับการลงมือ (เติมก่อน แล้วติ๊ก checkbox แล้วค่อยกดปุ่ม submit อันเดียว) ตัดสินโดยโค้ดธรรมดา ไม่ใช่โมเดล — แยกสมองออกจากมือชัดเจน
เทรนด้วยข้อมูลสังเคราะห์ 10,000 ตอน แล้วบังคับใส่คู่หลอก
ส่วนที่ทำให้ตัวเลขน่าเชื่อกว่าปกติคือวิธีสร้างชุดข้อมูล (cua_s1/synth.py):
- 10,000 episode ฟอร์มสุ่ม 2–16 ช่องจากแคตตาล็อก 55 concept ที่มีคำพ้องทั้งฝั่ง label บนฟอร์มและ label บนเอกสาร
- ใส่ distractor entity และ บังคับให้มีคู่หน้าตาคล้ายกัน เสมอ เช่น
emailกับstreet,phoneกับemergency contact phone,stateกับuniversity— คู่พวกนี้คือที่ที่โมเดลเล็ก ๆ มักตายตอนเจอของจริง - สุ่ม suffix ของ window title และ drop title ทิ้ง 20% เพื่อกันไม่ให้โมเดลอ่านชื่อหน้าต่างเป็นทางลัด
- split แยกกันด้วย signature ของชุดช่องแบบตรงตัว — ชุดช่องของฟอร์มใน test ไม่เคยปรากฏใน train
- AdamW, cosine schedule พร้อม warmup, 6 epoch, batch 128, cross-entropy เหนือจำนวนตัวเลือกที่ยังเหลือ
ข้อมูลเทรนใช้เบอร์โทรที่สงวนไว้สำหรับทดสอบ โดเมน .invalid และเลขประจำตัวที่ไม่ valid ทั้งหมด ไม่มีชุดข้อมูลฟอร์มที่ผู้ใช้จริงเคยส่งอยู่ในนั้น
ตัวเลข: 99.95% บนสังเคราะห์, 100% บนของจริง 196 การตัดสิน, 37% บน control
| split | top-1 | หมายเหตุ |
|---|---|---|
| synthetic test (แยกตาม form signature, ~15,000 การตัดสิน) | 99.95% | บังคับใส่คู่หลอกแล้ว |
| real demo eval (ฟอร์มจริง 3 + PDF จริง 3, 196 การตัดสิน) | 100% | ไม่มีของสังเคราะห์เลย |
| shuffled-context control | 37% | ยืนยันว่าโมเดลอ่าน element จริง ไม่ได้เดาจากสถิติของตัวเลือก |
แถว shuffled-context control คือแถวที่สำคัญที่สุดและเป็นแถวที่รีลีสโมเดลเล็กส่วนใหญ่ไม่ยอมปล่อย — ถ้าสลับ context ทิ้งแล้วความแม่นยังสูงอยู่ แปลว่าโมเดลเดาจาก prior ของตัวเลือก ไม่ได้อ่านหน้าจอ การที่มันร่วงลงไป 37% คือหลักฐานว่ามันอ่านจริง
ส่วนการวัดตัวต่อตัวกับ Jev API ที่โฮสต์อยู่ (jev-latest, ไม่ fine-tune อะไรเลย, งานเดียวกัน): 99.7% ต่อ 83.6% โดยรวม และเมื่อแยกดู Jev ที่โฮสต์ทำได้ 96% บนการตัดสินที่ต้องใช้วิจารณญาณจริง (เลือกระหว่าง fill / check / click) แต่ร่วงเหลือ 74% ตอนต้องรู้ว่าช่องที่มีค่าอยู่แล้วคือ no-op — ซึ่งเป็น convention ที่โมเดลตัวนี้ถูกเทรนมาและ Jev ที่โฮสต์ไม่ได้ถูกเทรนมา ทีมเขียนข้อนี้ไว้เองในการ์ด ถือว่าตรงไปตรงมาดี
เส้นแบ่งความปลอดภัยที่เขียนไว้แน่นกว่าตัวโมเดล
สำหรับโมเดลที่ไปกดปุ่มบนเครื่องคนอื่นได้จริง ส่วนนี้สำคัญพอ ๆ กับความแม่น และทีมเขียนไว้ละเอียดผิดคาด:
- แยก planning ออกจาก execution runtime ตั้งต้นเป็น dry run เสมอ
- ต้องมี หน้าต่างเป้าหมายเดียวที่ไม่กำกวม ใช้ element token ที่ผูกกับ snapshot และ re-observe หน้าต่างใหม่หลังทุกการเปลี่ยนแปลง
executeกับsubmitเป็น opt-in แยกกันคนละตัว- การกด submit ถูกล็อกแคบมาก:
submit=trueอนุญาตให้กดButtonหรือAXButtonที่มั่นใจสูงได้ไม่เกินหนึ่งอัน และ label ที่ normalize แล้วต้องเป็นSubmitหรือSubmit Formเป๊ะ ๆ เท่านั้น การคลิกอื่นถูกตัดทิ้งหมด - การอ่าน PDF ถูกจำกัดอยู่ใน allowed root ที่ตั้งไว้ (ถ้าไม่ตั้ง จะใช้ working directory ปัจจุบัน — ควรตั้งเป็น directory เฉพาะที่สิทธิ์ต่ำสุด)
ไฟล์เช็กพอยต์ก็คิดมาแล้ว: ปล่อยเป็น safetensors + JSON sidecar ที่เก็บ config สถาปัตยกรรม, ลายเซ็น SHA-256 ครอบ tensor และ metadata ส่วน loader ของ cua_s1 ปฏิเสธไฟล์ .pt/.pth ที่เป็น pickle โดยเจตนา เพราะ pickle จากอินเทอร์เน็ตคือช่องรันโค้ด (ไฟล์ .pt ตัวเดิมยังอยู่บน repo แต่ถูกระบุว่าเก็บไว้เผื่อคนที่โหลดตรงด้วย torch.load(..., weights_only=False) เท่านั้น — โค้ดใหม่ควรใช้ safetensors)
มี MCP server ให้ด้วยชื่อ cua-s1-mcp (stdio transport) แต่ทีมเรียกมันว่า “advanced integration surface ไม่ใช่ model service ที่ตั้งค่ามาแล้ว” และเตือนสองอย่างที่นักพัฒนาควรอ่านก่อนเสียบ: CUA_S1_PLANNER_FACTORY ชี้ไปที่โค้ด Python ที่จะถูก import และรันด้วยสิทธิ์ของ process เซิร์ฟเวอร์ (อย่าชี้ไปที่โมดูลที่ไม่ไว้ใจ) และ ผลลัพธ์ของ MCP tool กับ log บน stdio ต้องถือว่าเป็นข้อมูลอ่อนไหว เพราะมันมีค่าที่ดึงมาจาก PDF และ label บนฟอร์มอยู่ข้างใน
ข้อควรระวัง: การ์ดบน Hugging Face กับ repo บน GitHub ยังพูดไม่ตรงกัน
จุดนี้ต้องพูดให้ชัด เพราะเป็นเรื่องที่คนอ่านข่าวรีลีสอาจพลาด MODEL_CARD.md ใน repo ระบุว่าเช็กพอยต์ cua-s1-form-v0 มีสถานะเป็น “research profile” และ “does not distribute weights” พร้อมประโยคตรง ๆ ใน README ว่า “No checkpoint performance claim is established by this source-only release” — ขณะที่การ์ดบน Hugging Face ของ cua-ai/cua-s1-forms มีทั้งน้ำหนักและตัวเลขทั้งตารางอยู่จริง
อ่านตรงตัวคือเอกสารใน repo ยังตามไม่ทันการอัปโหลดบน Hugging Face (โค้ด merge 18 ก.ย. การ์ดถูกแก้ล่าสุด 19 ก.ย.) และตัวเลขทั้งหมดในโพสต์นี้มาจากการ์ดบน Hugging Face ไม่ใช่จากงานวัดอิสระ เพิ่มอีกข้อ: README ของ repo เขียนไว้ว่า สัญญาอนุญาต MIT ของโค้ดไม่ครอบคลุมน้ำหนักโมเดลในอนาคต และเช็กพอยต์รุ่นถัด ๆ ไป “อาจอนุญาตให้ใช้เพื่อวิจัยและประเมินผล แต่ต้องทำข้อตกลงแยกสำหรับการใช้งาน production เชิงพาณิชย์” — ตอนนี้ไฟล์บน Hugging Face ติดป้าย license: mit แต่ถ้าคุณจะเอาไปใส่ของขาย ควรตรวจป้ายใหม่ทุกครั้งที่มีเช็กพอยต์ใหม่ ไม่ใช่จำจากวันนี้
และข้อจำกัดทางเทคนิคที่ทีมบอกเอง: contract ของ cua-driver แบบพกพายังไม่มี set_value ฉะนั้นการเติมค่าจริงจะ fail closed เว้นแต่ runtime ที่ต่ออยู่ประกาศว่ารองรับการเปลี่ยนค่าแบบ token-based — ส่วน planning ใช้ได้ตามปกติ ตัว document parser ก็แคบ: ดึงเฉพาะค่าที่อยู่ในรูป Label: value เท่านั้น
มุมมอง AI Curator
ปีนี้เราเขียนถึงโมเดล “System One” ไปหลายตัวจนเริ่มเป็นแนว แต่ cua-s1-forms เป็นตัวแรกที่ทำให้เห็นภาพว่ามันจะกินพื้นที่ตรงไหนในระบบจริง — และคำตอบคือ มันไม่ได้มาแทน LLM แต่มาแทนงานที่เราจ่าย LLM ไปโดยไม่จำเป็น
ลองคิดเป็นตัวเลขแบบไทย ๆ ฟอร์มลงทะเบียนคนไข้หนึ่งใบมี 12 ช่อง วันนี้ agent ทั่วไปจะยิง vision-language model ไป 12 ครั้ง (หรือครั้งเดียวแต่ context ยาวและตอบเป็นข้อความที่ต้อง parse ต่อ) ที่ราคาระดับสตางค์ต่อครั้งและ latency ระดับวินาที ส่วนตัวนี้ให้คะแนนทั้ง 12 ช่องขนานกันใน batch เดียวด้วยโมเดล 2.8 MB ที่รันบน CPU ได้สบาย ๆ ต้นทุนต่อการตัดสินใจไม่ใช่ถูกลง 10 เท่า แต่มันหลุดออกจากบิล API ไปเลย — และนั่นคือเหตุผลที่มีคนแปลงเป็น ONNX กับ CoreML ภายใน 24 ชั่วโมง เพราะเป้าหมายจริงคือให้มันรันอยู่ในเครื่องผู้ใช้
สิ่งที่ผมคิดว่าสำคัญกว่าตัวเลข 99.7% คือ รูปแบบการออกแบบ: แยกการตัดสินใจเชิงรับรู้ (โมเดล) ออกจากลำดับการลงมือ (โค้ดธรรมดา) แล้วเอา guardrail ไปไว้ที่ฝั่งโค้ด สังเกตว่าเงื่อนไข “กด submit ได้ก็ต่อเมื่อ label เป็น Submit หรือ Submit Form เป๊ะ ๆ” ไม่ได้อยู่ใน prompt และไม่ได้ฝากไว้กับความเชื่อฟังของโมเดล มันเป็น if ในโค้ดที่โมเดลเถียงไม่ได้ หลังจากปีนี้ที่เราเขียนข่าว prompt injection ในสรุป compaction ของ OpenAI, agent อัปโหลด .git เงียบ ๆ และ Gemini เผลอเจาะบริษัทจริงสามแห่งระหว่างเทสต์ — บทเรียนที่ตรงกันคือ guardrail ที่เขียนเป็นภาษาอังกฤษให้โมเดลอ่าน ไม่ใช่ guardrail
สำหรับทีมไทย ผมว่าประโยชน์ที่ใกล้ตัวที่สุดไม่ใช่การหยิบเช็กพอยต์นี้ไปใช้ตรง ๆ เพราะมันเทรนบนฟอร์มภาษาอังกฤษล้วน และ byte-level encoder ที่เห็นแต่ไบต์ละติน 224 ตัวจะเจอ UTF-8 ภาษาไทยที่กินคำละ 3 ไบต์เข้าไปแบบไม่เคยเห็นมาก่อน ประโยชน์จริงอยู่ที่ สูตร — 10,000 episode สังเคราะห์, แคตตาล็อก concept พร้อมคำพ้อง, คู่หลอกที่บังคับใส่, split แยกด้วย signature, shuffled-context control — ทั้งหมดนี้เป็นโค้ด MIT ที่อ่านได้ และงานที่คู่กันในไทยก็มีเต็มไปหมด: กรอก ภ.ง.ด., กรอกแบบฟอร์มประกันสังคม, คีย์ใบเสร็จเข้าระบบบัญชี ซึ่งล้วนเป็นงานที่ทุกวันนี้ต้องจ่ายค่า VLM ต่อหนึ่งช่อง
ข้อที่ผมจะไม่ทำคือเชื่อ 100% ในตาราง — 196 การตัดสินคือกลุ่มตัวอย่างที่เล็กมาก และทีมเองก็เขียนไว้ว่ารีลีสเช็กพอยต์ในอนาคตต้อง “เพิ่ม holdout ที่ไม่เคยแตะ, hash ของ artifact, รายละเอียด environment ที่แน่นอน และผลที่ทำซ้ำได้อย่างอิสระ” นั่นคือทีมกำลังบอกเองว่าตัวเลขชุดนี้ยังไม่ผ่านบาร์นั้น จนกว่าจะมีคนนอกวัดซ้ำ ตัวเลข 99.7% ควรอ่านว่า “สัญญาณที่น่าสนใจมาก” ไม่ใช่ “พิสูจน์แล้ว”
แหล่งข่าว
อ่านเพิ่มในหมวด โมเดลใหม่
Google เปิดตัว Gemini 4 Carbon ขึ้นอันดับ 1 Artificial Analysis v5 ด้วยคะแนน 59 แต่ยังให้ใช้แค่นักป้องกันไซเบอร์กลุ่มเล็ก
Gemini 4 Carbon เปิดตัว 28 ต.ค. แซง Claude Opus 5.5 บน Intelligence Index v5 แค่ 1 คะแนน และตามหลังเพียง 3 คะแนนในดัชนี coding agent ราคาเปิดตัว $2/$10 แต่นักพัฒนาทั่วไปยังเรียกใช้ไม่ได้ ระหว่างที่ Google ค่อย ๆ เปิดผ่านโปรแกรม Fairwind
Microsoft ปล่อย Mage-VL-Cowork โมเดล 4B คุมเดสก์ท็อปและเทอร์มินัลในตัวเดียว ได้ 66% บน OSWorld-Verified สัญญาอนุญาต Apache-2.0
Mage-VL-Cowork ขนาด 4B ของ Microsoft เลือกเองว่าจะคลิกหน้าจอหรือสั่ง bash ทำคะแนน OSWorld-Verified 66.0% ใกล้ค่าอ้างอิงมนุษย์ 72.4% ในตารางเดียวกัน แต่คำว่าดีที่สุดในขนาด 4B มีคู่เทียบบนตารางนี้แค่รุ่นเดียว
Mistral ปล่อยน้ำหนัก Large 4 จริงแล้ว — 1T ราคาลดเกือบครึ่ง แต่บน AA ได้ 26 และสัญญาอนุญาตห้ามขายเป็น API ถ้าไม่มีใบอนุญาตแยก
Mistral ปล่อยน้ำหนัก Large 4 (Le Chonk) เมื่อ 29 ต.ค. เป็นรุ่นที่ฝึก RL ต่ออีกสามสัปดาห์หลัง preview ขนาด 1T ใช้พื้นที่ราว 1.06TB ราคา API ลดเหลือ $0.70/$2.10 Mistral นำ open-weight ด้าน coding แต่คะแนนรวม AA 26 ตามหลังโมเดลจีน และสัญญาอนุญาตกันธุรกิจ Model-as-a-Service