Chatbot: ตอบแบบสอบถาม ฟรีป๊อบคอร์น!

เนื่องจากทางบริษัทแทนเจอรีน ได้ไปออกบูธที่งานสัมนางานหนึ่ง โดยกิจกรรมในบูธของเรา จะมีแบบสอบถามออนไลน์ (ทำจาก Google Form) ให้ตอบ เมื่อตอบแบบสอบถามเสร็จก็รับป๊อบคอร์นไปเลย 1 ถุง โดยจะมีให้เลือก 2 รส คือรสเค็ม กับรสชีส ครับ

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

เรามาดูรายละเอียดของ Chatbot ตัวนี้กันเลยคับ

ภาพรวมของ Intent ทั้งหมด

Intent Design

ผม design ให้มี intent ทั้งหมด 5 intent โดยมีรายละเอียดคือ
  • Default Fallback Intent: มีมาให้อยู่แล้วแต่เข้าไปแก้ response ให้ตอบด้วยเรื่องที่ chatbot ทำได้
  • Default Welcome Intent: มีมาให้อยู่แล้วแต่เข้าไปแก้ response ให้ตอบด้วยเรื่องที่ chatbot ทำได้ (เช่นเดียวกับ Fallback Intent) คือแจ้งข้อมูลการได้รับป๊อบคอร์ และถามผู้ใช้งาน ว่าตอบแบบสอบถามหรือยัง
  • Default Welcome  - yes: สร้างเป็น follow up intent เมื่อผู้ใช้งานพิมพ์ว่าตอบแบบสอบถามแล้วก็จะสอบถามรสชาติของป๊อบคอร์นที่ต้องการ
  • Default Welcome  - yes - popcorn: สร้างเป็น follow up intent เพื่อแจ้งผู้ใช้ว่า เจ้าหน้าที่กำลังเตรียมป๊อบคอร์นรสที่เลือกไว้ให้อยู่ 
  • Default Welcome  - no: สร้างเป็น follow up intent เมื่อผู้ใช้งานพิมพ์ว่า ยังไม่ได้ตอบแบบสอบถามแล้ว ก็จะแจ้ง link เพื่อให้ไปตอบแบบสอบถาม

อำนวยความสะดวกให้ผู้ใช้ ด้วย Quick Replies

ในแต่ละ intent ผมจะใช้ Quick Replies ในจุดที่เหมาะสม เพื่อช่วยให้ผู้ใช้ สามารถกดเลือกเพื่อโต้ตอบกับ chatbot ได้เลย ไม่ต้องคิดและพิมพ์เองทั้งหมด และ Quick Replies ยังช่วยให้ผู้ใช้รู้ว่าควรจะตอบอะไรกลับไปให้ chatbot เพื่อทำให้เกิดประสบการณ์การใช้งานที่ดี (คือลดโอกาสที่ผู้ใช้จะตอบสิ่งที่ chatbot ไม่รู้เรื่องกลับมา)

ด้านล่างคือตัวอย่าง Quick Replies ที่ตั้งไว้ในแต่ละ intent ครับ
Quick Replies ของ Default Welcome Intent จะเป็นการถามให้ผู้ใช้ตอบกลับมาว่าตอบแบบสอบถามหรือยัง

Quick Replies ของ Default Welcome Intent - yes หลังจากตอบแบบสอบถาม bot จะถามว่าต้องการป๊อบคอร์นรสชาติไหน
 
กรณีของ Default Fallback Intent จะตั้ง response เหมือน Default Welcome Intent (อันนี้แล้วแต่เราสร้างครับ)

กำหนดรสชาติของป๊อบคอร์นด้วย entity

ผมต้องการให้ bot ที่สร้าง สามารถดึงค่ารสชาติที่ผู้ใช้งานเลือก เอามาอยู่ใน response ได้ เช่น การทวนรายการว่า "เจ้าหน้าที่กำลังทำป๊อบคอร์นรส ... ให้อยู่นะครับ" การดึงค่าจากประโยคที่ผู้ใช้พิมพ์เข้ามา เราจะใช้ความสามารถของ parameter แต่การที่ bot จะรู้จัก parameter นี้ เราจะต้องสร้างมันขึ้นมาในระบบก่อน ด้วยเมนู entity
สร้าง entity ชื่อ flavour โดยมี 2 รสชาติ คือ ชีส และ เค็ม (สามารถระบุ synonym ได้)

ใน Training phrases ให้เราใส่ตัวอย่างชื่อรสชาติ และระบุเป็น parameter ไว้ใช้งานต่อได้
ใน Responses เราสามารถดึงค่ารสชาติ มาใช้งานได้ด้วย $flavour 

เชื่อมโยง intent ด้วย context

