1. บทนำ
อัปเดตล่าสุด 23-08-2021
การโอนตัวแทนแบบเรียลไทม์ด้วย Business Messages
ฟีเจอร์การโอนตัวแทนแบบเรียลไทม์ของ Business Messages ช่วยให้ตัวแทนเริ่มการสนทนาในฐานะบ็อตและเปลี่ยนการสนทนาระหว่างการสนทนาเป็นตัวแทนแบบเรียลไทม์ได้ (ตัวแทนที่เป็นมนุษย์) บ็อตสามารถจัดการคำถามที่พบบ่อย เช่น เวลาทำการ ในขณะที่ตัวแทนแบบเรียลไทม์สามารถมอบประสบการณ์การใช้งานที่กำหนดเองพร้อมเข้าถึงบริบทของผู้ใช้ได้มากขึ้น เมื่อการเปลี่ยนผ่านระหว่างประสบการณ์ทั้งสองเป็นไปอย่างราบรื่น ผู้ใช้จะสามารถตอบคำถามได้อย่างรวดเร็วและถูกต้อง ซึ่งส่งผลให้อัตราการมีส่วนร่วมในผลตอบแทนสูงขึ้นและความพึงพอใจของลูกค้าเพิ่มขึ้น
Codelab นี้จะสอนวิธีใช้ฟีเจอร์การโอนตัวแทนแบบเรียลไทม์ให้เกิดประโยชน์สูงสุด
สิ่งที่คุณจะสร้าง
ใน Codelab นี้ คุณจะสร้างเว็บฮุคสำหรับตัวแทนที่ส่งและรับเหตุการณ์การโอนตัวแทนแบบเรียลไทม์ได้ คุณจะต้องใช้ UI พื้นฐานจากรหัสเริ่มต้นเพื่อทดสอบสิ่งที่คุณสร้างขึ้น
สิ่งที่คุณจะได้เรียนรู้
- วิธีจัดเก็บและจัดการสถานะการสนทนา
- วิธีใช้ Business Messages เพื่อส่งกิจกรรมการโอนตัวแทนแบบเรียลไทม์
- วิธีตั้งค่าเว็บฮุคและ UI พื้นฐานสำหรับการเข้าร่วมการสนทนาในฐานะตัวแทน
- แนวทางปฏิบัติแนะนำในการใช้ Business Messages API
Codelab นี้มุ่งเน้นการใช้ Business Message API เพื่อติดตั้งใช้งานการโอนตัวแทนแบบสด คุณจะอ่านโค้ดเริ่มต้นสำหรับแต่ละขั้นตอนได้ แต่ต้องติดตั้งใช้งานเฉพาะโค้ดที่เกี่ยวข้องกับ Business Messages เท่านั้น
สิ่งที่คุณต้องมี
- ตัวแทน Business Messages รวมถึงคีย์บัญชีบริการ คุณสามารถสร้างตัวแทนได้โดยทำตามคู่มือสร้างตัวแทน
- การกำหนดค่า Cloud Datastore ที่ใช้งานอยู่ซึ่งลิงก์กับโปรเจ็กต์ GCP ของตัวแทน คุณสามารถใช้การเริ่มต้นใช้งาน Cloud Datastore อย่างรวดเร็วเพื่อตั้งค่าได้ คุณไม่จำเป็นต้องทราบวิธีใช้ Cloud Datastore
- คอมพิวเตอร์ที่ติดตั้ง Google Cloud SDK และ Node.js (เวอร์ชัน 10 ขึ้นไป) แล้ว
- อุปกรณ์ Android (เวอร์ชัน 5 ขึ้นไป) หรืออุปกรณ์ iOS สำหรับการทดสอบประสบการณ์ของผู้ใช้
- ประสบการณ์ในการเขียนโปรแกรมเว็บแอปพลิเคชัน คุณจะเขียนโค้ด JavaScript เพียงเล็กน้อยและอาจต้องแก้ไขข้อบกพร่องของสิ่งที่คุณเขียน
2. สร้างบ็อต Echo
ในขั้นตอนนี้ คุณจะต้องทำให้ตัวแทนบ็อตพื้นฐานที่เรียกว่า "บ็อต Echo" ใช้งานได้ บ็อตนี้จะบันทึกข้อความของผู้ใช้ บันทึกไว้ในชุดข้อความการสนทนาใน Cloud Datastore แล้ว "เสียงสะท้อน" ข้อความของผู้ใช้โดยการตอบกลับด้วยเนื้อหาเดียวกัน เมื่อมีบ็อตพื้นฐานและโครงสร้างพื้นฐานการบันทึกแล้ว คุณจะเพิ่มต่อเพื่อสร้างการติดตั้งใช้งาน Agent แบบเรียลไทม์เต็มรูปแบบในขั้นตอนถัดไปได้
รับรหัสเริ่มต้น
โคลนรหัสเริ่มต้นของการโอน Agent สดไปยังไดเรกทอรีที่ใช้งานได้ของโปรเจ็กต์ด้วยคำสั่งต่อไปนี้ในเทอร์มินัล
git clone https://github.com/google-business-communications/bm-nodejs-live-agent-transfer
ทำความเข้าใจโค้ดเริ่มต้น
ลองมาดูโครงสร้างโค้ดเริ่มต้นที่คุณจะร่วมงานด้วยตลอดทั้ง Codelab กัน
ไปที่ไดเรกทอรี step-1
และดูเนื้อหา ซึ่งประกอบด้วยองค์ประกอบต่อไปนี้
- bin: ไดเรกทอรีนี้มีสคริปต์เริ่มต้น www ซึ่งจะตั้งค่าและกำหนดค่าเซิร์ฟเวอร์
- libs: ไดเรกทอรีนี้ประกอบด้วย
datastore_util.js
ซึ่งมีวิธีที่สะดวกสำหรับการอ่านและการเขียนจาก Cloud Datastore คุณไม่จำเป็นต้องเข้าใจวิธีการทำงานของไฟล์นี้ เพียงจดบันทึกวิธีการที่ใช้ได้และสิ่งที่พวกเขาทำ - ทรัพยากร: จะมีคีย์บัญชีบริการเป็นไฟล์ชื่อ
credentials.json
- เส้นทาง: ไฟล์
index.js
มีเว็บฮุคและวิธีการช่วยเหลือทั้งหมดของเว็บฮุค นี่คือไฟล์หลักที่คุณจะใช้และเพิ่มไฟล์ได้ - views คือไดเรกทอรีนี้มีไฟล์เทมเพลต EJS สําหรับองค์ประกอบ UI ซึ่งจะมีไฟล์อื่นๆ อีกในขั้นตอนถัดไป
- app.js, app.yaml, package.json: ไฟล์เหล่านี้จะกำหนดค่าแอปพลิเคชันและทรัพยากร Dependency ของแอป
ก่อนทำให้ใช้งานได้ ให้ดาวน์โหลดคีย์บัญชีบริการ GCP แล้วคัดลอกไฟล์ข้อมูลเข้าสู่ระบบ JSON ไปยังไดเรกทอรีทรัพยากรแต่ละรายการในโค้ดตัวอย่าง ทำขั้นตอนนี้ในทุกขั้นตอนของ Codelab
cp credentials.json bm-nodejs-live-agent-transfer/step-<step number>/resources/credentials.json
การทำให้โค้ดเริ่มต้นใช้งานได้
ในเทอร์มินัล ให้ไปที่ไดเรกทอรี step-1
ของตัวอย่าง จากนั้นตั้งค่าเครื่องมือ gcloud ให้ใช้โปรเจ็กต์ Google Cloud โดยการตั้งค่ารหัสโปรเจ็กต์ที่คุณใช้ลงทะเบียนกับ API
gcloud config set project <PROJECT_ID>
หากต้องการทำให้แอปพลิเคชันใช้งานได้ ให้เรียกใช้คำสั่งต่อไปนี้
gcloud app deploy
จด URL ของแอปพลิเคชันที่ทำให้ใช้งานได้ในเอาต์พุตของคำสั่งล่าสุดแล้ว
Deployed service [default] to [https://PROJECT_ID.appspot.com]
โค้ดเริ่มต้นที่คุณเพิ่งทำให้ใช้งานได้มีเว็บแอปพลิเคชันที่มีเว็บฮุคเพื่อรับข้อความจาก Business Messages แอปพลิเคชันจะสะท้อนข้อความกลับไปยังผู้ใช้และบันทึกชุดข้อความไปยัง Cloud Datastore
กำหนดค่าตัวแทนของคุณ
ไปที่หน้าการตั้งค่าบัญชีใน Business Communications Developer Console และตั้งค่าเว็บฮุคเป็น URL ของแอปพลิเคชันที่ทำให้ใช้งานได้แล้ว เช่น https://PROJECT_ID.appspot.com/callback/
จากนั้นในหน้าข้อมูลตัวแทน ให้กำหนดค่าประเภทการโต้ตอบหลักและรองเป็น "บ็อต" และ "มนุษย์" ตามลำดับ
การสนทนากับบ็อตเสียงก้อง
เปิด Agent ใน Developer Console คุณจะเห็นหน้าภาพรวมที่ให้ตรวจสอบรายละเอียดของตัวแทนได้ คัดลอก URL ทดสอบของตัวแทนที่ตรงกับอุปกรณ์ทดสอบสำหรับอุปกรณ์เคลื่อนที่ ใช้ URL นี้ในอุปกรณ์เคลื่อนที่เพื่อเปิดใช้แพลตฟอร์มการสนทนาของตัวแทน
โต้ตอบกับตัวแทนด้วยการส่งข้อความ 2-3 ข้อความ แพลตฟอร์มการสนทนาคัดลอกเฉพาะสิ่งที่คุณพูดเท่านั้น ไม่ใช่ประสบการณ์ที่มีประโยชน์มากนักของผู้ใช้ ถ้ามีวิธีคุยกับคนจริงๆ ก็พอ
3. การเข้าร่วมการสนทนา
ตอนนี้เราจะมาดูการสนทนาจากมุมมองของตัวแทนแบบเรียลไทม์กัน ในฐานะตัวแทนแบบเรียลไทม์ คุณจำเป็นต้องทราบข้อมูลการสนทนาบางอย่างก่อนเข้าร่วม เช่น รหัสการสนทนา ข้อมูลว่าผู้ใช้ได้ขอพูดคุยกับตัวแทนแบบเรียลไทม์หรือไม่ก็มีประโยชน์เช่นกัน ในขั้นตอนนี้ คุณจะใช้หน้า CRM (การจัดการลูกค้าสัมพันธ์) พื้นฐานเพื่อดูข้อมูลนี้และเข้าร่วมการสนทนาในฐานะตัวแทนแบบเรียลไทม์
โค้ดเริ่มต้นสำหรับขั้นตอนนี้จะเพิ่ม CRM พื้นฐานซึ่งจะแสดงชุดข้อความการสนทนาที่ต่อเนื่องทั้งหมดสำหรับตัวแทน ลองมาดูที่ CRM นั้นเพื่อดูว่าการสนทนาใดที่จำเป็นต้องให้ตัวแทนแบบเรียลไทม์เข้ามามีส่วนร่วม
ไปที่ไดเรกทอรี step-2
แล้วทำให้แอปใช้งานได้อีกครั้งเหมือนที่ทำในขั้นตอนก่อนหน้า
เมื่อทำให้แอปใช้งานได้ คุณจะเห็น URL เป้าหมาย ไปที่ URL นี้ในเบราว์เซอร์เพื่อดูข้อมูลที่มีชุดข้อความแบบสนทนาที่คุณเริ่มไว้ในขั้นตอนก่อนหน้า สถานะของการสนทนาในขณะนี้คือ "จัดการโดยบ็อต" เนื่องจากบ็อตเสียงสะท้อนทำหน้าที่เป็นตัวแทนของตัวแทนของเราในการสนทนานี้
ปุ่มเข้าร่วมแชทจะปรากฏขึ้น แต่ยังไม่ได้ดำเนินการใดๆ นอกจากนี้ คุณยังไม่สามารถบอกได้จากอินเทอร์เฟซนี้ว่าผู้ใช้ต้องการพูดคุยกับตัวแทนแบบเรียลไทม์หรือไม่
Business Messages จะแสดงกิจกรรมที่ขอจากตัวแทนแบบเรียลไทม์ ซึ่งจะระบุเวลาที่ผู้ใช้ต้องการพูดกับตัวแทนแบบเรียลไทม์ คุณต้องติดตามสถานะนั้นเพื่อแสดงใน UI
ดูเมธอด Callback ใน index.js
ความคิดเห็น TODO
จะระบุตำแหน่งที่คุณจะต้องตรวจจับคำขอของผู้ใช้สำหรับ Agent แบบเรียลไทม์ และอัปเดตสถานะของชุดข้อความ
step-2/Routes/index.js
/**
* The webhook callback method.
*/
router.post('/callback', async function(req, res, next) {
...
} else if (requestBody.userStatus !== undefined) {
if (requestBody.userStatus.requestedLiveAgent !== undefined) {
...
// TODO: Update the thread state to QUEUED_THREAD_STATE.
}
}
});
...
});
คุณต้องใช้วิธีการใน libs/datastore_utils.js
เพื่อโหลดชุดข้อความการสนทนาปัจจุบันและอัปเดตสถานะเป็น QUEUED_THREAD_STATE
หากไม่แน่ใจว่าต้องทำอย่างไร โปรดดูวิธีแก้ปัญหา โค้ดเริ่มต้นจะมีไดเรกทอรี solutions
ในทุกขั้นตอนที่จําเป็นต้องกรอกโค้ดบางรายการ ไดเรกทอรีเหล่านี้มีสำเนาของแอปทั้งแอปที่มีการใช้งานที่สมบูรณ์สำหรับขั้นตอนนั้นๆ
เมื่อคุณติดตั้งใช้งานและทำให้แอปใช้งานได้อีกครั้งแล้ว ให้ใช้เมนูรายการเพิ่มเติมในการสนทนาบนอุปกรณ์เคลื่อนที่เพื่อขอตัวแทนแบบเรียลไทม์
ตอนนี้หากกลับไปที่ CRM คุณจะเห็นหมายเหตุในชุดข้อความการสนทนาที่ระบุว่า "ขอตัวแทนแบบเรียลไทม์แล้ว" ผู้ใช้รายนี้ต้องการความช่วยเหลือจากคน คุณต้องใช้ปลายทาง joinConversation
เพื่อให้ปุ่มใช้งานได้
ค้นหาความคิดเห็นอื่นของ TODO
ในวิธีการที่ตัดออกสำหรับ /joinConversation
step-2/Routes/index.js
/**
* Updates the thread state and sends a representative join signal to the user.
*/
router.post('/joinConversation', async function(req, res, next) {
let conversationId = req.body.conversationId;
// TODO: Update the thread state to LIVE_AGENT_THREAD_STATE and post a REPRESENTATIVE_JOINED event.
res.json({
'result': 'ok',
});
});
คุณต้องอัปเดตสถานะชุดข้อความอีกครั้ง โดยครั้งนี้เป็น LIVE_AGENT_THREAD_STATE
นอกจากนี้ คุณต้องใช้เมธอด conversations.events.create
ของ Business Messages API เพื่อโพสต์กิจกรรม REPRESENTATIVE_JOINED
ด้วย
หากต้องการสร้างเพย์โหลดคำขอ คุณต้องตั้งค่าช่องที่ระบุไว้ในตารางต่อไปนี้
ชื่อช่อง | คำแนะนำ |
| ตั้งค่าเป็น "conversations/{conversationId}" |
| สร้างรหัสแบบสุ่มของคุณเองสำหรับกิจกรรม |
| ใช้เมธอด |
| ส่วนนี้จะเป็นตัวเนื้อหาของเหตุการณ์ ตั้งค่า eventType และตัวแทน |
ดูหน้าข้อมูลอ้างอิงสำหรับวิธีสร้างหรือหน้าข้อมูลอ้างอิงเหตุการณ์สำหรับความช่วยเหลือ
เมื่อติดตั้งใช้งานเสร็จแล้ว ให้เปิดใช้งานแอปอีกครั้งและคลิกปุ่มเข้าร่วมแชท กล่องโต้ตอบการสนทนาที่เข้าร่วมจะปรากฏขึ้น และสถานะแชทจะเปลี่ยนเป็น "แชทสด" หากดูการสนทนาในอุปกรณ์เคลื่อนที่ คุณจะเห็นหมายเหตุในแชทที่ตัวแทนแบบเรียลไทม์เข้าร่วม
ยินดีด้วย ในขั้นตอนถัดไป เราจะมาดูวิธีทำให้ตัวแทนแบบเรียลไทม์พูดคุยกับผู้ใช้
4. การรับส่งข้อความในฐานะตัวแทนแบบเรียลไทม์
เมื่อเข้าร่วมการสนทนาเรียบร้อยแล้ว ก็ถึงเวลาส่งข้อความในฐานะตัวแทนแบบเรียลไทม์
ไปที่ไดเรกทอรี step-3
และทำให้แอปใช้งานได้อีกครั้ง ใน CRM ให้คลิกชุดข้อความการสนทนาจากขั้นตอนก่อนหน้า ตอนนี้คุณควรเห็นอินเทอร์เฟซแชทพื้นฐาน คุณจะดูข้อความของผู้ใช้แบบเรียลไทม์ได้จากที่นี่
แต่การส่งข้อความเนื่องจากตัวแทนยังไม่ได้ใช้งาน คุณต้องทำขั้นตอนนี้ให้เสร็จ
เปิดไฟล์ routes/index.js
และดูปลายทาง 3 รายการที่เพิ่มเข้ามาใหม่
/messages
: รับไฟล์มุมมองmessages.ejs
และแสดงผลในเบราว์เซอร์ เมื่อคลิกชุดข้อความการสนทนาจากดัชนี คุณจะไปที่หน้าใดหน้าหนึ่งเหล่านี้ได้/retrieveMessages
: รับเนื้อหาข้อความของชุดข้อความและแสดงรายการข้อความทั้งหมดในการสนทนาที่มีการจัดรูปแบบ หน้าข้อความจะเรียกให้ปลายทางนี้แสดงข้อความล่าสุดเป็นระยะๆ/sendMessage
: ส่งข้อความจากตัวแทนตัวแทนแบบเรียลไทม์ถึงผู้ใช้ หน้าเว็บข้อความจะเรียกตัวเลือกนี้เมื่อคุณคลิกส่ง ซึ่งขณะนี้ไม่ได้ใช้งาน
ตอนนี้ให้ดูเมธอด storeAndSendResponse
ที่มีอยู่
step-3/Routes/index.js
/**
* Updates the thread, adds a new message and sends a response to the user.
*
* @param {string} message The message content that was received.
* @param {string} conversationId The unique id for this user and agent.
* @param {string} threadState Represents who is managing the conversation for the CRM.
* @param {string} representativeType The representative sending the message, BOT or HUMAN.
*/
async function storeAndSendResponse(message, conversationId, threadState, representativeType) {
...
}
เว็บฮุคใช้วิธีนี้เพื่อส่งการตอบกลับจากบ็อตเสียงสะท้อนอยู่แล้ว วิธีแรกคือการจัดเก็บข้อมูลข้อความขาเข้าในออบเจ็กต์ Cloud Datastore สำหรับการสนทนา จากนั้นจึงส่งข้อความตอบกลับ พิจารณาออบเจ็กต์ข้อความที่สร้างอย่างละเอียด โดยเฉพาะที่ประเภทตัวแทน
ติดตั้งใช้งานปลายทาง /sendMessage
ด้วยตัวเอง คุณสามารถใช้เมธอด storeAndSendResponse
ที่มีอยู่ที่นี่เพื่อทำงานส่วนใหญ่ได้ สิ่งสำคัญคือ โปรดอย่าลืมกำหนดตัวแทนที่ถูกต้อง
เมื่อใช้งานได้แล้ว ให้นำแอปไปใช้งานอีกครั้ง แล้วกลับไปที่การสนทนาใน CRM ตอนนี้คุณจะดูข้อความที่ปรากฏในประวัติการแชทได้แล้ว นอกจากนี้คุณยังเห็นข้อความของตัวแทนปรากฏในอุปกรณ์ทดสอบบนอุปกรณ์เคลื่อนที่ได้อีกด้วย
ก่อนดำเนินการต่อ โปรดทำความเข้าใจวิธีการทำงานของปลายทางใหม่ ในขั้นตอนถัดไป คุณจะต้องเพิ่มปลายทางของคุณเองเพื่อออกจากการสนทนา
5. กำลังออกจากการสนทนา
หลังจากที่ช่วยเหลือผู้ใช้เมื่อมีข้อสงสัยแล้ว คุณอาจต้องการออกจากการสนทนาและให้ผู้ใช้พูดคุยกับบ็อตอีกครั้ง ใน Business Messages การเปลี่ยนแปลงนี้ส่งสัญญาณจากเหตุการณ์ REPRESENTATIVE_LEFT
ไปที่ไดเรกทอรี step-4
ทำให้แอปใช้งานได้อีกครั้ง แล้วกลับไปที่ชุดข้อความการสนทนา ตอนนี้จะมีลิงก์ปิดและออกจากการสนทนาที่ด้านล่างของชุดข้อความ ลิงก์นี้ไม่ทำงานในขณะนี้เนื่องจากยังไม่ได้ใช้ปลายทาง leaveConversation
ดูไฟล์ index.js
มีความคิดเห็นสิ่งที่ต้องทำที่บอกให้สร้างปลายทาง leaveConversation
ใหม่
step-4/Routes/index.js
/*
* TODO: Create a '/leaveConversation' endpoint that does the following:
* - Updates the thread to BOT_THREAD_STATE.
* - Sends a REPRESENTATIVE_LEFT event.
* - Sends a message to the thread informing the user that they are speaking to the echo bot again.
*
* Hint: You can use the same methods that '/joinConversation' uses.
*/
ในการนำคำแนะนำดังกล่าวมาใช้ คุณต้องรวบรวมทุกอย่างที่ได้เรียนรู้จาก Codelab จนถึงตอนนี้ ปลายทางนี้ควรทำหน้าที่ต่อไปนี้
- อัปเดตชุดข้อความเป็น
BOT_THREAD_STATE
- ส่งเหตุการณ์
REPRESENTATIVE_LEFT
- ส่งข้อความในการสนทนาเพื่อแจ้งให้ผู้ใช้ทราบว่ากำลังคุยกับบ็อตเสียงสะท้อน ใช้เมธอด
storeAndSendResponse
โปรดทราบว่าตัวแทนได้เปลี่ยนกลับเป็นBOT
แล้ว
ขั้นตอนสุดท้ายจะบอกสถานะของการสนทนาให้ผู้ใช้ทราบ ผู้ใช้จะเห็นเหตุการณ์เมื่อตัวแทนออกจากแชท แต่จะไม่ทราบว่ากำลังคุยกับบ็อตเสียงสะท้อนอีก การส่งข้อความโดยตรงจากบ็อตจะช่วยลดความสับสนของผู้ใช้และปรับปรุงประสบการณ์การใช้งาน
เมื่อบ็อตกำลังจัดการสิ่งต่างๆ อยู่ ตัวแทนแบบเรียลไทม์ของคุณก็เข้าร่วมการสนทนาอื่นได้อย่างอิสระ ลองเล่นกับโค้ดตัวอย่างและ CRM มากเท่าที่คุณต้องการ ทดสอบไอเดียต่างๆ ที่คุณมีสำหรับประสบการณ์การโอนตัวแทนแบบเรียลไทม์ของธุรกิจ แล้วดูว่าคุณคิดอะไรได้บ้าง
6. ใกล้จะเสร็จแล้ว
ขอแสดงความยินดีที่ผ่าน Codelab การโอนตัวแทนแบบสดเรียบร้อยแล้ว
คุณได้สร้างตัวแทนที่สามารถจัดการการโอนตัวแทนแบบเรียลไทม์ตั้งแต่เริ่มต้นจนเสร็จ คุณยังจะได้เรียนรู้วิธีหนึ่งในการติดตามสถานะการสนทนาด้วย Cloud Datastore
การโอนตัวแทนแบบเรียลไทม์จะช่วยให้คุณออกจากคำขอทั่วไปไปยังบ็อตได้ ในขณะที่ตัวแทนแบบเรียลไทม์ต้องตอบคำถามที่ซับซ้อนมากขึ้น ผู้ใช้จะพึงพอใจกับประสบการณ์การใช้งานแบบใหม่ที่มีประโยชน์มากขึ้น ซึ่งจะช่วยเพิ่มโอกาสในการกลับมาและแนะนำธุรกิจของคุณให้เพื่อนๆ ได้รู้จัก
สิ่งที่ต้องทำต่อไป
ลองดู Codelab ต่อไปนี้
อ่านเพิ่มเติม
- อ่านข้อมูลพื้นฐานเกี่ยวกับการโอนตัวแทนแบบเรียลไทม์ด้วยคำแนะนำสำหรับการจะย้ายจากบ็อตไปเป็นตัวแทนแบบเรียลไทม์
- อัปเกรดบ็อต Echo ให้เป็นบ็อตคำถามที่พบบ่อยด้วยคู่มือ Dialogflow