Skip to main content

คลังความรู้สำหรับบอต

ภาพรวม

Knowledge Base คือคลังเอกสารที่บอตของ เวิร์กโฟลว์ ใช้ประกอบการตอบคำถามในรูปแบบ RAG (Retrieval-Augmented Generation) โครงสร้างข้อมูลแบ่งเป็นสามชั้น

ชั้นตารางความหมาย
คลังknowledge_baseหนึ่ง LINE OA มีคลังได้หลายคลัง
เอกสารknowledge_documentเอกสารที่อยู่ในคลัง
ชิ้นข้อมูลknowledge_chunkเอกสารที่ถูกซอยเป็นชิ้นพร้อม embedding เพื่อค้นหาเชิงความหมาย

การทำ index และสร้าง embedding เป็นงานที่ใช้เวลานาน จึงไม่ทำภายใน request แต่ถูกส่งต่อให้ worker ผ่าน RabbitMQ คิว knowledge_index

Business Flow

จัดการคลัง

  1. GET /api/knowledge-base แสดงรายการคลังทั้งหมดของ LINE OA
  2. GET /api/knowledge-base/select-options คืนข้อมูลรูปแบบ dropdown ให้หน้าตั้งค่า workflow เลือกคลังได้ก่อนที่ token จะผูกกับ OA endpoint นี้จึงอยู่บน group public คู่กับ JwtLoginAuth
  3. POST /api/knowledge-base สร้างคลังใหม่
  4. GET /api/knowledge-base/:id ดูรายละเอียด และ PUT /api/knowledge-base/:id แก้ไข
  5. DELETE /api/knowledge-base/:id ลบแบบ soft delete สองชั้น คือเปลี่ยน status เป็น delete ก่อน แล้วจึง stamp deleted_date ตามลำดับที่ระบบ TypeScript เดิมทำไว้

จัดการเอกสาร

  1. GET /api/knowledge-base/:id/documents แสดงรายการเอกสารในคลัง
  2. POST /api/knowledge-base/:id/documents เพิ่มเอกสารด้วย CreateDocumentDto แล้ว publish งาน index ลงคิว knowledge_index
  3. PUT /api/knowledge-base/:id/documents/:docId แก้ไขเอกสารและสั่ง index ใหม่
  4. DELETE /api/knowledge-base/:id/documents/:docId ลบเอกสาร โดยเปลี่ยน status เป็น delete แล้ว soft delete

Reindex ทั้งคลัง

  1. POST /api/knowledge-base/:id/reindex สั่ง index ใหม่ทั้งคลัง ใช้เมื่อเปลี่ยน embedding model หรือเมื่อข้อมูล chunk เสียหาย
  2. worker คำนวณ embedding เขียนผลลง knowledge_chunk แล้ว index เข้า Meilisearch
  3. เมื่อบอตตอบคำถาม แซนด์บ็อกซ์และ 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

MethodRouteHandlerGuard / Policy
GET/api/knowledge-base/select-optionsct.getSelectOptionspublic + JwtLoginAuth
GET/api/knowledge-basect.findAllauthed + readAll line-oa
GET/api/knowledge-base/:idct.findByIdauthed + read line-oa
GET/api/knowledge-base/:id/documentsct.listDocumentsauthed + read line-oa
POST/api/knowledge-basect.createauthed + create line-oa
POST/api/knowledge-base/:id/documentsct.addDocumentauthed + create line-oa
POST/api/knowledge-base/:id/reindexct.reindexAllauthed + update line-oa
PUT/api/knowledge-base/:idct.updateauthed + update line-oa
PUT/api/knowledge-base/:id/documents/:docIdct.updateDocumentauthed + update line-oa
DELETE/api/knowledge-base/:idct.softDeleteauthed + delete line-oa
DELETE/api/knowledge-base/:id/documents/:docIdct.deleteDocumentauthed + delete line-oa

จุดเชื่อมต่อกับ Service อื่น

  • สิทธิ์การเข้าถึง — route หลักอยู่บน group authed ซึ่งบังคับ JWT ระดับ global ส่วน policy metadata ใช้ PolicyModuleLineOa ที่ยังไม่ได้บังคับใช้ และไม่มี ModuleGate ครอบ
  • ตารางที่เกี่ยวข้องknowledge_base, knowledge_document, knowledge_chunk, line_oa
  • RabbitMQ — คิว knowledge_index บน exchange line_exchange
  • บริการภายนอก — embedding API และ Meilisearch ใช้ตอนค้นหาจริง (ดูรายละเอียดที่ เวิร์กโฟลว์)
  • การจัดการข้อผิดพลาด — ใช้ throwInstanceofError โดย HttpException จะถูกส่งต่อตามเดิม ส่วน error อื่นจากฐานข้อมูลจะกลายเป็น HTTP 500 พร้อมรหัส APP_000
  • โมดูลที่เกี่ยวข้องเวิร์กโฟลว์ และ ตั้งค่า AI