เปรียบเทียบการใช้ Bard และ ChatGPT เขียนโปรแกรม

by lew
24 April 2023 - 19:01

ปัญญาประดิษฐ์ด้านภาษาอย่าง ChatGPT กำลังเป็นที่นิยมอย่างสูง และกูเกิลก็เปิดตัว Bard มาได้ระยะหนึ่งแล้ว แม้จะเป็นบริการทดสอบวงปิด (ต้องขอใช้งานล่วงหน้า) แต่ตอนนี้คิวการใช้งานก็ใช้งานได้แทบทันที ทำให้หลายคนอาจจะใช้ปัญญาประดิษฐ์สองตัวคู่กันเสมอๆ

การใช้งานมีหลายด้าน แต่ด้านหนึ่งที่หลายคนอาจจะใช้งานกัน คือการใช้ปัญญาประดิษฐ์มาช่วยเขียนโปรแกรม โดยการใช้แชตบอตเช่น Bard และ ChatGPT นั้นมีข้อดีเหนือกว่า การใช้ปัญญาประดิษฐ์เขียนโค้ดโดยตรง เพราะเรามักสามารถกำหนดความต้องการ รอผลลัพธ์ และสามารถสั่งแก้ไขเพิ่มเติม จนกว่าจะได้โปรแกรมที่เราต้องการ เราสามารถขอสคริปต์หรือโครงร่างโปรแกรมอย่างง่าย ที่เราต้องการใช้ไลบรารีหรือเฟรมเวิร์คใหม่ๆ โดยผลที่ได้ตรงตามต้องการทันที

ข้อดีสำคัญการใช้แชตบอทในการเขียนโปรแกรมอีกอย่าง คือ แชตบอทมักมีคำอธิบายโค้ดที่มันสร้างขึ้นมาให้ด้วย ทำให้ประหยัดเวลาที่จะอ่านเอกสารที่เกี่ยวข้องซึ่งหลายครั้งอยู่กระจัดกระจายกันไป

ผมตั้งโจทย์การเขียนโปรแกรมเป็นเว็บอันหนึ่ง โดยต้องการให้แชตบอทเขียน API ที่คืนค่าเป็น JSON จากนั้นจึงเพิ่มเงื่อนไขเพิ่มเติมไปเรื่อยๆ เช่น

  • เพิ่มคอนฟิกสำหรับเว็บผ่านทาง environment variable
  • ให้เพิ่ม basic authentication ลงไปยัง route
  • ทำให้ path หนึ่งของเว็บเป็นการ proxy ไปยังเซิร์ฟเวอร์ปลายทาง
  • filter HTTP Header ที่ได้จากเซิร์ฟเวอร์ต้นทาง

ผมใช้ทั้งสองตัวในเวอร์ชั่นฟรี ดังนั้นจึงไม่ได้ใช้ GPT-4

คำสั่งแรก โปรแกรมอย่างง่าย

ทั้ง Bard และ ChatGPT ได้รับ คือ Write a flask application with a route /blognone_test which will return json {"msg": "Hello Blognone"} ทั้งสองตัวสามารถเขียนโปรแกรมได้โดยไม่มีปัญหาใดๆ โดยทั้งสองตัวพยายามอธิบายวิธีการรันไว้ด้วย ความพิเศษสักหน่อยของ Bard คือมันพยายามบอกด้วยว่าเมื่อรันและเข้าเว็บด้วยเบราว์เซอร์แล้วจะเห็นผลอย่างไร

from flask import Flask, jsonify

app = Flask(__name__)

@app.route("/blognone_test")
def blognone_test():
    return jsonify({"msg": "Hello Blognone"})

if __name__ == "__main__":
    app.run(debug=True)

คำสั่งสอง เพิ่มคอนฟิก

