ทำหน้าที่เป็นตัวกลางที่จะเชื่อมต่อ Server เข้ากับ LINE Official Account ทำให้สามารถเขียนโปรแกรมเพื่อสร้างบริการที่ผู้พัฒนาต้องการ ผ่านข้อความและโต้ตอบกับผู้ใช้ในลักษณะ Chatbot Show
.png) Reply messages เป็นการโต้ตอบกับ Chatbot โดยผู้ใช้เป็นคน Request มาที่ Chatbot ก่อนและตัว Chatbot ทำการตอบข้อความกลับไปหาผู้ใช้ เช่น ผู้ใช้ส่งข้อความเข้ามา หรือ ผู้ใช้ทำการ Add Chatbot เป็นเพื่อน (ผู้ใช้เป็นคนทักหา Account เราก่อน ลักษณะ Two-way communication) Flex Message ฉีกกฎการแสดงผลข้อความแบบเดิมๆใน LINE ด้วย Flex Message ที่เป็นการแสดงผลข้อความตามที่เราออกแบบได้เองอย่างอิสระ Flex Message ฉีกกฎการแสดงผลข้อความแบบเดิมๆใน LINE ด้วย Flex Message ที่เป็นการแสดงผลข้อความตามที่เราออกแบบได้เองอย่างอิสระ .png) ดึงข้อมูลโปรไฟล์ของผู้ใช้ โดยข้อมูลของผู้ใช้ที่เราสามารถเก็บได้จาก LINE API จะประกอบไปด้วย userId - ID ของผู้ใช้(สำหรับระบบหลังบ้าน) displayName - ชื่อของผู้ใช้ statusMessage - ข้อความของผู้ใช้ pictureUrl - รูปของผู้ใช้ email - อีเมลของผู้ใช้(เฉพาะ LIFF v2 และ LINE Login) และ language - ภาษาของอุปกรณ์ที่ใช้งานแอป LINE อยู่ Why LINE API? Why LINE API? 1 LINE API เปิดกว้างให้สามารถนำไปสร้างสรรค์บริการต่างๆให้ตอบโจทย์กับธุรกิจได้ทุกประเภท 2 นักพัฒนาเขียนโค้ดแค่ครั้งเดียวแต่สามารถทำงานได้ทั้ง iOS และ Android พัฒนาได้ง่ายและเร็วทำให้ Time-to-market ต่ำ ประหยัดต้นทุนทางธุรกิจ 3 ปัจจุบัน LINE ได้กลายมาเป็นช่องทางหลักในการสื่อสารของคนไทย ด้วยจำนวนผู้ใช้งานกว่า 50 ล้านคนทั่วประเทศ โดยการใช้งานหลากหลายตั้งแต่คุยกันในหมู่เพื่อนฝูง ครอบครัว จนไปถึงการมีปฏิสัมพันธ์กับธุรกิจหรือแบรนด์ต่างๆ ทำให้มี Learning curve ต่ำ จากงาน LINE HACK 2018 ที่เพิ่งผ่านพ้นไป ผมได้มีโอกาสไปชมการ pitching ของทั้ง 12 ทีมสุดท้าย แล้วพบว่าเกือบทุกทีมใช้ Dialogflow และ Firebase มาช่วยสร้าง LINE Bot กันให้เสร็จได้ในเวลาอันสั้น อีกทั้งผมและ warat wongmaneekit ก็มีโชว์ Live coding การเชื่อมต่อ LINE เข้ากับ Dialogflow และ Firebase ด้วย บทความนี้ก็เลยถือโอกาสมาแนะนำการเชื่อมต่อบริการทั้ง 3 เข้าด้วยกัน ซึ่งให้จิ้นกันไปก่อนเลยว่าสุดท้าย BMI Bot ของเราจะสามารถเข้าใจผู้ใช้งาน ว่ากำลังต้องการทราบ BMI ของตนเองในบริบทที่ต่างกัน และสามารถเก็บค่าส่วนสูงและน้ำหนักไปประมวลผลได้ แต่ที่แน่ๆผมรับรองว่างานนี้ ง่ายมว๊ากกก ก ไก่ ล้านตัว สิ่งที่จะได้เรียนรู้จากบทความนี้
เมื่อทราบขั้นตอนแล้ว ขอให้ผู้อ่านเอามือจับติ่งหูตัวเองไว้ แล้วนับ 1.2.3 ไปลุยกันเลย! 2. การสอน Bot ให้เข้าใจบทสนทนาด้วย Dialogflowขั้นตอนนี้ถือเป็นพระเอกของงาน ตัว Dialogflow เป็นเครื่องมือในการพัฒนาให้ Bot มันเข้าใจบทสนทนา(Conversation Development Tool) ที่เราสามารถหยิบไปใช้ได้ทันที ไม่ต้องพัฒนาตัว NLP เอง แถมรองรับภาษาไทยด้วย ว่าแล้วก็เปิด https://console.dialogflow.com ขึ้นมาเลย จะเจอหน้าตาแบบนี้ อย่าได้ช้าที เร่ง Sign in ด้วย Google Account โดยพลัน ครั้น sign in แล้วก็กด CREATE AGENT ต่อในหน้านี้ จะเจอหน้าสำหรับการสร้าง Agent แบบนี้
ตัวอย่างนี้ ผมจะเลือกสร้าง Google Project ใหม่เลย ให้กด CREATE เบาๆ จากนั้นจะเจอหน้าแรกของ Agent ที่เราสร้างแล้ว โดยในหน้านี้ จะมี Intent พื้นฐานมาให้ 2 ตัว จากนี้ไปจะขออธิบายเรื่องของ Intent หรือความปรารถนาของผู้ใช้ในแต่ละเรื่องเป็นข้อๆนะครับ 2.1 Default Fallback Intentหน้าที่ของ Intent ตัวนี้คือ เมื่อไรที่ผู้ใช้ป้อนอะไรมาแล้วมันไม่เข้าใจ มันจะวิ่งเข้า Intent ตัวนี้ ลองกดเข้าไปดูหน่อย จะพบว่ามี section ที่ชื่อ Responses มีข้อความที่แสดงความไม่เข้าใจกรอกไว้เป็นตัวอย่างหลายบรรทัดเลย ซึ่งเมื่อเราใช้งานจริงก็จะพบว่า หากเราพิมพ์อะไรที่มันไม่เข้าใจ มันจะสุ่มคำพูดใน responses ตอบกลับไปให้ 2.2 Default Welcome Intentหน้าที่ของ Intent ตัวนี้คือการทักทายกลับ กดเข้าไปดูจะพบว่าจะมีส่วนที่ชื่อ Training Phrases ที่สอนให้ Dialogflow เข้าใจว่าเมื่อผู้ใช้พิมพ์คำที่อยู่ในบริบท หรือ context เหล่านี้เข้ามา ก็ให้สุ่มคำตอบใน Responses กลับไป ย้ำว่าบริบทนะครับ ก็คือไม่ต้องเป๊ะ มันจะพยามเข้าใจเอง 2.3 BMI Intentถึงคิวเราสร้าง Intent เองละ เริ่มเลยที่เมนู Intent ให้กดตุ่ม CREATE INTENT ตั้งชื่อ Intent ตามใจชอบ ตัวอย่างผมตั้งว่า BMI จากนั้นมองมาที่ Training phrases ให้เรากรอกประโยคที่ผู้ใช้น่าจะพิมพ์มาเพื่อถามถึง BMI ของตนเอง ใส่ไปเลย ยิ่งหลากหลายยิ่งดี เพราะ Dialogflow จะเรียนรู้และทำความเข้าใจจากประโยคเหล่านี้นี่หละ เมื่อใส่จนพอใจแล้ว ก็ไถลงมาด้านล่าง ในส่วนของ Responses เราสามารถเลือกการตอบกลับหาผู้ใช้ได้ 2 วิธี
มาดูตัวอย่างกัน โดยผมจะมีทั้ง Text response ที่ตอบกลับไปโดยมุ่งหมายให้ผู้ใช้กรอกน้ำหนักที่เป็น kg และ ส่วนสูงที่เป็น cm มาให้ และแถม Custom payload ให้อีกอันเพื่อให้เห็นภาพและเข้าใจว่าผลลัพธ์ถัดไปจะเป็นอย่างไร เราจะเพิ่ม Responses ทั้ง text และ custom เท่าไรก็ได้ผ่านตุ่มชื่อ ADD RESPONSES Custom payload ที่เป็น JSON จะเริ่มด้วย line และตามด้วย Message Object ที่ต้องการ ซึ่งเราสามารถเลือกระบุเป็น Flex Message, Imagemap Message, Template Messages และรูปแบบอื่นๆก็ได้ { }ผมขอแอบเอาผลลัพธ์บน LINE มาให้ดูก่อน จะเห็นว่าถามไป 1 ตอบกลับมา 2 bubbles เลย และทีเด็ดคือตอน Training Phrases ผมไม่ได้ระบุประโยคว่า “ผมอ้วนอ๊ะป่าว” แต่มันเข้าใจบริบทเองว่าน่าจะหมายถึงการถามเรื่องนี้ เจ๋งป๊ะหละ Dialogflow จะใช้ส่งข้อความกลับมาผ่านการ Reply ใน Messaging API 2.4 BMI - custom Intentกลับมาหน้าหลักของ Intent อีกครั้ง
เมื่อเข้ามาจะเจอว่า Intent นี้มี Contexts โผล่มาแล้วแฮะ ทั้งนี้ก็เนื่องจากว่า BMI - custom Intent ถูกสร้างภายใต้ BMI Intent นั่นเอง จึงมีการควบคุมบริบทในการทำงานต่อเนื่อง แปลว่า ผู้ใช้จะไม่สามารถกระโดดเข้า Intent นี้ได้เลยหากไม่ผ่าน BMI Intent มาก่อน (ตรงนี้ดี ทำให้กระโดดไปมั่วไม่ได้) 3. ชื่อ Intent เราสามารถแก้ได้เพื่อให้สื่อความหมายมากที่สุด 4. เป็น context ที่ถูกสร้างอัตโนมัติและเป็น input ที่ถูกส่งมาจาก BMI Intent แต่สังเกตไหมว่าด้านล่างกรอบเบอร์ 4 ที่ชื่อ Add output context ยังว่าง นั่นก็เพราะยังไม่มี Intent มาอยู่ภายใต้ BMI — custom Intent นั่นเอง ถัดไปให้ไถลงไปจนเจอส่วนที่ชื่อว่า Action and parameters ตรงส่วนนี้เราจะมากำหนดตัว param กัน ซึ่ง BMI Bot ต้องการ น้ำหนักและส่วนสูง 5. เลือกต่อเมื่อ param ตัวนี้จำเป็นที่จะต้องได้มา 6. ตั้งชื่อ param ให้สื่อความหมายกับสิ่งที่ต้องการเก็บ 7. ประเภทของ value ที่จะเข้ามา กรณีนี้คือ น้ำหนักและส่วนสูง จึงตั้งเป็น number 8. ตั้งชื่อตัวแปร นำหน้าด้วย $ เพื่อนำไปแสดงผลในขั้นตอน Responses 9. ถ้าเลือกข้อ 5 ไว้ จะมี Prompts ขึ้นมาให้กรอก และมันจะแสดงผลกรณีที่ Dialogflow ไม่สามารถเก็บค่านั้นมาได้ ในที่นี้ก็คือค่าน้ำหนัก โดยเราสามารถมีได้หลายประโยคผ่านการเว้นบรรทัด สำหรับ BMI Bot ก็ให้เราสร้าง param ทั้งน้ำหนักและส่วนสูงไว้นะครับ เสร็จแล้ว ก็ให้ไถกลับขึ้นไปที่ส่วนของ Training Phrases แล้วก็ให้กรอกประโยคที่ผู้ใช้น่าจะพิมพ์มา หลังจากที่ก่อนหน้านี้ เราถามเรื่องน้ำหนักและส่วนสูงกับเขาไป เอาหละลงมือ ยิ่งหลากหลายยิ่งดี ใส่ไปๆ 10. เมาส์ลากสิ่งที่คิดว่าเป็น น้ำหนัก และ ส่วนสูง 11. ลากแล้วจะมี dialog ขึ้นมาให้เลือก เราก็เลือกส่วนสูงหรือน้ำหนักที่เราสร้างไว้ 12. ให้มั่นใจว่า value ตรงกับที่เราต้องการ 13. ในกรณีที่มันจับ param ให้อัตโนมัติหรือลากไม่ตรง ก็ลบออกได้ ขั้นตอนสุดท้ายของ BMI - custom Intent นี้ ก็คือการระบุ Responses เพื่อขอให้ผู้ใช้ยืนยันว่า Dialogflow เก็บข้อมูลมาได้ถูกต้อง เสร็จแล้วก็กดตุ่ม SAVE ไป 2.5 BMI - custom - no Intentให้เราสร้าง Intent ภายใต้ BMI - custom Intent โดยกด Add follow-up intent แล้วเลือก no ซึ่งถ้าทำถูกรูปมันจะเป็นลำดับชั้นแบบนี้ คลิกเลือก BMI - custom - no เบาๆ แล้วไถลงมาในส่วนของ Training Phrases จะพบว่า มีประโยคต้นแบบเตรียมมาให้แล้วนี่ ที่เป็นแบบนั้นเพราะเราเลือกประเภท Intent ตอนสร้างเป็น no นั่นเอง Dialogflow จึงมีประโยคที่เตรียมมาให้เหมาะกับ Intent ประเภทนั้นๆไว้ เราสามารถเพิ่มประโยคหรือคำเข้าไปได้อีกนะ เช่นผมเพิ่ม no เข้าไปด้วย ถัดไป ไถต่อมาที่ส่วนของ Responses ตรงนี้ลองจิ้นดูว่า ถ้าผู้ใช้งานตอบว่า นี่ไม่ใช่ส่วนสูงและน้ำหนักของฉัน เราจะตอบกลับว่าอย่างไร ตัวอย่างผมก็ตอบกลับไปว่า เอ แล้วตอบแบบนี้ ผู้อ่านก็เข้าใจทันทีว่าผมอยากให้มันวิ่งกลับไปที่ BMI - custom Intent ใช่มะ คำตอบก็คือใช่ หลังจากผู้ใช้ยืนยันแล้วว่านี่ไม่ใช่น้ำหนักและส่วนสูงของฉัน ผมก็อยากให้ Bot ถามกลับไปประมาณว่า “ช่วยกรอกน้ำหนักส่วนสูงอีกทีได้มะ” แต่ในความเป็นจริงมันจะกลับไปไม่ได้หรอก เพราะอย่าลืมว่า BMI - custom - Intent(2.4) มันจะรับ input context ชื่อ BMI-followup ซึ่งผู้ใช้จะกระโดดเข้าไม่ได้ ถ้าไม่มี context นี้ส่งไป ดังนั้นเราจะต้องส่ง context ไปให้นั่นเอง มันจึงจะทำงานต่อเนื่องกันได้ เอาหละไถกลับขึ้นไปเติม BMI-followup ที่ช่อง output context จาก Intent นี้กันเลย ไหนๆก็ไหนๆละ ขออธิบายเลข 2 ที่วงนี้หน่อย เลขตรงนี้เราสามารถระบุกับ output context เพื่อให้มัน save state ไว้ จากตัวอย่างนี้ เมื่อผู้ใช้ตอบว่า “ไม่ใช่” Dialogflow จะขอให้ผู้ใช้บอกน้ำหนักและส่วนสูงอีกครั้งพร้อมส่ง BMI-followup ไปยัง Intent ที่รับ BMI-followup อยู่ นั่นก็คือ BMI - custom - Intent(2.4) ซึ่ง Traning Phrases ที่ BMI - custom - Intent คาดหวังไว้คือให้ผู้ใช้กรอกน้ำหนักและส่วนสูง แต่หากผู้ใช้กรอกเรื่องอื่นที่ไม่ตรงกับบริบทน้ำหนักและส่วนสูง จะสามารถกรอกมั่วได้แค่ครั้งเดียว ถ้ามั่วถึง 2 ครั้งเมื่อไร จะหลุดออกจาก context ทั้งหมด นั่นก็หมายความว่า ออกไปเริ่มใหม่นั่นเอง 2.6 BMI - custom - yes Intentให้เราสร้าง Intent ภายใต้ BMI - custom Intent โดยกด Add follow-up intent แล้วเลือก yes เสร็จแล้วก็คลิกที่ Intent นั้น จากนั้นไถลงมาในส่วนของ Training Phrases จะพบว่า มีประโยคที่บ่งบอกถึงการยอมรับเตรียมไว้แล้ว เหมือนเดิมคือกรอกเพิ่มได้นะ เช่นผมกรอก Yes ไป ถัดไปส่วนของ Action and parameters ให้เราสร้างตัวแปร weight และ height อีกครั้ง แต่ครั้งนี้ value เราจะไม่ถามผู้ใช้ใหม่ เราจะเอามาจาก Intent ก่อนหน้านี้ 2.4 โดยวิธีการก็คือ ใช้ # นำหน้าชื่อ context ที่ส่งเข้ามา แล้วตามด้วย .ชื่อ param ใน 2.4 จำชื่อ input context ไม่ได้ก็ไถขึ้นไปด้านบนสุด สุดท้ายก็ใส่ Responses สักหน่อย เป็นอันจบขั้นตอนนี้ 3. Test & Train in advanceเมื่อเราสร้าง Intent เสร็จเรียบร้อยแล้ว เราก็สามารถทดสอบผ่านหน้า Dialogflow ได้เลย ว่าการทำงานเป็นไปตามที่คาดหวังไว้ไหม โดยให้เรามองไปทางขวาที่หน้าไหนก็ได้ใน Dialogflow Console จะเจอช่องที่ชื่อ Try it now ให้เราทดสอบจากตรงนั้นหละ มาดูตัวอย่างกัน จากตัวอย่างด้านบนนี้จะมีเรื่องที่น่าสนใจเรื่องหนึ่ง นั่นก็คือตอนผมตอบยืนยันด้วยคำว่า “ถั่วต้ม” แน่นอน Dialogflow ต้องไม่เข้าใจแน่ๆว่านี่คือการยืนยัน ก็เพราะภาษาไทยมีศัพท์แสลงศัพท์วัยรุ่นเยอะ ดังนั้นถ้าเราอยากให้มันเข้าใจว่า “ถั่วต้ม” คือ “ถูกต้อง” มี 2 วิธีด้วยกันคือ
จะเจอประวัติที่เราทดสอบไปก่อนหน้านี้ “สวัสดีครับ” ให้คลิกแรงๆ คราวนี้เราจะเห็นรายละเอียดที่เราทดสอบไปละ ว่าประโยคไหนเข้ากับ Intent ไหน หรือไม่เข้ากับ Intent เลย ในรูปที่วงไว้ก็คือถั่วต้มที่ตามหา ให้คลิก Click to assign ไป จากนั้นให้เลือก Intent ที่หมายถึงการยอมรับตกลงเรื่อง BMI ตามรูป เสร็จแล้วก็กดตุ่ม Approve ที่มุมขวาบนได้เลย แต่เพื่อเป็นการยืนยันว่า ถั่วต้ม ได้ถูกเลือกไป train แล้ว ให้เราไปที่ BMI - cutom - yes Intent อีกครั้งครับ จ้องมองในส่วน Training Phrases ถ้าเจอถั่วต้มก็ผ่านละ 4. การเปิดใช้งาน Fulfillment และประมวลผลผ่าน Firebaseเมื่อเราสอน Dialogflow ให้เข้าใจการสนทนาในบริบทที่เกี่ยวข้องเรียบร้อยแล้ว คราวนี้ก็ถึงเวลาส่งค่าน้ำหนักและส่วนสูงไปยังระบบหลังบ้าน โดยให้เราเข้าไปที่ Intent ที่ผู้ใช้ยืนยันว่าข้อมูลน้ำหนักและส่วนสูงถูกต้อง ตัวอย่างของผมก็คือ BMI - custom - yes ในหน้า Intent นั้นให้ไถลงมาจนสุดซอย จะเจอส่วนที่ชื่อ Fulfillment เห็นแล้วก็ให้กด toggle เปิด Enable webhook call for intent และกด save ในบัดดล เมื่อเสร็จจากตรงนี้ก็ให้ไปคลิกเมนู Fulfillment ที่อยู่ด้านซ้าย ในหน้านี้เราสามารถเลือกพัฒนาระบบหลังบ้านได้ 2 วิธี คือ
แน่นอนหละ ผมสาวก Firebase นี่นา ตัวอย่างนี้ผมจึงเลือกวิธี Inline Editor ว่าแล้วก็ toggle เปิดมันขึ้นมาจะมีโค้ดตัวอย่างมาให้ ถึงตรงนี้ผมพูดเลยว่าแค่ดูโค้ดก็พอเข้าใจละ จะเห็นว่ากรอบด้านล่างจะใช้ชื่อ Intent ต้นแบบ นั่นก็คือ Welcome และ Fallback มาจับคู่กับฟังก์ชันที่เขียน ที่สำคัญชื่อ Intent ต้องเป๊ะนะ ลองดูภาพปลากรอบ เมื่อเดาได้ดังนั้น ก็ละเลงโค้ดได้เลย จากโค้ดด้านบนนี้ ขออธิบายเพิ่มเติมดังนี้ครับ
เขียนเสร็จแล้วก็กด Deploy แล้วก็นับหนึ่งถึงสามล้านรอจนเห็นข้อความแบบนี้ ถ้าไม่เห็น ให้เอาเมาส์ไถขึ้นไถลงเหมือนตอนไปขูดหวย แล้วมันจะมาให้เห็น อันนี้เพื่อนผมบอกมาอีกที ไม่เชื่ออย่าลบหลู่นะครับ 5. การเชื่อมต่อ LINE Bot เข้ากับ Dialogflowหลังจากที่เราทดสอบกับ simulator ใน Dialogflow จนเป็นที่น่าพอใจแล้ว คราวนี้ก็ถึงเวลาเอามาใช้งานจริงกับ LINE Bot ที่เราได้สร้างทิ้งไว้ในข้อ 1 เริ่มต้นจากการคลิกเมนู Integration ทางด้านซ้ายใน Dialogflow ในหน้า Integration นี้เราจะเจอผู้ให้บริการมากมายที่รองรับการเชื่อมต่อกับ Dialogflow อะ รอรัยอะ กด toggle ที่ LINE เสะ ในหน้านี้เราจะต้องแลกเปลี่ยนข้อมูลกันระหว่าง LINE กับ Dialogflow ละ โดย 3 ช่องแรก Channel ID, Channel Secret และ Channel Access Token ได้มาจาก Channel ในขั้นตอนที่ 1 https://developers.line.me/console/ ถัดมาช่องที่ 4 ช่องนี้ทาง Dialogflow จะสร้างตัว Webhook URL มาให้เรา ดังนั้น copy มันซะ แล้วไปเติมในช่อง Webhook URL ใน Channel ของขั้นตอนที่ 1 กรอกเสร็จก็ให้เรากด START ได้เลย จากนั้นเรามาลองดูผลลัพธ์กับการใช้งานผ่าน LINE Bot กัน…ทะ ทะดะแดม แถ่มแถ่ม แถ่ม แทม แท้ม BMI Bot สิ่งที่ได้เรียนรู้ก่อนหน้านี้เวลาผมและ Warit Wanwithu ออกไปสอน workshop ให้บุคคลภายนอก ก็จะสอนให้เขียนโค้ดสดทั้งหมด ซึ่งบางครั้งเป็น Node.js บางครั้งก็ PHP และปัญหาหนึ่งที่พวกเราเจอกันบ่อยๆ ก็คือการ setup(ซีตุ๊ป) environment แต่จากบทความนี้ จะเห็นว่าเราไม่ต้องให้ผู้เข้าอบรมเตรียม environment ใดๆ และเพื่อความมั่นใจผมก็เลยทดลองสอนบุคคลภายในบริษัทตามในบทความนี้ ปรากฏว่า ภายใน 1 ชม. มีคนทำ LINE Bot ตัวนี้เสร็จมากกว่า 80% ด้วยเหตุนี้ ผมจะเลือกใช้วิธีนี้ในการออกไป workshop ครั้งต่อๆไป ด้วย Chatbot ที่สร้างจากบทความนี้มีความเก่งในการเข้าใจ conversation ต่างๆ พัฒนาง่ายกว่า และใช้เวลาสั้นกว่า ดีขนาดนี้ทำไมจะไม่ใช้จริงมะ |