คลังความรู้
ภาพรวม
คลังความรู้ (Knowledge Base) คือที่เก็บเอกสารและคำถาม-คำตอบที่ผู้ดูแลป้อนเข้าไปเพื่อให้ AI ใช้เป็นแหล่งอ้างอิงในการตอบผู้ใช้ ตัวคลังเองไม่ได้ตอบแชทโดยตรง แต่จะถูกอ้างอิงจากโมดูล Workflow เมื่อ node ใดตั้งค่าโหมดการตอบเป็นแบบใช้คลังความรู้ แล้วเลือกว่าจะให้ AI ค้นจากคลังใด
สิ่งที่ควรเข้าใจตั้งแต่ต้นคือ การตั้งค่า AI แยกกันคนละที่กับคลังความรู้ โดยผู้ให้บริการ AI, โมเดล และ API key ตั้งครั้งเดียวที่ระดับ LINE OA ส่วนคลังความรู้ทำหน้าที่เป็นเพียงแหล่งความรู้ที่ workflow เลือกหยิบมาใช้ ไม่ได้กำหนดโมเดลเอง
คลังหนึ่งชุดประกอบด้วยชื่อ คำอธิบาย คำสั่งระบบระดับคลัง (system instruction) สถิติการใช้งาน และรายการเอกสารซึ่งแบ่งเป็น 3 ชนิด ได้แก่ เอกสารข้อความ, คู่คำถาม-คำตอบ และไฟล์แนบ โดยเอกสารแต่ละรายการมีสถานะการทำดัชนี (ยังไม่ทำ / กำลังทำ / เสร็จสิ้น / ล้มเหลว)
Business Flow
หน้ารายการคลัง
- เปิดหน้ารายการ ระบบโหลดรายการคลังทั้งหมดโดยเรียงตามวันที่สร้างล่าสุด หน้านี้ไม่มีแถบค้นหาหรือตัวกรอง มีเพียงการแบ่งหน้า
- ตารางแสดง ลำดับ, ชื่อคลัง, คำอธิบายแบบย่อพร้อมคำแนะนำเมื่อชี้เมาส์, จำนวนเอกสาร, สถานะ, เวลาที่ทำดัชนีล่าสุด และปุ่มแก้ไขกับลบ
- การสร้างคลังใหม่ถามเพียงชื่อ ผ่านหน้าต่างเล็กที่โฟกัสช่องกรอกให้อัตโนมัติและกด Enter เพื่อยืนยันได้ เมื่อสร้างสำเร็จระบบจะพาไปยังหน้ารายละเอียดของคลังใหม่ทันทีเพื่อกรอกข้อมูลที่เหลือ
- การลบต้องยืนยันก่อน แล้วแสดงผลลัพธ์ผ่านหน้าต่างสำเร็จหรือล้มเหลว
หน้ารายละเอียดคลัง
- หน้ารายละเอียดอ่านรหัสคลังจาก URL แล้วโหลดพร้อมกัน 2 ชุด คือข้อมูลหัวคลังกับสถิติ และรายการเอกสารทั้งหมด
- การ์ดข้อมูลพื้นฐาน เป็นฟอร์มแก้ไขชื่อ (บังคับ), คำอธิบาย และคำสั่งระบบระดับคลัง เมื่อบันทึกสำเร็จระบบจะโหลดข้อมูลหัวคลังใหม่
- การ์ดสถิติ แสดงตัวเลข 4 ค่า คือจำนวนเอกสารทั้งหมด, จำนวนคู่คำถาม-คำตอบ, จำนวนชิ้นส่วนข้อความที่แบ่งไว้สำหรับค้นหา (chunk) และเวลาที่ทำดัชนีล่าสุด พร้อมปุ่มสั่งทำดัชนีใหม่ทั้งคลัง
- การทำดัชนีเป็นงานเบื้องหลัง เมื่อสั่งแล้วหน้าจอจะแจ้งว่าเริ่มงานแล้วและโหลดข้อมูลใหม่ แต่ไม่ได้ติดตามความคืบหน้าแบบต่อเนื่อง ผู้ใช้ต้องกลับมาดูสถานะเอกสารอีกครั้งเพื่อดูผล
- เอกสารทั้งหมดถูกโหลดมาชุดเดียวแล้วแยกเป็น 3 แท็บที่ฝั่งหน้าเว็บตามชนิดของเอกสาร
- แท็บเอกสารข้อความ เพิ่มและแก้ไขผ่านหน้าต่างที่มีหัวเรื่องกับเนื้อหา (บังคับทั้งคู่) ตารางแสดงหัวเรื่อง เนื้อหาแบบย่อ สถานะการทำดัชนีเป็นป้ายสี และปุ่มแก้ไขกับลบ
- แท็บคำถาม-คำตอบ มีโครงเดียวกับแท็บเอกสาร แต่เปลี่ยนฟิลด์เป็นคำถามกับคำตอบ และใช้คำสั่งลบตัวเดียวกัน
- แท็บไฟล์แนบ ปัจจุบันถูกปิดใช้งานอยู่ แม้ว่าตรรกะการอัปโหลด การแสดงตาราง และการลบจะเขียนไว้ครบแล้ว โดยรองรับไฟล์ PDF, DOCX และ TXT
- ปุ่มย้อนกลับที่ส่วนหัวพากลับไปยังหน้ารายการ
การนำคลังไปใช้กับ AI
- หน้าฟอร์มของ Workflow เรียกรายการคลังในรูปแบบตัวเลือกแล้วส่งต่อให้แผงตั้งค่าของ node
- เมื่อ node ตั้งโหมดการตอบเป็นแบบใช้คลังความรู้ จะมีตัวเลือกให้เลือกคลังพร้อมปุ่มโหลดรายการใหม่ และเมื่อเลือกแล้วระบบจะเก็บทั้งรหัสและชื่อคลังไว้ในข้อมูลของ node
- การตั้งค่า AI ที่แท้จริง (ผู้ให้บริการ, โมเดล และ API key) ทำที่หน้าจัดการ LINE OA ซึ่งจะบังคับให้กรอก API key หากยังไม่เคยตั้งค่ามาก่อน และล้างช่อง key ออกจากหน้าจอหลังบันทึกสำเร็จ
- การตั้งค่า AI ชุดเดียวกันนี้ยังถูกใช้โดยเครื่องมือสร้าง Flex Message ด้วย AI ในโมดูล Workflow อีกด้วย
หน้าจอและองค์ประกอบหลัก
หน้ารายการ (src/app/knowledge-base/page.tsx คู่กับ src/components/knowledge-base/list/knowledge-base-list.container.tsx) — ตาราง, หน้าต่างสร้างที่ถามเพียงชื่อ และการลบ
หน้ารายละเอียด (src/app/knowledge-base/detail/page.tsx) — รวมทุกอย่างไว้ในไฟล์เดียวโดยไม่มีตัวควบคุมแยก ทั้งฟอร์มหัวคลัง การ์ดสถิติ ปุ่มทำดัชนีใหม่ แท็บทั้งสาม และหน้าต่างเพิ่ม-แก้เอกสารทั้งสองแบบ
เซอร์วิสกลาง (src/services/knowledge-base.service.ts) — ครอบคลุมการอ่านรายการ, อ่านรายการแบบตัวเลือก, อ่านรายตัว, สร้าง, แก้ไข, ลบ, จัดการเอกสารในคลัง (เพิ่ม แก้ ลบ), สั่งทำดัชนีใหม่ และอัปโหลดไฟล์ โดยเซอร์วิสรองรับรูปแบบผลลัพธ์ได้ทั้งแบบที่ API คืนเป็นรายการตรงและแบบที่ห่ออีกชั้น
เซอร์วิสตั้งค่า AI (src/services/ai-config.service.ts) — อ่านและบันทึกการตั้งค่า AI รวมถึงการสร้าง Flex Message จากคำสั่ง โดยไม่ถูกเรียกจากหน้าคลังความรู้เลย ผู้เรียกจริงคือหน้าจัดการ LINE OA และเครื่องมือสร้าง Flex ใน Workflow
จุดเชื่อมต่อกับฟีเจอร์อื่น
- สิทธิ์การเข้าถึง — ใช้ subject
knowledge-baseซึ่งปลดล็อกด้วยโมดูลระบบฝั่งหลังบ้าน โดยปัจจุบันการตรวจสิทธิ์ทำที่การแสดงเมนูด้านข้างและแถบคำสั่งด่วนเป็นหลัก - Workflow — เป็นผู้บริโภคหลักของโมดูลนี้ โดยดึงรายการคลังมาเป็นตัวเลือกให้ node ที่ตอบด้วยคลังความรู้
- LINE OA Management — เป็นที่ตั้งค่าผู้ให้บริการ AI, โมเดล และ API key ซึ่งต้องตั้งค่าก่อนคลังความรู้จะถูกนำไปใช้ตอบได้จริง
- เครื่องมือสร้าง Flex ด้วย AI — ใช้การตั้งค่า AI ชุดเดียวกัน
- ระบบเบื้องหลัง — การแบ่งชิ้นส่วนข้อความและสร้าง embedding ทำที่ฝั่งเซิร์ฟเวอร์และ worker หน้าเว็บเพียงสั่งทำดัชนีใหม่แล้วอ่านสถานะกับสถิติที่เซิร์ฟเวอร์เขียนกลับมา
- คอมโพเนนต์ร่วมของ CMS — ส่วนหัวหน้า, หน้าต่างยืนยัน, หน้าต่างผลลัพธ์, สถานะกำลังโหลด, สถานะไม่มีข้อมูล และพื้นที่เลื่อนตาราง
รายละเอียดฝั่ง Backend (CMS API)
โมดูลนี้อยู่ที่ internal/modules/knowledgebase/ ลงทะเบียนใต้กลุ่ม /api/knowledge-base
โครงสร้างข้อมูล 3 ชั้น
ฝั่งฐานข้อมูลไม่ได้เก็บเอกสารเป็นก้อนเดียว แต่แยกเป็น 3 ชั้น
- คลัง (
knowledge_base) — หนึ่ง LINE OA มีได้หลายคลัง - เอกสาร (
knowledge_document) — เอกสารแต่ละชิ้นในคลัง คือสิ่งที่ผู้ใช้เห็นและแก้ไขได้บนหน้าจอ - ชิ้นส่วน (
knowledge_chunk) — เอกสารที่ถูกซอยเป็นชิ้นพร้อมเวกเตอร์ embedding สำหรับค้นเชิงความหมาย ผู้ใช้ไม่ได้แก้ชั้นนี้โดยตรง แต่เป็นชั้นที่บอตใช้ค้นจริง
การทำดัชนีถูกโยนให้ worker ไม่ทำในคำขอ
- ตอนเพิ่มเอกสาร (
POST /api/knowledge-base/:id/documents) หรือแก้เอกสาร (PUT .../documents/:docId) backend ไม่ได้สร้าง embedding ทันที แต่ประกาศงานลงคิวknowledge_indexบน RabbitMQ แล้วตอบกลับทันที - worker เป็นฝ่ายรับงานไปทำ embedding เขียนลงตารางชิ้นส่วน แล้วส่งเข้าเครื่องมือค้นหา
POST /api/knowledge-base/:id/reindexสั่งทำดัชนีใหม่ทั้งคลัง ใช้เมื่อเปลี่ยนโมเดล embedding หรือเมื่อข้อมูลชิ้นส่วนเสียหาย- ผลที่ตามมาที่ควรรู้: คำตอบ 200 จาก API แปลว่า "รับงานแล้ว" ไม่ใช่ "ทำดัชนีเสร็จแล้ว" เอกสารที่เพิ่งเพิ่มจึงยังไม่ถูกบอตค้นเจอทันที และถ้า worker ล่มหรือคิวค้าง หน้า CMS จะไม่แสดงความผิดพลาดใด ๆ — ต้องดูสถานะและสถิติที่ worker เขียนกลับมาแทน
- รูปของ payload ที่ประกาศลงคิวถูกตรึงให้ตรงกับระบบเดิมทุกไบต์ เพราะ worker ตัวเดิมยังอ่านอยู่ การเปลี่ยนโครงข้อความจึงเป็นการเปลี่ยนสัญญาข้ามบริการ
สิทธิ์และข้อสังเกตด้านความปลอดภัย
- route หลักอยู่บนกลุ่มที่ต้องผ่าน
JwtAuthระดับ global policy metadata ประกาศไว้เป็นโมดูลline-oaแต่ ยังไม่บังคับใช้ และไม่มีModuleGateคุม GET /api/knowledge-base/select-optionsใช้การป้องกันที่อ่อนกว่า route อื่น โดยอยู่บนกลุ่มสาธารณะและตรวจด้วย token ระดับ "ล็อกอินแล้ว" เท่านั้น เหตุผลคือหน้าตั้งค่า Workflow ต้องเลือกคลังได้ตั้งแต่ก่อนที่ token จะผูกกับ OA ผลข้างเคียงคือรายชื่อคลังเข้าถึงได้ด้วยสิทธิ์ที่ต่ำกว่ารายละเอียดของคลัง
การลบเป็นสองจังหวะ
DELETE /api/knowledge-base/:id และการลบเอกสารทำเป็น soft delete สองชั้น คือเปลี่ยนสถานะของระเบียนเป็นสถานะลบก่อน แล้วจึงประทับเวลาลงคอลัมน์ deleted_date อีกที ยกพฤติกรรมมาจากระบบเดิม ผลคือระเบียนยังอยู่ในฐานข้อมูลและมีทั้งสถานะและเวลาลบเป็นร่องรอย แต่ทุกคำสั่งอ่านต้องกรองทั้งสองอย่างให้ครบเอง
การจัดการข้อผิดพลาด
ข้อผิดพลาดที่ backend ตั้งใจส่ง (เช่น ไม่พบคลัง, ข้อมูลไม่ถูกต้อง) จะถูกส่งต่อพร้อมสถานะและข้อความตามที่ตั้งไว้ ส่วนข้อผิดพลาดจากฐานข้อมูลที่ไม่ได้คาดไว้จะถูกกลบเป็นสถานะ 500 พร้อมรหัสข้อผิดพลาดทั่วไป จึงไม่ควรคาดหวังว่าข้อความ error จะอธิบายสาเหตุจริงเสมอ
ตารางและระบบภายนอกที่เกี่ยวข้อง
ตาราง knowledge_base, knowledge_document, knowledge_chunk และ line_oa ส่วนระบบภายนอกคือ RabbitMQ (คิว knowledge_index), บริการสร้าง embedding และเครื่องมือค้นหาแบบ full-text ที่ worker ใช้ตอนทำดัชนี