เรามาดูโครงสร้างของ intent กันอีกครั้งนะครับ


ด้วยการออกแบบ intent แบบนี้ จะช่วยให้บทสนทนาไหลไปตาม follow up intent ที่กำหนดไว้ คือ
  • Default Welcome Intent > bot ถามผู้ใช้ว่าตอบแบบสอบถามหรือยัง ถ้าตอบแล้วก็จะเข้า
  • Default Welcome Intent - yes > bot จะถามต่อว่าชอบป๊อบคอร์นรสชาติไหน ถ้าตอบรสที่ให้เลือก
  • Default Welcome Intent - yes - popcorn > bot จะขึ้นข้อความ โดยดึงรสชาติที่เลือกไว้ มาตอบ
แต่ในกรณีที่ผู้ใช้ไม่ได้ตอบตาม flow ที่ออกแบบไว้ เช่น
  • Default Welcome Intent > bot ถามผู้ใช้ว่าตอบแบบสอบถามหรือยัง ถ้ายัง ก็จะเข้า
  • Default Welcome Intent - no > bot ก็จะขึ้น url ของแบบสอบถามให้
  • เมื่อผู้ใช้ตอบแบบสอบถามเรียบร้อยแล้ว และกลับมาตอบ bot อีกครั้งว่า "ตอบแบบสอบถามเสร็จแล้ว" ประโยคนี้ควรจะเข้า Default Welcome Intent - yes ใช่มั้ยครับ แต่ถ้าเราไม่ตั้งค่าเพิ่ม ประโยคนี้จะไปเข้า Default Fallback Intent แทน
เหตุผลเป็นเรื่องของ context ครับ ซึ่งก็คือ การที่ bot จะจับคู่เข้า intent Default Welcome Intent - yes ได้นั้น จำเป็นจะต้องมี context ก่อนตามรูปด้านล่าง

ต้องมี input context ชื่อ DefaultWelcomIntent-followup ก่อนถึงจะเข้า intent นี้ได้
ชื่อ context ตัวนี้ ระบบจะตั้งให้อัตโนมัติจากที่เราสร้าง followup intent
ถ้าเราเข้าไปดูที่ output context ของ Default Welcome Intent เราจะเจอ context ชื่อเดียวกัน แต่เป็น output context

output context ของ Default Welcome Intent จะไปตรงกับ input context ของ Default Welcome Intent - yes
 ทีนี้ ถ้าเราอยากแก้ปัญหาข้างต้น ก็สามารถใช้ context มาช่วยเชื่อม intent ให้วิ่งเข้าได้ตามที่เราต้องการ ในที่นี้คือ
  • Default Welcome Intent > bot ถามผู้ใช้ว่าตอบแบบสอบถามหรือยัง ถ้ายัง ก็จะเข้า
  • Default Welcome Intent - no > bot ก็จะขึ้น url ของแบบสอบถามให้ พร้อมกับตั้งค่า output context เป็น DefaultWelcomIntent-followup
  • เมื่อผู้ใช้ตอบแบบสอบถามเรียบร้อยแล้ว และกลับมาตอบ bot อีกครั้งว่า "ตอบแบบสอบถามเสร็จแล้ว" ประโยคนี้จะเข้า Default Welcome Intent - yes เลย เนื่องจากมี context ที่ตรงกันจากการตั้งค่าเพิ่มเติม
ตั้งค่า output context ของ intent Default Welcome Intent - no ให้เป็น DefaultWelcomIntent-followup เพื่อให้สามารถเข้า intent Default Welcome Intent - yes เมื่อผู้ใช้ตอบกลับว่าตอบแบบสอบถามแล้ว

กรณีของ Default Fallback Intent จะคล้ายๆ กันคือตั้ง output context เป็น DefaultWelcomIntent-followup เพื่อให้สามารถเข้า intent Default Welcome Intent - yes หรือ Default Welcome Intent - no ได้เลย
ถ้าใครอยากลองคุยกับ bot ตัวนี้ดู ว่ามีผลลัพธ์เป็นยังไงบ้าง ก็สามารถเปิด Line และสแกน QR ด้านล่าง เพื่อคุยกับ bot ได้เลยครับ
หากใครสนใจนำ chatbot ไปช่วยตอบข้อความ ไม่ว่าจะเป็นการตอบพนักงานภายในองค์กร หรือจะทำ bot มาตอบลูกค้า สามารถติดต่อได้ที่ tangerine ครับ
---

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

การเรียกใช้งาน Google Apps Script

ลดเวลาการเรียก API ใน Apps Script ด้วย fecthAll

ออกแบบระบบให้คุยข้าม module กันได้ ด้วย Pub/Sub