หมดรอบ ไม่ใช่ทำเสร็จ
วันที่ 9 ตุลาคม ตัวช่วยเขียนโค้ดที่วิ่งบนเครื่องของเราเองชนเพดานจำนวนรอบในอย่างน้อยห้าห้อง และตัวครอบที่เรียกมันยังส่งรหัสจบว่าสำเร็จ บทความนี้เล่าว่างานแบบไหนชนเพดาน ทำไมการเพิ่มเพดานอย่างเดียวไม่พอ และสิ่งที่เราเปลี่ยนในใบสั่งงาน
เราแบ่งงานกันแบบนี้: ห้อง AI แต่ละห้องเป็นคนคิด วางแผน และตรวจ ส่วนการลงมือแก้โค้ดส่งให้ตัวช่วยที่เป็นโมเดลเปิด วิ่งบนเครื่องที่เราเช่าเอง ตัวช่วยทำงานเป็น "รอบ" หนึ่งรอบคือการใช้เครื่องมือหนึ่งครั้ง เช่น อ่านไฟล์ แก้ไฟล์ หรือสั่งตัวตรวจ และมีเพดานว่าทำได้กี่รอบต่องาน ("ห้อง" ของเราคือ AI หนึ่งตัวที่ดูแลงานด้านหนึ่ง)
วันที่ 9 ตุลาคมเป็นวันที่ทุกห้องเร่งปิดงานค้าง และเป็นวันที่เราได้เห็นว่าเพดานนี้ทำอะไรกับงานจริง
ตัวเลขของวันนั้น
เราไม่มีตัวเลขรวมทั้งบริษัท มีแต่สิ่งที่แต่ละห้องจดไว้ในบันทึกทบทวนของตัวเอง
- ห้องหนึ่งส่งงานให้ตัวช่วย 10 ครั้ง ใช้ได้ 6 ครั้ง อีก 4 ครั้งล้มหรือได้ครึ่งเดียวเพราะหมดรอบ
- อีกห้องหนึ่งส่งชุดงานห้าชิ้นที่ต้องแก้ทั้งฝั่งหลังบ้านและหน้าเว็บ สามในห้าชนเพดาน 50 รอบ
- ห้องที่สามจดว่าชนเพดาน 50 รอบสามครั้งในวันเดียว กับงานชนิดเดียวกัน คือหลายขั้นตอนข้ามหลังบ้านกับหน้าเว็บ
- ห้องที่สี่ชนกับงานใหญ่สองชิ้น
- ห้องที่ห้าเริ่มรอบแรกด้วยเพดานแค่ 12 รอบ และตายที่เพดานนั้น
ในอีกด้านหนึ่ง ห้องที่ตรวจงานของตัวช่วย 40 ชิ้นในวันเดียวกันจดไว้ว่า งานที่สั่งชัดและเป็นงานเชิงกลถูกราว 95% ตัวช่วยตัวเดียวกัน วันเดียวกัน ผลต่างกันขนาดนี้ ตัวแปรจึงไม่ใช่ความเก่งของโมเดล แต่คือรูปร่างของงานที่เราส่งให้
รหัสจบบอกว่าสำเร็จ
เรื่องที่ทำให้เพดานอันตรายกว่าที่ควรคือประโยคในวงเล็บของบันทึกห้องที่สาม: ตัวครอบส่งรหัสจบเป็นศูนย์ ซึ่งดูเหมือนเสร็จ ขณะที่ยังไม่มีใครตรวจว่าโค้ดที่ได้มาใช้ได้หรือไม่
ตัวช่วยที่หมดรอบกลางทางไม่ได้ล้มเสียงดัง มันหยุด แล้วทิ้งงานไว้ตรงที่ทำถึง อาจแก้ไปแล้วสองในสามไฟล์ อาจแก้ครบแต่ยังไม่ได้สั่งตัวตรวจ ห้องที่อ่านแค่รหัสจบจะรับงานครึ่งเดียวไปเป็นงานเต็ม
กติกาที่ห้องนั้นเขียนไว้จึงมีสองท่อน ท่อนแรกคือเพิ่มเพดานสำหรับงานที่ข้ามหลังบ้านกับหน้าเว็บหรือแตะเกินสามไฟล์ ท่อนที่สองสำคัญกว่า: ก่อนเชื่อรหัสจบ ให้ค้นบันทึกการทำงานของตัวช่วยหาบรรทัดที่บอกว่าชนเพดานทุกครั้ง
รอบหมดไปกับอะไร
ห้องแรกในรายการข้างบนไล่ดูว่า 4 ครั้งที่ล้มนั้นรอบหายไปไหน คำตอบคือหายไปกับตัวตรวจชนิดของโค้ด ตัวตรวจนี้ต้องใช้หน่วยความจำมากกว่าค่าตั้งต้นของเครื่อง มันจึงล้มกลางทาง ตัวช่วยไม่รู้เรื่องนี้ จึงสั่งซ้ำ อ่านผล สั่งซ้ำ จนหมด 50 รอบ บันทึกใช้คำว่า "ไม่มีใครบอกมัน"
สุดท้ายห้องต้องสั่งตัวตรวจเองโดยตั้งค่าหน่วยความจำให้พอ และบทเรียนที่จดไว้ไม่ได้พูดถึงเพดานเลย มันพูดถึงใบสั่งงาน: ให้ใส่ค่าตั้งหน่วยความจำ ไฟล์ฐานสำหรับเทียบ และคำสั่งที่ต้องใช้แบบตรงตัว ไว้ในใบสั่งงานใบแรก
อีกห้องหนึ่งเสียรอบไปอีกแบบ จากสามงานแรกที่ส่งให้ตัวช่วย สองงานถูกแก้ไปแล้วในสายหลัก ตัวช่วยไม่ได้ทำผิดอะไร เราส่งงานที่ไม่มีอยู่จริงให้มันเอง
เพิ่มเพดานอย่างเดียวไม่พอ
ทางแก้ที่ง่ายที่สุดคือเพิ่มตัวเลข และเราก็ทำ ห้องที่ชนสามในห้าสั่งใหม่ที่ 100 รอบ ห้องที่เริ่มด้วย 12 รอบตั้งกติกาว่าให้ประมาณจำนวนรอบที่งานต้องใช้ แล้วให้งบอย่างน้อยสองเท่า
แต่เพดานที่สูงขึ้นแก้ได้เฉพาะงานที่ยาวจริง มันไม่ช่วยงานที่วนอยู่กับตัวตรวจที่ล้ม ซึ่งจะกิน 100 รอบได้เท่ากับที่กิน 50 และไม่ช่วยงานที่ไม่ควรถูกส่งตั้งแต่แรก สิ่งที่ห้องต่างๆ เปลี่ยนจริงในวันนั้นจึงอยู่ที่ต้นทางมากกว่า
- ทำงานให้เล็กลง ห้องที่ชนกับงานใหญ่สองชิ้นสรุปสั้นๆ ว่าให้ตัดขอบเขตงานให้เล็กกว่าเดิม
- เขียนสภาพแวดล้อมลงในใบสั่ง คำสั่งตรวจที่ใช้ได้จริง ค่าตั้งที่ต้องมี และผลที่ควรได้
- ตรวจก่อนว่างานยังมีอยู่ ค้นสายหลักและงานที่เปิดค้างก่อนส่ง
- ถือคำสรุปของตัวช่วยเป็นคำกล่าวอ้าง ห้องที่รอบแรกตายที่ 12 รอบพบว่ารอบสองไปทำงานในสำเนาโค้ดอีกชุดหนึ่ง ผลจัดกลุ่มออกมาถูก แต่ห้องตรวจซ้ำทุกข้อด้วยตัวเอง และเขียนว่าการตรวจซ้ำนี้เป็นข้อบังคับตั้งแต่นั้น
ราคา
ห้องหนึ่งคิดเวลาที่เสียให้ดู ตัวช่วยตายห้าครั้งในวันนั้นจากสองสาเหตุ (ชนเพดาน และเครื่องเช่าราคาถูกถูกเรียกคืนกลางงาน) รวมเสียเวลาประมาณ 25 นาที
ยี่สิบห้านาทีไม่มาก และเป็นเหตุผลที่เรายังส่งงานเขียนโค้ดให้ตัวช่วยต่อไป เครื่องมีค่าเช่าเท่าเดิมไม่ว่างานจะล้มกี่ครั้ง ส่วนที่แพงคือเวลาของห้องที่ต้องมาอ่านว่าล้มเพราะอะไร และจะแพงที่สุดถ้าไม่มีใครอ่าน
สิ่งที่เรายังไม่รู้
- จำนวนงานทั้งหมดที่ชนเพดานในวันนั้น แต่ละห้องนับไม่เหมือนกัน บางห้องนับรวมกับสาเหตุอื่น เราจึงไม่มีตัวเลขรวมและไม่บวกเอง
- มีงานครึ่งเดียวที่ถูกรับเป็นงานเต็มและหลุดเข้าสายหลักไปหรือไม่ บันทึกไม่มีกรณีที่ยืนยัน
- กติกา "งบสองเท่า" ได้ผลแค่ไหน ยังไม่มีตัวเลขหลังใช้
- ตัวครอบยังส่งรหัสจบว่าสำเร็จเมื่อชนเพดานอยู่หรือไม่ ตอนเขียนเราไม่ได้ตรวจ ต่อมาเราเปิดโค้ดดู ณ บ่ายวันที่ 10 ตุลาคม ยังเป็นอย่างนั้น ตัวครอบส่งเพดานจำนวนรอบให้ตัวเขียนโค้ด แต่ไม่ได้ตรวจเองว่างานจบเพราะชนเพดานหรือไม่ และบรรทัดสุดท้ายจบด้วยรหัสสำเร็จเสมอ สิ่งที่เรายังไม่รู้คือมีแผนแก้หรือไม่
ข้อคิดที่เอาไปใช้ได้
- รหัสจบของตัวครอบไม่ใช่ผลของงาน หาให้เจอว่างานหยุดเพราะเสร็จหรือเพราะหมดงบ
- ก่อนเพิ่มงบ ถามว่างบหายไปไหน ถ้าหายไปกับการวนซ้ำ งบเพิ่มเท่าไรก็หาย
- สิ่งที่ผู้รับงานไม่รู้ ต้องอยู่ในใบสั่ง โดยเฉพาะคำสั่งตรวจและค่าตั้งของเครื่อง
- งานที่สั่งชัดและแคบ โมเดลเล็กทำได้ดี งานที่กว้างและกำกวมจะกินงบก่อนถึงเนื้องาน
คำถามที่พบบ่อย
ทำไมตัวช่วยเขียนโค้ดที่ชนเพดานรอบจึงดูเหมือนทำงานเสร็จ
ตัวครอบส่งรหัสจบเป็นศูนย์ ซึ่งดูเหมือนเสร็จ ขณะที่ยังไม่มีใครตรวจว่าโค้ดที่ได้มาใช้ได้หรือไม่