วิธีที่ฉันใช้ "AI"
(nicholas.carlini.com)- ตลอด 1 ปีที่ผ่านมา ฉันใช้เวลาหลายชั่วโมงทุกสัปดาห์ในการโต้ตอบกับโมเดลภาษาขนาดใหญ่ และประทับใจกับความสามารถของมันในการแก้ปัญหาที่ยากขึ้นเรื่อย ๆ อย่างต่อเนื่อง
- ผลลัพธ์คือ ความเร็วในการเขียนโค้ดสำหรับทั้งโปรเจ็กต์วิจัยและโปรเจ็กต์ส่วนตัวของฉันเพิ่มขึ้นอย่างน้อย 50%
- คนที่พูดถึงประโยชน์ของ LLM บนอินเทอร์เน็ต ส่วนใหญ่มักมองโลกในแง่ดีเกินไปหรือมองโลกในแง่ร้ายเกินไป
- แทนที่จะถกเถียงเรื่องอนาคต ฉันอยากยกตัวอย่างบทสนทนา 50 แบบที่ฉันใช้ LLM ตลอด 1 ปีที่ผ่านมาเพื่อพัฒนาความสามารถด้านการวิจัยและช่วยงานโปรเจ็กต์เขียนโค้ด
- กรณีการใช้งาน LLM ของฉัน
- สร้างเว็บแอปทั้งตัวด้วยเทคโนโลยีที่ไม่เคยใช้มาก่อน
- เรียนรู้วิธีใช้เฟรมเวิร์กหลากหลายแบบโดยไม่ต้องลองใช้เองก่อน
- แปลงโปรแกรมหลายสิบตัวเป็น C หรือ Rust เพื่อเพิ่มประสิทธิภาพ 10~100 เท่า
- ลดขนาดโค้ดเบสขนาดใหญ่เพื่อทำให้โปรเจ็กต์เรียบง่ายขึ้นมาก
- เขียนโค้ดสำหรับการทดลองเริ่มต้นของงานวิจัยแทบทุกฉบับในช่วงปีที่ผ่านมา
- ทำงานน่าเบื่อหรือสคริปต์ใช้ครั้งเดียวเกือบทั้งหมดให้เป็นอัตโนมัติ
- แทบจะใช้แทนการค้นหาบนเว็บทั้งหมดสำหรับการตั้งค่าและคอนฟิกแพ็กเกจหรือโปรเจ็กต์ใหม่
- ใช้แทนการค้นหาบนเว็บราว 50% สำหรับการดีบักข้อความแสดงข้อผิดพลาด
- หากจัดหมวดหมู่ จะมีอยู่ 2 แบบ
- ช่วยการเรียนรู้: ทำให้สามารถทำสิ่งที่ก่อนหน้านี้เป็นเรื่องยากได้
- ทำงานน่าเบื่อให้เป็นอัตโนมัติ: ช่วยให้โฟกัสกับสิ่งที่ถนัดที่สุดและแก้ปัญหาที่ยากได้
- สิ่งสำคัญที่สุดคือ ตัวอย่างเหล่านี้เป็นวิธีที่ฉันใช้ LLM แล้วได้รับความช่วยเหลือจริง
- ไม่ได้มีไว้เพื่อโชว์ความสามารถที่น่าทึ่ง แต่เกิดจากความจำเป็นของฉันที่ต้องจัดการงานจริง
ความละเอียดอ่อนของเรื่องนี้
- สิ่งหนึ่งที่อินเทอร์เน็ตทำได้ไม่ดีนักคือการรักษาความละเอียดอ่อนของประเด็น ฉันจะไม่อ้างว่า LLM ในปัจจุบันจะครองโลก หรือพูดถึงว่าโมเดลในอนาคตจะทำอะไรได้บ้าง
- ฉันจะพูดแค่ว่าโมเดลในวันนี้มีประโยชน์กับตัวฉันหรือไม่เท่านั้น
- คุณอาจสงสัยว่าทำไมต้องเขียนบทความเพื่ออธิบายว่าโมเดลภาษานั้นมีประโยชน์ แต่ดูเหมือนว่าในแวดวงวิชาการ วิศวกรรมซอฟต์แวร์ และสื่อ จะมีคนจำนวนมากที่ประกาศกันอย่างกว้างขวางว่า LLM ไม่ได้สร้างคุณูปการอะไรเลย เป็นเพียงวัฏจักรกระแสเกินจริงอีกครั้งหนึ่ง และอีกไม่กี่ปีก็จะหายไปโดยไม่ทิ้งผลกระทบใดไว้กับโลก
- ฉันจะโต้แย้งว่าคนเหล่านี้คิดผิด เพราะ LLM ในปัจจุบันมีประโยชน์อยู่แล้ว
- ในทางกลับกัน ก็มีคนที่อ้างว่าโมเดลทุกวันนี้สามารถแทนที่โปรแกรมเมอร์ทั้งหมดได้ และผู้คนไม่ควรเรียนการเขียนโปรแกรมอีกต่อไป
- ฉันไม่ได้ตั้งใจจะโต้แย้งข้ออ้างเหล่านี้โดยตรง
- ฉันเข้าใจอย่างเต็มที่ว่า LLM อาจก่อให้เกิดผลกระทบด้านลบได้มากมาย ไม่ว่าจะเป็นข้อมูลเท็จ การละเมิด การเฝ้าระวัง การแทนที่แรงงาน และอื่น ๆ ฉันตั้งใจจะเขียนถึงความคิดของฉันเกี่ยวกับผลกระทบด้านลบของ LLM เร็ว ๆ นี้ แต่เรื่องนั้นเป็นคนละประเด็นกับคำถามว่าโมเดลภาษามีประโยชน์ได้หรือไม่
- ฉันเข้าใจดีว่าทำไมบางคนถึงไม่อยากใช้ LLM เพราะมันเกิดภาพหลอน ซ้ำข้อเท็จจริงเดิม ๆ และขาดความแข็งแกร่งจนมีแนวโน้มจะล้มเหลวได้ แต่บทความนี้ไม่ได้พูดถึงเรื่องนั้น
- ฉันคิดว่าแม้จะมีความล้มเหลวเหล่านี้ โมเดลก็ยังมีประโยชน์ได้
- ความมีจริยธรรมของการฝึกโมเดลเหล่านี้เป็นเรื่องที่น่าสงสัยอย่างไม่ต้องสงสัย คุณอาจนึกถึงการฝึกด้วยข้อมูลของผู้คนโดยไม่ได้รับอนุญาต หรือผู้ที่ได้รับค่าจ้างต่ำเพื่อฝึกโมเดลอย่างชัดเจน ฉันเห็นด้วยว่านี่เป็นปัญหา
- แต่บทความนี้ไม่ได้พูดถึงเรื่องนั้น
- อย่างที่ฉันพูดหลายครั้งแล้วว่า บทความนี้จะพูดถึงแค่เรื่องเดียวคือ โมเดลที่มีอยู่ในปัจจุบันมีประโยชน์หรือไม่
ภูมิหลังของฉัน
- โดยทั่วไปแล้วฉันไม่ใช่คนที่เชื่ออะไรง่าย ๆ เมื่อ 10 ปีก่อนฉันเคยเจอกระแส hype ของคริปโตในชุมชนความปลอดภัย แต่ก็หลีกเลี่ยงการเขียนบทความเกี่ยวกับบล็อกเชนโดยสิ้นเชิง ฉันไม่เคยถือ Bitcoin และฉันตั้งข้อสงสัยกับทุกคำกล่าวอ้าง
- ตอนที่มีคนบอกฉันครั้งแรกว่าเทคโนโลยี AI นี้จะมีประโยชน์มากและจะเปลี่ยนวิธีทำงานประจำวันอย่างมาก ปฏิกิริยาของฉันคือ "ฉันจะไม่เชื่อจนกว่าจะได้เห็นกับตา"
- ฉันเป็นนักวิจัยด้านความปลอดภัย งานประจำของฉันในช่วง 10 ปีที่ผ่านมาคือการแสดงให้เห็นว่าวิธีต่าง ๆ ที่โมเดล AI ล้มเหลวอย่างมหันต์เมื่อเผชิญกับสภาพแวดล้อมที่ไม่ได้อยู่ในข้อมูลฝึกนั้นมีอะไรบ้าง ฉันเคยแสดงให้เห็นว่าเพียงรบกวนอินพุตของโมเดลแมชชีนเลิร์นนิงเล็กน้อย ก็ทำให้มันสร้างเอาต์พุตที่ผิดพลาดอย่างรุนแรงได้ หรือแสดงให้เห็นว่าโมเดลแมชชีนเลิร์นนิงส่วนใหญ่มักจดจำตัวอย่างเฉพาะจากชุดข้อมูลฝึก และทวนซ้ำมันเมื่อถูกใช้งาน ฉันเข้าใจข้อจำกัดของระบบเหล่านี้อย่างถ่องแท้
- ถึงอย่างนั้น ฉันก็ยังบอกว่าโมเดลภาษาขนาดใหญ่ในปัจจุบันได้เพิ่มผลิตภาพมากที่สุดนับตั้งแต่มีอินเทอร์เน็ตเกิดขึ้น หากวันนี้ฉันต้องเลือกอย่างใดอย่างหนึ่งระหว่างการเข้าถึงอินเทอร์เน็ตหรือการเข้าถึงโมเดลภาษารุ่นล่าสุดสำหรับงานเขียนโปรแกรมแบบสุ่มที่เลือกมา ฉันจะเลือกโมเดลภาษาในมากกว่าครึ่งของกรณี
[ วิธีที่ฉันใช้ LLM ]
สร้างแอปพลิเคชันสมบูรณ์ให้ฉัน
- ปีที่แล้ว ฉันสร้างแบบทดสอบเพื่อทดสอบว่า GPT-4 สามารถทำนายได้ดีแค่ไหนว่า งานแบบ few-shot บางงานจะถูกแก้ได้หรือไม่ แบบทดสอบนั้นได้รับความนิยมพอสมควรและมียอดเข้าชมมากกว่า 10 ล้านครั้ง
- ฉันให้ GPT-4 เขียนเวอร์ชันแรกเริ่มของแอปพลิเคชันนี้เกือบทั้งหมด โดยเริ่มจากขอให้สร้างโครงหลักของแอป แล้วค่อย ๆ สร้างฟีเจอร์ต่าง ๆ ผ่านชุดคำถามต่อเนื่อง
- บทสนทนานี้มีความยาวรวม 30,000 คำ และใช้ขีดความสามารถของโมเดล GPT-4 รุ่นใหม่ล่าสุดในเวลานั้นอย่างเต็มที่
- [ขอละเว้น prompt และคำตอบจริง]
- ฉันตั้งคำขอในบทสนทนากับ GPT-4 หลายรูปแบบ
- ตั้งแต่ข้อความที่อธิบายด้วยคำพูดว่าฉันต้องการอะไรและขอให้โมเดลทำ implementation ทั้งหมด ไปจนถึงข้อความที่ขอเปลี่ยนแปลงเฉพาะจุด (
"แทนที่จะเทียบกับคะแนนเฉลี่ย ใช้ KDE เพื่อบอกเปอร์เซ็นไทล์ได้ไหม?") - รวมถึงข้อความที่เป็นคำถามไม่สมบูรณ์อย่างมาก เช่นการคัดลอกแล้ววางข้อความ error (
"Plotting: numpy.linalg.LinAlgError: singular matrix") หรือกรณีที่ขอคำตอบสั้น ๆ แบบใช้ครั้งเดียว ("จะเพิ่ม iframe ลงในหน้าเว็บด้วย JavaScript ที่มีเนื้อหาซึ่งโหลดมาจากสตริงได้อย่างไร?")
- ตั้งแต่ข้อความที่อธิบายด้วยคำพูดว่าฉันต้องการอะไรและขอให้โมเดลทำ implementation ทั้งหมด ไปจนถึงข้อความที่ขอเปลี่ยนแปลงเฉพาะจุด (
- เหตุผลที่โมเดลภาษามีประสิทธิภาพ
- วิธีนี้ได้ผลเพราะโมเดลภาษาทำได้ดีกับสิ่งที่คนเคยแก้ไว้ก่อนแล้ว
- 99% ของแบบทดสอบนี้เป็นเพียง HTML พื้นฐานพร้อม backend เว็บเซิร์ฟเวอร์ Python ที่ใครสักคนก็เขียนได้อยู่แล้ว
- สิ่งที่ทำให้แบบทดสอบนี้น่าสนใจและผู้คนชอบ ไม่ใช่เทคโนโลยีเบื้องหลัง แต่เป็นเนื้อหาของแบบทดสอบ และเมื่อทำให้ส่วนที่น่าเบื่อทั้งหมดเป็นอัตโนมัติ การสร้างแบบทดสอบก็กลายเป็นเรื่องง่ายมาก
- ฉันค่อนข้างมั่นใจว่าถ้าไม่ได้ความช่วยเหลือจากโมเดลภาษา ฉันก็คงจะไม่สร้างแบบทดสอบนี้
- เพราะฉันไม่สนใจจะใช้เวลามาเขียนเว็บแอปทั้งตัวตั้งแต่ต้น
- และนี่คือเรื่องเล่าจากคนที่รู้วิธีเขียนโปรแกรมอยู่แล้ว!
- ฉันเชื่อว่าแม้แต่โมเดลในปัจจุบันก็เพียงพอที่จะทำให้คนส่วนใหญ่สามารถทำงานที่มีความหมาย ซึ่งก่อนหน้านี้ไม่มีทางแก้ได้เลย เพียงแค่ขอวิธีแก้จากมัน
- ต่อจากนี้ฉันจะยกตัวอย่างเพิ่มเติมอีกสองสามกรณีที่โมเดลเขียนแอปพลิเคชันทั้งตัวให้ฉัน และเมื่อฉันปล่อยมันออกมา ฉันจะระบุอย่างชัดเจนว่ามันถูกสร้างขึ้นด้วยความช่วยเหลือจากโมเดลภาษา
ทำหน้าที่เป็นติวเตอร์สำหรับเทคโนโลยีใหม่
- เมื่อก่อนฉันพยายามตามเฟรมเวิร์กใหม่ ๆ ให้ทัน แต่เวลาที่คนคนหนึ่งจะทำได้ก็มีจำกัด
- ด้วยอาชีพการงานของฉัน เวลาส่วนใหญ่จึงหมดไปกับการตามให้ทันความก้าวหน้าของงานวิจัยล่าสุด และไม่ได้ตามพัฒนาการของเฟรมเวิร์ก JavaScript รุ่นใหม่ ๆ
- เมื่อเริ่มโปรเจกต์ใหม่ที่อยู่นอกเหนือจากขอบเขตงานวิจัยเฉพาะทาง โดยทั่วไปมักมีอยู่สองทางเลือก
- อย่างแรกคือใช้สิ่งที่รู้อยู่แล้ว และ
- อย่างที่สองคือเรียนรู้วิธีใหม่ ๆ (ซึ่งมักจะดีกว่า)
- ตรงนี้เองที่ language model เข้ามาช่วยได้ เฟรมเวิร์กหรือเครื่องมือใหม่ ๆ ส่วนใหญ่ เช่น Docker, Flexbox, React ไม่ได้เป็นเรื่องใหม่สำหรับคนอื่น มีคนทั่วโลกตั้งแต่หลักหมื่นถึงหลักแสนที่เข้าใจสิ่งเหล่านี้อย่างถ่องแท้ และ language model ในปัจจุบันก็เช่นกัน
- แทนที่จะอ่านทูโทเรียลแบบตายตัวที่สมมติผู้อ่านกลุ่มหนึ่งและพยายามพาไปสู่เป้าหมายเฉพาะ เราสามารถโต้ตอบกับ language model เพื่อเรียนรู้สิ่งที่จำเป็นต่อการแก้ปัญหางานตรงหน้าได้
- ตอนต้นปีนี้ ขณะสร้างเฟรมเวิร์กสำหรับประเมินผล LLM ฉันต้องการรันโค้ดที่ LLM สร้างขึ้นในสภาพแวดล้อมที่จำกัด
- Docker เป็นเครื่องมือที่เหมาะกับงานนี้มาก แต่ฉันไม่เคยใช้มันมาก่อน
- การใช้ Docker ไม่ใช่เป้าหมายของโปรเจกต์ แต่เป็นเพียงเครื่องมือที่จำเป็นเพื่อให้บรรลุเป้าหมาย
- ฉันแค่อยากเข้าใจ Docker สัก 10% เพื่อให้มั่นใจว่ากำลังใช้งานมันอย่างปลอดภัยด้วยวิธีพื้นฐานที่สุดเท่าที่ทำได้
- ถ้าย้อนกลับไปยุค 90 ก็คงต้องซื้อหนังสือสอนใช้ Docker ตั้งแต่หลักการพื้นฐาน อ่านไปไม่กี่บทแรก แล้วข้ามไปหาวิธีทำสิ่งที่ต้องการ
- ในช่วง 10 ปีที่ผ่านมา สถานการณ์ดีขึ้นเป็นการค้นหาทูโทเรียลออนไลน์เกี่ยวกับวิธีใช้ Docker ทำตามไป แล้วค่อยค้นหาข้อความ error เพื่อดูว่ามีคนอื่นเจอปัญหาเดียวกันหรือไม่
- แต่ทุกวันนี้ แค่ขอให้ language model สอน Docker ให้ก็พอ
- หลังจากตั้งค่าและรัน Docker แล้ว ฉันก็พบว่ามีปัญหาเรื่องสิทธิ์เมื่อรันบน Linux เลยขอให้โมเดลช่วยแก้ปัญหานี้
- จากนั้นฉันก็ได้รู้จัก Podman และขอให้โมเดลเขียนโค้ดเวอร์ชันที่ใช้ Docker ใหม่ให้เป็นเวอร์ชัน Podman ที่เทียบเท่ากัน
- และตอนที่อยากหาวิธีส่ง GPU ของเครื่อง host เข้าไปใน Docker container ฉันก็ถามมันเช่นกัน
การเริ่มต้นโปรเจกต์ใหม่
- ตอนเด็ก ภาษาโปรแกรมภาษาแรกของฉันคือ Java ฉันชอบการเขียนโปรแกรมมาก แต่เกลียดการมองหน้าจอเปล่าตอนเริ่มโปรเจกต์ใหม่สุด ๆ โดยเฉพาะถ้าเป็น Java!
- แค่จะคอมไพล์โปรแกรม Hello World ยังยากเลย เพราะต้องหาว่า
public static void main string argsทำอะไร วงเล็บต้องวางตรงไหน ตัวอักษรไหนต้องเป็นตัวใหญ่บ้าง แล้วทำไมถึงมีทั้งวงเล็บปีกกาและวงเล็บเหลี่ยมเต็มไปหมด
- แค่จะคอมไพล์โปรแกรม Hello World ยังยากเลย เพราะต้องหาว่า
- ดังนั้นฉันจึงทำในสิ่งที่เด็กทั่วไปน่าจะทำ คือขอให้พ่อช่วยทำให้
- ผ่านมา 20 ปีแล้ว ฉันก็ยังเกลียดการเริ่มโปรเจกต์ใหม่ด้วยเฟรมเวิร์กที่ไม่คุ้นเคยอยู่ดี
- มันเสียเวลาไปกับการกำจัด boilerplate มากเกินไป และฉันก็ไม่เข้าใจด้วยซ้ำว่ากำลังทำอะไรอยู่
- ตัวอย่างเช่น เมื่อไม่นานมานี้ฉันอยากลองเขียนโค้ด CUDA เพื่อ benchmark ประสิทธิภาพของ Greedy search แบบง่าย ๆ บน GPU เทียบกับ implementation บน CPU ของใครบางคนที่มีประสิทธิภาพและปรับแต่งมาอย่างดี
- แต่ฉันไม่รู้วิธีเขียนโปรแกรม CUDA
- ฉันเขียน C ได้ และเข้าใจว่า GPU ทำงานอย่างไร kernel ทำงานอย่างไร รวมถึง memory layout ต่าง ๆ
- แต่ไม่รู้ว่าจะเขียนโค้ดที่ส่งงานไปให้ GPU ทำจริง ๆ อย่างไร
- ดังนั้นฉันจึงขอให้โมเดลเขียน first pass ของโปรแกรม CUDA ให้
- มันสมบูรณ์แบบไหม? ไม่เลย! แต่มันคือจุดเริ่มต้น และนั่นแหละคือสิ่งที่ฉันต้องการ
- เห็นได้ชัดเลยว่าโค้ดตรงนี้ผิดอยู่หลายจุด
- ซึ่งจริง ๆ แล้วไม่ใช่ปัญหาเลย
- เพราะฉันไม่ได้กำลังหาคำตอบที่สมบูรณ์แบบ แต่กำลังหาจุดเริ่มต้น
- ถ้าในอนาคตโมเดลเก่งขึ้นกว่านี้ก็คงยอดเยี่ยมมาก
- แต่แค่สิ่งที่มีอยู่ตอนนี้ก็ดีมากแล้วและช่วยได้มากจริง ๆ
- แยกจากเรื่องข้างบนโดยสิ้นเชิง สำหรับอีกโปรเจกต์ส่วนตัวที่ทำอยู่ที่บ้าน ฉันกำลังใช้ Raspberry Pi Pico W
- นี่เป็นครั้งแรกที่ฉันได้ลองใช้มัน
- โดยเฉพาะฉันอยากให้มันทำงานด้านเครือข่าย
- แน่นอนว่าฉันน่าจะหาทูโทเรียลดี ๆ ทางออนไลน์ที่อธิบายวิธีทำสิ่งที่ต้องการได้
- แต่ช่วงนี้เวลาเสิร์ชอินเทอร์เน็ต ผลลัพธ์ 5 อันดับแรกมักเป็นแค่คอนเทนต์ฟาร์มขยะที่มีโค้ดบั๊ก ๆ มาตั้งแต่ปี 2008 อัปเดตเพื่อ SEO อย่างเดียว และสุดท้ายก็ยังใช้ไม่ได้อยู่ดี
- เพราะอย่างนั้น ฉันเลยขอให้ language model สอนวิธีทำสิ่งที่ฉันต้องการแทน
- ฉันเคยทำงานกับไมโครคอนโทรลเลอร์มาก่อน จึงพอเข้าใจคร่าว ๆ ว่าพวกมันทำงานอย่างไร
- แต่ไม่เคยทำงานกับ Pico W มาก่อน
- ถ้ามีอะไรสักอย่างที่ช่วยให้เริ่มต้นได้พร้อม dependencies ทั้งหมด ฉันก็สามารถไปต่อเองได้
- สำหรับไมโครคอนโทรลเลอร์ตัวใหม่ โปรแกรม "hello world" ตัวแรกที่ฉันเขียนเสมอคือทำให้ LED กระพริบ
- มันช่วยให้ทดสอบได้ว่าสามารถคอมไพล์และอัปโหลดโค้ดลงอุปกรณ์ได้หรือไม่ พินทั้งหมดถูกตั้งค่าอย่างถูกต้องหรือไม่ และโดยพื้นฐานแล้วฉันกำลังทำอะไรอยู่
- ดังนั้นก็แค่ขอโปรแกรมกระพริบไฟเท่านั้นเอง (พูดอีกแบบก็คือ สิ่งนี้มีอยู่บนอินเทอร์เน็ตไหม? เกือบจะแน่นอนว่ามี แต่ถ้าอย่างนั้นฉันก็ต้องไปหาเอง)
- เมื่อรันโค้ดนี้ได้แล้ว ฉันก็จะรู้ว่าควรทำอะไรต่อจากตรงนี้
- ฉันรู้ว่า Python ทำงานอย่างไร (เชื่อหรือไม่ก็ตาม!)
- ดังนั้นพอผ่านส่วนงาน MicroPython เฉพาะทางไปได้แล้ว ฉันก็แก้ไขต่อเองได้ทันที
- และเมื่อเจอปัญหาอื่นที่ต้องการการจัดการเฉพาะทาง ก็แค่ขอให้โมเดลช่วย
- ตัวอย่างเช่น ในกรณีนี้ ฉันทำต่อด้วยการขอให้โมเดลเขียนสคริปต์สำหรับเชื่อมต่อ WiFi
- แล้วทุกครั้งที่ติดขัดอีก เช่น ต้องเชื่อมต่อกับเซิร์ฟเวอร์ MQTT ก็แค่ขอให้โมเดลช่วยอีกครั้ง
- ตอนนี้ฉันทำแบบนี้อยู่เรื่อย ๆ แม้แต่ตัวอย่างที่อยู่ด้านบนสุดของส่วนนี้ก็ไม่ใช่เรื่องสมมติ
- ฉันกำลังถามวิธีใช้ Flexbox เพราะวิธีใหม่ในการเรียนรู้การจัด layout HTML คือใช้
divแทนตาราง
- ฉันกำลังถามวิธีใช้ Flexbox เพราะวิธีใหม่ในการเรียนรู้การจัด layout HTML คือใช้
ทำให้โค้ดเรียบง่ายขึ้น
- ในฐานะนักวิจัยด้านความปลอดภัย ฉันมักได้รับ repository ใหม่ที่บรรจุโปรเจกต์วิจัยของคนอื่นซึ่งยาวเป็นพันบรรทัด และต้องไปหาว่ามันทำงานอย่างไรเพื่อโจมตีมัน
- ถ้าทุกคนเขียนโค้ดสะอาด งานก็คงไม่ยากขนาดนั้น แต่โลกที่เราอยู่ไม่เป็นแบบนั้น
- นักวิจัยไม่ได้มีแรงจูงใจให้เผยแพร่โค้ดที่สะอาด
- ดังนั้นบ่อยครั้งคนเราจึงส่งโค้ดขยะที่ใช้งานได้มาแทน (ฉันเองก็ทำเหมือนกัน)
- ฉันไม่มีตัวอย่างจากงานวิจัยที่จะแชร์ได้ที่นี่ แต่สามารถแชร์ตัวอย่างจากโปรเจกต์ส่วนตัวที่กำลังทำอยู่ได้
- ฉันหมกมุ่นกับเกมชีวิตของ Conway แบบไม่ค่อยดีต่อสุขภาพนัก
- เมื่อไม่นานมานี้ฉันกำลังหาวิธีที่เร็วในการประเมินรูปแบบบางอย่างของชีวิตใน Python
- มีเครื่องมือ C++ ที่ยอดเยี่ยมชื่อ golly สำหรับทำสิ่งนี้ แต่ฉันไม่อยากเขียนโค้ด Python ใหม่ทั้งหมดเป็น C++
- golly มีเครื่องมือ CLI ที่ทำสิ่งที่ฉันต้องการได้
- สิ่งที่ต้องมีคือแค่รู้วิธีเรียกใช้มันให้ถูกต้อง
- ขั้นตอนแรกของเรื่องนี้คือเอาโค้ด C++ ที่รองรับตัวเลือกบรรทัดคำสั่งประมาณ 50 แบบ แล้วทำให้มันเหลือแค่ทำสิ่งเดียวที่ฉันต้องการอย่างแม่นยำ
- ดังนั้นฉันจึงเทโค้ด C++ ทั้งหมด 500 บรรทัดให้ LLM แล้วขอไฟล์ที่สั้นกว่าซึ่งยังทำงานเดิมได้
- แล้วผลเป็นอย่างไรน่ะหรือ? มันทำงานได้สมบูรณ์แบบ
- จากนั้นฉันก็ขอ Python wrapper รอบโค้ด C++ นั้น และมันก็ใช้ได้ดีเหมือนกัน
- นี่เป็นหนึ่งในงานที่น่ารำคาญเกินกว่าผู้เขียนต้นฉบับจะยอมทำเองแน่นอน
- แต่ตอนนี้แค่ขอก็พอ ฉันเลยได้บางอย่างที่เร็วกว่าโค้ด Python เดิมถึง 100 เท่า
- ฉันทำอะไรแบบนี้ค่อนข้างบ่อย และยังมีอีกตัวอย่างหนึ่งที่ทำแบบเดียวกันเป๊ะใน Python
- งานเหล่านี้ไม่มีงานไหนยากเลย
- แต่ทุกครั้งที่ทำแบบนี้ก็ช่วยประหยัดเวลาได้มาก
- และฉันคิดว่านี่คือหนึ่งในเหตุผลที่ทำให้ LLM ทุกวันนี้น่าทึ่งมาก
- มันไม่ใช่อะไรหวือหวา และการพูดว่า "นี่คือวิธีน่าเบื่อที่ฉันใช้ LLM เพื่อทำให้ชีวิตง่ายขึ้น" ก็คงไม่ได้แต้มจากอินเทอร์เน็ตมากนัก แต่นี่คือสิ่งที่เกิดขึ้นจริง
ทำงานน่าเบื่อให้เป็นอัตโนมัติ
- มีงานจำนวนมากที่ไม่ต้องใช้ความคิดมาก น่าเบื่อ แต่ก็ต้องทำ
- หนึ่งในเหตุผลหลักที่ทำให้ผัดวันประกันพรุ่งคือรู้ว่าการทำมันให้สำเร็จจะทั้งน่าหงุดหงิดและทรมาน
- LLM ช่วยลดความทุกข์แบบนี้ลงได้อย่างมหาศาล และเมื่อรู้ว่าตัวเองต้องแก้แค่ปัญหาที่น่าสนใจ ก็ทำให้เริ่มลงมือทำอะไรสักอย่างได้ง่ายขึ้นมาก
- ตรงนี้จะยกตัวอย่างปัญหาในชีวิตประจำวันล้วน ๆ ที่ให้ LLM ช่วยแก้
- ตัวอย่างเช่น ไม่นานมานี้ฉันต้อง disassemble โปรแกรม Python ที่เขียนด้วย Python 3.9
- ตัว disassembler ของ Python ส่วนใหญ่ใช้ได้แค่กับเวอร์ชันก่อน Python 3.7 และรันกับไบนารีของ 3.9 ไม่ได้
- การ disassemble ไม่ใช่งานที่ยากมากจริง ๆ ส่วนใหญ่คือการไล่ตาม goto เพื่อสร้าง control flow กลับขึ้นมาโดยไม่พลาด
- แทนที่จะเสียเวลานั่งแปลง op-code หลายพันตัวด้วยมือสำหรับโค้ดหลายร้อยบรรทัด ฉันก็ขอให้ LLM ทำแทน
- แล้วมันก็ทำได้ดีมากจริง ๆ! ดีกว่าที่คิดว่าเป็นไปได้มาก ๆ มาก ๆ
- อีกตัวอย่างหนึ่งคือเวลาที่ต้องเอาข้อมูลแบบไม่มีโครงสร้างมาแปลงให้อยู่ในรูปแบบที่มีโครงสร้าง
- เช่น ตอนทำโปรเจกต์หนึ่ง ฉันต้องการรายชื่อหนังสือพร้อมชื่อผู้เขียน
- เลยไปหาข้อมูลในรูปแบบไม่เป็นระเบียบจากออนไลน์ แล้วขอให้ LLM จัดฟอร์แมตให้
- หรือไม่นานมานี้ ตอนเขียนบล็อกโพสต์เกี่ยวกับวิธีเจาะการป้องกันบางอย่าง ฉันอยากแสดง diff แบบเต็มของโค้ดที่ต้องแก้
- ดังนั้นฉันจึงวาง (1) diff และ (2) ตัวอย่างเก่าเกี่ยวกับวิธีทำ diff ให้เป็น HTML แล้วขอให้ LLM จัด diff นี้ให้อยู่ในรูปแบบเดิม
- อีกตัวอย่างคือ ในงานของฉันมักต้องสร้าง citation สำหรับแหล่งข้อมูลที่ใช้บ่อย
- Google Scholar ทำสิ่งนี้ให้กับงานวิชาการได้ง่ายมาก แค่คัดลอก citation ไปวางก็พอ
- แต่การอ้างอิงเว็บเพจนั้นค่อนข้างน่ารำคาญ
- ช่วงหลังฉันเลยมักขอให้ LLM สร้าง citation ให้ (ขอให้ชัดเจนไว้ก่อนว่าฉันตรวจสอบความถูกต้องของมันด้วย!)
- ฉันยกตัวอย่างแบบนี้ได้อีกอย่างน้อย 100 กรณี แต่คิดว่าคุณคงเข้าใจประเด็นแล้ว
- ฉันเข้าใจดีว่านี่เป็นงานประเภทที่บางคนอาจมองแล้วพูดว่า "แค่นี้เองเหรอ??"
- แต่ขอให้จำไว้ว่าเมื่อ 5 ปีก่อน พวกมันยังทำได้แค่ร้อยเรียงย่อหน้าที่พออ่านรู้เรื่อง ยังแก้ปัญหาได้ไม่ครบทั้งก้อนแบบนี้ไม่ได้
ทำให้ผู้ใช้ทุกคนเป็น "power user"
- ถ้าคุณเคยเห็นคนที่ไม่ชำนาญเท่าคุณมาก ๆ ใช้เครื่องมือบางอย่าง มันอาจจะดูทรมานพอสมควร
- คุณอาจเห็นพวกเขาใช้เวลาหลายนาที บางครั้งเป็นหลายชั่วโมง ไปกับงานที่สามารถทำให้เป็นอัตโนมัติได้ด้วยการใช้แมโครหรือแอปพลิเคชันแบบขนานอย่างชาญฉลาด
- แต่การเรียนรู้คาถาที่ต้องใช้เพื่อทำสิ่งนี้ต้องอาศัยเวลาและก็ยาก
- ตัวอย่างเช่น ไม่นานมานี้ฉันพยายามเขียนโปรแกรม Python ที่จัดการอินพุตคีย์บอร์ดจากคีย์บอร์ด Apple Lisa
- ฉันไปเจอคนที่เคยเขียนบางอย่างไว้สำหรับงานนี้ในภาษา C ทางออนไลน์ และมีบรรทัดแบบ
#define KEYNAME key_codeอยู่มากมาย - ฉันอยากแปลงมันให้เป็น Python dictionary ที่แมปโค้ดจำนวนเต็มไปยังสตริงเหล่านั้น
- ฉันไปเจอคนที่เคยเขียนบางอย่างไว้สำหรับงานนี้ในภาษา C ทางออนไลน์ และมีบรรทัดแบบ
- ฉันเป็นผู้ใช้ Emacs ฉันรู้ว่าจะแก้ปัญหานี้ใน Emacs อย่างไร มันคงไม่ยากนัก นี่คือคีย์หลักที่เพิ่งอัดไว้ซึ่งทำเอฟเฟกต์นี้ได้:
C-h C-s #def [enter] M-f [delete] C-d M-f C-[space] M-f C-w C-a C-y : " M-f ", C-g C-] } C-[ { - สำหรับฉันมันแทบจะเป็นธรรมชาติไปแล้ว แต่กว่ามันจะกลายเป็นธรรมชาติ ฉันใช้เวลามากกว่าครึ่งชีวิตเพื่อให้คุ้นกับ Emacs มากพอ อย่างไรก็ตาม ถ้าตอนนี้มี LLM ต่ออยู่กับเอดิเตอร์ ฉันจะพิมพ์ว่าอะไร?
C-h C-h rewrite these #defines to a dictionary of {keycode: string, ...} - แล้วจู่ ๆ ข้อความก็ถูกเขียนใหม่ต่อหน้าต่อตา!
- ในกรณีแบบนี้ ฉันคิดว่าประโยชน์ที่เป็นไปได้ของ LLM มีมากกว่าสำหรับคนที่ไม่ใช่ผู้เชี่ยวชาญมากกว่าสำหรับผู้เชี่ยวชาญ
- โมเดลช่วยยกระดับพื้นฐานของทุกคน และถ้าเมื่อก่อนทำอะไรไม่ได้เลย จู่ ๆ ก็สามารถทำอะไรได้มากขึ้นมาก
ใช้เป็น API reference
- โปรแกรมเมอร์ตัวจริงจะอ่านคู่มืออ้างอิงเมื่ออยากรู้ว่าเครื่องมือทำงานอย่างไร
- แต่ฉันเป็นโปรแกรมเมอร์ขี้เกียจ ฉันแค่อยากให้มีคนป้อนคำตอบให้เลย
- ดังนั้นตอนนี้ฉันเลยถามโมเดลภาษาแทน
- เมื่อยกตัวอย่างแบบนี้ให้ดู บางคนจะตอบโต้เชิงป้องกันและพูดว่า "LLM ไม่ได้ทำอะไรที่คุณทำไม่ได้ด้วยเครื่องมือที่คุณมีอยู่แล้ว!"
- และพวกเขาก็พูดถูก
- แต่ก็ไม่มีอะไรที่เสิร์ชเอนจินทำได้ซึ่งหนังสือเล่มจริงทำไม่ได้ และไม่มีอะไรที่หนังสือเล่มจริงทำได้ซึ่งคุณทำไม่ได้ด้วยการอ่านซอร์สโค้ด
- แต่แต่ละอย่างก็ทำให้สิ่งเดิมง่ายขึ้นกว่าที่มาก่อนตามลำดับ
- และเมื่ออะไรสักอย่างง่ายขึ้น เราก็จะทำมันบ่อยขึ้น และทำในรูปแบบที่ต่างออกไปอย่างมีนัยสำคัญ
- ตัวอย่างพร้อมพรอมป์ต์
- ฉันถามว่า "ใน Bash มี
$ตัวไหนที่ให้อาร์กิวเมนต์ที่เหลือทั้งหมด" แล้วก็ได้คำตอบ (และถัดจากนั้นก็ตามมาด้วยอีกคำถามว่า "แล้วจะใช้มันอย่างไร") - หรือเวลาที่อยากรู้ว่าจะทำให้ข้อความเป็นสีแดงใน LaTeX ได้อย่างไร ฉันก็ไม่ค้นหาหรืออ่านเอกสารอีกแล้ว แต่ถามโมเดลแทน
- และเวลาที่อยากรู้ว่าคำสั่ง LLDB อะไรตรงกับคำสั่ง GDB ต่าง ๆ ฉันก็ใช้วิธีเดียวกัน
- หรือเวลาที่อยากรู้ว่าคำสั่ง
findบางคำสั่งทำงานอย่างไร - รวมถึงวิธีใช้
lpr - หรือวิธี rebind คำสั่งใน LaTeX
- ฉันถามว่า "ใน Bash มี
- จริง ๆ แล้วนี่เป็นหนึ่งในวิธีที่ฉันใช้ LLM บ่อยที่สุด
- เหตุผลเดียวที่ฉันไม่สามารถลิสต์ตัวอย่างแบบนี้ได้อีกหลายพันกรณีก็เพราะทั้ง Emacs และเชลล์มีเครื่องมือสำหรับ query LLM ฝังมาอยู่แล้ว
- ดังนั้น 90% ของเวลา เวลาที่ฉันอยากทำอะไรแบบนี้ ฉันไม่จำเป็นต้องออกจากเอดิเตอร์เลยด้วยซ้ำ
ค้นหาสิ่งที่หายากและหาเจอยาก
- การค้นหาเนื้อหาบนอินเทอร์เน็ตเคยเป็นทักษะที่ต้องเรียนรู้อย่างยากลำบาก
- ควรมีคำเฉพาะอะไรบ้างที่อยากใส่ไว้ในคิวรี? ควรใช้รูปพหูพจน์ไหม? เอกพจน์? อดีตกาล?
- มีคำอะไรบ้างที่ไม่อยากให้ปรากฏบนหน้า? ต้องการ X AND Y หรือ X OR Y?
- ตอนนี้ไม่เป็นแบบนั้นแล้ว
- จำไม่ได้แล้วว่าครั้งสุดท้ายที่เขียนคิวรีโดยใช้ OR ใน Google คือตอนไหน
- และก็จำไม่ได้เช่นกันว่าครั้งสุดท้ายที่ใช้เครื่องหมายลบ (-) เพื่อตัดผลลัพธ์บางส่วนออกคือเมื่อไร
- = ทุกวันนี้ในกรณีส่วนใหญ่ แค่พิมพ์สิ่งที่อยากหา แล้วเสิร์ชเอนจินก็จะหาให้
- แต่เสิร์ชเอนจินก็ยังไม่ใช่คิวรีภาษาธรรมชาติ 100% อยู่ดี
- ยังรู้สึกเหมือนกำลังเล่นเกม Reverse-Jeopardy และพยายามใช้คีย์เวิร์ดที่จะอยู่ในคำตอบ ไม่ใช่คำถาม
- นี่เป็นทักษะที่พวกเราแทบทุกคนเรียนรู้มา จนลืมไปแล้วว่าได้เรียนมันมา
- โมเดลภาษาทุกวันนี้ดีกว่าสำหรับงานง่าย ๆ บางอย่างอยู่แล้ว และยิ่งนานไปก็ยิ่งมากขึ้นเรื่อย ๆ
- แค่พิมพ์ว่า "โอเค เข้าใจแล้วว่า + ตรงกับ
addแล้ว ~ ล่ะคืออะไร" มันก็บอกคำตอบว่าinvให้ได้
- แค่พิมพ์ว่า "โอเค เข้าใจแล้วว่า + ตรงกับ
- นี่เป็นสิ่งที่ค้นหาด้วยเสิร์ชเอนจินมาตรฐานได้ยากมาก
- ผมรู้ว่ามีวิธีหาคำตอบได้
- น่าจะต้องพิมพ์อะไรประมาณ "python documentation metaclass
add" แล้วค่อยค้นหา ~ ในหน้านั้นถึงจะได้คำตอบ - แต่การถามคำถามที่มีอยู่กับ LLM ตรง ๆ ก็ใช้ได้ผลเหมือนกัน
- การทำแบบนี้ประหยัดเวลาได้เพียงไม่กี่วินาทีต่อครั้ง แต่ตอนที่กำลังแก้งานโค้ดบางอย่าง และในหัวพยายามจัดการเรื่องนับล้านอย่างพร้อมกัน แค่เททุกอย่างที่กำลังพยายามแก้ออกมาแล้วได้คำตอบที่สอดคล้องกันกลับมาก็น่าทึ่งแล้ว
- แต่ก็ไม่ได้แปลว่าทุกวันนี้มันจะสมบูรณ์แบบกับเรื่องนี้
- โมเดลภาษารู้แค่สิ่งที่มีอยู่บนออนไลน์และถูกพูดซ้ำบ่อยพอเท่านั้น
- และคำว่า "บ่อยพอ" ก็มีความหมายต่างกันไปตามแต่ละโมเดล ดังนั้นต้องใช้พลังสมองไปกับการคิดอยู่บ้างว่าจะถามโมเดลหรือถามอินเทอร์เน็ตดี
- แต่โมเดลจะพัฒนาต่อไปเรื่อย ๆ
- หรือเวลามีอะไรชนกันแบบสุ่มเกิดขึ้น ผมก็จะเทสิ่งที่เห็นให้โมเดลดูแล้วขอให้มันอธิบาย
- ตรงนี้คือการพิมพ์คำว่า "Remote wildcard transfer issue" แล้วทำแบบนั้น
- อีกตัวอย่างที่ไม่เกี่ยวกันเลยคือ ตอนเขียนบล็อกโพสต์เมื่อปีที่แล้ว ผมอยากทำตัวอักษรตัวแรกของคำแรกให้ใหญ่ แล้วให้ข้อความที่เหลือไหลล้อมรอบมัน
- สิ่งนี้เรียกว่า drop cap แต่ตอนนั้นผมไม่รู้
- ผมรู้แค่ว่าอยากได้เอฟเฟกต์แบบนี้ เลยถามโมเดลภาษาว่า "อยากให้มันดูเหมือนหนังสือสวย ๆ ที่มีข้อความล้อมรอบ O" แล้วมันก็ให้สิ่งที่ผมต้องการเป๊ะ
- งานนี้ก็อยู่ในหมวด "ทำได้เพราะมี LLM" เช่นกัน
- ผมคงไม่คิดว่ามันคุ้มที่จะใช้เวลาเยอะเพื่อหาวิธีทำสิ่งนี้
- แต่เพราะถามโมเดลได้ ผมก็เลยทำ และมันทำให้โพสต์ของผมดูดีขึ้นอีกหน่อย
การแก้งานใช้ครั้งเดียว
- โปรแกรมมีอยู่สองประเภท
- อย่างแรกคือโปรแกรมที่เราอยากทำให้ดีจริง ๆ โปรแกรมพวกนี้จะอยู่ไปอีกพักใหญ่และต้องดูแลรักษาไปอีกหลายปี ความเป็นระเบียบเรียบร้อยจึงสำคัญ
- อย่างที่สองคือโปรแกรมที่มีชีวิตอยู่ 25 วินาที มันช่วยให้งานบางอย่างเสร็จ แล้วก็ถูกทิ้งทันที
- ในกรณีแบบนี้ที่ตัวโปรแกรมแยกเดี่ยวโดยสมบูรณ์ และผมไม่สนคุณภาพโค้ดเลย ทุกวันนี้ผมแทบจะใช้ LLM เขียนให้ทั้งหมด
- คำเตือน: กรณีส่วนใหญ่เหล่านี้ก็ยังเป็นเรื่องประเภทที่ทำให้พูดได้ว่า "แค่นั้นเองเหรอ?"
- แต่เหมือนที่พูดไปก่อนหน้านี้ เวลาที่จะลงทุนให้กับโปรเจกต์ใดโปรเจกต์หนึ่งในแต่ละวันมีจำกัด
- และถ้าสามารถประหยัดทั้งเวลาและพลังสมองในการเขียนโปรแกรมที่จะไม่ใช้ซ้ำอีกเลยได้ ผมก็จะทำ
- ตัวอย่างที่พบบ่อยที่สุดน่าจะเป็นการช่วยสร้างกราฟเพื่อทำ visualization ของข้อมูลที่สร้างขึ้นจากผลของการทดลองวิจัยบางอย่าง
- ผมมีตัวอย่างแบบนี้เป็นสิบ ๆ อัน น่าจะใกล้ 100 มากกว่า 0 ด้วยซ้ำ พวกมันหน้าตาเหมือนกันแทบทั้งหมด เลยยกมาแค่อันเดียวพอ
- อีกตัวอย่างที่คล้ายกันคือเวลาเรามีข้อมูลในฟอร์แมตหนึ่ง แล้วอยากแปลงมันไปเป็นอีกฟอร์แมตหนึ่ง
- ปกติแล้วสิ่งนี้ทำครั้งเดียว พอเสร็จแล้วก็โยนสคริปต์ที่ได้ทิ้ง
- ถ้าสคริปต์ที่ต้องการง่ายพอ ผมก็มักจะขอให้ LLM เขียนให้ทั้งก้อน
- ยกตัวอย่างเช่น ตรงนี้คือให้ LLM เขียนสคริปต์ที่อ่านเปเปอร์ออกเสียง เพื่อจะได้เช็กว่าไม่มีปัญหาไวยากรณ์งี่เง่า ๆ
- ส่วนใหญ่เวลาไม่ค่อยแน่ใจว่าต้องการอะไร ผมจะเริ่มจากขอโค้ดตั้งต้นจากโมเดลก่อน แล้วค่อยวนปรับจากตรงนั้น
- ตัวอย่างเช่น ตรงนี้มีงานใช้ครั้งเดียวที่ต้องประมวลผลข้อมูลอย่างรวดเร็ว
- ถ้าเป็นปี 2022 ผมคงใช้เวลา 2 นาทีเขียนมันด้วย Python แล้วรอให้มันรันอยู่หลายชั่วโมง เพราะมันจะถูกรันแค่ครั้งเดียว
- การ optimize มันคงใช้เวลานานกว่าที่โปรแกรม Python รันเสียอีก
- แต่ตอนนี้ล่ะ? ผมมั่นใจว่าคงใช้เวลา 2 นาทีเท่าเดิมในการขอ Rust code ที่ช่วยประมวลผลข้อมูลให้ผม
- หรือมีอีกตัวอย่างที่ให้โมเดลช่วยดาวน์โหลดชุดข้อมูลและทำ preprocessing เบื้องต้นให้
- มันง่ายสำหรับผมไหม? ก็น่าจะใช่
- แต่ไม่ใช่งานที่ผมอยากใช้สมองคิด
- ผมอยากคิดถึงงานวิจัยที่จะทำกับชุดข้อมูลมากกว่า
- การตัดสิ่งรบกวนออกไปมีคุณค่ามากกว่าแค่ไม่กี่นาทีที่ประหยัดได้
- อีกครั้งหนึ่ง ผมกำลังเขียนโปรแกรมเพื่อให้พิมพ์ภาพแบบ pixelated ที่ประกอบด้วยลูกบาศก์เล็ก ๆ ออกมาเป็น 3D ได้
- สำหรับเรื่องนี้ ผมอยากแปลง PNG ไปเป็นไฟล์ STL แต่สิ่งนี้ไม่ใช่ประเด็นหลักของโปรเจกต์
- มันเป็นแค่สิ่งที่ต้องเกิดขึ้นระหว่างทางเท่านั้น เลยขอให้ LLM ช่วยแก้ให้
- อีกตัวอย่างหนึ่งคือ เมื่อไม่นานมานี้ผมอยากตั้งค่าโปรเจกต์ใหม่ด้วย Docker Compose
- มันมีปัญหาเกิดขึ้น และไม่ว่าอย่างไรผมก็แค่อยากให้มันรันได้ก่อน เดี๋ยวค่อยไปหาทีหลังว่าอะไรผิด
- สุดท้ายเลยกลายเป็นว่าผมแค่คัดลอกข้อความ error ทีละอันไปกลับอยู่หลายรอบ จนในที่สุดก็ได้โซลูชันที่ใช้งานได้
- และบ่อยครั้งผมก็พบว่าตัวเองเริ่มจากการขอโซลูชันแบบครบก่อน แล้วค่อยขอ hint ว่าจะปรับแก้มันอย่างไร
- บทสนทนานี้ก็เริ่มจากการขอโปรแกรมที่ parse HTML แล้วค่อยต่อด้วยการขอ API reference หรือคำใบ้ว่าจะปรับปรุงอย่างไร
- อีกครั้งหนึ่ง ผมอยากติดตามว่าคอมพิวเตอร์ใช้หน่วยความจำและ CPU มากแค่ไหนเมื่อเวลาผ่านไป
- ผมอาจใช้เวลาสองสามนาทีหาคำสั่งที่เหมาะสมแล้วเอามามัดรวมเป็นสคริปต์ที่ทำงานตามต้องการได้ แต่ผมก็แค่ขอให้โมเดลภาษาทำแทน
- เมื่อไม่นานมานี้ผมกำลังพยายามทำงานอิเล็กทรอนิกส์เล็ก ๆ น้อย ๆ อยู่ และมีโปรแกรมภาษา C ที่รันบน Arduino แต่อยากให้มันไปรันบน Raspberry Pi Pico ที่ใช้ MicroPython
- กระบวนการแปลงนี้ไม่มีอะไรน่าสนใจ แค่มันต้องทำให้เสร็จ
- เพราะงั้นแทนที่จะลงมือทำเอง ผมก็ขอให้โมเดลภาษาทำแทน
- สำหรับอีกโปรเจกต์หนึ่ง ผมต้องจัดประเภทภาพบางภาพด้วย ML model เจ๋ง ๆ บางตัวในลูปแบบโต้ตอบ
- ผมจะเขียนเองก็ได้ แต่จะให้โมเดลทำแทนก็ได้เหมือนกัน
อธิบายบางอย่างให้ผมเข้าใจ
- ช่วงหลังมานี้ฉันเริ่มสนใจงานอิเล็กทรอนิกส์
- ตอนเด็ก ๆ เคยจับงานอิเล็กทรอนิกส์มาบ้าง และก็เคยเรียนบางวิชาในมหาวิทยาลัย
- แต่พอจะมาทำโปรเจ็กต์จริง ๆ ตอนนี้ กลับพบว่ามีเรื่องจุกจิกเล็ก ๆ น้อย ๆ ที่ไม่รู้อีกเป็นพัน ๆ อย่าง จนทำอะไรได้ยาก
- ฉันอาจจะไปอ่านหนังสืออิเล็กทรอนิกส์เชิงปฏิบัติก็ได้ ซึ่งก็น่าจะช่วยให้เข้าใจหัวข้อนั้นอย่างถูกต้อง แต่ฉันไม่อยากใช้เวลาไปกับอะไรที่ให้ความรู้สึกเหมือนกำลังเรียนหนังสือ
- เหตุผลครึ่งหนึ่งที่ฉันทำงานอิเล็กทรอนิกส์ ก็เพื่อพักจากการอ่านและเขียนเปเปอร์ทั้งวัน
- ข้อดีของ LLM ในที่นี้คือ แม้มันจะไม่ได้รอบรู้เท่าคนที่มีความรู้มากที่สุดในโลก แต่มีคนเป็นพัน เป็นล้านที่รู้คำตอบของคำถามด้านอิเล็กทรอนิกส์ที่ฉันอาจจะมี
- เพราะงั้นโมเดลภาษาก็น่าจะรู้คำตอบนั้นด้วย
- และมันก็ยินดีตอบทุกคำถาม ทำให้ฉันได้สนุกกับสิ่งที่อยากทำ โดยไม่ต้องไปปล้ำกับรายละเอียดมากนัก
- และถึงแม้ค้นหาในอินเทอร์เน็ตแล้วพยายามเพิ่มอีกนิดก็คงหาคำตอบได้ แต่หลังจากต้องทำงานกับโค้ดวิจัยที่ซับซ้อนมาทั้งวัน ความสะดวกที่แค่ถามโมเดลก็พอนั้นสบายมาก
- ดังนั้นนี่คือชุดตัวอย่างที่ฉันถามโมเดลภาษาเกี่ยวกับคำถามพื้นฐานเรื่องหลักการทำงานของอุปกรณ์อิเล็กทรอนิกส์
- คำตอบพวกนี้สมบูรณ์แบบไหม? ใครจะไปรู้
- แต่ดีกว่าไม่รู้อะไรเลยไหม?
- (บทความนี้เริ่มยาวมากแล้ว และถึงจุดนี้ก็น่าจะเหนื่อยทั้งคนอ่านทั้งคนเขียน ดังนั้นฉันจะทิ้งตัวอย่างเหล่านี้ไว้เฉย ๆ โดยไม่อธิบายอะไรเพิ่ม)
- คำถามพื้นฐานเกี่ยวกับการออกแบบ PCB
- คำถามพื้นฐานเกี่ยวกับการบัดกรี
- คำถามพื้นฐานเกี่ยวกับคาปาซิเตอร์
- คำถามพื้นฐานเกี่ยวกับ LED
- คำถามพื้นฐานเกี่ยวกับฟลอปปีดิสก์
- ยกตัวอย่างต่อได้อีก แต่คิดว่าคงเห็นประเด็นแล้ว
ใช้โซลูชันที่มีอยู่แล้วมาแก้ปัญหา
- แทบทุกอย่างคือสิ่งที่มีคนทำไว้ก่อนแล้ว
- แทบไม่มีอะไรที่คุณอยากทำแล้วใหม่จริง ๆ
- และโมเดลภาษาก็เก่งมากในการเสนอวิธีแก้สำหรับสิ่งที่มันเคยเห็นมาก่อน
- ในโปรเจ็กต์ล่าสุด ฉันต้องปรับปรุงประสิทธิภาพของโค้ด Python บางส่วน
- (1) ฉันขอให้ LLM เขียนมันใหม่เป็น C
- จากนั้น (2) ก็ขอให้มันสร้างอินเทอร์เฟซสำหรับเรียกโค้ด C จาก Python
- งานพวกนี้ไม่ได้ "ยาก"
- การแปลงจาก Python เป็น C น่าจะใช้เวลาแค่ 1–2 ชั่วโมง
- และถึงจะยังไม่รู้ชัดว่า Python->C API ทำงานอย่างไร แต่ถ้าอ่านเอกสารก็คงหาคำตอบได้
- แต่ถ้าต้องทำเอง ฉันคงไม่มีวันทำ
- เพราะมันไม่ได้อยู่บน critical path การรอให้คอมพิวเตอร์จัดการงานไปน่าจะดีกว่าเสียเวลาไปทำให้สิ่งที่ไม่ได้รันบ่อยเร็วขึ้น
- แต่สำหรับโปรแกรมง่าย ๆ การแปลงจาก Python เป็น C นั้น (ส่วนใหญ่) เป็นกระบวนการเชิงเทคนิค และมีรูปแบบการเรียก Python->C แบบมาตรฐานอยู่แบบเดียว
- เพราะงั้นฉันก็แค่ขอให้ LLM ทำแทน
- หลังจากนั้น ฉันก็คาดหวังว่านี่เป็นสิ่งที่ฉันทำได้ และโดยพื้นฐานแล้วเมื่อใดก็ตามที่ต้องการโค้ดชิ้นเล็ก ๆ ที่เร็วขึ้น ฉันก็แค่อธิบายสิ่งที่ต้องการเป็น Python แล้วขอ C ที่ผ่านการ optimize
- บางครั้งก็ทำแบบเดียวกัน แต่ถ้าคิดว่าจะตัดสินความถูกต้องของผลลัพธ์ Rust ได้ง่ายกว่าเมื่อเทียบกับผลลัพธ์ C ก็จะขอ Rust แทน C
- อีกตัวอย่างหนึ่งคือ การทำให้ฟังก์ชัน Python ทำงานแบบขนานด้วยไลบรารี multiprocessing นั้นไม่ได้ยาก
- แค่ต้องเขียน boilerplate เล็กน้อย แล้วโดยพื้นฐานมันก็ใช้งานได้
- แต่การเขียนโค้ดนั้นค่อนข้างน่าปวดหัว และรบกวนงานที่ฉันอยากทำจริง ๆ
- ตอนนี้ whenever ต้องใช้ ฉันก็แค่ขอให้ LLM ทำแทน
- หรือบ่อยครั้งเวลาทดสอบ API บางตัว ตอนแรกฉันก็แค่เขียนคำขอ curl ให้มันทำงานได้ก่อน
- แล้วพอมันใช้ได้และอยากเรียกซ้ำแบบเป็นโปรแกรม ก็จะค่อยแปลงเป็น Python
- เมื่อก่อนฉันมักทำอะไรที่ไม่น่าดูมาก ๆ อย่างการเรียก
os.popen()แล้วรันคำสั่ง curl ตรง ๆ ซึ่งไม่ค่อยดี - การแปลงเป็น Python requests library น่าจะดีกว่า แต่ใช้เวลา เลยไม่ทำ
- แต่ตอนนี้แค่ขอให้ LLM ทำแทน ก็ได้โปรแกรมที่สะอาดกว่าภายในเวลาที่สั้นกว่า
- สำหรับโปรเจ็กต์ในอนาคตที่ฉันน่าจะเล่าถึงต่อไปนี้ ฉันจำเป็นต้องรู้ว่าผู้คนใช้ของประเภทไหนกับเครื่องส่งสัญญาณไร้สายแบบง่าย ๆ
- และเพราะสิ่งที่ฉันต้องการจริง ๆ คือคำตอบแบบมนุษย์ค่ากลาง LLM จึงเป็นตัวเลือกที่เหมาะสมอย่างยิ่ง!
แก้ข้อผิดพลาดทั่วไป
- ก่อนปี 2022 ถ้าเจอข้อความ error จากเครื่องมือหรือไลบรารีชื่อดังบางตัว ฉันจะใช้โปรโตคอลประมาณนี้:
- คัดลอกข้อความ error
- วางลงใน Google
- คลิกลิงก์ Stack Overflow อันดับบนสุด
- ดูว่าคำถามนั้นคือสิ่งที่ฉันอยากถามหรือไม่; ถ้าไม่ใช่ก็กลับไปข้อ 2
- เอาวิธีแก้ยอดนิยมไปลองกับงาน
- ถ้าไม่เวิร์ก ก็กลับไปข้อ 2 เปลี่ยนคำค้น แล้วภาวนา ฯลฯ
- พูดตรง ๆ คือเครื่องมือที่พังพวกนี้มักอยู่ห่างจากงานที่ฉันพยายามจะแก้อยู่ประมาณ 5 ขั้น และฉันไม่ได้สนใจจริง ๆ ว่ามันทำงานอย่างไร ขอแค่มันใช้งานได้ก็พอ
- แล้วในปี 2024 ล่ะเป็นยังไง?
- คัดลอกข้อความ error
- ถาม LLM ว่า "จะแก้ error นี้อย่างไร? [error]"
- ทำตามวิธีแก้แบบทีละขั้นที่ LLM เสนอ
- ถ้าไม่เวิร์ก ก็พิมพ์ว่า "มันยังใช้ไม่ได้"
- ไม่มีสำเนาตัวอย่างให้ดูสำหรับเรื่องนี้ (หรืออย่างน้อยฉันก็หาไม่เจอ แม้จะใช้เวลาหาเป็นชั่วโมง) แต่จริง ๆ แล้วมีเหตุผลที่ดีมาก: เพราะฉันฝังมันเข้าไปใน workflow แล้วโดยตรง
- ฉันเป็นผู้ใช้ Emacs
- ฉันตั้งค่าสภาพแวดล้อมไว้ให้ทุกครั้งที่รันโปรแกรมแล้วมันจบด้วยสถานะโค้ดที่ไม่ใช่ 0 (แปลว่ามีปัญหาเกิดขึ้น) ระบบจะเรียก LLM รุ่นที่เร็วที่สุดและดีที่สุดล่าสุดโดยอัตโนมัติ เพื่อขอให้มันอธิบายคำตอบ และในเวลาเดียวกันก็ขอ patch ที่ฉันสามารถนำไปใช้ตรง ๆ เพื่อแก้บั๊กในโค้ดได้
- โมเดลในปัจจุบันยังไม่ดีพอจะเอาชนะผู้เขียนได้ในงานนี้ในกรณีส่วนใหญ่ แต่ก็กำลังเข้าใกล้ขึ้นเรื่อย ๆ
- และบางครั้งที่ LLM แก้บั๊กให้ได้ ทั้งที่ฉันรู้ว่ามี typo ซ่อนอยู่ตรงไหนสักแห่งและคงตามหาอย่างทรมาน มันก็เป็นความประหลาดใจที่น่ายินดีมาก
สรุป
- บทสนทนาทั้งหมดที่ลิงก์ไว้ข้างบน คิดเป็นไม่ถึง 2% ของบทสนทนาทั้งหมดที่ฉันคุยกับ LLM ตลอดปีที่ผ่านมา
- เหตุผลที่ฉันไม่ได้ลิงก์บทสนทนาอื่น ๆ ไม่ใช่เพราะเป็นกรณีที่โมเดลล้มเหลว (ถึงแน่นอนว่าจะมีแบบนั้นอยู่มาก)
- แต่เป็นเพราะ (1) มันแค่ทำซ้ำรูปแบบเดียวกับบทสนทนาที่ลิงก์ไปแล้ว
- หรือ (2) อธิบายได้ไม่ง่ายว่ากำลังเกิดอะไรขึ้น และก็ยากที่จะเห็นด้วยตัวเองว่าทำไมมันถึงมีประโยชน์
- ฉันคาดว่าการใช้งานโมเดลเหล่านี้จะเพิ่มขึ้นต่อไปในอนาคต
- สำหรับอ้างอิง ในปี 2024 ฉันส่งคำขอหา LLM ผ่านเว็บอินเทอร์เฟซมากกว่าปี 2023 อยู่ 30% และแม้จะนับการเพิ่มขึ้นของคำขอผ่าน API ไม่ได้ แต่ฉันคิดว่าน่าจะเพิ่มขึ้นอย่างน้อย 2 ถึง 3 เท่า
สิ่งที่ควรประเมินไม่ใช่สิ่งที่ LLM ทำไม่ได้ แต่คือสิ่งที่ "ทำได้"
- เวลาประเมินผู้สมัครในการสัมภาษณ์ ควรให้ความสำคัญกับสิ่งที่เขาทำได้มากกว่าสิ่งที่ทำไม่ได้
- หากโยนคำถามจุกจิกให้ LLM ก็อาจทำให้มันดูเหมือนไม่มีความสามารถได้ ตัวอย่างเช่น ถ้าถามเป็นภาษาจีนที่มีผู้ใช้ 1 พันล้านคน มันก็อาจตอบได้ไม่ดีนัก
- แม้แต่ในสาขาวิทยาการคอมพิวเตอร์เอง ก็ยังมีหลายเรื่องที่มันไม่รู้ เช่น รู้เพียงแค่คำสั่ง
SELECTของ SQL - จึงยากที่จะเข้าใจการอ้างบนออนไลน์ว่า LLM ถูกโฆษณาเกินจริง เพียงเพราะมันทำ task บางอย่างไม่ได้
- นับจำนวนคำในประโยคไม่ได้
- แต่งบทกวีที่ทุกคำขึ้นต้นด้วย
aไม่ได้ - คูณเลขสองหลักไม่ได้
- เลือกองค์ประกอบแบบสุ่มจากลิสต์ไม่ได้
- แต่ก็อดสงสัยไม่ได้ว่า เวลาต้องทำเรื่องแบบนี้จริง ๆ เคยมีใครคิดว่า LLM เป็นเครื่องมือที่เหมาะสมหรือไม่
- เหมือนกับที่เราไม่พูดว่ามนุษย์ไร้ประโยชน์เพียงเพราะไม่สามารถหารจำนวนเต็ม 64 บิตในใจได้ การมองข้าม LLM เพียงเพราะตั้งโจทย์ที่มันแก้ไม่ได้ก็ไม่สมเหตุสมผล
- ประเด็นสำคัญคือมี task ที่ LLM สามารถสร้างคุณค่าได้หรือไม่
- โปรแกรมเมอร์รู้ดีอยู่แล้วว่าภาษาที่ต่างกันย่อมมีประโยชน์ต่างกันตามวัตถุประสงค์
- การเขียนระบบปฏิบัติการนั้น C เหมาะกว่า Python
- เราไม่ได้บอกว่า Python ใช้ไม่ได้เพียงเพราะมันจัดแนวตัวแปรให้ตรงขอบเขต 32 ไบต์ไม่ได้ มันแค่มีระดับนามธรรมต่างกันเท่านั้น
- LLM ก็เช่นกัน มันทำงานอยู่บนระดับนามธรรมที่สูงมาก
- จึงยากที่จะคาดหวังให้ LLM จัดการงานที่แม้แต่โปรแกรมง่าย ๆ ก็แก้ได้
- แต่ก็พอจะคาดหวังได้ว่ามันจะจัดการงานอีกประเภทหนึ่งได้
บทสรุป
- แรงจูงใจสองประการในการเขียนบทความนี้
- เพื่อยืนยันว่า LLM ได้สร้างคุณค่าให้กับตัวผมเป็นการส่วนตัวอยู่แล้วอย่างมาก
- เพื่อแสดงตัวอย่างการใช้งานให้คนที่คิดว่าแนวคิดของ LLM น่าสนใจ แต่ยังไม่รู้ว่าจะช่วยตัวเองได้อย่างไร
- คุณค่าของ LLM
- LLM ไม่ได้ทำได้ทุกอย่าง แต่แม้จะเป็นเพียงโมเดลในปัจจุบันก็ยังสร้างคุณค่าได้มาก
- ตัวอย่างเช่น ช่วยวิเคราะห์ข้อผิดพลาดของ CUDA และบอกวิธีติดตั้งแพ็กเกจใหม่ เขียนโปรแกรมใหม่ด้วย C หรือสอนเกี่ยวกับหัวข้อเฉพาะบางอย่างได้
- สิ่งเหล่านี้เป็นงานที่นักศึกษามหาวิทยาลัยก็อาจทำได้หากใช้เวลาหลายชั่วโมง แต่ไม่มีนักศึกษามหาวิทยาลัยคนไหนพร้อมตอบคำถามได้ตลอดเวลา ในขณะที่ LLM ทำได้
- พัฒนาการของ LLM และสถานการณ์ปัจจุบัน
- เมื่อเพียง 5 ปีก่อน สิ่งที่ดีที่สุดที่ LLM ทำได้คือเขียนย่อหน้าภาษาอังกฤษที่ดูน่าเชื่อถือ และแทบไม่มีประโยชน์ใช้งานจริงเลย
- แต่ทุกวันนี้ LLM ช่วยเพิ่มผลิตภาพของงานเขียนโปรแกรมได้อย่างน้อย 50% และช่วยกำจัดงานน่าเบื่อออกไป
- เพราะ LLMs ผมจึงทำโปรเจ็กต์หลายชิ้นที่เดิมทีคงไม่คิดจะลองให้เสร็จได้
- ข้อโต้แย้งต่อคำกล่าวว่า LLMs มีประโยชน์น้อย
- ผมไม่เห็นด้วยกับคำกล่าวที่ว่า "LLM เป็นกระแสเกินจริงและไม่มีคุณค่าในทางปฏิบัติ"
- สำหรับผมแล้ว LLM กำลังสร้างคุณค่าอย่างมาก
- แม้แต่ผมที่มีประสบการณ์เขียนโปรแกรมมา 20 ปี ก็ยังเพิ่มผลิตภาพได้อย่างมากผ่าน LLM
- และผมคิดว่ายังมีคนอีกมากมายที่สามารถได้รับประโยชน์จาก LLMs เช่นกัน
- มุมมองต่ออนาคต
- แม้จะเป็นโมเดลปัจจุบัน ก็ยังสร้างคุณค่าได้มากอยู่แล้ว
- ในอีก 5 ปีข้างหน้า ผมทั้งคาดหวังและหวาดหวั่นปะปนกันต่อการพัฒนาของ LLM
- บทความถัดไปจะพูดถึงการคาดการณ์ในเรื่องนี้
7 ความคิดเห็น
เป็นบทความที่ชวนเห็นด้วยมาก ผู้เขียนใช้งานได้คล่องจนอ่านแล้วแทบเหนื่อยเลย..;
> เหตุผลเดียวที่ไม่สามารถยกตัวอย่างแบบนี้มาเชื่อมต่อกันได้อีกเป็นพัน ๆ ตัวอย่าง ก็คือทั้ง Emacs และเชลล์ต่างก็มีเครื่องมือสำหรับ query LLM ฝังมาอยู่แล้ว
ผมเองก็ดูเหมือนจะไม่ค่อยออกจากหน้าต่างเทอร์มินัลเหมือนกันครับ คิดว่านักพัฒนาสายขี้เกียจน่าจะใช้กันแบบนี้ทุกคนหรือเปล่า
ถ้าเป็นปัญหาง่าย ๆ ก็ใช้
copilot.vimเปิดบัฟเฟอร์ไหนก็ได้แล้วให้มัน auto-complete เพื่อชักนำคำตอบออกมาถ้านึกคำสั่ง shell ไม่ออก ก็มีคำสั่ง
copilot-cli ??เลยไม่ต้องไปค้นหาอะไรเครื่องมือช่วยเติมโค้ดรู้เจตนาและสร้างโค้ดออกมาได้ก่อนที่ผมจะทันถามเสียอีก
อย่างที่บทความบอกไว้ คือเรารู้อยู่ว่าควรค้นหาอย่างไร แต่ LLM ดีกว่าตรงที่ถามได้อย่างอิสระโดยไม่ต้องใช้ถ้อยคำให้เป็นทางการ
ผมก็ใช้ copilot-vim เหมือนกันครับ! ขอถามหน่อยว่าที่พูดถึง copilot-cli นี่หมายถึงตัวไหนเหรอครับ
https://www.npmjs.com/package/@githubnext/github-copilot-cli
นี่แหละ!
https://docs.github.com/ko/copilot/…
มี GitHub CLI เวอร์ชันส่วนขยายด้วย แต่วิธีใช้งานจะแตกต่างกันเล็กน้อย
ดีเลยที่แม้แต่บนบรรทัดคำสั่งก็ยังได้รับความช่วยเหลือจาก Copilot ขอบคุณครับ!
เวลาเรารู้วิธีทำอยู่แล้วแต่ขี้เกียจพิมพ์ ก็ให้ ChatGPT ทำให้
คิดว่าต้องรู้จักตรวจทานผลลัพธ์ถึงจะใช้งานได้ดี
ผู้เขียนเน้นว่าการใช้งาน LLM มีประโยชน์หลัก ๆ คือ 1. ช่วยในการเรียนรู้ 2. ทำงานน่าเบื่อให้เป็นอัตโนมัติ
ช่วงนี้สำหรับผมเองก็เป็นแบบนั้นพอดีครับ พอลองนึกถึงสิ่งที่ทำไปล่าสุดก็มี
แน่นอนว่าเป็นงานที่ทำได้แม้ไม่มี LLM แต่เพราะแค่สั่งแล้วเร็วกว่า ก็เลยเหมาะมากสำหรับการใช้แบบ Life Hacking ครับ
มีหลายจุดที่รู้สึกเห็นด้วยมากครับ
คล้ายกับสิ่งที่ผมรู้สึกขณะใช้งาน AI เลยครับ