เผยวิธีทำให้ LINE ใช้ Bot กับ Chat พร้อมกันได้

Sitthi Thiammekha
LINE Developers Thailand
4 min readJan 14, 2020

มีคำถามเข้ามาเยอะมาก ว่าทำอย่างไร จะให้ bot ทำงานได้ ในขณะที่ admin ก็สามารถ chat แบบ 1-on-1 กับลูกค้าได้ด้วย

ถ้าตอบแบบสั้นๆก็คือ

  • ให้ใช้งาน Bot Mode เพื่อใช้งาน Messeging API
  • เขียนโปรแกรม เก็บทุกๆ Webhook Event (ข้อความแชทและอื่นๆ) ลง Database ก่อนจะทำงานตาม flow ปกติของ Bot
  • สร้าง web application เพื่อดึงข้อมูล (ข้อความแชท) นั้นมาแสดงผล
  • มีช่อง text input ให้ admin พิมพ์ตอบลูกค้า
  • เมื่อ admin พิมพ์ ก็เรียก Push/Reply API ของ LINE Messaging API เพื่อตอบกลับลูกค้า
  • ส่วนการเลือกว่าจะใช้ Push หรือ Reply นั้น ขึ้นอยู่กับระยะเวลาที่ admin ตอบ ถ้าตอบทันที (ไม่เกิน 30 วินาที) ก็สามารถใช้ reply ได้ แต่ถ้าเกินกว่านั้น ต้องเปลี่ยนไปใช้การ push แทน
  • ข้อควรระวัง คือ ทุกๆข้อความที่ admin พิมพ์ และใช้ push ออกไป จะมีการคิดจำนวนข้อความตาม package ที่เลือก หากใช้เกินจากโควต้าที่กำหนด ก็จะมีค่าใช้จ่ายเกิดขึ้น (ยกเว้น Free Package ที่ไม่เสียเงินเพิ่ม แต่จะส่งข้อความไม่ออกเลย)
  • ต่างจากการ chat ผ่าน OA Manager ซึ่งไม่มีค่าใช้จ่ายใดใด

เมื่อทำตามนี้ ผลลัพธ์ที่ได้ ก็จะประมาณนี้

ดูเหมือนไม่มีอะไรซับซ้อน แต่ความยากมันอยู่ที่ จะทำยังไงให้ admin เห็นข้อความที่ Bot ตอบกลับไปที่ลูกค้าด้วย เพื่อที่จะได้ทราบว่าลูกค้าคุยอะไรกับ Bot ไปแล้วบ้าง

วิธีทำให้ Admin เห็นข้อความที่ลูกค้า คุยกับ Bot

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

จากการที่ได้พัฒนาระบบลักษณะนี้ให้กับลูกค้าหลายราย และล่าสุดได้เปิดระบบให้คนนอกใช้งานด้วย ในรูปแบบ Close beta ก็พอจะสรุปรูปแบบต่างๆของการพัฒนา LINE Chatbot ได้ 2 รูปแบบหลักๆดังนี้

A) ต่อ LINE เข้ากับ webhook ของ Bot APIโดยตรง

B) ต่อ LINE เข้ากับ Integration ของ Dialogflow

Remark : Bot API ในที่นี้ หมายถึงการสร้าง API endpoint เพื่อทำงานร่วมกับ Messeging API ไม่ว่าจะเป็น การตั้ง server เองหรือ การใช้ cloud เช่น Cloud Functions for Firebase หรือ heroku เป็นต้น

ถ้าใคร advance หน่อย ก็อาจจะมีท่าที่ใช้ Bot API ทำงานร่วมกับ Dialogflow ด้วย เช่น

C) ต่อ LINE เข้ากับ webhook ของ Bot API และมีการ forward บาง message ไปที่ Dialogflow

D) ต่อ LINE เข้ากับ webhook ของ Bot API และมีการเรียกใช้ Dialogflow โดยการเรียกใช้งาน Detect Intent API ของ Dialogflow

E) ใครมีท่าอื่นๆอีก แนะนำเข้ามาได้นะครับ

