65 คะแนน โดย xguru 2024-08-06 | 7 ความคิดเห็น | แชร์ทาง WhatsApp
  • ตลอด 1 ปีที่ผ่านมา ฉันใช้เวลาหลายชั่วโมงทุกสัปดาห์ในการโต้ตอบกับโมเดลภาษาขนาดใหญ่ และประทับใจกับความสามารถของมันในการแก้ปัญหาที่ยากขึ้นเรื่อย ๆ อย่างต่อเนื่อง
    • ผลลัพธ์คือ ความเร็วในการเขียนโค้ดสำหรับทั้งโปรเจ็กต์วิจัยและโปรเจ็กต์ส่วนตัวของฉันเพิ่มขึ้นอย่างน้อย 50%
  • คนที่พูดถึงประโยชน์ของ LLM บนอินเทอร์เน็ต ส่วนใหญ่มักมองโลกในแง่ดีเกินไปหรือมองโลกในแง่ร้ายเกินไป
  • แทนที่จะถกเถียงเรื่องอนาคต ฉันอยากยกตัวอย่างบทสนทนา 50 แบบที่ฉันใช้ LLM ตลอด 1 ปีที่ผ่านมาเพื่อพัฒนาความสามารถด้านการวิจัยและช่วยงานโปรเจ็กต์เขียนโค้ด
  • กรณีการใช้งาน LLM ของฉัน
    • สร้างเว็บแอปทั้งตัวด้วยเทคโนโลยีที่ไม่เคยใช้มาก่อน
    • เรียนรู้วิธีใช้เฟรมเวิร์กหลากหลายแบบโดยไม่ต้องลองใช้เองก่อน
    • แปลงโปรแกรมหลายสิบตัวเป็น C หรือ Rust เพื่อเพิ่มประสิทธิภาพ 10~100 เท่า
    • ลดขนาดโค้ดเบสขนาดใหญ่เพื่อทำให้โปรเจ็กต์เรียบง่ายขึ้นมาก
    • เขียนโค้ดสำหรับการทดลองเริ่มต้นของงานวิจัยแทบทุกฉบับในช่วงปีที่ผ่านมา
    • ทำงานน่าเบื่อหรือสคริปต์ใช้ครั้งเดียวเกือบทั้งหมดให้เป็นอัตโนมัติ
    • แทบจะใช้แทนการค้นหาบนเว็บทั้งหมดสำหรับการตั้งค่าและคอนฟิกแพ็กเกจหรือโปรเจ็กต์ใหม่
    • ใช้แทนการค้นหาบนเว็บราว 50% สำหรับการดีบักข้อความแสดงข้อผิดพลาด
  • หากจัดหมวดหมู่ จะมีอยู่ 2 แบบ
    1. ช่วยการเรียนรู้: ทำให้สามารถทำสิ่งที่ก่อนหน้านี้เป็นเรื่องยากได้
    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 ที่มีเนื้อหาซึ่งโหลดมาจากสตริงได้อย่างไร?")
  • เหตุผลที่โมเดลภาษามีประสิทธิภาพ
    • วิธีนี้ได้ผลเพราะโมเดลภาษาทำได้ดีกับสิ่งที่คนเคยแก้ไว้ก่อนแล้ว
    • 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 ทำอะไร วงเล็บต้องวางตรงไหน ตัวอักษรไหนต้องเป็นตัวใหญ่บ้าง แล้วทำไมถึงมีทั้งวงเล็บปีกกาและวงเล็บเหลี่ยมเต็มไปหมด
  • ดังนั้นฉันจึงทำในสิ่งที่เด็กทั่วไปน่าจะทำ คือขอให้พ่อช่วยทำให้
  • ผ่านมา 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 แทนตาราง

ทำให้โค้ดเรียบง่ายขึ้น

  • ในฐานะนักวิจัยด้านความปลอดภัย ฉันมักได้รับ 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 ที่แมปโค้ดจำนวนเต็มไปยังสตริงเหล่านั้น
  • ฉันเป็นผู้ใช้ 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
  • จริง ๆ แล้วนี่เป็นหนึ่งในวิธีที่ฉันใช้ 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 จากเครื่องมือหรือไลบรารีชื่อดังบางตัว ฉันจะใช้โปรโตคอลประมาณนี้:
    1. คัดลอกข้อความ error
    2. วางลงใน Google
    3. คลิกลิงก์ Stack Overflow อันดับบนสุด
    4. ดูว่าคำถามนั้นคือสิ่งที่ฉันอยากถามหรือไม่; ถ้าไม่ใช่ก็กลับไปข้อ 2
    5. เอาวิธีแก้ยอดนิยมไปลองกับงาน
    6. ถ้าไม่เวิร์ก ก็กลับไปข้อ 2 เปลี่ยนคำค้น แล้วภาวนา ฯลฯ
  • พูดตรง ๆ คือเครื่องมือที่พังพวกนี้มักอยู่ห่างจากงานที่ฉันพยายามจะแก้อยู่ประมาณ 5 ขั้น และฉันไม่ได้สนใจจริง ๆ ว่ามันทำงานอย่างไร ขอแค่มันใช้งานได้ก็พอ
  • แล้วในปี 2024 ล่ะเป็นยังไง?
    1. คัดลอกข้อความ error
    2. ถาม LLM ว่า "จะแก้ error นี้อย่างไร? [error]"
    3. ทำตามวิธีแก้แบบทีละขั้นที่ LLM เสนอ
    4. ถ้าไม่เวิร์ก ก็พิมพ์ว่า "มันยังใช้ไม่ได้"
  • ไม่มีสำเนาตัวอย่างให้ดูสำหรับเรื่องนี้ (หรืออย่างน้อยฉันก็หาไม่เจอ แม้จะใช้เวลาหาเป็นชั่วโมง) แต่จริง ๆ แล้วมีเหตุผลที่ดีมาก: เพราะฉันฝังมันเข้าไปใน 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 ความคิดเห็น

 
