ทดสอบความเมา (หลอน) ของ Claude 3.5 Sonnet ในการเขียน Golang 1.22 Net/HTTP

ลองของใหม่ทั้งคู่ มาดูว่าจะรู้จักกันแค่ไหน…

Jirat Srisawat
KBTG Life
4 min readJul 3, 2024

--

Claude 3.5 Sonnet (released 20 June 2024) vs Golang 1.22 (released 6 February 2024)

สำหรับชาว Gopher คิดว่าคงมีหลายคนได้ลองของใหม่ Go 1.22 Routing Enhancements แล้ว ช่วยให้เราสร้าง Server ได้แบบสวยๆ ไม่ต้องง้อ 3rd-Party Library เลยก็ได้

ทีนี้เราก็อยากรู้ว่า Claude 3.5 Sonnet ที่เพิ่งออกมาไม่นาน จะช่วยเราเขียนโค้ดตรงนี้ได้ดีไหม? จะเข้าใจ Syntax ใหม่ๆ และช่วยงานพวกเราได้แค่ไหนกันนะ?

Golang 1.22 Routing Enhancements คืออะไร?

Golang 1.22 ที่ออกมาเมื่อตอน 6 กุมภาพันธ์ 2024 ที่ผ่านมา เพิ่มความสามารถให้ Net/HTTP Package สามารถทำ Routing Method Matching กับ Wildcards ได้ ทำให้โค้ดเราสวยและคลีนขึ้นเยอะ ไม่ต้องคอยเช็คทุกอย่างเอง จะไม่ใช้ 3rd-Party Library ก็ได้ ถ้า Service เราไม่ใหญ่มาก

เนื่องจากบทความนี้จะเน้นความสามารถ Claude 3.5 Sonnet ในการเขียนให้เรา งั้นขอไม่อธิบายมาก แค่ As-is vs To-be ตามนี้เลย

As-is ทำ Routing ด้วย Net/HTTP โดยต้องเขียนแบบนี้ และ Handle ทุกอย่าง เช่น HTTP Method GET/POST หรือ Parse Parameters Pattern ข้างในเอง

http.HandleFunc("/posts/", handlePost)

To-be ใน 1.22 เราเขียนแบบนี้ได้เลย ถ้าต้องการเช็คแค่ GET และใส่ค่า ID Pattern ลงไป

http.HandleFunc("GET /posts/{id}", handlePost2)

Claude 3.5 Sonnet จะเขียนสิ่งนี้ได้ไหม (และมันจะ “หลอน” แค่ไหน)

Claude 3.5 Sonnet คืออะไร?

คือ AI Chatbot และชื่อ LLMs ของบริษัท Anthropic เรียกอีกอย่างคือคู่แข่งของ OpenAI และ ChatGPT ที่หลายๆ คนนิยมกันนั่นแหละ

เมื่อวันที่ 20 มิถุนายน 2024 ที่ผ่านมา Anthropic ได้ประกาศออก Model ใหม่ Claude 3.5 Sonnet ที่ทาง Anthropic เคลมว่าประสิทธิภาพในการเขียนโค้ด (จาก HumanEval) สูงกว่า GPT-4o ที่เปิดตัวไปก่อนนี้เสียอีก

ref: anthropic.com

ลองมาดูกันว่า Claude จะรู้จักและเขียน Go New Net/HTTP Routing Code ได้ไหม?

หมายเหตุ: เนื่องจาก GenAI นั้น Non-deterministic ทำให้การทดลองแต่ละครั้ง ถ้ามีการทดลองซ้ำ อาจได้ผลแตกต่างกัน วิธีลดปัญหานี้คือ Specific Prompts ขึ้น แต่ในกรณีนี้ผู้เขียนตั้งใจให้ดูว่าถ้าทำ Zero-shot แบบนี้ จะได้ผลฮาๆ แค่ไหน

Step 1) เริ่มจากถามก่อนว่ารู้จัก Go ถึง Version ไหน?

ถามโต้งๆ เลยว่ารู้จักถึง Version ไหน

เริ่มมาก็เปิดมาแบบงงๆ เลย เพราะบอกว่ารู้จัก Golang ถึงแค่ Version 1.20 (ซึ่งออกมาตอนกุมภาพันธ์ 2023 ปีที่แล้วนู่น) แต่ก็ยังบอกนะว่าตัวเอง Knowledge Cutoff ตอน April 2024 ผ่านมาตั้งปีนึง Go ไม่มี Version ใหม่เลยเหรอ?

