ตอบกลับอัตโนมัติ (Auto Response)
ภาพรวม
Auto Response คือกฎแบบ "keyword → Rich Message" ของ LINE OA เมื่อผู้ใช้พิมพ์ข้อความในห้องแชทที่ตรงกับ keyword ที่ตั้งไว้ ระบบจะส่ง Rich Message ที่ผูกกับ keyword นั้นกลับไปให้โดยอัตโนมัติ โดยไม่ต้องมีแอดมินคอยตอบ
หน้าจอนี้เหมาะกับทีมที่ดูแลแชทของ LINE OA และต้องการลดภาระการตอบคำถามซ้ำ ๆ เช่น เวลาทำการ ที่ตั้งสาขา วิธีสั่งซื้อ หรือโปรโมชันประจำเดือน
ข้อมูล 1 รายการประกอบด้วย
| ข้อมูล | คำอธิบาย |
|---|---|
| ชื่อกฎ | ชื่อที่ใช้อ้างอิงในตาราง ความยาวไม่เกิน 100 ตัวอักษร |
| Keyword | ระบุได้หลายคำต่อ 1 กฎ ระบบจะตอบกลับเมื่อข้อความตรงกับคำใดคำหนึ่ง |
| Rich Message | ข้อความ Rich Message ที่จะถูกส่งกลับเมื่อ keyword ถูก trigger |
| สถานะ | เปิด (active) / ปิด (inactive) ปรับได้ทันทีจากตาราง |
จุดสำคัญที่ต้องทราบ
- Keyword ต้องไม่ซ้ำกันทั้งระบบ ระบบตรวจสอบความซ้ำแบบทันทีขณะพิมพ์ หากซ้ำจะแจ้งเตือนพร้อมลิงก์ไปยังกฎที่ถือ keyword นั้นอยู่
- Keyword ของกฎที่เปิดใช้งานอยู่ จะถูกนำไปแสดงเป็นคำแนะนำ (suggestion) ให้ฟีเจอร์อื่นที่ส่งข้อความกลับเข้าห้องแชทได้ เช่น Quick Reply, Template Message, Flex Card Builder และปุ่ม action ของ Rich Message
- หาก LINE OA ตั้งค่าลำดับการจัดการข้อความเป็น
ai_classifier_onlyระบบจะขึ้นแถบเตือนเหนือตาราง เพราะในโหมดนั้น chatbot/AI classifier จะรับข้อความทั้งหมดไป ทำให้ Auto Response ไม่ทำงาน
Business Flow
การจัดการรายการกฎ
- เข้าหน้ารายการ Auto Response ระบบตรวจสิทธิ์การเข้าถึง (สิทธิ์
VIEWของโมดูลauto-response) ก่อนแสดงผล - ระบบอ่านการตั้งค่า LINE OA ปัจจุบันเพื่อตรวจว่าโหมดจัดการข้อความเป็น
ai_classifier_onlyหรือไม่ ถ้าใช่จะแสดงแถบเตือนที่ปิดได้เหนือตาราง - ตารางแสดงลำดับ ชื่อกฎ (เรียงลำดับได้) Rich Message ที่ผูกไว้ สถานะ และปุ่มดำเนินการ หาก Rich Message ที่ผูกไว้ถูกลบหรือปิดใช้งาน จะขึ้นป้ายกำกับให้เห็นในคอลัมน์นั้น
- ค้นหาและกรองข้อมูลได้จากชื่อกฎและสถานะ เงื่อนไขการกรองล่าสุดถูกจดจำไว้ในเซสชัน ทำให้กลับเข้าหน้านี้แล้วยังเห็นผลการกรองเดิม
- เปิด/ปิดกฎได้ทันทีด้วยสวิตช์ในตาราง ระบบบันทึกทันทีโดยไม่ต้องยืนยันซ้ำ
- การลบต้องยืนยันผ่านกล่องข้อความก่อน เมื่อสำเร็จระบบจะแจ้งผลและรีเฟรชตารางให้อัตโนมัติ
การสร้างและแก้ไขกฎ
- เข้าฟอร์มได้ 4 โหมด ได้แก่ สร้างใหม่ แก้ไข ทำสำเนา (duplicate) และดูอย่างเดียว (view) โดยหัวข้อและปุ่มบนหน้าจอจะเปลี่ยนตามโหมด
- ระบบโหลดรายการ Rich Message ที่เปิดใช้งานมาเป็นตัวเลือกก่อน แล้วจึงโหลดข้อมูลกฎเดิม เพื่อให้ตรวจสอบได้ว่า Rich Message ที่ผูกไว้ยังมีอยู่จริง
- หาก Rich Message เดิมถูกลบหรือปิดไปแล้ว ระบบจะล้างค่าในช่องนั้นและแสดงข้อความแจ้งเตือนให้ผู้ใช้เลือกใหม่
- กรอกชื่อกฎ ระบุ keyword และเลือก Rich Message ช่อง keyword รับค่าแบบแท็ก พิมพ์เครื่องหมายจุลภาคเพื่อขึ้นแท็กใหม่ได้ และจำกัดความยาวการแสดงผลแท็กละ 30 ตัวอักษร
- ทุกครั้งที่เพิ่ม keyword ระบบจะตรวจความซ้ำกับกฎอื่นในระบบ หากซ้ำจะลบแท็กนั้นออกให้ทันที พร้อมแจ้งเตือนและมีปุ่มเปิดกฎที่ใช้ keyword นั้นอยู่ในแท็บใหม่
- คอลัมน์ด้านขวาแสดงตัวอย่างข้อความในรูปแบบหน้าจอแชทจริง เพื่อให้เห็นผลลัพธ์ก่อนบันทึก
- ปุ่มบันทึกจะเปิดใช้งานเมื่อกรอกครบทั้งชื่อ keyword และ Rich Message และไม่มีข้อผิดพลาดค้างอยู่ในฟอร์ม
- โหมดสร้างใหม่บันทึกได้ทันที ส่วนโหมดแก้ไขจะมีกล่องยืนยันก่อนบันทึก เมื่อสำเร็จระบบจะพากลับสู่หน้ารายการ
การนำ keyword ไปใช้ในฟีเจอร์อื่น
- ฟีเจอร์ที่ต้องพิมพ์ข้อความซึ่งจะถูกส่งกลับเข้าห้องแชท จะเรียกใช้ช่องกรอกแบบ AutoComplete ที่ดึง keyword ของกฎที่เปิดใช้งานอยู่มาแสดงเป็นคำแนะนำ (ดึงสูงสุด 100 รายการ)
- ระบบรวม keyword จากทุกกฎ ตัดค่าซ้ำและค่าว่างออก แล้วแสดงพร้อมป้ายกำกับให้รู้ว่าเป็น keyword ของ Auto Response
- ผู้ใช้ยังพิมพ์ข้อความอิสระได้ตามปกติ คำแนะนำเป็นเพียงตัวช่วยให้ข้อความที่ตั้งไว้ตรงกับกฎที่มีอยู่จริง
หน้าจอและองค์ประกอบหลัก
หน้ารายการ (/auto-response)
- แถบเตือน AI Classifier — แสดงเมื่อ LINE OA ตั้งค่าให้ AI classifier รับข้อความทั้งหมด ปิดแถบได้และไม่กระทบการทำงานอื่น
- ส่วนกรองข้อมูล — ช่องค้นหาชื่อกฎ และตัวเลือกสถานะ พร้อมปุ่มค้นหา/ล้างค่า
- ตารางรายการ — คอลัมน์ลำดับ ชื่อ Rich Message สถานะ (สวิตช์) และปุ่มแก้ไข/ลบ รองรับการเรียงลำดับตามชื่อและการแบ่งหน้า
- กล่องยืนยันและกล่องแจ้งผล — ใช้ชุด modal มาตรฐานของระบบสำหรับยืนยันการลบ แจ้งสำเร็จ และแจ้งข้อผิดพลาด
ไฟล์อ้างอิงหลัก: src/app/auto-response/page.tsx, src/components/auto-response/list/auto-response.container.tsx
หน้าฟอร์ม (/auto-response/form)
- ช่องชื่อกฎ — บังคับกรอก จำกัด 100 ตัวอักษร มีคำอธิบายเงื่อนไขอักขระที่อนุญาตในรูปแบบ popover
- ช่อง Keyword — ช่องเลือกแบบแท็กที่ไม่มี dropdown ผู้ใช้พิมพ์เองทั้งหมด รองรับการคั่นด้วยจุลภาค
- ช่องเลือก Rich Message — ค้นหาได้ในรายการที่โหลดมาแล้ว พร้อมปุ่มโหลดรายการใหม่กรณีเพิ่ง publish Rich Message ตัวใหม่
- สวิตช์สถานะ — กำหนดว่ากฎจะเริ่มทำงานทันทีหลังบันทึกหรือไม่ (การสร้างใหม่ตั้งค่าเป็นเปิดใช้งานให้เป็นค่าเริ่มต้น)
- แผงพรีวิวแชท — จำลองหน้าจอ LINE เพื่อแสดง Rich Message ที่เลือก
ไฟล์อ้างอิงหลัก: src/app/auto-response/form/page.tsx, src/components/auto-response/form/auto-response-form.container.tsx, src/components/auto-response/form/auto-response-form.tsx
คอมโพเนนต์ร่วม
src/components/common/auto-response-keyword-autocomplete.tsx — ช่องกรอกแบบ AutoComplete ที่นำ keyword ของกฎที่เปิดใช้งานมาเป็นคำแนะนำ ใช้เฉพาะกับฟิลด์ที่ค่าจะถูกส่งกลับเข้าห้องแชทเท่านั้น ไม่ควรใช้กับข้อความที่ใช้แสดงผลอย่างเดียว
บริการฝั่ง API
รวมอยู่ที่ src/services/auto-response.service.ts ภายใต้ path หลัก auto-response
| ความสามารถ | Endpoint |
|---|---|
| ดึงรายการกฎ | GET /auto-response |
| ดึงข้อมูลกฎรายตัว | GET /auto-response/{id} |
| สร้างกฎใหม่ | POST /auto-response |
| แก้ไขกฎ | PUT /auto-response/{id} |
| เปลี่ยนสถานะเปิด/ปิด | PUT /auto-response/{id}/status |
| ลบกฎ | DELETE /auto-response/{id} |
| ตรวจสอบ keyword ซ้ำ | POST /auto-response/check-keyword-exists |
จุดเชื่อมต่อกับฟีเจอร์อื่น
- สิทธิ์การใช้งาน — ทั้งหน้ารายการและหน้าฟอร์มถูกควบคุมด้วยสิทธิ์ของโมดูล
auto-responseโดยการเปิดสิทธิ์โมดูลนี้จะปลดล็อกทั้งเมนู Auto Response และ Quick Reply พร้อมกัน - Rich Message Management — เป็นแหล่งข้อมูลของตัวเลือก Rich Message หากรายการที่ผูกไว้ถูกลบหรือปิดใช้งาน กฎ Auto Response นั้นจะทำงานไม่สมบูรณ์ และหน้าฟอร์มจะบังคับให้เลือกใหม่
- LINE OA Management — ค่าการตั้งค่า
messageHandlingConfig.priorityของ LINE OA เป็นตัวกำหนดว่า Auto Response จะถูก AI classifier แย่งข้อความไปหรือไม่ - Quick Reply / Template Message / Flex Card Builder / Rich Message — เป็นผู้ใช้ปลายทางของคำแนะนำ keyword เพื่อให้ปุ่มที่กดแล้วส่งข้อความกลับเข้าแชทตรงกับกฎ Auto Response ที่มีอยู่จริง
- โครงสร้างพื้นฐานร่วม — ใช้ระบบยืนยันตัวตนและ HTTP client กลางของ CMS (ออกจากระบบอัตโนมัติเมื่อ token หมดอายุ) ระบบ breadcrumb และเมนูด้านข้าง รวมถึงชุด modal และการจดจำเงื่อนไขการกรองใน sessionStorage เช่นเดียวกับหน้ารายการอื่นในระบบ
รายละเอียดฝั่ง Backend (CMS API)
ฝั่ง cms-api ทำหน้าที่เป็น ฝั่งตั้งค่า ของ Auto Response เท่านั้น ไม่ใช่ฝั่งที่ตอบข้อความจริง ส่วนที่ตอบข้อความคือ service แยกชื่อ line-management-webhook-go ซึ่งอ่านค่าที่หน้านี้บันทึกไว้ผ่าน Redis cache
โค้ดฝั่ง backend อยู่ที่โมดูล internal/modules/autoresponse/
สิทธิ์ที่ต้องมี
- ทุก route ถูกครอบด้วย module gate ของโมดูล
auto-responseหากองค์กรไม่ได้เปิดโมดูลนี้ request จะถูกปฏิเสธก่อนถึง handler - แต่ละ endpoint ยังตรวจ policy แยกอีกชั้น:
readAllสำหรับดึงรายการและตรวจ keyword ซ้ำ,readสำหรับดูรายตัว,create/update/deleteตามการกระทำ - การลบถาวร (hard delete) ต้องเป็น Super Admin เท่านั้น ไม่ใช่แค่มีสิทธิ์
deleteของโมดูล
Validation และ Business Rule ที่ backend ตรวจ
- keyword ต้องไม่ซ้ำภายใน LINE OA เดียวกัน เป็นกฎหลักของโมดูลนี้ backend จึงเปิด endpoint
POST /api/auto-response/check-keyword-existsแยกไว้ (รับ payload ที่มีฟิลด์keyword) เพื่อให้ฟอร์มถามก่อน submit ได้ ไม่ต้องรอ error ตอนบันทึก - endpoint สร้างกฎ (
POST /api/auto-response) รับข้อมูลแบบmultipart/form-dataไม่ใช่ JSON ล้วน เพราะรองรับการแนบไฟล์มาพร้อมฟอร์มในคำขอเดียว - การเปลี่ยนสถานะเปิด/ปิดแยกเป็น endpoint ของตัวเอง (
PUT /api/auto-response/:id/status) ไม่ผูกกับการแก้เนื้อหา ทำให้ปิดกฎชั่วคราวได้โดยไม่ต้องส่งข้อมูลกฎทั้งชุดกลับไปและไม่ต้องลบ - การดึงรายการ (
GET /api/auto-response) ตอบกลับเป็นโครงสร้างแบ่งหน้าที่มีทั้งรายการข้อมูลและจำนวนรวม โดย join กับ rich message ที่ผูกไว้ให้เลย หน้ารายการจึงแสดงชื่อ Rich Message ได้ในคำขอเดียว
สิ่งที่บันทึกและผลข้างเคียง (Side Effect)
- ข้อมูลกฎถูกบันทึกลงตาราง
auto_responseและอ้างอิงกับตารางrich_messageและline_oa - หลังสร้างหรือแก้กฎ backend เขียน Redis cache ทันที ด้วยคีย์กลุ่ม
AUTO_RESPONSE:*(มีการตั้ง TTL) เพื่อให้ webhook ไม่ต้อง query ฐานข้อมูลทุกครั้งที่มีข้อความเข้ามา - พร้อมกันนั้น backend ยังเขียนข้อมูล mapping ของ LINE OA ลง Redis hash (คีย์
LINE_OA_ID) เพื่อให้ webhook resolve ได้เร็วว่าข้อความที่เข้ามาเป็นของ OA ไหน - การลบด้วย
DELETE /api/auto-response/:idเป็น soft delete ข้อมูลยังอยู่ในฐานข้อมูล ส่วนการลบจริงต้องเรียกDELETE /api/auto-response/:id/hardและต้องส่ง query parameter ยืนยัน (confirm=true) เพิ่มด้วย เป็นการกันการลบพลาดสองชั้น
Edge Case และข้อสังเกตที่ควรรู้
- เพราะ webhook อ่านจาก cache ไม่ใช่จากฐานข้อมูลโดยตรง หากการเขียน cache ล้มเหลวหรือ cache หมดอายุจังหวะที่แก้ค่าไม่สำเร็จ กฎที่แก้ไปแล้วอาจยังไม่มีผลทันที ในห้องแชท กรณีที่ตั้งค่าแล้วบอทตอบเป็นค่าเดิม ให้สงสัย cache ก่อนสงสัยข้อมูล
- โมดูลนี้ query ตาราง rich message โดยตรงจากภายในโมดูลตัวเอง (ไม่ผ่าน repository ของโมดูล rich message) ดังนั้นการเปลี่ยนโครงสร้างข้อมูล rich message มีผลกระทบมาถึงโมดูลนี้ด้วย
- การที่ Auto Response จะได้รับข้อความหรือไม่ ยังขึ้นกับการตั้งค่าลำดับการจัดการข้อความของ LINE OA ที่ตั้งไว้อีกชั้น — บันทึกกฎสำเร็จไม่ได้แปลว่ากฎจะได้ทำงาน หาก OA ตั้งให้ AI classifier รับข้อความทั้งหมด