ChatGPT เป็นบ็อตอัจริยะที่มีคนพูดถึงกันค่อนข้างมาก จนอดใจไม่ได้ ขอลองเล่นดูสักหน่อย โดยจะให้ ChatGPT ช่วยเขียนโค้ดไพธอนง่าย ๆ ไม่ซับซ้อนมาก ดูซิว่าผลจะเป็นอย่างไร
เนื้อหาโดยรวม :)
รู้จัก ChatGPT
ChatGPT เป็นปัญญาประดิษฐ์ (A.I. – Artificial Intelligence) ผลงานของ OpenAI (บริษัทนี้แยกเป็น 2 บริษัทย่อยคือ OpenAI LP เอาไว้ทำธุรกิจ กับ OpenAI Inc. วางตัวเป็นองค์กรไม่แสวงหากำไร องค์กรนี้ก่อตั้งขึ้นในซานฟรานซิสโก เมื่อ พ.ศ. 2558 โดย คนกลุ่มหนึ่งลงขันกันทำบริษัทนี้ขึ้นมา และบางคนในกลุ่มนั้นเราก็รู้จักกันดี เช่น อีลอน มัสก์ จอมเกรียนจาก เทสลา สเปซเอ็กซ์ และล่าสุด ทวิตเตอร์ และที่สำคัญคือ เมื่อปี 2562 บริษัทไมโครซอฟต์ลงทุนให้บริษัทนี้ถึง 1 พันล้านดอลลาร์สหรัฐฯ
ที่เข้าใจว่าน่าจะตอบคำถามได้ทุกภาษา เพราะลองถามเป็นภาษาไทยก็ตอบกลับมาเป็นภาษาไทย เช่นขอให้แนะนำตัวเอง ก็ได้รับคำตอบกลับมาว่า
ChatGPT เป็นโมเดลเสียงภาษาขนาดใหญ่ที่ถูกฝึกด้วย OpenAI, มีความสามารถในการตอบคำถามและสร้างข้อความที่สมบูรณ์และเป็นไปตามความหมายในภาษาไทย. เป้าหมายของ ChatGPT คือให้บริการคำตอบและข้อมูลที่ถูกต้องและสะดวกในการใช้งาน.
เท่าที่ลองคุยเล่นดู ก็ตอบโต้ได้เหมือนคุยกับคนทั่วไป
หลังจากเปิดตัวเมื่อวันที่ 30 พฤศจิกายน พ.ศ. 2565 แค่สองเดือน ChatGPT ก็สร้างความสั่นสะเทือนไปทั่ว (บล็อกนี้เขียนวันที่ 1 กุมภาพันธ์ พ.ศ. 2566) มีทั้งคนชอบและไม่ชอบ เช่น
“AI bot ChatGPT ทำให้นักวิชาการตกตะลึงด้วยทักษะการเขียนเรียงความและความสามารถในการใช้งาน” https://www.theguardian.com/technology/2022/dec/04/ai-bot-chatgpt-stuns-academics-with-essay-writing-skills-and-usability
“ในที่สุด A.I. Chatbot ผ่าน “การทดสอบเรื่องนาซี” ได้อย่างน่าเชื่อถือ” https://slate.com/technology/2022/12/chatgpt-openai-artificial-intelligence-chatbot-whoa.html
“ChatGPT พิสูจน์ให้เห็นว่า AI กลายเป็นกระแสหลักในที่สุด และสิ่งต่างๆ ก็มีแต่จะแปลกประหลาดขึ้นเรื่อย ๆ” https://www.theverge.com/2022/12/8/23499728/ai-capability-accessibility-chatgpt-stable-diffusion-commercialization
ในเดือนธันวาคม พ.ศ. 2565 เว็บไซต์ Stack Overflow (ที่ DataRevol.com อาศัยพึ่งพาค้นหาคำตอบค่อนข้างบ่อย) ได้ห้ามใช้ สร้างคำตอบสำหรับคำถาม โดยอ้างถึงลักษณะการตอบของ ChatGPT ยังมีความคลุมเครืออยู่ ในเดือนมกราคม พ.ศ. 2566 International Conference on Machine Learning ห้ามใช้ สร้างข้อความในเอกสารที่ส่งมา
ก็จะเห็นว่า เปิดตัวไม่นาน แต่เป็นที่เลื่องลือตามสมควร อันนี้ก้ไม่แปลกใจ เพราะเท่าที่เห็นมีคนใช้งานหลากหลายมาก ทั้งแต่เนื้อเพลง เขียนรายงาน ทำการบ้าน ฯลฯ
คุยกับ ChatGPT
DataRevol.com ก็อยากจะลองบ้าง โดยจะลองทดสอบให้เขียนโค้ดไพธอน
เตรียมโจทย์ไว้ดังนี้
สร้าง dataframe ชื่อ MFK โดยใช้ข้อมูลจากไฟล์ txt ที่อยู่ในโฟลเดอร์ D:\VAL\V66-69\VALB โดยจะเลือกไฟล์ที่ชื่อขึ้นต้นด้วย 12 เท่านั้น โดยใช้ จุลภาคเป็นตัวคั่น ในการนำเข้านี้ จะไม่เอา คอลัมน์ CHANODE ที่มีค่าเป็น NaN
สร้าง dataframe ชื่อ STR โดยใช้ข้อมูลจากไฟล์ txt ที่อยู่ในโฟลเดอร์ D:\DEED\2566-73-25\SEP โดยจะเลือกเฉพาะข้อมูลไฟล์ที่ชื่อขึ้นต้นด้วย 12 เท่านั้น โดยใช้ จุลภาคเป็นตัวคั่น
เชื่อม dataframe ทั้ง 2 เข้าด้วยกัน โดยใช้คอลัมน์ BRANCH, CHANODE และ AMP จาก MFK เชื่อมกับ BRANCH_CODE, PARCEL_NO และ AMPHUR_CODE จาก STR แล้วสร้างคอลัมน์ชื่อ Compare ขึ้นมาเพื่อตรวจสอบว่า คอลัมน์ ‘SURVEY’ จาก MFK ตรงกับ คอลัมน์ PARCEL_SURVEY_NO ใน STR หรือไม่
ส่งผลทั้งหมดไปที่ Excel ในชื่อ D:\Temp\Result.xlsx
ชั้นแรก เราไปที่ openai.com เพื่อคลิกพูดคุย โดยที่เราต้องล็อกอินก่อน (ใครมี Google Account อยู่แล้วใช้ Google Account เลยก็สะดวกดี) จากนั้นเราก็เริ่มต้นคุย
ลองภาษาไทย
ด้วยความอยากรู้ว่า ถ้าใช้ภาษาไทยแล้วเจ้าบ็อตอัจริยะจะจับความได้ตรงหรือไม่ (เอาจริง เราก็ไม่ได้ถนัดภาษาอังกฤษ พิมพ์ผิดพิมพ์ถูก ใช้ภาษาไทยดีกว่า)
เริ่มต้นด้วยการทักทาย บอกให้รู้ว่า เราจะขอคำปรึกษาเรื่องเขียนโค้ดไพธอน
สังเกตว่า บ็อตจะตอบกลับมาแบบช้า ๆ หน่วง ๆ ไม่แน่ใจว่าเป็นเพราะมีคนใช้บริการมาก หรือว่า เป็นเพราะพยายามแปลภาษาไทยอยู่
แล้ว DataRevol ก็งานที่เตรียมไว้ วางไปโครมเดียวเลย
แชตบ็อตอัจริยะก็ส่งโค้ดมาให้อย่างรวดเร็ว
ตอนเห็นโค้ด ก็รู้อยู่แล้วว่า มีปัญหาบางอย่างเกิดขึ้นแน่ ๆ
นั่นคือ ตอนอ่าน txt file ใช้ตัว Sep เป็น \t ซึ่งแปลว่าจะให้ใช้ย่อหน้าในการแบ่งคอลัมน์ ย้อนขึ้นไปดูโจทย์ด้านบน ก็ว่าบอกแล้วนะ ว่าต้องใช้ จุลภาคเป็นตัวคั่น
ตอนแรกว่าจะลองแก้เอง แต่แล้วก็คิดได้ว่า เรากำลังทดสอบบ็อตอยู่นี่นา
ก็เลยไปแชตคุยกับบอตอีกทีว่า มันใช้จุลภาคเป็นตัวคั่นนะจ๊ะ แก้ไขให้หน่อย
บ็อตแสนดีก็เขียนโค้ดให้ใหม่ แต่มันชักจะไม่ใช่อย่างที่คิดแล้ว
มีปัญหาตั้งแต่การอ่านเลยแฮะ
แล้วพอเอาปัญหาที่เกิดขึ้นไปถามแช็ตบ็อต คราวนี้เหมือนว่าจะมีความไม่เข้าใจกันเกิดขึ้น
จึงอธิบายสิ่งที่ต้องการใหม่อีกครั้งแบบเฉพาะเจาะจง
แต่ผลลัพธ์ไม่ได้อย่างที่ต้องการเท่าไหร่
และดูเหมือนว่า ยิ่งคุยกันก็ยิ่งไปคนละทางกับที่ตั้งใจไว้
ยิ่งไปต่อ เหมือนจะไปกันใหญ่ เลยคิดว่า เอ๊ะ หรือจะเป็นปัญหาเรื่องภาษาไทย
โอเค เราไปลองภาษาอังกฤษดีกว่า
ลองภาษาอังกฤษ
สำหรับภาษาอังกฤษ เขียนสิ่งที่เราต้องการแบบงู ๆ ปลา ๆ ดังนี้
Create a dataframe called MFK using the data from the txt file contained in the folder. D:\VAL\V66-69\VALB Only files whose names start with 12, using a comma as a separator. In this import, the CHANODE column with a value of NaN is ignored.
Create a dataframe named STR using the data from the txt file contained in the folder. D:\DEED\2566-73-25\SEP Only files whose names begin with 12, using commas as separators.
Concatenate the two dataframes by using the BRANCH, CHANODE, and AMP columns from MFK, joining the BRANCH_CODE, PARCEL_NO, and AMPHUR_CODE from STR, and then creating a column called Compare to verify that the ‘SURVEY’ column from MFK matches the PARCEL_SURVEY_NO column in STR. no
Send all results to Excel as D:\Temp\Result.xlsx
เอ๊ะ รู้สึกว่าเร็วกว่าตอนถามเป็นภาษาไทยพอสมควร
แต่ตอนดูโค้ด เห็นแล้วว่ามีบางอย่างที่ไม่ถูกต้องนัก
import pandas as pd
import os
# Load MFK dataframe
mfk_path = r'D:\VAL\V66-69\VALB'
mfk_files = [f for f in os.listdir(mfk_path) if f.startswith('12') and f.endswith('.txt')]
mfk_dfs = []
for file in mfk_files:
df = pd.read_csv(os.path.join(mfk_path, file), sep=',', header=0, index_col=None, na_values=['NaN'])
mfk_dfs.append(df)
MFK = pd.concat(mfk_dfs, axis=0, ignore_index=True)
MFK = MFK[['BRANCH', 'CHANODE', 'AMP']]
# Load STR dataframe
str_path = r'D:\DEED\2566-73-25\SEP'
str_files = [f for f in os.listdir(str_path) if f.startswith('12') and f.endswith('.txt')]
str_dfs = []
for file in str_files:
df = pd.read_csv(os.path.join(str_path, file), sep=',', header=0, index_col=None)
str_dfs.append(df)
STR = pd.concat(str_dfs, axis=0, ignore_index=True)
STR = STR[['BRANCH_CODE', 'PARCEL_NO', 'AMPHUR_CODE']]
# Concatenate and join the two dataframes
result = pd.concat([MFK, STR], axis=1, join='inner')
result['Compare'] = result['SURVEY'].eq(result['PARCEL_SURVEY_NO'])
# Save the result to Excel
result.to_excel(r'D:\Temp\Result.xlsx', index=False)
ลองรันโค้ดดู ใช่แล้ว…
ในนี้ขึ้นปัญหาว่า SURVEY ก็คือ ไม่มีคอลัมน์นี้ เพราะในโค้ด
MFK = MFK[['BRANCH', 'CHANODE', 'AMP']]
มันคือการบอกว่า ให้เอาเฉพาะ 3 คอลัมน์นี้ แล้วจะไปเอา SURVEY มาจากไหน
โอเค เราจะไม่แก้ปัญหาเอง จะเอาปัญหานี้ไปบอกบ็อตอัจริยะ
แต่พอ copy ความผิดพลาดไป เจ้าบ็อตดูจะเข้าใจผิด คิดว่าคอลัมน์นี้เป็นชื่ออื่น จึงให้โค้ดเปลี่ยนชื่อ
ตรงนี้ บ็อตรู้ว่าปัญหามาจากชื่อคอลัมน์ SURVEY ไม่มีใน dataframe แต่ช่วยแก้ปัญหาด้วยการเปลี่ยนชื่อคอลัมน์อื่น ซึ่งไม่ตรงกับที่เราวางเป้าหมายไว้
ตอนแรกก็คิดว่าจะกวนตีนมันด้วยการถามไปเรื่อย ๆ แต่ก็ฉุกใจคิดว่า เราต้องสอนมัน มันถึงจะรู้ว่าต้องแก้ปัญหาอย่างไร
ก็เลยต้องชี้ปัญหาว่า มีปัญหามาจากจุดใด นั่นคือ แต่เติมคอลัมน์ SURVEY ไปก็สิ้นเรื่อง
แต่เรื่องยังไม่สิ้น
ลองดูผลลัพธ์จากโค้ดใหม่ ที่บ็อตเขียนให้ก่อน
import pandas as pd
import os
# Load MFK dataframe
mfk_path = r'D:\VAL\V66-69\VALB'
mfk_files = [f for f in os.listdir(mfk_path) if f.startswith('12') and f.endswith('.txt')]
mfk_dfs = []
for file in mfk_files:
df = pd.read_csv(os.path.join(mfk_path, file), sep=',', header=0, index_col=None, na_values=['NaN'])
mfk_dfs.append(df)
MFK = pd.concat(mfk_dfs, axis=0, ignore_index=True)
MFK = MFK[['BRANCH', 'CHANODE', 'AMP', 'SURVEY']]
# Load STR dataframe
str_path = r'D:\DEED\2566-73-25\SEP'
str_files = [f for f in os.listdir(str_path) if f.startswith('12') and f.endswith('.txt')]
str_dfs = []
for file in str_files:
df = pd.read_csv(os.path.join(str_path, file), sep=',', header=0, index_col=None)
str_dfs.append(df)
STR = pd.concat(str_dfs, axis=0, ignore_index=True)
STR = STR[['BRANCH_CODE', 'PARCEL_NO', 'AMPHUR_CODE', 'PARCEL_SURVEY_NO']]
# Concatenate and join the two dataframes
result = pd.concat([MFK, STR], axis=1, join='inner')
result['Compare'] = result['SURVEY'].eq(result['PARCEL_SURVEY_NO'])
# Save the result to Excel
result.to_excel(r'D:\Temp\Result.xlsx', index=False)
เปิดไฟล์ Excel
อ้าว ไม่ใช่ ยังมีปัญหาคือ ไม่ได้เป็นการ ลิงก์กัน แต่เป็นการนำไปวางผสานกันเฉย ๆ เลย
ทั้งนี้เป็นเพราะตรงส่วน # Concatenate and join the two dataframes ซึ่งเป็นการผสาน dataframe เป็นการใช้ pd.concat คือ เอาไปวางผสานกัน แต่ไม่ใช่เป็นการเชื่อมข้อมูลโดยลิงก์กันค่าในคอลัมน์ที่ระบุไว้
เราจะลองเอาโค้ดตรงนี้ไปปรึกษาบ็อตอีกรอบ
คราวนี้ ระบุแบบค่อนข้างจะเฉพาะเจาะจงละเอียดมาก ๆ
ผลลัพธ์ก็คือ
เออ ใช้ได้ละ
จริง ๆ ก็มีปัญหาอาจจะต้องปรับจูนกันหน่อย แต่ถือว่า ผลลัพธ์ที่ออกมาตรงตามที่ต้องการ
ความคิดเห็น
ตอนนี้ DataRevol.com แทบจะใช้ ChatGPT เป็นที่ปรึกษาเวลาเขียนโค้ดแล้ว เพราะรวดเร็ว กว่านั่งคิดเอง และผลลัพธ์ก็ออกมาน่าพอใจ
อย่างไรก็ดี ตามที่เห็นในตัวอย่างนี้ ก็ยังมีข้อผิดพลาดไม่สมบูรณ์แบบอย่างที่คิดอยู่บ้าง เวลาทำงานที่มีความซับซ้อนอาจจะต้องแยกขั้นตอนทีละลำดับ สิ่งสำคัญคือต้องเข้าใจข้อจำกัดและใช้อย่างเหมาะสม ต้องไม่ลืมว่า นี่คือ บ็อต ที่ได้รับการฝึกสอนจากมนุษย์ ในแง่การเลียนแบบ (ซึ่งโค้ดส่วนใหญ่คือการเลียนแบบจากแพตเทิร์นเดิม ๆ) ในแง่ความเป็นต้นฉบับแปลกใหม่ยังมองไม่เห็น หลาย ๆ คำถาม ความจริงหาคำตอบได้ใน Stack Overflow
แต่ผลลัพธ์ก็น่าทึ่งทีเดียวสำหรับการเปิดตัวในครั้งนี้