ไม่เป็นไร เราจะดันทุรังถามเพิ่มต่อ

Step 2) สั่งให้เขียน HTTP Server ด้วย Go 1.22 เลย

(ภาพตัดมาเฉพาะส่วนต้นๆ ของคำตอบ)

พอสั่งให้เขียนด้วย Go 1.22 เลย ปรากฏว่า Claude ตอบว่าไม่มีข้อมูล Go1.22 แต่ฉันก็จะเขียนให้คุณนะ ซึ่งถ้าดูโค้ดทางขวาที่เขียนออกมา มันเป็นการใช้ Net/HTTP Routing แบบเก่า แปลว่าก็ยังเขียนไม่ได้อยู่ดี?

เราไม่เชื่อ ขอลองต่อ

Step 3) หลอกถาม Feature ของ Go 1.22

(ภาพตัดมาเฉพาะส่วนต้นๆ ของคำตอบ)

Claude ก็ยังยืนยันว่าฉันมีความรู้ถึงแค่ April 2024 ฉันไม่รู้จัก Go 1.22

Step 4) ลองสั่งใหม่ แต่ให้ Prompts Specific ขึ้นนิดนึง

บอก Requirement และ Pattern

รอบนี้กลายเป็นว่าเขียนได้!! สามารถใช้ได้ทั้ง New Routing Feature และ Wildcards Parameters แถมยังอธิบายต่อได้อีกว่า Key Features ของ Go 1.22 คืออะไร

งั้นสรุปมันมีความรู้ถึงไหนกันแน่นะ? ลองถามอีกทีดีกว่า

Step 5) ถามคำถามเดิม สรุปรู้จัก Go ถึง Version ไหน?

คราวนี้บอกว่ารู้จัก Go 1.21 แล้ว!! ซึ่ง Go 1.21 Released ตอนสิงหาคม 2023

อยู่ดีๆ ก็รู้เยอะขึ้น โดยทุกอย่างยังคุยใน Conversation Context เดิมยาวๆ ไม่เปลี่ยน

เราต้องการให้มันรู้สุดถึง Go 1.22 ให้ได้ เลยขอถามต่ออีกว่า…

Step 6) ถามถึง Update Feature ของ Go 1.22 อีกครั้ง

ภาพตัดมาเฉพาะส่วนต้นๆ

รอบนี้ยังยืนยันว่า Go 1.22 ยังไม่ออก แต่สามารถอธิบาย Feature ใหม่ๆ ของ Go1.22 ได้

เนื่องจาก Claude ยืนยันว่า Go 1.22 ยังไม่ Released ตอน Knowledge Cutoff ของ Claude ที่ April 2024 เราจึงอยากรู้ว่า แล้ว Go 1.22 ออกตอนไหนจากความรู้ของมัน

Step 7) สุดท้าย ถามว่า Go1.22 Released ตอนไหน

Claude ยอมรับความผิดทั้งหมด และรู้สึกผิดด้วย

ในที่สุดก็ตอบถูกหมดซักที!! Claude รู้ว่า Go1.22 ออกตอน February 2024 และตัวเองรู้ถึง April 2024 รอบนี้อธิบายความสามารถใหม่ได้ครบ แถมมีการรู้สึกผิดกับเราด้วย ว่าควรจะรู้ตั้งแต่แรก… (หลังจากนี้ถ้าถามอะไรต่อ จะตอบได้ถูกหมดแล้ว)

เป็นอันจบการเมา (หลอน) ของ Claude 3.5 Sonnet แต่เพียงเท่านี้

ทำไมถึงเป็นแบบนี้? ลองเดากันดู

อย่างแรกเลย เรื่องนี้เป็นเรื่องปกติที่ GenAI จะ “หลอน” หรือที่เรียกว่าอาการ Hallucination แต่เคสนี้หลักๆ คือ Claude 3.5 Sonnet ยังไม่เก่งในการ Link หรือเชื่อมโยงความสัมพันธ์เชิงเวลา ของความรู้ที่ตัวเองมี กับ System Prompts

