ก้าวที่ 8 · ตอนที่ 26

หลัง Buddy ขึ้น Production ผมเพิ่มไอเดียและตามแก้ Bug จนเกิด v1.1

พ่อกับ Buddy วางรองเท้าวิ่งคู่ใหม่บนโต๊ะ ขณะหน้าจอจัดการแท็กและตรวจการส่งมอบระบบ

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

เมื่อเริ่มใช้งานจริง จุดขัดใจก็เริ่มทำงาน

วันแรกที่ระบบขึ้นไปอยู่บน VPS จริง ทุกอย่างที่วางไว้ทำงานได้ตามหวัง ทั้งการอ่านรูปผลการนอน การสรุปภาพสะท้อนชีวิตประจำวัน และสมุดบันทึกบนเว็บ แต่พอตกบ่าย เมื่อผมลองบันทึกกิจกรรมวิ่งตามจริง จุดสะดุดที่เคยจดไว้ในข้อสังเกตการณ์ก็กลับมาสะกิดใจอีกครั้ง

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

คำถามง่าย ๆ จึงผุดขึ้นมาว่า ทำไมบอทถึงจำชื่อรองเท้าจากบทสนทนาที่เพิ่งคุยกันไปเองไม่ได้

ให้บอทเรียนรู้จากสิ่งที่คุย แต่ต้องไม่ชะงักและไม่ต้องพัง

ผมอยากให้ประสบการณ์ใช้งานเป็นธรรมชาติที่สุด ถ้าผู้ใช้บอกชื่อรองเท้าคู่ใหม่มาในแชท ระบบก็ควรบันทึกกิจกรรมนั้นให้เสร็จ แล้วสร้างแท็กใหม่เก็บไว้ เพื่อให้การวิ่งครั้งถัดไปบอทถามหารองเท้าแล้วชื่อนั้นปรากฏเป็นปุ่มให้แตะเลือกได้ทันทีด้วยนิ้วเดียว

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

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

คนยังต้องมีสิทธิ์เข้าไปดูและแก้ไข

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

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

บทเรียนจากท่อ Deploy: เมื่อ Nginx เกือบทำไฟดับ

การเขียนโค้ดและทดสอบผ่านไปได้ดี แต่ความตื่นเต้นที่แท้จริงอยู่ที่ท่อส่งงานขึ้น Production เมื่อผมส่งโค้ดขึ้นกิ่งที่ทำให้ระบบ Deploy อัตโนมัติ ก็เจอ 502 Bad Gateway กระแทกหน้าเข้าอย่างจัง

สาเหตุแรกคือสคริปต์ส่งมอบที่มีอยู่เดิมมีคำสั่งไปเขียนทับไฟล์คอนฟิกของ Nginx บนเครื่องโฮสต์แบบยกแผง ทำให้การตั้งค่าพอร์ตและใบรับรอง SSL หลุด สาเหตุที่สองคือคอนเทนเนอร์เพิ่งเริ่มบูตและระบบภายในยังไม่พร้อม แต่คำสั่งตรวจความพร้อมกลับยิงตรวจทันที พอไม่ผ่าน ท่อก็ตัดสินว่าการส่งมอบล้มเหลว

ผมกับ AI ต้องรีบนั่งไล่แก้ปัญหาตรงหน้า ปรับสคริปต์ให้เลิกแตะคอนฟิกหลักของโฮสต์ ซิงก์พอร์ต 443 ให้ตรงกับเครื่องจริง และเขียนลูปหน่วงเวลาให้ท่อรอเช็กความพร้อมของระบบได้นานขึ้น

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

ในค่ำของวันนั้น ผมจึงเซ็นรับรองปิดรอบ v1.1 ได้อย่างสมบูรณ์