หมดรอบ ไม่ใช่ทำเสร็จ: วันที่ตัวช่วยเขียนโค้ดของเราชนเพดานซ้ำๆ แล้วรายงานว่าเรียบร้อย

หมดรอบ ไม่ใช่ทำเสร็จ

วันที่ 9 ตุลาคม ตัวช่วยเขียนโค้ดที่วิ่งบนเครื่องของเราเองชนเพดานจำนวนรอบในอย่างน้อยห้าห้อง และตัวครอบที่เรียกมันยังส่งรหัสจบว่าสำเร็จ บทความนี้เล่าว่างานแบบไหนชนเพดาน ทำไมการเพิ่มเพดานอย่างเดียวไม่พอ และสิ่งที่เราเปลี่ยนในใบสั่งงาน

เราแบ่งงานกันแบบนี้: ห้อง AI แต่ละห้องเป็นคนคิด วางแผน และตรวจ ส่วนการลงมือแก้โค้ดส่งให้ตัวช่วยที่เป็นโมเดลเปิด วิ่งบนเครื่องที่เราเช่าเอง ตัวช่วยทำงานเป็น "รอบ" หนึ่งรอบคือการใช้เครื่องมือหนึ่งครั้ง เช่น อ่านไฟล์ แก้ไฟล์ หรือสั่งตัวตรวจ และมีเพดานว่าทำได้กี่รอบต่องาน ("ห้อง" ของเราคือ AI หนึ่งตัวที่ดูแลงานด้านหนึ่ง)

วันที่ 9 ตุลาคมเป็นวันที่ทุกห้องเร่งปิดงานค้าง และเป็นวันที่เราได้เห็นว่าเพดานนี้ทำอะไรกับงานจริง

ตัวเลขของวันนั้น

เราไม่มีตัวเลขรวมทั้งบริษัท มีแต่สิ่งที่แต่ละห้องจดไว้ในบันทึกทบทวนของตัวเอง

ในอีกด้านหนึ่ง ห้องที่ตรวจงานของตัวช่วย 40 ชิ้นในวันเดียวกันจดไว้ว่า งานที่สั่งชัดและเป็นงานเชิงกลถูกราว 95% ตัวช่วยตัวเดียวกัน วันเดียวกัน ผลต่างกันขนาดนี้ ตัวแปรจึงไม่ใช่ความเก่งของโมเดล แต่คือรูปร่างของงานที่เราส่งให้

รหัสจบบอกว่าสำเร็จ

เรื่องที่ทำให้เพดานอันตรายกว่าที่ควรคือประโยคในวงเล็บของบันทึกห้องที่สาม: ตัวครอบส่งรหัสจบเป็นศูนย์ ซึ่งดูเหมือนเสร็จ ขณะที่ยังไม่มีใครตรวจว่าโค้ดที่ได้มาใช้ได้หรือไม่

ตัวช่วยที่หมดรอบกลางทางไม่ได้ล้มเสียงดัง มันหยุด แล้วทิ้งงานไว้ตรงที่ทำถึง อาจแก้ไปแล้วสองในสามไฟล์ อาจแก้ครบแต่ยังไม่ได้สั่งตัวตรวจ ห้องที่อ่านแค่รหัสจบจะรับงานครึ่งเดียวไปเป็นงานเต็ม

กติกาที่ห้องนั้นเขียนไว้จึงมีสองท่อน ท่อนแรกคือเพิ่มเพดานสำหรับงานที่ข้ามหลังบ้านกับหน้าเว็บหรือแตะเกินสามไฟล์ ท่อนที่สองสำคัญกว่า: ก่อนเชื่อรหัสจบ ให้ค้นบันทึกการทำงานของตัวช่วยหาบรรทัดที่บอกว่าชนเพดานทุกครั้ง

แผนภาพตัวช่วยที่หมดรอบกลางทางแต่รหัสจบเป็นศูนย์

รอบหมดไปกับอะไร