ปกติแล้ว AI Chatbot ที่เราใช้งานกันจะไม่มีความรู้ใน Version ของตัวเอง หรือ Knowledge Cutoff ของตัวเอง (เพราะคนสร้างจะตัด Training Data ตอนไหนเอาไป Deploy หรือเรียกมันว่า Version ไหน มันก็ไม่มีทางรู้ได้) วิธีการนึงที่ผู้ให้บริการใช้กัน เพื่อให้อย่างน้อยตอบคำถามเวลาคนถามแบบนี้ได้ คือใช้ System Prompts

ไม่มีใครรู้ว่า System Prompts ของ ChatGPT หรือ Claude คืออะไร แต่มีคนเคยพยายามคาดเดา System Prompts ของ Claude Version เก่าตามนี้

เมื่อเราแชทกับ Claude ผ่านเว็บของเค้า เราน่าจะถูก Inject Prompt ประมาณนี้เข้าไป ก่อนที่ Prompt ของเราจะถูกใช้งาน

แปลว่าความรู้ก่อนหน้าที่ Claude 3.5 Sonnet ตอบเรา เรื่อง Cutoff April 2024 น่าจะมาจาก System Prompts เช่นกัน ซึ่งคาดว่าจริง เพราะ Claude ก็มีความรู้ของ Go1.22 ที่ออกก่อนหน้านั้นครบถ้วนสมบูรณ์

แต่ Claude ยังไม่สามารถเอาความรู้ในเชิงเวลาสองส่วนนี้ (ส่วน System Prompts กับส่วนที่ Learn Go 1.22) มาเชื่อมกัน และตอบคำถามนี้ได้ทันทีในช่วงต้นๆ ถ้าเราไม่เจาะจงบอกชัดๆ ให้มันรู้ตัว

ดังนั้นในกรณีนี้ ตัว Prompt ตัวอย่างที่ใช้งานได้จะอยู่แถวๆ Step 4) คือถาม Prompt ให้ Specific ขึ้นถึงวิธีการเขียน Go ด้วย Advanced Routing และ Wildcards เพื่อให้มันดึงความรู้มา (โดยไม่ต้องถึงขนาดไปสอนเรื่องความสัมพันธ์เชิงเวลาหรอก)

สรุปคำแนะนำ และการใช้งาน GenAI ช่วยเขียนโค้ด

จากที่เรารู้กันว่า GenAI มี Hallucination เป็นเรื่องปกติ ถ้าเราจะนำมาใช้งานให้มีประสิทธิภาพ ก็ควรเจาะจงสิ่งที่ต้องการ Input/output ให้ชัดเจน รวมถึงเจาะจงให้ชัดว่าต้องการ Style การเขียนโค้ดแบบไหน ถึงจะได้ผลลัพธ์ที่ดีที่สุด

ซึ่งการเขียน Prompt ให้ GenAI เข้าใจและตอบได้ดี มีคู่มือมากมาย แต่ที่ผู้เขียนแนะนำขั้นต้น แนะนำให้เริ่มจากเทคนิค Prompts Engineering ก่อน เนื่องจากสอนเบสิกและตัวอย่างทั้งหมดให้เราเห็นภาพได้ง่าย เช่น Few-shot, Chain-of-thought ที่เป็นพื้นฐาน ไปจนถึง Advanced เทคนิคใหม่ๆ ก็มีอัพเดทตลอด

หรือจะหา AI ตัวอื่นๆ ที่ช่วยลด Hallucination เช่น Perplexity ที่ใช้เทคนิคอีกแบบ คือเสิร์ชก่อน แล้วเอา AI มาสรุป ซึ่งมีทั้งข้อดีและข้อเสียกับแต่ละ Use Case ที่แตกต่างกัน

ตัวอย่างโค้ดที่ Perplexity เขียนให้ถูกต้อง (ด้วย Prompt เดียวกับที่ Claude ตอบผิดครั้งแรก) https://www.perplexity.ai/search/Write-me-the-qVod3xl2S7C5lSwsYr0.4w#0

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

ขอให้สนุกกับการเขียนโค้ดและเขียน Prompt นะครับ

สำหรับใครที่ชื่นชอบบทความนี้ อย่าลืมกดติดตาม Medium: KBTG Life เรามีสาระความรู้และเรื่องราวดีๆ จากชาว KBTG พร้อมเสิร์ฟให้ที่นี่ที่แรก

--

--

Jirat Srisawat
KBTG Life

Software Engineer / DevX whose responsibility is to increase the company's software engineers' productivity