25 KiB
ADR-023: Unified AI Architecture (สถาปัตยกรรม AI หลักแบบผสานรวม)
Status: Accepted Date: 2026-05-14 Decision Makers: Development Team, System Architect, Security Team, AI Integration Lead Related Documents:
- Glossary
- Data Dictionary
- Legacy Data Migration Plan
- n8n Migration Setup Guide
- ADR-016: Security & Authentication
- ADR-019: Hybrid Identifier Strategy
- RAG Implementation Guide v1.1.2
หมายเหตุ: ADR-023 เป็นเอกสารสถาปัตยกรรม AI หลักของระบบ (Master AI Architecture) ที่ทำการยุบรวมและแทนที่ (Supersede) เอกสาร ADR-017, ADR-017B, ADR-018, ADR-020, และ ADR-022 เพื่อให้มี Single Source of Truth เพียงที่เดียวในการควบคุมทั้งโครงสร้างพื้นฐาน, ความปลอดภัย, การนำเข้าข้อมูลเก่า, การสกัดข้อมูลอัตโนมัติ, และระบบสืบค้น RFA/Correspondence แบบถาม-ตอบเชิงลึก
🎯 Gap Analysis & Purpose
ปิด Gap จากเอกสาร:
- Product Vision v1.8.5 - Section 3.1, 3.2, 3.3: ความต้องการยกระดับประสิทธิภาพการนำเข้าเอกสารเก่าและการจัดการเอกสารใหม่ด้วย AI Intelligence
- เหตุผล: การทำงานด้วยมือ (Manual) มีต้นทุนเวลาสูงและเกิดความผิดพลาดได้ง่าย จำเป็นต้องมี AI ช่วยตรวจสอบและจัดหมวดหมู่โดยอัตโนมัติ
- Security Requirements & Risk Assessment - Section 3.1, 4.2: ความเสี่ยงด้านข้อมูลรั่วไหลและการเข้าถึงฐานข้อมูลโดยตรงจากเซอร์วิส AI
- เหตุผล: ข้อมูลเอกสารก่อสร้างท่าเรือแหลมฉบัง เฟส 3 เป็นความลับระดับสูง (Confidential) ต้องมีขอบเขตความปลอดภัย (AI Boundary) ที่รัดกุม
แก้ไขความขัดแย้งและการกระจายตัวของเอกสาร:
- ADR-017, ADR-017B, ADR-018, ADR-020, ADR-022 มีความทับซ้อนในเชิงสถาปัตยกรรมและข้อกำหนด
- การตัดสินใจนี้ช่วยแก้ไขโดย: ยุบรวมข้อกำหนดทั้งหมดเข้าสู่ร่มใหญ่ฉบับเดียว (Consolidation) เพื่อลดปัญหา Revision Drift และทำให้การทบทวนสถาปัตยกรรม (Review Cycle) เป็นไปอย่างสอดคล้องกันทั้งระบบ
Context and Problem Statement
โครงการ LCBP3-DMS มีความต้องการประยุกต์ใช้ AI ในการเพิ่มประสิทธิภาพการบริหารจัดการเอกสารวิศวกรรมโยธาขนาดใหญ่ โดยเผชิญกับโจทย์และความท้าทายหลัก 5 ด้าน:
- Legacy Document Migration: เอกสาร PDF เก่ากว่า 20,000 ฉบับ ต้องนำเข้าระบบพร้อมตรวจสอบความสอดคล้องกับ Metadata ใน Excel
- Real-time Ingestion & Classification: เอกสารใหม่ที่ผู้ใช้อัปโหลดต้องการการสกัด Metadata และจัดหมวดหมู่แบบเรียลไทม์เพื่อลดภาระงานกรอกข้อมูล
- Conversational Retrieval (RAG): Full-text search บน MariaDB ไม่เข้าใจบริบท (Semantic) และการตัดคำภาษาไทย ทำให้สืบค้นข้อมูลเชิงลึกได้ยาก
- Data Confidentiality & Privacy: ห้ามส่งข้อมูลความลับออกนอกเครือข่ายองค์กรไปยัง Cloud AI Provider (เช่น OpenAI, Google)
- System Stability & Isolation: การรัน AI Inference ใช้ทรัพยากรสูง (GPU VRAM/CPU) ไม่ควรรันร่วมกับ Production Server หลัก (QNAP NAS) เพื่อไม่ให้กระทบประสิทธิภาพของระบบ
Decision Drivers
- Zero Trust & Physical Isolation: AI ต้องถูกปฏิบัติเสมือน Untrusted Component รันแยกต่างหากบน Admin Desktop เท่านั้น
- RFA-First Approach: มุ่งเน้นกระบวนการเอกสาร RFA (Request for Approval) ซึ่งซับซ้อนที่สุดเป็นแกนหลัก
- Data Integrity & Human-in-the-Loop: ข้อมูลจาก AI ต้องผ่านการทวนสอบและยืนยันโดยมนุษย์ก่อน Commit ลงฐานข้อมูลจริงเสมอ
- Multi-tenant Isolation: ต้องแยกขอบเขตข้อมูลของแต่ละโครงการอย่างเด็ดขาดในระดับ Vector Database Payload Filter
- Cost Effectiveness: ประมวลผลภายในองค์กร (On-Premises) เพื่อหลีกเลี่ยงค่าใช้จ่ายแบบ Pay-per-use
- Two-Phase Storage Governance: ควบคุมการย้ายไฟล์ทุกขั้นตอนผ่าน
StorageServiceเพื่อให้สแกนไวรัสและเก็บ Audit Log ได้ครบถ้วน
Considered Options
Option 1: Fragmented AI Subsystems (แยกระบบ AI ตาม Use Case)
Pros:
- ออกแบบและพัฒนาง่ายในระยะสั้น แต่ละส่วนไม่พึ่งพากัน Cons:
- ❌ เกิด Code Duplication สูง
- ❌ มาตรฐานความปลอดภัยและการควบคุมสิทธิ์ไม่สม่ำเสมอ
- ❌ บำรุงรักษายากเมื่อมีการเปลี่ยนโมเดลหรือโครงสร้าง Prompt
Option 2: Cloud AI Platform Integration
Pros:
- โมเดลมีความฉลาดแม่นยำสูงมาก ไม่ต้องลงทุนและบำรุงรักษา Hardware Cons:
- ❌ ผิดข้อกำหนดด้าน Data Privacy อย่างรุนแรงสำหรับเอกสาร Confidential
- ❌ ค่าใช้จ่ายสูงมากเมื่อต้องประมวลผลเอกสารเก่ากว่า 20,000 ฉบับและรองรับ RAG
Option 3: Unified Master AI Architecture (On-Premises Isolation + Multi-layer Gateways) ⭐ SELECTED
Pros:
- ✅ Single Source of Truth: รวมสถาปัตยกรรมและข้อกำหนดความปลอดภัยไว้ที่เดียว
- ✅ Absolute Isolation: แยกส่วน AI Workload ไปยัง Admin Desktop ปลอดภัยและไม่กวน Production NAS
- ✅ High Reusability: ใช้ Pipeline และ UI Components (เช่น
DocumentReviewForm) ร่วมกันได้ทั้งหมด - ✅ Thai Language Optimized: ผสานการทำงานของ PaddleOCR และ PyThaiNLP เพื่อคุณภาพข้อความภาษาไทยสูงสุด
- ✅ Absolute Multitenancy: ป้องกันข้อมูลข้ามโครงการด้วย Qdrant Payload Filter
Cons:
- ❌ สถาปัตยกรรมมีความซับซ้อน ต้องใช้คิว (BullMQ) และการจัดการ State ที่รัดกุม
Decision Outcome
Chosen Option: Option 3 — Unified Master AI Architecture
Rationale
การรวมสถาปัตยกรรม AI ไว้ภายใต้ร่มใหญ่เดียวช่วยลดความซ้ำซ้อนของโค้ดและการบำรุงรักษา พร้อมทั้งบังคับใช้นโยบายความปลอดภัยสูงสุด (Physical Isolation & No Direct DB Access) ได้กับทุกฟีเจอร์อย่างเสมอภาค ทำให้ระบบมีความเสถียร ปลอดภัย และพร้อมขยายขีดความสามารถในอนาคต
🔍 Impact Analysis
Affected Components
| Component | Level | Impact Description | Required Action |
|---|---|---|---|
| Security Layer | 🔴 High | บังคับใช้ขอบเขตการเชื่อมต่อผ่าน API Gateway เท่านั้น | เพิ่ม permissions ai.suggest, ai.rag_query, ai.migration_manage, ai.audit_log_delete และ Assign ตาม Role Matrix ด้านล่าง |
| Backend (NestJS) | 🔴 High | สร้าง AiModule เป็นศูนย์กลางควบคุม Pipeline และ RAG |
พัฒนา Gateway Services และ Validation Layers |
| Database | 🔴 High | ตารางจัดเก็บประวัติการทวนสอบและสถานะเวกเตอร์ | สร้าง migration_review_queue และ ai_audit_logs (แยก table, ไม่ใช่ Compliance — เป็น AI Development Feedback Log) |
| Frontend (Next.js) | 🟡 Medium | หน้าจอแสดงผลลัพธ์จาก AI พร้อมค่า Confidence | พัฒนา Reusable Form Components และ Dashboard |
| Infrastructure | 🔴 High | การตั้งค่า Admin Desktop (Desk-5439) สำหรับ AI | ติดตั้ง Ollama, Qdrant, n8n, PaddleOCR, PyThaiNLP |
Cross-Module Dependencies
graph TB
subgraph QNAP["🖥️ QNAP NAS (Production Host)"]
BE[NestJS Backend API]
N8N[n8n Workflow Orchestrator]
end
subgraph DESK["🖥️ Desk-5439 (AI Isolation Host)"]
OLLAMA["Ollama\ngemma4:9b + Typhoon Local\n+ nomic-embed-text"]
QDRANT[Qdrant Vector Store]
NLP[PaddleOCR + PyThaiNLP]
end
BE --"HTTP API"--> N8N
N8N --"Ollama REST API"--> OLLAMA
N8N --"Qdrant REST API"--> QDRANT
N8N --"HTTP"--> NLP
N8N --"DMS API (MariaDB update)"--> BE
BE --"RAG Query"--> QDRANT
BE --"LLM Inference"--> OLLAMA
📋 Version Dependency Matrix
| ADR | Version | Dependency Type | Affected Version(s) | Implementation Status |
|---|---|---|---|---|
| ADR-023 | 1.0 | Master Core | v1.9.0+ | ✅ Consolidated |
| ADR-016 | 2.0 | Governs | v1.8.0+ | ✅ Active |
| ADR-019 | 1.5 | Governs | v1.8.0+ | ✅ Active |
Implementation Details (ข้อกำหนดเชิงลึกรายหมวด)
1. Security Isolation Policy (ขอบเขตความปลอดภัย)
- Physical Isolation: เซอร์วิส AI ทั้งหมด (Ollama, Qdrant, PaddleOCR) ต้องรันบน Admin Desktop (Desk-5439) ที่มี GPU RTX 2060 Super 8GB เท่านั้น ห้ามรันบน QNAP NAS หลัก
- No Direct DB/Storage Access: เครื่อง AI Host ห้ามมีการเชื่อมต่อฐานข้อมูล MariaDB หรือเมาท์ Storage ปลายทางโดยตรง การอ่าน/เขียนข้อมูลทั้งหมดต้องทำผ่าน DMS Backend API
- Validation Layer: Backend ต้องตรวจสอบความถูกต้องของ Output จาก AI (Schema, System Enum, Confidence Threshold) ก่อนบันทึกลงฐานข้อมูลเสมอ
AI RBAC Permission Matrix
Permission ใหม่ที่ต้องเพิ่มใน
lcbp3-v1.9.0-seed-permissions.sql(module:ai, ID range: 181-190)
| Permission | คำอธิบาย | Superadmin (1) | Org Admin (2) | Document Control (3) | Editor (4) | Viewer (5) |
|---|---|---|---|---|---|---|
ai.suggest |
รับ AI Suggestion เมื่อสร้าง/แก้ไขเอกสาร | ✅ | ✅ | ✅ | ❌ | ❌ |
ai.rag_query |
ใช้ RAG Q&A สืบค้นเอกสาร | ✅ | ✅ | ✅ | ❌ | ❌ |
ai.migration_manage |
จัดการ Migration Batch (Review/Import/Reject) | ✅ | ✅ | ✅ | ❌ | ❌ |
ai.audit_log_delete |
Hard Delete ai_audit_logs |
✅ | ❌ | ❌ | ❌ | ❌ |
2. Core Infrastructure & Models
นโยบาย: เอกสารทั้งหมดใน LCBP3 จัดชั้นเป็น INTERNAL — AI Inference ทั้งหมดต้องรันภายใน Physical Isolation Boundary บน Desk-5439 เท่านั้น ห้ามใช้ Cloud AI Provider โดยเด็ดขาด
- Orchestrator: ใช้ n8n เป็นตัวควบคุม Flow การนำเข้าและเตรียมข้อมูล
- LLM Engine (General Inference): ใช้ Ollama บน Desk-5439 รันโมเดล
gemma4:9bสำหรับงานทำความเข้าใจเอกสารและ RAG Q&A - LLM Engine & OCR (Thai Specialized Models - T040, US2, US3): รองรับการสลับและเปิดใช้งานโมเดลเฉพาะทางภาษาไทย On-premises แบบ dynamic ได้แก่:
scb10x/typhoon-ocr-3b(~3.5GB VRAM) สำหรับ OCR ภาษาไทยคุณภาพสูงผ่าน OCR Sandbox Selector (มี fallback ไปยัง Tesseract อัตโนมัติใน 5 วินาที)scb10x/typhoon2.1-gemma3-4b(~4.5GB VRAM) สำหรับงานสกัด Metadata และวิเคราะห์ข้อความภาษาไทยผ่าน AI Model Management- ทั้งหมดนี้ควบคุมด้วยนโยบาย
keep_alive = 0( unload ทันทีหลัง inference) และVramMonitorServiceใน backend เพื่อหลีกเลี่ยง GPU VRAM OOM
- Embedding Model: ใช้
nomic-embed-textรันผ่าน Ollama บน Desk-5439 สำหรับแปลงเวกเตอร์ 768-มิติ - OCR & NLP: ใช้ PaddleOCR สกัดข้อความจาก Scanned PDF และใช้ PyThaiNLP ตัดคำ/เตรียมข้อความภาษาไทย — ทั้งคู่รันบน Desk-5439
- ❌ Typhoon Cloud API: ไม่ใช้ —
rag/typhoon.service.tsต้องถูก Remove ออกจาก Codebase (Dead Code + Security Risk)
3. Legacy Data Migration (การนำเข้าข้อมูลเก่า)
- Staging Area: ข้อมูลที่ประมวลผลผ่าน n8n จะถูกส่งเข้าตาราง
migration_review_queueเสมอ - Record Lifecycle: Record ใน
migration_review_queueไม่ถูกลบ หลัง Import — เปลี่ยนstatusเป็นIMPORTEDเก็บไว้ตลอดเพื่อ Debug และตรวจสอบ Batch ย้อนหลัง- Status transitions:
PENDING→IMPORTED|PENDING→REJECTED
- Status transitions:
- Confidence Threshold Policy (กำหนดผ่าน
.env— ไม่ Hardcode, ไม่มี Admin UI):AI_THRESHOLD_HIGH=0.85และis_valid = true\rightarrowสถานะPENDING(พร้อม Import)AI_THRESHOLD_MID=0.60ถึงAI_THRESHOLD_HIGH-0.01\rightarrowสถานะPENDING(ไฮไลต์เตือน Admin)- ต่ำกว่า
AI_THRESHOLD_MIDหรือis_valid = false\rightarrowสถานะREJECTED - การเปลี่ยนค่าต้อง Restart service และมีร่องรอยใน deployment log
- Idempotency Header: บังคับส่ง
Idempotency-Key: <doc_number>:<batch_id>ป้องกันบันทึกซ้ำ - Two-Phase Storage: ไฟล์ถูกอัปโหลดเป็น Temp (
is_temporary = true) และย้ายเข้า Storage จริงเมื่อเรียก API Commit เท่านั้น
4. Smart Classification & Real-time Ingestion
- Enum Enforcement: ฟิลด์หมวดหมู่และประเภทเอกสารที่สกัดได้ ต้องนำไปทวนสอบกับ Master Data (
GET /api/meta/categories) เสมอ ห้ามให้ AI สร้างประเภทเอกสารขึ้นมาเองโดยพลการ - Human Override: นำเสนอผลลัพธ์บนหน้าจอ RFA/Correspondence ให้ผู้ใช้กดยืนยันหรือแก้ไขก่อนบันทึก
5. Hybrid Retrieval-Augmented Generation (RAG)
- Hybrid Search Strategy: ผสานคะแนน Vector Similarity (0.7) + Keyword Exact Match (0.3) และผ่าน Score-based Re-ranking
- Multi-tenant Isolation: บังคับใช้ Qdrant Payload Filter กำหนด
project_public_idเป็นเงื่อนไขในการสืบค้นทุกครั้งเพื่อป้องกันข้อมูลรั่วไหลข้ามโครงการ - LLM สำหรับ RAG Q&A: ใช้ Local Ollama (
gemma4:9b) บน Desk-5439 เท่านั้น — ไม่มี Cloud Fallback เนื่องจากเอกสารทั้งหมดจัดชั้นเป็น INTERNAL - Performance Target:
p95 < 10sสำหรับการตอบคำถามผ่าน Local LLM
6. ai_audit_logs — AI Development Feedback Log
วัตถุประสงค์: บันทึก AI Suggestion + การตัดสินใจของมนุษย์เพื่อใช้วิเคราะห์และปรับปรุงคุณภาพโมเดล AI — ไม่ใช่ Compliance Audit Trail Compliance จริงๆ ถูกบันทึกอยู่ใน
audit_logsแล้ว (Human Confirm Action)
- Key Columns:
document_public_id,model_name,ai_suggestion_json,human_override_json,confidence_score,confirmed_by_user_id,created_at - Retention: ตลอดอายุโครงการ (~5-10 ปี) — Admin สามารถ Hard Delete ได้ผ่าน Frontend เพื่อจัดการ Test Data และ Storage
- RBAC: เฉพาะ Role
SYSTEM_ADMINเท่านั้นที่ลบได้ — การลบทุกครั้งต้องบันทึกในaudit_logs(action: 'AI_AUDIT_LOG_DELETED') - ห้าม Merge: ต้องเป็น Table แยกจาก
audit_logsเพื่อให้ Query ด้วย Typed Columns ได้ (เช่นWHERE confidence_score < 0.85)
Consequences
Positive
- ✅ มีมาตรฐานสถาปัตยกรรม AI ที่เป็นหนึ่งเดียว ง่ายต่อการอ้างอิงและตรวจสอบสิทธิ์
- ✅ ปลอดภัยสูงสุดตามหลักการ Zero Trust ป้องกันฐานข้อมูลและไฟล์ระบบจากความเสี่ยงของเซอร์วิสภายนอก
- ✅ รองรับเอกสารภาษาไทยได้อย่างแม่นยำผ่านกระบวนการ NLP เฉพาะทาง
- ✅ ควบคุมการใช้งานทรัพยากรได้อย่างมีประสิทธิภาพ ไม่รบกวน Production NAS
Negative
- ❌ ระบบมีความซับซ้อนในการตั้งค่าและเชื่อมต่อเครือข่ายระหว่าง NAS และ Admin Desktop
- ❌ มี Overhead ในการดูแลรักษาเครื่อง Desktop (GPU Temperature, Service Uptime)
Mitigation Strategies
- Graceful Degradation (Desk-5439 ออฟไลน์): DMS Core ยังทำงานได้ปกติทุก Feature — เฉพาะ AI Features ถูก Disable ชั่วคราว:
- Backend ตรวจสอบ Health Check ของ Desk-5439 ทุก 60 วินาที ผ่าน
/healthendpoint ของ Ollama และ Qdrant - เมื่อ Desk-5439 ออฟไลน์ → set
AI_AVAILABLE = falseใน Redis Cache - Frontend แสดง Global Banner: "⚠️ ระบบ AI ไม่พร้อมใช้งานชั่วคราว กรุณากรอกข้อมูลด้วยตนเอง"
- AI Classification form fields แสดงผล แต่ AI Suggestion ถูก hide — User กรอกเองได้ปกติ
- RAG Q&A endpoint return
503 Service Unavailableพร้อม error message ที่อ่านเข้าใจได้
- Backend ตรวจสอบ Health Check ของ Desk-5439 ทุก 60 วินาที ผ่าน
- GPU Overload Prevention: ใช้ BullMQ จัดคิวงาน AI แบบ Sequential เพื่อไม่ให้ VRAM 8GB โอเวอร์โหลด
🔄 Review Cycle & Maintenance
Review Schedule
- Next Review: 2026-11-14 (6 months from creation)
- Review Type: Scheduled Core Architecture Review
- Reviewers: System Architect, Security Lead, AI Integration Lead
Review History
| Version | Date | Changes | Status |
|---|---|---|---|
| 1.0 | 2026-05-14 | ยุบรวมและแทนที่ ADR-017, 017B, 018, 020, 022 เป็นฉบับเดียว | ✅ Active |
| 1.1 | 2026-05-14 | Grilling Session: (1) ล็อค Local-only AI บน Desk-5439 ทั้งหมด (2) แยก Typhoon Local vs Cloud (3) ลบ Typhoon Cloud API ออก (4) กำหนด ai_audit_logs เป็น Development Feedback Log ไม่ใช่ Compliance (5) เพิ่ม Admin Hard Delete Policy |
✅ Active |
| 1.2 | 2026-05-30 | บันทึกการรองรับ Typhoon OCR-3B และ typhoon2.1-gemma3-4b แบบ Dynamic พร้อมระบบ VRAM capacity check และ Tesseract fallback | ✅ Active |
Related ADRs (อดีตเอกสารที่ถูกแทนที่)
- ADR-017: Ollama Data Migration Architecture — Superseded
- ADR-017B: AI Document Classification — Superseded
- ADR-018: AI Boundary Policy — Superseded
- ADR-020: AI Intelligence Integration Architecture — Superseded
- ADR-022: Retrieval-Augmented Generation (RAG) System — Superseded