คำสั่งต่อมาขอให้เปลี่ยน `/blognone_test เป็นค่าที่ได้รับจาก environment variable ชื่อว่า API_PATH

Make the route /blognone_test configurable by get the path from environment variable named "API_PATH"

คำสั่งแม้ว่าทั้งสองตัวจะตอบได้คล้ายกันมาก แต่ Bard ก็เริ่มแสดงอาการ ด้วยการลืม import os ไปเสียเฉยๆ ทำให้โค้ดรันไม่ได้ แต่เมื่อนำ error บรรทัดสุดท้ายไปแจ้ง Bard มันก็ตอบวิธีแก้ไขได้อย่างถูกต้อง

คำสั่งสาม เพิ่ม Basic Authentication

คำสั่งต่อมาสั่งเพียงสั้นๆ ว่า Add basic authentication เพื่อให้แชตบอตเพิ่มการล็อกอินก่อนจะเรียก API คำสั่งนี้ Bard เลือกใช้ flask_httpauth ขณะที่ ChatGPT เลือกใช้ flask_basicauth แต่โดยรวมโค้ดทั้งสองชุดสามารถทำงานได้ตามคำสั่ง แต่โค้ดของ Bard ยังคงลืม import os แม้เพิ่มสั่งแก้ไขไป และโค้ดของ ChatGPT นั้นไม่ใส่คอนฟิกที่สั่งไปในข้อที่แล้วมาด้วย

คำสั่งสี่ ทำตัวเป็นพรอกซี่ไปยัง httpbin.org

คำสั่งที่สี่ขอให้แก้ไขโค้ด Make blognone_test proxy the request to https://httpbin.org/anything เพื่อส่งต่อ request ไปยัง httpbin.org

Bard ตีความการทำตัวเป็น proxy ได้แม่นกว่า ด้วยการพยายามส่งค่า header ทั้งหมดไปยังเซิร์ฟเวอร์ต้นทางด้วย อย่างไรก็ดี โค้ดที่สร้างออกมานั้นกลับใช้ออปเจกต์ request ของ flask ผิดพลาด Bard พยายาม copy ด้วยฟังก์ชั่น copy() ตรงๆ แต่กลับใช้งานไม่ได้ และเมื่อนำ error ไปวาง Bard ก็พยายามเปลี่ยนไปใช้ to_dict() ซึ่งรันไม่ได้เช่นกัน แต่เมื่อนำ error ไปวางรอบที่สอง Bard ก็แก้ไขจนโค้ดทำงานได้

ChatGPT สร้างโค้ดที่ไม่ได้ส่ง header ไปยัง httpbin แต่กลับสร้าง header ใหม่ทั้งหมด อย่างไรก็ดีมันส่ง arguments ไปด้วย ทำให้อาจจะถือว่าชนะบางส่วน

ChatGPT ยังดีกว่า แต่ Bard ตามมาใกล้แล้ว

การทดสอบครั้งนี้เป็นเพียงส่วนหนึ่งของการใช้งาน โดยรวมแล้วประสบการณ์มักคล้ายๆ แบบนี้ Bard มีแนวโน้มว่าจะสร้างโค้ดผิดพลาดจนถึงกับรันไม่ได้อยู่เสมอๆ หากสั่งคำสั่งซับซ้อนไปบ้าง และ ChatGPT นั้นสามารถสร้างโค้ดที่ "รันได้" ตามคำสั่งที่ซับซ้อนมากกว่าพอสมควร แม้ว่าหากใส่คำสั่งที่ซับซ้อนเกินไปก็จะมีความผิดพลาด หรือบางครั้งก็แก้ไขโค้ดโดยทิ้งบางฟีเจอร์ที่สั่งไว้ก่อนหน้าออกไปเสียเฉยๆ

อาการหลอน (hallucination) ยังคงพบได้เรื่อยๆ ในแชตบอตทั้งสองตัว เช่น หากถามถึง Flask extensions โดยขอจำนวนดาวใน GitHub ด้วย Bard ก็จะแสดงตารางสวยงาม แต่ตัวเลขกลับเกินกว่าจำนวนดาวจริงๆ ของแต่ละโครงการไปมาก ChatGPT ตอบได้ใกล้เคียงกว่าแต่ก็เป็นข้อมูลเก่าตั้งแต่ปี 2021

โดยทั่วไปแล้ว ทั้งสองตัวสามารถใช้งานช่วยเหลือระหว่างการเขียนโปรแกรมได้ โดยเฉพาะการเรียนเฟรมเวิร์คหรือภาษาใหม่ๆ ที่ผู้เขียนยังไม่ชินว่ากระบวนการแต่ละอย่างทำอย่างไรบ้าง หากเป็นตัวอย่างที่ง่ายพอก็มักจะได้คำตอบที่ตรงประเด็นพร้อมคำอธิบายที่ชัดเจน แต่ควรตระหนักว่าหากคำสั่งซับซ้อนขึ้น หรือหากเฟรมเวิร์คที่ใช้ไม่เป็นที่นิยมนัก แชตบอตทั้งสองตัวก็มักจะทำงานผิดพลาดได้ง่ายขึ้น

โค้ดที่ได้จากการทดสอบนี้อยู่ใน GitHub Gist

Blognone Jobs Premium