- เมื่อนำ LLM หลายตัวมาทดสอบภายใต้เงื่อนไขเดียวกัน พบว่าเพียงแค่เปลี่ยน เครื่องมือแก้ไขโค้ด ก็ช่วยเพิ่มประสิทธิภาพได้อย่างมาก
- แทนที่จะใช้วิธี Patch·Replace แบบเดิม ได้มีการใช้ฟอร์แมต ‘Hashline’ ที่กำหนดแฮชแท็กให้แต่ละบรรทัดของโค้ด เพื่อเพิ่มความแม่นยำในการแก้ไข
- Hashline ให้ความแม่นยำสูงกว่าวิธีเดิมใน 14 จาก 16 โมเดล และยังยืนยันได้ว่าช่วย ลดโทเค็นเฉลี่ย 20~30%
- โดยเฉพาะโมเดล Grok Code Fast 1 ที่มีอัตราความสำเร็จพุ่งจาก 6.7% เป็น 68.3% ดีขึ้น 10 เท่าเพียงแค่เปลี่ยน harness
- งานวิจัยนี้ชี้ให้เห็นว่า ‘harness’ คือคอขวดของประสิทธิภาพจริง มากกว่าตัวโมเดลเอง และเน้นย้ำถึงความจำเป็นของการทำงานร่วมกันในระบบนิเวศโอเพนซอร์ส
ภาพรวมของเบนช์มาร์กการแก้ไขโค้ด
- การทดลองดำเนินในรูปแบบการเปรียบเทียบฟอร์แมตการแก้ไข 3 แบบ ได้แก่ Patch, Replace, Hashline
- ให้ 16 โมเดลดำเนินโจทย์แก้ไขโค้ดเดียวกัน
- แต่ละโมเดลถูกทดสอบด้วยการแก้บั๊กในไฟล์ที่สุ่มเลือกจากโค้ดเบส React
- ฟอร์แมต Hashline ให้ผลดีกว่า Patch ใน 14 โมเดล และโดยเฉลี่ยประหยัดโทเค็นได้ 20~30%
- การปรับปรุงที่มากที่สุดคือโมเดล Grok Code Fast 1 โดยอัตราความสำเร็จเพิ่มจาก 6.7% เป็น 68.3% (+61.6pp)
- Gemini 3 Flash เพิ่มขึ้น 5.0pp และ Claude Sonnet 4.5 เพิ่มขึ้น 1.6pp
ปัญหาเรื่อง harness
- ปัจจุบันการถกเถียงมักมุ่งไปที่ “โมเดลไหนเขียนโค้ดเก่งที่สุด” แต่คอขวดที่แท้จริงคือ harness ไม่ใช่โมเดล
- harness คืออินเทอร์เฟซหลักที่จัดการโทเค็นอินพุต และเชื่อมผลลัพธ์ของโมเดลเข้ากับการเปลี่ยนแปลงในเวิร์กสเปซ
- ความล้มเหลวส่วนใหญ่ไม่ได้เกิดจากโมเดล แต่เกิดจากข้อจำกัดเชิงโครงสร้างของ harness
- ผู้เขียนได้ลองปรับปรุงผ่านโปรเจกต์ส่วนตัว oh-my-pi ซึ่ง fork มาจากเอเจนต์เขียนโค้ดโอเพนซอร์ส Pi โดยทำคอมมิตไปราว 1,300 ครั้ง
- สภาพแวดล้อมนี้เป็นอิสระจากตัวโมเดล ทำให้ทดลองโดยเปลี่ยนเฉพาะ harness ได้
ข้อจำกัดของเครื่องมือแก้ไขแบบเดิม
- วิธี
apply_patch ของ Codex ใช้ฟอร์แมต diff เฉพาะของ OpenAI จึงมีอัตราล้มเหลวสูงเมื่อใช้กับโมเดลอื่น
- ตัวอย่าง: Grok 4 มีอัตราล้มเหลวของ patch ที่ 50.7% และ GLM-4.7 อยู่ที่ 46.2%
- วิธี
str_replace ของ Claude Code ต้องตรงกับสตริงเดิมแบบสมบูรณ์ ทำให้เกิดข้อผิดพลาดจากความต่างของช่องว่างหรือการเยื้อง
- มีรายงานข้อผิดพลาด “String to replace not found in file” จำนวนมากบน GitHub
- Cursor ฝึกโมเดล 70B แยกต่างหากเพื่อจัดการการรวมโค้ด แต่ในไฟล์ที่มีไม่เกิน 400 บรรทัด การเขียนใหม่ทั้งหมด (full rewrite) กลับให้ผลดีกว่า
- งานวิจัย Diff-XYZ และ EDIT-Bench ของ JetBrains ก็ยืนยันเช่นกันว่าประสิทธิภาพต่างกันมากตามฟอร์แมตการแก้ไข
หลักการของวิธี Hashline
- แต่ละบรรทัดของโค้ดจะถูกกำหนด คอนเทนต์แฮชความยาว 2~3 ตัวอักษร เพื่อให้โมเดลระบุตำแหน่งที่ต้องแก้ได้อย่างชัดเจน
- ตัวอย่าง:
22:f1| return "world";
- โมเดลจะสั่งแก้โดยอิงจากแฮช เช่น “replace line 2:f1”
- หากไฟล์มีการเปลี่ยนแปลงจนแฮชไม่ตรงกัน การแก้ไขจะถูกปฏิเสธเพื่อป้องกันความเสียหาย
- วิธีนี้ทำให้โมเดลไม่จำเป็นต้องสร้างเนื้อหาเดิมซ้ำ จึงลดข้อผิดพลาดเรื่องช่องว่างและการเยื้อง และทำให้การแก้ไขเสถียรมากขึ้น
ผลลัพธ์ของเบนช์มาร์ก
- การทดสอบประกอบด้วยโจทย์แก้บั๊ก 180 ข้อ ทำซ้ำ 3 รอบ และใช้เครื่องมือ 4 อย่าง (read, edit, write, etc.)
- โดยสรุป ฟอร์แมต Patch แย่ที่สุดในแทบทุกโมเดล ขณะที่ Hashline ให้ผลเทียบเท่าหรือดีกว่า Replace
- ยิ่งเป็นโมเดลที่อ่อนกว่า ก็ยิ่งเห็นขนาดของการปรับปรุงชัดเจน
- Grok 4 Fast ลดโทเค็นเอาต์พุตได้ 61% และ MiniMax ดีขึ้นมากกว่าสองเท่า
- อัตราความสำเร็จของ Gemini เพิ่มขึ้น +8% ซึ่งมากกว่าการอัปเกรดโมเดลทั่วไป และทำได้โดยไม่ต้องฝึกเพิ่ม
นโยบายของผู้ขายและระบบนิเวศโอเพนซอร์ส
- Anthropic บล็อกการเข้าถึง Claude Code ของเอเจนต์เขียนโค้ดโอเพนซอร์ส OpenCode
- เหตุผลคือ “การย้อนรอยวิศวกรรม API แบบปิด” แต่ในทางปฏิบัติถูกตีความว่าเป็นสัญญาณว่า “ให้ใช้เฉพาะ harness ของตัวเอง”
- Google บล็อกบัญชีของผู้เขียน ทำให้ไม่สามารถเข้าถึง Gemini ได้
- เหตุการณ์นี้เกิดขึ้นไม่นานหลังเบนช์มาร์กที่แสดงว่า Gemini 3 Flash มีประสิทธิภาพเพิ่มเป็น 78.3% เมื่อใช้ Hashline
- ผู้เขียนชี้ว่ามาตรการเหล่านี้เป็น การกระทำที่ถอยหลังและขัดขวางโอกาสในการพัฒนาโมเดล
- การเพิ่มประสิทธิภาพ harness เป็นงานวิจัยสาธารณะที่ช่วยยกระดับคุณภาพของทุกโมเดล ไม่ใช่แค่โมเดลใดโมเดลหนึ่ง
- เขาสรุปด้วยวลีว่า “โมเดลคือคูเมือง ส่วน harness คือสะพาน” เพื่อชี้ว่าความปิดกั้นแบบนี้ขัดขวางการเติบโตของระบบนิเวศ
บทสรุป
- ปัญหาเรื่อง harness ได้รับการยืนยันว่าเป็น ปัจจัยที่วัดผลได้และส่งผลโดยตรงต่อประสิทธิภาพจริง
- เพียงเปลี่ยนฟอร์แมตอย่างง่ายก็สามารถให้ผลการปรับปรุงในระดับใกล้เคียงกับการอัปเกรดโมเดลได้
- ทิศทางการพัฒนาในอนาคตควรเป็น ความร่วมมือแบบเปิดที่ขับเคลื่อนโดยชุมชน ไม่ใช่ การปรับปรุงแบบปิดของบริษัทเดียว
- โค้ด เบนช์มาร์ก และผลการรันทั้งหมดถูกเปิดเผยไว้ใน GitHub รีโพซิทอรี oh-my-pi
3 ความคิดเห็น
โมเดลมันแปลก ๆ อยู่แล้ว ทำไมยังต้องมานั่งทำ prompt engineering อีกรอบ..
ฮาร์เนสกับการทำ prompt engineering เป็นคนละเรื่องกันโดยสิ้นเชิง
ความคิดเห็นจาก Hacker News
ฉันอ่านบทความนี้แล้วรู้สึกว่าน่าสนใจมาก คิดว่าผู้เขียน ชี้ประเด็นสำคัญได้ตรงมาก
แม้แต่โมเดลที่มีอยู่ตอนนี้เอง ก็ยังมีพื้นที่ให้ทำงานได้มีประสิทธิภาพขึ้นมาก ขึ้นอยู่กับว่าเราออกแบบ agent harness อย่างไร
ฉันคิดว่าการมอง “AI” เป็นแค่ตัว LLM อย่างเดียวไม่ถูกนัก แต่ควรมองเป็น ระบบไซเบอร์เนติกทั้งระบบ ที่ LLM กับ harness เชื่อมกันด้วย feedback loop
โมเดลกับ harness เป็นโครงสร้างที่เสริมแรงกันและพัฒนาไปด้วยกัน ดังนั้นทั้งสองอย่างจึงสำคัญพอๆ กัน
มุมมองแบบนี้ไม่ได้ช่วยแค่เรื่องเพิ่มประสิทธิภาพ แต่ยังทำให้เราตีความ generative AI ใหม่เป็นโครงการแบบ neurosymbolic ได้ด้วย
ผมเคยสร้าง coding agent โดยใช้ GPT-4 เวอร์ชันปี 2023 จริงๆ
พอทำงานกับโมเดลเก่า เราจำเป็นต้องรักษาความเรียบง่ายไว้ เลยทำให้มองปัญหาในอีกแบบหนึ่ง
ตัวอย่างเช่น ใน Python การทำ semantic compression แบบง่ายๆ อย่าง
grep -r def .เป็นสิ่งจำเป็นถ้าเพิ่ม hook ง่ายๆ แบบนี้เข้าไปในเครื่องมืออย่าง Claude Code ก็จะเข้าใจโครงสร้างโค้ดได้ทันทีโดยไม่เปลืองโทเคน
แค่ปรับแต่ง prompt ไม่กี่ชั่วโมงและเขียนโค้ดจัดการ response เพิ่มอีกหน่อย คุณภาพ output ของโมเดลเล็กแบบ local ก็ดีขึ้นอย่างน่าทึ่ง
ลิงก์ GitHub
OpenAI ใช้ GPT-5.3-Codex เวอร์ชันแรกๆ ดีบักกระบวนการฝึกของตัวเองและจัดการ deployment
Claude Code ส่ง PR มากกว่า 20 รายการต่อวันโดย สร้างโค้ดของตัวเองทั้งหมด
ที่จริงเรายังไม่ค่อยรู้ด้วยซ้ำว่าโมเดลไหนไวต่อ context engineering ที่ดีมากน้อยแค่ไหน
แต่ผมเห็นด้วยว่ามันยังมี low hanging fruit อยู่เยอะมากแน่นอน
เทคโนโลยีนี้น่าสนใจ แต่ก็ให้ความรู้สึกว่า ถูกประเมินค่าสูงเกินไป
ผู้เขียนเห็นการปรับปรุง 5% ใน benchmark แบบ find/replace ง่ายๆ ที่ตัวเองทำขึ้น แล้วพูดเหมือนกับว่าประสิทธิภาพโดยรวมเพิ่มขึ้น 14 จุด
ในความเป็นจริง มันอาจเป็นการปรับปรุงด้านประสิทธิภาพการใช้โทเคนรวมไม่ถึง 1% ด้วยซ้ำ
แถมน้ำเสียงในบทความที่ พูดเกินจริง และสำนวนแบบ ChatGPT ยังทำให้ความน่าเชื่อถือลดลง
บทความนี้แสดงให้เห็นชัดว่าระดับ harness ยังมี พื้นที่ให้ปรับปรุง ได้มากแค่ไหน
agent เปลืองโทเคนไปมากกับการแก้ไข การ sandbox และการส่งผ่านข้อมูลระหว่าง tool call
การจับคู่กันของ การอ้างอิงตามเนื้อหา + การใส่เลขบรรทัด ทั้งใช้งานได้จริงและสวยงาม
มันทำให้การพัฒนาเริ่มต้นง่ายขึ้น แต่กลับไม่มีประสิทธิภาพเพราะต้องเรียกโมเดลใหญ่โดยไม่จำเป็น
ใน CC มีคำสั่ง
/costให้ดูค่าใช้จ่ายต่อ session ได้ ดังนั้นน่าจะใช้ตัวชี้วัดแบบนี้ประเมินประสิทธิภาพของปลั๊กอินได้ความสำคัญของ harness นั้นมากกว่าที่คนส่วนใหญ่คิดไว้เยอะมาก
ตัวอย่างเช่น คะแนน benchmark CORE ของ Opus พอเปลี่ยนจาก harness ภายในของตัวเองมาเป็น Claude Code ก็แทบจะเพิ่มเป็นสองเท่า
ลิงก์ที่เกี่ยวข้อง
คะแนนสูงสุดของ TerminalBench เกิดขึ้นได้เพราะ harness Terminus 2
การถูกผูกกับ harness ตัวใดตัวหนึ่งเพียงเพราะค่าสมัครสมาชิกรายเดือน 20 ดอลลาร์นั้นไม่สมเหตุสมผล
ผมทำเครื่องมือชื่อ tilth ที่ใช้แนวทางอ่าน/แก้ไขแบบอิง hash
ติดตั้งได้ผ่าน npm และ cargo และเชื่อมกับ editor อย่าง Claude Code หรือ Cursor ได้
ลิงก์ GitHub
เป้าหมายคือช่วยให้ LLM ใช้ tool ได้มีประสิทธิภาพขึ้นและลดการเปลืองโทเคน
ผมก็คิดวิธีคล้ายๆ กันขึ้นมาได้อย่างอิสระ แต่สุดท้ายเลิกใช้เพราะ การพึ่งพา abstraction
ผมหันไปใช้ ระยะ Damerau-Levenshtein เพื่อคำนวณความคล้ายคลึงของการแก้ไข แล้วถ้าเกิน threshold ที่กำหนดก็ให้การแก้ไขผ่านได้
วิธีนี้ทำให้โมเดลต้องพิมพ์ source token ที่จะถูกแทนที่ออกมาอย่างชัดเจน เลยเพิ่มความแม่นยำได้
ตัวอย่างโค้ด
แก่นสำคัญคือข้อความ error ต้องเจาะจง — การจัดการ error แบบมี คำสั่งสำหรับกู้คืน อย่าง “Content mismatch. Reread the file” นั้นสำคัญมาก
วิธีนี้ใช้ได้ดีแม้กับโมเดล 4B และสำหรับโมเดลที่ไม่รองรับ tool call ก็รับมือด้วย การแฮ็กฉีด system prompt
โค้ดที่เกี่ยวข้อง
แม้แต่โมเดลเก่าๆ ก็ยังให้ผลลัพธ์ที่ค่อนข้างแม่นยำได้
แก่นสำคัญคือการ “จัดการโมเดลให้ถูกวิธี”
บทความนี้ชี้เป็นนัยว่า ถ้าโมเดลไม่ได้จัดการแค่ข้อความ แต่จัดการ การแทนโครงสร้างของ source code (AST) ได้โดยตรง ก็จะได้ผลลัพธ์ที่ดียิ่งกว่า
ตัวอย่างเช่น OpenRewrite ใช้ Lossless Semantic Tree ที่รวมทั้งชนิดข้อมูลของโค้ด รูปแบบ และข้อมูล dependency เอาไว้ครบ
ถ้าโมเดลใช้โครงสร้างแบบนี้ได้ ก็จะทำการแก้ไขได้แม่นยำมากโดยไม่เปลืองโทเคนโดยไม่จำเป็น
ท้ายที่สุดแล้ว นี่ก็เหมือนเหตุผลที่คำตอบของการถกเถียง “Vim vs Emacs” คือ “IntelliJ” — ข้อมูลเชิงโครงสร้างคืออาวุธทรงพลัง
ถ้าโมเดลได้เรียนรู้ทั้งโค้ด เอกสาร และ syntax/semantic tree ไปพร้อมกัน มันก็จะกลายเป็น โมเดลเขียนโค้ดแบบ neurosymbolic อย่างแท้จริง
ผมทดลองใช้ LLM กับ gptel บน Emacs แล้วพบว่า LLM แก้โค้ดด้วยเครื่องมือ Unix patch ได้ไม่ค่อยดี
เลยสร้าง tool สำหรับ gptel ขึ้นมาเองโดยใช้ tree-sitter ของ Emacs
พอให้มันแก้ AST node โดยตรงด้วยคำสั่งอย่าง
tree_sitter_list_nodes,tree_sitter_update_nodesก็ทำงานได้สมบูรณ์แบบapply_patchของ Codex จริงๆ แล้วใช้ schema การสุ่มตัวอย่างแบบมีข้อจำกัดโค้ดที่เกี่ยวข้อง
ผู้เขียนไม่รู้เรื่องนี้แล้วเอามาเปรียบเทียบแบบตรงๆ ดังนั้น benchmark ที่สมจริงกว่าควรทำในสภาพที่เปิด schema นี้ไว้ด้วย
มีช่วงหนึ่งในคำคมของบทความนี้ที่ผมประทับใจเป็นพิเศษ
“ปัญหาไม่ใช่ว่าโมเดลไม่เข้าใจโจทย์ แต่คือ รูปแบบการแทนที่ไม่เสถียร อย่าโทษนักบินเพราะปัญหาที่ชุดลงจอด”
“โมเดลคือ moat, harness คือ bridge”
“ความต่างระหว่างเดโมที่เท่กับเครื่องมือที่เชื่อถือได้ ไม่ใช่เวทมนตร์ แต่คือ วิศวกรรมที่น่าเบื่อแต่ประณีต”