edunga1 2024-08-06

เป็นบทความที่ชวนเห็นด้วยมาก ผู้เขียนใช้งานได้คล่องจนอ่านแล้วแทบเหนื่อยเลย..;

> เหตุผลเดียวที่ไม่สามารถยกตัวอย่างแบบนี้มาเชื่อมต่อกันได้อีกเป็นพัน ๆ ตัวอย่าง ก็คือทั้ง Emacs และเชลล์ต่างก็มีเครื่องมือสำหรับ query LLM ฝังมาอยู่แล้ว

ผมเองก็ดูเหมือนจะไม่ค่อยออกจากหน้าต่างเทอร์มินัลเหมือนกันครับ คิดว่านักพัฒนาสายขี้เกียจน่าจะใช้กันแบบนี้ทุกคนหรือเปล่า
ถ้าเป็นปัญหาง่าย ๆ ก็ใช้ copilot.vim เปิดบัฟเฟอร์ไหนก็ได้แล้วให้มัน auto-complete เพื่อชักนำคำตอบออกมา
ถ้านึกคำสั่ง shell ไม่ออก ก็มีคำสั่ง copilot-cli ?? เลยไม่ต้องไปค้นหาอะไร
เครื่องมือช่วยเติมโค้ดรู้เจตนาและสร้างโค้ดออกมาได้ก่อนที่ผมจะทันถามเสียอีก

อย่างที่บทความบอกไว้ คือเรารู้อยู่ว่าควรค้นหาอย่างไร แต่ LLM ดีกว่าตรงที่ถามได้อย่างอิสระโดยไม่ต้องใช้ถ้อยคำให้เป็นทางการ

 
galadbran 2024-08-06

ผมก็ใช้ copilot-vim เหมือนกันครับ! ขอถามหน่อยว่าที่พูดถึง copilot-cli นี่หมายถึงตัวไหนเหรอครับ

 
edunga1 2024-08-06

https://www.npmjs.com/package/@githubnext/github-copilot-cli
นี่แหละ!

https://docs.github.com/ko/copilot/…
มี GitHub CLI เวอร์ชันส่วนขยายด้วย แต่วิธีใช้งานจะแตกต่างกันเล็กน้อย

 
galadbran 2024-08-08

ดีเลยที่แม้แต่บนบรรทัดคำสั่งก็ยังได้รับความช่วยเหลือจาก Copilot ขอบคุณครับ!

 
wedding 2024-08-06

เวลาเรารู้วิธีทำอยู่แล้วแต่ขี้เกียจพิมพ์ ก็ให้ ChatGPT ทำให้
คิดว่าต้องรู้จักตรวจทานผลลัพธ์ถึงจะใช้งานได้ดี

 
xguru 2024-08-06

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

  1. ออกแบบออร์แกไนเซอร์บอร์ดเกมด้วยโค้ด OpenSCAD
  • พอให้มันเขียนโค้ด OpenSCAD ให้ ก็เอากลับมาใช้ซ้ำทีหลังได้ง่ายกว่าทำใน Fusion
  • ถ้าขอให้จัดการพารามิเตอร์ มันก็ช่วยแยกเป็นฟังก์ชันให้ได้ดี เลยนำไปใช้ได้หลายที่
  1. เขียนสคริปต์ Python สำหรับทำเครื่องมืออัตโนมัติ เพื่อดึงภาพจาก PDF ที่สแกนการ์ดแล้วปรับแต่งตามต้องการ
  • ใช้กับงานต่าง ๆ ตอนสแกนบอร์ดเกมที่น่าจะไม่มีเวอร์ชันภาษาเกาหลีออกมาดี แล้วทำให้เป็นภาษาเกาหลี
  1. เขียน JavaScript สำหรับคัดลอกตะกร้าสินค้าในร้านค้าออนไลน์
  • กำลังทำให้การกรอกข้อมูลไปยังฝั่งบริการส่งต่อพัสดุเป็นอัตโนมัติ สำหรับของที่ซื้อจากร้านบอร์ดเกมต่างประเทศหลายแห่ง

แน่นอนว่าเป็นงานที่ทำได้แม้ไม่มี LLM แต่เพราะแค่สั่งแล้วเร็วกว่า ก็เลยเหมาะมากสำหรับการใช้แบบ Life Hacking ครับ

 
helloppfm 2024-08-06

มีหลายจุดที่รู้สึกเห็นด้วยมากครับ
คล้ายกับสิ่งที่ผมรู้สึกขณะใช้งาน AI เลยครับ