คลังความรู้สำหรับบอต
ภาพรวม
Knowledge Base คือคลังเอกสารที่บอตของ เวิร์กโฟลว์ ใช้ประกอบการตอบคำถามในรูปแบบ RAG (Retrieval-Augmented Generation) โครงสร้างข้อมูลแบ่งเป็นสามชั้น
| ชั้น | ตาราง | ความหมาย |
|---|---|---|
| คลัง | knowledge_base | หนึ่ง LINE OA มีคลังได้หลายคลัง |
| เอกสาร | knowledge_document | เอกสารที่อยู่ในคลัง |
| ชิ้นข้อมูล | knowledge_chunk | เอกสารที่ถูกซอยเป็นชิ้นพร้อม embedding เพื่อค้นหาเชิงความหมาย |
การทำ index และสร้าง embedding เป็นงานที่ใช้เวลานาน จึงไม่ทำภายใน request แต่ถูกส่งต่อให้ worker ผ่าน RabbitMQ คิว knowledge_index
Business Flow
จัดการคลัง
GET /api/knowledge-baseแสดงรายการคลังทั้งหมดของ LINE OAGET /api/knowledge-base/select-optionsคืนข้อมูลรูปแบบ dropdown ให้หน้าตั้งค่า workflow เลือกคลังได้ก่อนที่ token จะผูกกับ OA endpoint นี้จึงอยู่บน grouppublicคู่กับJwtLoginAuthPOST /api/knowledge-baseสร้างคลังใหม่GET /api/knowledge-base/:idดูรายละเอียด และPUT /api/knowledge-base/:idแก้ไขDELETE /api/knowledge-base/:idลบแบบ soft delete สองชั้น คือเปลี่ยน status เป็นdeleteก่อน แล้วจึง stampdeleted_dateตามลำดับที่ระบบ TypeScript เดิมทำไว้
จัดการเอกสาร
GET /api/knowledge-base/:id/documentsแสดงรายการเอกสารในคลังPOST /api/knowledge-base/:id/documentsเพิ่มเอกสารด้วยCreateDocumentDtoแล้ว publish งาน index ลงคิวknowledge_indexPUT /api/knowledge-base/:id/documents/:docIdแก้ไขเอกสารและสั่ง index ใหม่DELETE /api/knowledge-base/:id/documents/:docIdลบเอกสาร โดยเปลี่ยน status เป็นdeleteแล้ว soft delete
Reindex ทั้งคลัง
POST /api/knowledge-base/:id/reindexสั่ง index ใหม่ทั้งคลัง ใช้เมื่อเปลี่ยน embedding model หรือเมื่อข้อมูล chunk เสียหาย- worker คำนวณ embedding เขียนผลลง
knowledge_chunkแล้ว index เข้า Meilisearch - เมื่อบอตตอบคำถาม แซนด์บ็อกซ์และ executor ของ workflow จะค้นข้อมูลจาก Meilisearch ร่วมกับ embedding API
payload ที่ publish ลงคิวถูกจัดให้มี byte-shape ตรงกับของเดิมทุกประการ รวมถึงลำดับ key ตาม object literal เดิม เพราะ worker ตัวเดิมยังเป็นผู้อ่าน และ routing key มีค่าเท่ากับชื่อคิวบน exchange line_exchange
ไฟล์และฟังก์ชันหลัก
โค้ดอยู่ที่ internal/modules/knowledgebase/ ประกอบด้วย controller.go, service.go และ dto.go
| Method | Route | Handler | Guard / Policy |
|---|---|---|---|
| GET | /api/knowledge-base/select-options | ct.getSelectOptions | public + JwtLoginAuth |
| GET | /api/knowledge-base | ct.findAll | authed + readAll line-oa |
| GET | /api/knowledge-base/:id | ct.findById | authed + read line-oa |
| GET | /api/knowledge-base/:id/documents | ct.listDocuments | authed + read line-oa |
| POST | /api/knowledge-base | ct.create | authed + create line-oa |
| POST | /api/knowledge-base/:id/documents | ct.addDocument | authed + create line-oa |
| POST | /api/knowledge-base/:id/reindex | ct.reindexAll | authed + update line-oa |
| PUT | /api/knowledge-base/:id | ct.update | authed + update line-oa |
| PUT | /api/knowledge-base/:id/documents/:docId | ct.updateDocument | authed + update line-oa |
| DELETE | /api/knowledge-base/:id | ct.softDelete | authed + delete line-oa |
| DELETE | /api/knowledge-base/:id/documents/:docId | ct.deleteDocument | authed + delete line-oa |
จุดเชื่อมต่อกับ Service อื่น
- สิทธิ์การเข้าถึง — route หลักอยู่บน group
authedซึ่งบังคับ JWT ระดับ global ส่วน policy metadata ใช้PolicyModuleLineOaที่ยังไม่ได้บังคับใช้ และไม่มีModuleGateครอบ - ตารางที่เกี่ยวข้อง —
knowledge_base,knowledge_document,knowledge_chunk,line_oa - RabbitMQ — คิว
knowledge_indexบน exchangeline_exchange - บริการภายนอก — embedding API และ Meilisearch ใช้ตอนค้นหาจริง (ดูรายละเอียดที่ เวิร์กโฟลว์)
- การจัดการข้อผิดพลาด — ใช้
throwInstanceofErrorโดย HttpException จะถูกส่งต่อตามเดิม ส่วน error อื่นจากฐานข้อมูลจะกลายเป็น HTTP 500 พร้อมรหัสAPP_000 - โมดูลที่เกี่ยวข้อง — เวิร์กโฟลว์ และ ตั้งค่า AI