Petch Kruapanich
readmoreth
Published in
4 min readApr 22, 2018

--

Dialogflow: มาทำบอทสำหรับลงทะเบียนงานอบรมกันเถอะ

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

ในบทความนี้เราจะมาเพิ่มความสามารถให้แชทบอทของเราเก่งมากขึ้น โดยจะทำให้รองรับการลงทะเบียนแบบง่ายๆ ภายใต้ Requirement ต่อไปนี้

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

Step 1: สร้าง Pre Register Intent
สำหรับตัวอย่างนี้เรากำหนดให้ผู้ใช้ต้องพิมพ์คำว่า “ลงทะเบียน” ก่อนเริ่มใช้งาน ดังนั้นเราจึงสร้าง Pre Register Intent ขึ้นมาโดยกำหนดให้ Intent นี้เป็น Trigger node สำหรับเริ่มกระบวนการลงทะเบียน โดยจะ Response ข้อความไปบอกให้ผู้ใช้กรอกข้อมูลที่จำเป็น ดังนั้นเราต้องระบ ุุTraining phrases และ Responses สำหรับ Intent ประมาณนี้

Training phrases: ลงทะเบียน
Responses: ในการลงทะเบียน ผมขอทราบชื่อ เลขประจำตัวพนักงาน และแผนกของท่านหน่อยครับ

Step 2: สร้าง Register Intent
เมื่อสร้าง Pre Register Intent ที่ทำหน้าที่ถามข้อมูลแล้ว เราก็มาสร้าง Register Intent ที่จะมารับข้อมูลที่ผู้ใช้กรอก แต่การสร้าง Register Intent นี้จะไม่สร้างเหมือนเดิม เพราะเราจะ Add follow-up intent แบบ custom ภายใต้ Register Intent แทน

จากนั้นเข้าไปใน Pre Register Intent — custom ที่พึ่งถูกสร้างขึ้น และเปลี่ยนชื่อเป็น Register Intent เพื่อความเข้าใจง่ายของเรา และให้ระบุ Training phrases โดยอ้างอิงจากคำถามใน Intent เราคาดหวังว่าผู้ใช้จะตอบกลับมาแนวๆนี้

Training phrases
สมศักดิ์ รหัสประจำตัว 12345 แผนก Account

แต่ Training phrases ที่เราระบุไปแชทบอทจะยังไม่รู้เรื่องว่า ตรงส่วนไหนของประโยคคือชื่อ รหัสประจำตัว และแผนก ดังนั้นเราต้องระบุ Parameters ลงไปในประโยค พร้อมระบุว่า Parameter นั้นๆเป็น Entity type อะไร ซึ่งในที่นี้เรากำหนดให้

  • Parameter name มี Entity เป็น @sys.given-name
  • Parameter empid มี Entity เป็น @sys.number
  • Parameter department มี Entity เป็น @sys.any

ย้อนไปที่ Requirement เรากำหนดไว้ว่า ถ้าผู้ใช้ตอบอะไรมา ต้องมีการยืนยันคำตอบก่อนจะบันทึก ดังนั้นเราต้องเอาข้อมูลที่ผู้ใช้กรอกมาไปใส่ใน Response โดยสามารถใช้ $ นำหน้าตัวแปร เพื่อเรียกใช้ตัวแปรที่อยู่ภายใน Intent เดียวกันได้ดังนี้

Responses
ขอยืนยันข้อมูลอีกครั้ง
คุณ$name
เลขประจำตัวพนักงาน: $empid
แผนก: $department
ข้อมูลของท่านถูกต้องหรือไม่

จากนั้นลองทดสอบก็จะพบว่าแชทบอทของเราสามารถตัดคำได้แล้ว เย้!!!

“แต่ช้าก่อน โลกมันไม่ได้ง่ายที่เราคิด !!!”

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

Step 3: เพิ่มความฉลาดให้ Register Intent หน่อย
ภาษาเป็นเรื่องที่ดิ้นได้ เป็นไปได้ยากมากที่เราจะบังคับให้ผู้ใช้งานพิมพ์ตาม format ที่เราต้องการ สิ่งที่เราสามารถทำได้ก็คือการสร้าง Training phrases ที่มีความหลากหลาย และรองรับในหลายๆกรณี จากเคสก่อนหน้าจะพบว่าผู้ใช้งานมีโอกาสพิมพ์ข้อความเข้ามาเช่น

Input
สมรักษ์ 12346 Account
สมรักษ์ Account 12346
ชื่อสมรักษ์
สมรักษ์ 12345 Account
.
.
.
และอีกมากมาย เท่าที่จะคิดได้

ดังนั้นเราก็จะลองเพิ่ม Training Phrase ให้รองรับที่หลากหลายขึ้น

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

วิธีแก้ปัญหา กรณี Parameter ไม่ครบ
ใน Section Action and parameters เราสามารถกำหนดได้ว่าต้องการให้ตัวแปรไหน เป็น Required บ้าง และถ้าตัวแปรนั้นผู้ใช้งานไม่ได้ระบุมา ก็จะมีข้อความ (prompts) ในการแจ้งเตือนให้ผู้ใช้กรอกข้อมูลที่หายไปเพิ่มเติม

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

Step 4: ทำ Register Confirmation Intent เพื่อยืนยันสิ่งที่ผู้ใช้กรอก
จาก Register Intent ที่มีการถามให้ผู้ใช้กรอกข้อมูล ขั้นตอนต่อไปก็เป็นขั้นตอนการยืนยัน ซึ่งจากการวิเคราะห์ เราคิดว่าผู้ใช้น่าจะมีความตั้งใจจะตอบว่า ยกเลิก, ไว้ทีหลัง, ไม่ตกลง หรือ ตกลง ดังนั้นเราต้อง Add follow-up Intent ทั้งหมด 4 ตัวประกอบด้วย

  • Register Confirmation Intent Cancel
  • Register Confirmation Intent Later
  • Register Confirmation Intent No
  • Register Confirmation Intent Yes

ถ้าเราเข้าไปดูรายละเอียดของ Intent แต่ละตัวจะพบว่ามี Training phrases ที่เกี่ยวกับ Intent นั้นๆค่อนข้างครบเช่น Intent No ก็จะมีข้อความแนวปฎิเสธ เช่น ไม่, ไม่เอา, ไม่ทำ, ไม่ทำนะ, ไม่สนใจ เป็นต้น ซึ่งตรงนี้ถ้าต้องการอะไรเพิ่มเติม ก็เติมไปได้ตามสบาย

จากนั้นเรามาตั้งค่า Responses ให้แต่ละ Intent โดย Register Confirmation Intent Later และ Register Confirmation Intent Cancel เราจะตั้ง Responses เป็นการบอกลาผู้ใช้ พร้อมกับ Set as end of conversation เพื่อเคลียร์ context ที่คุยมาออกไป

สำหรับ Register Confirmation Intent No เราจะขอให้ผู้ใช้ตอบอีกครั้ง ซึ่งจำเป็นต้อง เพิ่ม PreRegisterIntent-followup ใน Output context ด้วย เพราะนั้นคือ PreRegisterIntent-followup คือ Input context ของ Register Intent ที่เราไว้รับข้อมูล ชื่อ เลขประจำตัวพนักงาน และแผนก

สำหรับ Register Confirmation Intent Yes ในบทความนี้เราจะให้ขึ้นข้อความว่า “กำลังลงทะเบียน กรุณารอสักครู่….” แล้วค่อยโยนค่าเข้า API ผ่านการทำ Fulfillment ในบทความถัดไป

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

--

--

Petch Kruapanich
readmoreth

Full time Developer, Part time writer, Vinyl lover