ทั้งหมดนี้ ไม่ว่าจะใช้ท่าไหนอยู่ ก็สามารถทำระบบ Bot+Chat ได้ทั้งสิ้น เดี๋ยวจะค่อยๆเรียบเรียงให้ดู ทีละกรณี

เริ่มกันด้วยท่าง่ายก่อน สำหรับกรณีแรก

A) กรณีต่อ LINE เข้ากับ webhook ของ Bot API โดยตรง

ท่านี้ง่ายและตรงไปตรงมาที่สุด

การรับข้อความจากผู้ใช้

  • handle webhook event แล้วเก็บลงฐานข้อมูล (แนะนำพวก NoSQL database)

การส่งข้อความออก

  • บันทึกข้อความที่จะส่ง ลง database ก่อน push/reply message

B) กรณีต่อ LINE เข้ากับ Integration ของ Dialogflow

ท่านี้มีคือกรณีที่ทำ Bot ด้วย Dialogflow ไม่ว่าจะมีการใช้ Fulfillment (ต่อไป ขอเขียน Fulfillment อย่างย่อว่า FF) ร่วมด้วยหรือไม่ก็ตาม

การรับข้อความจากผู้ใช้

  • เนื่องจาก Dialogflow ไม่ได้มี database ให้เราเก็บข้อมูลได้ จึงจำเป็นต้องใช้ FF เพื่อเชื่อมต่อกับ database เอง
  • ต้อง Enable Webhook Call สำหรับทุกๆ Intent (ไม่ว่า Flow การทำงานเดิมจะมีการใช้ FF หรือไม่ก็ตาม) เพื่อส่งไปให้ FF เก็บ event (agent.originalRequest.payload.data) ลง database แล้วค่อยให้ทำงานตาม Function ปกติ(ถ้ามี)

การส่งข้อความออก

  • ให้ FF บันทึกข้อความที่จะส่ง ลง database ก่อน แล้วค่อยเรียก agent.add(xxx)
  • ข้อเสียที่ต้องระวังคือ FF สามารถตอบกลับข้อความได้แค่ 1 bubble เท่านั้น
  • กรณีต้องการส่งข้อความมากกว่า 1 bubble ต้องใช้วิธีการ call Push API ไปที่ Messeging API เอง ซึ่งต้องไม่ลืมบันทึกข้อความลง database ก่อนส่งออกด้วย

C) กรณีต่อ LINE เข้ากับ webhook ของ Bot API และมีการ Forward บาง message ไปที่ Dialogflow

สำหรับบางคนที่ใช้ Dialogflow มาระยะหนึ่งจะพบข้อจำกัดว่า Dialogflow ยังไม่รองรับพวก Postback Message หรือ Image Message เป็นต้น ก็ต้องใช้วิธีการสร้าง Bot API ขึ้นมารับ event ก่อน อันไหนเป็น Text ค่อยส่งไป Dialogflow ถ้าเป็น Message Type อื่นๆ ก็ให้ Bot API ดำเนินการเอง

แบบนี้การรับข้อความจะง่ายเพราะเราสามารถ handle webhook event ลง database ได้ทันที แต่ความยากจะอยู่ที่ตอนส่งข้อความออก เพราะการ Forward Request ไปที่ Dialogflow จะทำให้ Dialogflow ทำงานเสมือนแบบเดียวกับข้อ B นั่นคือเราต้องไป เก็บข้อความที่จะส่งออกที่ FF แทน

การรับข้อความจากผู้ใช้

  • Bot API ทำการ handle webhook event แล้วเก็บลงฐานข้อมูล (เหมือน A)
  • ข้อแตกต่างจากกรณี B คือ ไม่ต้องบันทึกข้อความขาเข้าที่ FF แล้ว เพราะ Bot API ได้จัดเก็บไปแล้ว

