- เป็นการทดลองว่าการขอให้ LLM สั่งว่า “เขียนโค้ดให้ดีขึ้น” ซ้ำ ๆ จะทำให้โค้ดดีขึ้นได้จริงหรือไม่
- กรณีต้นแบบได้รับแรงบันดาลใจจากมีมในฟีเจอร์สร้างภาพ DALL-E ของ ChatGPT ที่คำสั่งแบบ “ทำให้ดู ... มากขึ้น”
การทดลองพรอมต์แบบซ้ำแบบธรรมดา
- ใช้ Claude 3.5 Sonnet พร้อมพรอมต์การเขียน Python ให้แก้ปัญหาที่ค่อนข้างเรียบง่ายแต่สามารถปรับให้มีประสิทธิภาพได้
- การนำไปใช้แบบต้นแบบ
- ค้นหาค่าความต่างระหว่างค่าน้อยสุดและค่าสูงสุดของตัวเลขที่มีผลรวมหลัก (digit sum) เท่ากับ 30 จากตัวเลขสุ่มหนึ่งล้านค่าระหว่าง 1 ถึง 100,000
- แบบแก้ไขแบบตรงไปตรงมาใช้เวลา 657ms (ใช้วิธีแปลงด้วย
str ของ Python)
- Iteration #1
- ขอให้ Claude “เขียนโค้ดให้ดีขึ้น” เพื่อปรับปรุงโค้ด
- Claude ปรับโครงสร้างโค้ดใหม่เป็นคลาส Python และทำให้เป็นเชิงวัตถุ พร้อมคำนวณ digit sum ของตัวเลขทั้งหมดไว้ล่วงหน้า
- เร็วขึ้น 2.7 เท่า
- Iteration #2
- Claude ใช้การทำงานแบบมัลติเธรดและการคำนวณแบบเวกเตอร์ด้วย numpy เพื่อปรับแต่งโค้ดมากขึ้น
- เร็วขึ้น 5.1 เท่า
- Iteration #3
- โค้ดกลับซับซ้อนขึ้นและเกิดการถอยกลับไปใช้การแปลงเป็นสตริง
- เร็วขึ้น 4.1 เท่า
- Iteration #4
- ใช้ไลบรารี Python อย่าง numba เพื่อเรียกตัวคอมไพล์ JIT และใช้ asyncio ของ Python เพื่อทำงานขนาน
- เร็วขึ้นได้ถึง 100 เท่า
- แทนที่จะกลายเป็นโค้ดระดับจักรวาล โค้ดกลับกลายเป็นเวอร์ชันโอเวอร์เอนจิเนียริ่งแบบ "เอ็นเตอร์ไพรส์"
การนำ Prompt Engineering ไปใช้
- จำเป็นต้องใช้ prompt engineering เพื่อเพิ่มคุณภาพผลลัพธ์ของ LLM
- Claude 3.5 Sonnet มีความสามารถในการปฏิบัติตามพรอมต์ได้ดีมาก หากให้คำสั่งที่ชัดเจนก็สามารถได้ผลลัพธ์ที่ดีกว่า
- ใช้ system prompt ที่ใส่คำแนะนำละเอียดแทนการสั่งเพียง “เขียนโค้ดให้ดีขึ้น”
- พรอมต์เริ่มต้น
- กำหนดนิยามของ “โค้ดที่ทำให้เหมาะสม” อย่างละเอียด (อัลกอริทึม การขนาน การลดโค้ดที่ไม่จำเป็น ฯลฯ)
- เริ่มจากการปรับแต่ง digit sum ด้วย Numba ในการนำไปใช้แรก เร็วขึ้น 59 เท่า
- Iteration #1
- Claude เพิ่มการขนาน แต่กลับแนะนำให้ใช้การเลื่อนบิตแบบผิดพลาด (สำหรับเลขฐานสิบหก) จนเกิดบั๊ก
- ประสิทธิภาพกลับลดลงเหลือ 9.1 เท่า
- Iteration #2
- Claude พยายามเร่งด้วย SIMD แต่ยังคงใช้การเลื่อนบิตที่ผิด
- เร็วกว่าเวอร์ชันเริ่มต้น 65 เท่า
- Iteration #3
- Claude ใช้ hash table เพื่อเพิ่มประสิทธิภาพ
- เร็วกว่าเวอร์ชันเริ่มต้น 100 เท่า
- Iteration #3
- Claude แก้ไขการเลื่อนบิตที่ผิดทำให้ประสิทธิภาพลดลงเล็กน้อย
- เร็วกว่าเวอร์ชันเริ่มต้น 95 เท่า
บทสรุป
- แม้เพียงพรอมต์ที่กว้างและคลุมเครืออย่าง “โค้ดที่ดีขึ้น” ก็ยังอาจช่วยให้เกิดการปรับปรุงแบบขั้นเป็นขั้นไป
- หากผ่าน prompt engineering ระบุทิศทางที่ต้องการอย่างชัดเจน (เช่น ตัวเลข, JIT, การขนาน ฯลฯ) จะได้โค้ดที่พัฒนายิ่งขึ้นได้เร็วขึ้น
- แนวคิดการปรับแต่งอัตโนมัติอาจเป็นจุดเริ่มต้นในการค้นพบเครื่องมือใหม่ (เช่น numba) ได้ แต่ผู้วิศวกรยังจำเป็นต้องคัดกรองและใช้อย่างเลือกสรรโดยคำนึงถึงบั๊ก
- ในระบบที่ใช้งานจริง ไม่ควรคัดลอกโค้ดที่ LLM เสนอทั้งหมดมาใช้ดิบ ๆ เนื่องจากมีข้อจำกัดเฉพาะโดเมนและความจำเป็นในการยืนยันความถูกต้องสูง
- การทดลองนี้ยึดพื้นฐานโค้ด Python แต่แนวคิดการปรับแต่งของ LLM ก็ยังมีศักยภาพที่จะใช้ได้กับการผสมผสานกับภาษาอื่น เช่น Rust ผ่านทาง PyO3
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
การทดสอบก่อนว่าตัวเลขเป็นค่าน้อยกว่าค่าต่ำสุดหรือต่ำกว่า/มากกว่าค่าสูงสุดหรือไม่ในขั้นตอนเพิ่มประสิทธิภาพโค้ดเป็นวิธีที่ได้ผล เทคนิคนี้ทำก่อนคำนวณผลรวมตัวเลข และสามารถเพิ่มความเร็วได้สูงสุด 5.5 เท่าได้ โดยทำได้ด้วย
numpyโดยไม่ต้องใช้NumbaLLM อย่าง GPT มักให้ผลลัพธ์ระดับกลางในช่วงแรก ๆ และมีการอ้างว่าอาจได้ผลลัพธ์ที่ดีกว่าโดยให้คำแนะนำที่เฉพาะเจาะจง
LLM เป็นเหมือนเครื่องจำลองสถานการณ์ตามบริบทที่จำลองแบบจำลองโลกจริงผ่านการคาดเดาข้อความ ความแม่นยำในการคาดเดาข้อความต้องอาศัยแบบจำลองโลกจริงที่แม่นยำ
LLM มักโน้มเอียงไปทางการเขียนโค้ดแบบผู้เริ่มต้น และการระบุแพ็กเกจและขอเฉพาะโค้ดแบบง่ายจะได้ผล
ChatGPT ใน Android/Kotlin มีความไม่มีประสิทธิภาพและมักเรียกใช้เมธอดที่ไม่ถูกต้องหรือเลิกใช้งานแล้วบ่อยครั้ง
สิ่งสำคัญคือการเริ่มเซสชันการเขียนโค้ดด้วย "แผนเปิด" แทนคำสั่ง "เขียนโค้ด" ควรชี้แจงสมมติฐานของ LLM อย่างชัดเจนและปรับแผนก่อนที่คุณจะเริ่มเขียนโค้ด
อธิบายการลบ PostgreSQL ออกจาก Debian อย่างสมบูรณ์แล้วติดตั้งใหม่ โดยคงไดเรกทอรีข้อมูลเดิมไว้เพื่อรักษาฐานข้อมูลเดิมไว้
การเพิ่มประสิทธิภาพโค้ดอาจไม่ดีหากทำเร็วเกินไป ควรทำการเพิ่มประสิทธิภาพเฉพาะเมื่อต้องการเท่านั้น
การขอให้ "เขียนโค้ดให้ดีกว่า" ซ้ำไปซ้ำมาอาจทำให้ประสิทธิภาพลดลง และอาจทำให้โซลูชันใช้งานไม่ได้
การคำนวณใน LiveCode เร็วกว่า Python และอธิบายวิธีคำนวณผลรวมด้วยการวนซ้ำ