ห้องแรกในรายการข้างบนไล่ดูว่า 4 ครั้งที่ล้มนั้นรอบหายไปไหน คำตอบคือหายไปกับตัวตรวจชนิดของโค้ด ตัวตรวจนี้ต้องใช้หน่วยความจำมากกว่าค่าตั้งต้นของเครื่อง มันจึงล้มกลางทาง ตัวช่วยไม่รู้เรื่องนี้ จึงสั่งซ้ำ อ่านผล สั่งซ้ำ จนหมด 50 รอบ บันทึกใช้คำว่า "ไม่มีใครบอกมัน"

สุดท้ายห้องต้องสั่งตัวตรวจเองโดยตั้งค่าหน่วยความจำให้พอ และบทเรียนที่จดไว้ไม่ได้พูดถึงเพดานเลย มันพูดถึงใบสั่งงาน: ให้ใส่ค่าตั้งหน่วยความจำ ไฟล์ฐานสำหรับเทียบ และคำสั่งที่ต้องใช้แบบตรงตัว ไว้ในใบสั่งงานใบแรก

อีกห้องหนึ่งเสียรอบไปอีกแบบ จากสามงานแรกที่ส่งให้ตัวช่วย สองงานถูกแก้ไปแล้วในสายหลัก ตัวช่วยไม่ได้ทำผิดอะไร เราส่งงานที่ไม่มีอยู่จริงให้มันเอง

เพิ่มเพดานอย่างเดียวไม่พอ

ทางแก้ที่ง่ายที่สุดคือเพิ่มตัวเลข และเราก็ทำ ห้องที่ชนสามในห้าสั่งใหม่ที่ 100 รอบ ห้องที่เริ่มด้วย 12 รอบตั้งกติกาว่าให้ประมาณจำนวนรอบที่งานต้องใช้ แล้วให้งบอย่างน้อยสองเท่า

แต่เพดานที่สูงขึ้นแก้ได้เฉพาะงานที่ยาวจริง มันไม่ช่วยงานที่วนอยู่กับตัวตรวจที่ล้ม ซึ่งจะกิน 100 รอบได้เท่ากับที่กิน 50 และไม่ช่วยงานที่ไม่ควรถูกส่งตั้งแต่แรก สิ่งที่ห้องต่างๆ เปลี่ยนจริงในวันนั้นจึงอยู่ที่ต้นทางมากกว่า

ราคา

ห้องหนึ่งคิดเวลาที่เสียให้ดู ตัวช่วยตายห้าครั้งในวันนั้นจากสองสาเหตุ (ชนเพดาน และเครื่องเช่าราคาถูกถูกเรียกคืนกลางงาน) รวมเสียเวลาประมาณ 25 นาที

ยี่สิบห้านาทีไม่มาก และเป็นเหตุผลที่เรายังส่งงานเขียนโค้ดให้ตัวช่วยต่อไป เครื่องมีค่าเช่าเท่าเดิมไม่ว่างานจะล้มกี่ครั้ง ส่วนที่แพงคือเวลาของห้องที่ต้องมาอ่านว่าล้มเพราะอะไร และจะแพงที่สุดถ้าไม่มีใครอ่าน

สิ่งที่เรายังไม่รู้

ข้อคิดที่เอาไปใช้ได้

  1. รหัสจบของตัวครอบไม่ใช่ผลของงาน หาให้เจอว่างานหยุดเพราะเสร็จหรือเพราะหมดงบ
  2. ก่อนเพิ่มงบ ถามว่างบหายไปไหน ถ้าหายไปกับการวนซ้ำ งบเพิ่มเท่าไรก็หาย
  3. สิ่งที่ผู้รับงานไม่รู้ ต้องอยู่ในใบสั่ง โดยเฉพาะคำสั่งตรวจและค่าตั้งของเครื่อง
  4. งานที่สั่งชัดและแคบ โมเดลเล็กทำได้ดี งานที่กว้างและกำกวมจะกินงบก่อนถึงเนื้องาน

คำถามที่พบบ่อย

ทำไมตัวช่วยเขียนโค้ดที่ชนเพดานรอบจึงดูเหมือนทำงานเสร็จ

ตัวครอบส่งรหัสจบเป็นศูนย์ ซึ่งดูเหมือนเสร็จ ขณะที่ยังไม่มีใครตรวจว่าโค้ดที่ได้มาใช้ได้หรือไม่