การส่งข้อความออก

  • ข้อความที่ส่งออกจาก Bot API ให้ บันทึกข้อความที่จะส่ง ลง database ก่อน push/reply message (แบบเดียวกับกรณี A)
  • ที่ Dialogflow ต้อง Enable Webhook Call สำหรับทุกๆ Intent (ไม่ว่า Flow การทำงานเดิมจะมีการใช้ FF หรือไม่ก็ตาม) เพื่อส่งไปให้ FF จัดเก็บข้อความส่งออกลง database
  • ให้ FF บันทึกข้อความที่จะส่ง ลง database ก่อน แล้วค่อยเรียก agent.add(xxx)
  • ข้อเสียที่ต้องระวังคือ FF สามารถตอบกลับข้อความได้แค่ 1 bubble เท่านั้น
  • กรณีต้องการส่งข้อความมากกว่า 1 bubble ต้องใช้วิธีการ call Push API ไปที่ Messeging API เอง ซึ่งต้องไม่ลืมบันทึกข้อความลง database ก่อนส่งออกด้วย

เริ่มเห็นความวินาศสันตะโรแล้วใช่มั้ย ลองมาดูวิธีสุดท้ายกันครับ

D) กรณีต่อ LINE เข้ากับ webhook ของ Bot API และมีการเรียกใช้ Dialogflow โดยการเรียกใช้งาน Detect Intent API ของ Dialogflow

วิธีนี้ เป็นวิธีที่ผมแนะนำ สำหรับการทำงานของ Bot API ร่วมกับ Dialogflow เพราะเราสามารถจัดการส่วนต่างๆได้ทั้งหมด แล้วปล่อยให้ Dialogflow ทำหน้าที่เป็นแค่ Intent Analyzer เท่านั้น หลังจาก Dialogflow ทำการวิเคราะห์ Intent เสร็จ ก็แค่ตอบกลับมาว่า ต้องตอบผู้ใช้อย่างไร Bot API จะนำ Response ที่ได้จาก Dialogflow นั้น มาส่งถึงผู้ใช้ด้วยตัวเอง

สำหรับใครที่ใช้วิธีนี้อยู่ การทำ Chat+Bot ก็ไม่ยาก (มาก)

การรับข้อความจากผู้ใช้

  • Bot API ทำการ handle webhook event แล้วเก็บลงฐานข้อมูล (เหมือน A)
  • แล้วค่อยเรียก DetectIntent API ของ Dialogflow ดูตัวอย่างเพิ่มเติมได้ที่ link นี้

การส่งข้อความออก

  • ข้อความที่ส่งออกจาก Bot API ให้ บันทึกข้อความที่จะส่ง ลง database ก่อน push/reply message (แบบเดียวกับกรณี A)
  • ที่ Dialogflow ไม่จำเป็นต้อง Enable Webhook Call สำหรับทุกๆ Intent อีกแล้ว เพราะเราจัดการข้อความทั้งขารับและขาส่งที่ Bot API เองแล้ว
  • เรียกได้ว่าแทบไม่ต้องไปแตะต้องอะไรกับ Dialogflow เลย เพียงแค่นำ Response ที่ได้จากการเรียก DetectIntent API มาถอด payload ออกมา (response.queryResult.fulfillmentMessages) แล้วบันทึกลง database ก็เป็นอันเรียบร้อย
  • ดูข้อมูลการเรียก DetectIntent API ได้ที่ https://cloud.google.com/dialogflow/docs/reference/rest/v2/projects.agent.sessions/detectIntent

เป็นยังไงกันบ้างครับ หวังว่าคงพอเป็นแนวทางให้กับ developer ที่กำลังต้องพัฒนาระบบ Chat+Bot ขึ้นมาใช้งานได้นะครับ

หากใครมีแนวทางที่น่าสนใจอื่นๆ ก็เอามาแลกเปลี่ยนกันเพิ่มเติมได้นะครับ

ส่วนใครที่ต้องใช้งาน แต่ไม่อยากพัฒนาระบบขึ้นมาเอง ผมมีระบบที่เปิดให้ใช้ฟรี เป็น Open Beta อยู่นะครับ หน้าตาประมาณนี้

ใครสนใจก็เข้าไปลงทะเบียนใช้งานได้เลยครับ ที่ https://ex10.tech/

ศึกษาวิธีการใช้งานได้ที่ https://medium.com/linedevth/bc41f22f3df4

จบปิ๊ง 😍😍😍

--

--