Files
2026-05-19 08:19:40 +07:00

295 lines
16 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 🔍 เปรียบเทียบ: AI DMS Architecture Proposal vs. Repo จริง (lcbp3)
> จากแผน "อยากได้" → เทียบกับ "ที่มีอยู่จริง" แบบละเฮียกทีละข้อ 🎯
---
## 🏗️ 1. Architecture ภาพรวม
| ส่วนที่เสนอ | สถานะใน Repo | Gap / ข้อสังเกต |
|------------|-------------|---------------|
| **User → Web UI / Chat UI** | ✅ มี Next.js 16 + App Router | ✅ ตรงตามแผน แต่ยังไม่มี "Chat UI" แบบ Dedicated (มีแต่ Table + Form) |
| **AI Agent Layer** | 🟡 มี `.agents/` + `AGENTS.md` + n8n | ⚠️ เป็น "Agent Toolkit" สำหรับ Dev AI ช่วยเขียนโค้ด **ไม่ใช่** AI Agent ที่รันใน Production สำหรับ User |
| **RAG Engine** | ✅ มี ADR-022 (Superseded) → ADR-023 | ✅ มีสถาปัตยกรรม RAG แล้ว แต่ยังเป็น "แผน" ในเอกสาร ต้องดูการ Implement จริง |
| **Workflow Engine** | ✅ มี `workflow-engine/` module + ADR-001/021 | ✅ ตรงตามแผน 100% — DSL-based workflow + Integrated Context |
| **Tool Layer** | 🟡 มี Services ใน NestJS modules | ⚠️ Tools ยังเป็น "Internal API" ไม่ใช่ "Function Calling Interface" สำหรับ AI โดยตรง |
| **Database + Storage** | ✅ MariaDB 11.8 + Two-Phase File Storage | ✅ ตรงตามแผน + มี ClamAV + Redis Locking |
👉 **สรุป**: โครงสร้างพื้นฐาน (Infrastructure) พร้อมมาก แต่ "AI Agent Layer" ที่ User คุยด้วยยังต้องพัฒนาเพิ่ม
---
## 🔥 2. Core Components (ต้องมี)
### 2.1 AI Agent (สมอง)
| ที่เสนอ | ที่มีอยู่ | Gap |
|--------|----------|-----|
| LangChain / CrewAI | 🟡 ใช้ n8n + Ollama (ADR-023) | ⚠️ n8n เป็น Workflow Orchestrator **ไม่ใช่** Agent Framework แบบ LangChain |
| เข้าใจคำถาม → ตัดสินใจ → Call Tool | 🟡 มี "AI Boundary" (ADR-023) | ⚠️ ยังไม่มี "Intent Recognition Layer" ที่แยก Query → Tool Routing ชัดเจน |
💡 **แนะนำ**: ถ้าอยากได้ Agent แบบ "ตัดสินใจเอง" อาจต้องเพิ่ม `ai-agent/` module ที่ใช้ LangGraph หรือ Custom Agent Loop
---
### 2.2 RAG System (ค้นหาเอกสาร)
| ที่เสนอ | ที่มีอยู่ | Gap |
|--------|----------|-----|
| Vector DB: Qdrant / Chroma | 🟡 มี ADR-023A ระบุใช้ `Qdrant` | ✅ มีในสถาปัตยกรรม แต่ต้องตรวจสอบว่า Deploy แล้วหรือยัง |
| Search PDF / Drawing / Spec | 🟡 มี Elasticsearch 9.3.4 | ⚠️ Elasticsearch เป็น **Keyword Search** ไม่ใช่ **Vector Search** — ต้องแยกกัน |
| Use case: "Drawing A-101 revision ล่าสุด" | 🟡 มี `drawing/` module + revision tracking | ✅ Data Model พร้อม แต่ต้องเพิ่ม "Natural Language → Query Translation" |
💡 **จุดสำคัญ**: ต้องแยกให้ชัดระหว่าง:
- `Elasticsearch` → Full-text search (keyword)
- `Qdrant` → Vector search (semantic/RAG)
---
### 2.3 Tool Layer (สำคัญมาก) ⭐
| Tool ที่เสนอ | ที่มีอยู่ (NestJS Service) | Gap |
|-------------|--------------------------|-----|
| `get_rfa(id)` | ✅ `RfaService.findOne()` | ✅ พร้อม แต่ต้องสร้าง "AI Tool Wrapper" |
| `get_drawings_by_rfa(rfa_id)` | 🟡 มี Relation ใน Schema | ⚠️ ต้องเขียน Service Method แยกสำหรับ AI Call |
| `get_latest_revision(drawing_code)` | ✅ มี `DrawingService.getLatestRevision()` | ✅ พร้อม |
| `search_documents(query)` | ✅ มี `SearchModule` (Elasticsearch) | ⚠️ ต้องเพิ่ม "Vector Search" endpoint สำหรับ RAG |
| `get_transmittal_history()` | ✅ มี `TransmittalService` | ✅ พร้อม |
💡 **สิ่งที่ต้องทำเพิ่ม**: สร้าง `AiToolsService` ที่:
```typescript
// ตัวอย่าง: AI Tool Wrapper
@Injectable()
export class AiToolsService {
@Tool({ name: 'get_rfa', description: 'Get RFA by ID' })
async getRfa(id: string) {
return this.rfaService.findOne({ publicId: id });
}
// ...อื่นๆ
}
```
---
### 2.4 Workflow Engine (logic ธุรกิจ)
| ที่เสนอ | ที่มีอยู่ | Gap |
|--------|----------|-----|
| RFA status flow | ✅ มี `workflow-engine/` + DSL | ✅ ตรงตามแผน 100% |
| Approval logic | ✅ มี CASL Guards + State Machine | ✅ พร้อม |
| Revision control | ✅ มี `revisions` table + locking | ✅ พร้อม |
| "AI = ช่วยคิด, Workflow = ของจริง" | ✅ มี ADR-023 "AI Boundary" | ✅ ตรงตามหลักการ |
👉 **จุดแข็ง**: ส่วนนี้ทำไว้ดีมากแล้ว — AI ไม่สามารถ "มั่ว" Workflow ได้ เพราะต้องผ่าน DSL Engine
---
### 2.5 File Storage
| ที่เสนอ | ที่มีอยู่ | Gap |
|--------|----------|-----|
| เก็บไฟล์จริง (PDF, DWG) | ✅ Two-Phase Storage + ClamAV | ✅ ตรงตามแผน |
| Version control | ✅ มี `revisions` table + naming convention | ✅ พร้อม |
| Naming convention | ✅ มี `document-numbering/` module (ADR-002) | ✅ พร้อม |
---
## ⚙️ 3. Database Design
| Table ที่เสนอ | ที่มีอยู่ | Gap |
|--------------|----------|-----|
| `ai_embeddings` | 🟡 มีใน ADR-023A (Qdrant) | ⚠️ ต้องสร้าง Collection ใน Qdrant + Sync Job |
| `ai_logs` | 🟡 มี `monitoring/` module | ⚠️ ต้องเพิ่ม `ai_audit_logs` table สำหรับ tracking AI decisions |
| `ai_tasks` | 🟡 มี BullMQ (ADR-008) | ✅ สามารถใช้ `ai-batch` queue สำหรับ background jobs |
💡 **แนะนำ**: สร้าง migration script สำหรับ:
```sql
-- ตัวอย่าง: ai_audit_logs table
CREATE TABLE ai_audit_logs (
id INT AUTO_INCREMENT PRIMARY KEY,
user_public_id BINARY(16),
query_text TEXT,
agent_decision JSON,
tools_used JSON,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```
---
## 🤖 4. AI Use Cases (ของจริงที่ควรทำ)
| Use Case | สถานะใน Repo | ความยาก |
|----------|-------------|---------|
| 🔎 Smart Search | 🟡 มี Elasticsearch + ADR-023 RAG | ⭐⭐ ต้องเพิ่ม NL→Query translator |
| 📄 Document QA | 🟡 มี OCR + Text extraction ในแผน | ⭐⭐⭐ ต้องเพิ่ม PDF parsing + chunking pipeline |
| 🔗 Relationship Mapping | ✅ มี Relations ใน Schema + Services | ⭐⭐ ต้องเพิ่ม "Graph Query" layer สำหรับ AI |
| 📊 Timeline Analysis | 🟡 มี `revisions.created_at` | ⭐⭐⭐ ต้องเพิ่ม "Temporal Query" logic |
| 🧠 Auto Classification | 🟡 มี ADR-017B (Superseded) | ⭐⭐⭐⭐ ต้องฝึก Model หรือใช้ Prompt Engineering |
| ⚠️ Alert / Assistant | 🟡 มี `notification/` module | ⭐⭐ ต้องเพิ่ม "Rule Engine" สำหรับ trigger alerts |
---
## 🧩 5. UI Design
| ส่วนที่เสนอ | ที่มีอยู่ | Gap |
|------------|----------|-----|
| Hybrid UI: Table + Chat | 🟡 มี DataTables + Forms | ⚠️ ยังไม่มี "Chat Panel" แบบ Side-by-side |
| Drawing Page: revision + RFAs + AI summary | ✅ มี `drawing/` module + relations | ⚠️ ต้องเพิ่ม "AI Summary" component ที่เรียก RAG |
💡 **Quick Win**: เพิ่ม Chat Panel แบบง่ายๆ ใน `app/(dashboard)/drawings/[id]/page.tsx`:
```tsx
// ตัวอย่าง: Chat Panel ใน Drawing Page
<aside className="w-80 border-l">
<AiChatPanel
context={{ type: 'drawing', id: drawing.publicId }}
tools={['get_related_rfas', 'get_revision_history']}
/>
</aside>
```
---
## ⚡ 6. Tech Stack
| ส่วนที่เสนอ | ที่มีอยู่ | ตรงกัน? |
|------------|----------|---------|
| Backend: PHP → Python | ❌ ใช้ NestJS (TypeScript) ทั้งระบบ | ⚠️ ไม่ตรง — แต่ TypeScript + NestJS ดีกว่า PHP สำหรับ AI Integration |
| AI Layer: LangChain / Ollama | 🟡 ใช้ Ollama + n8n (ADR-023) | ✅ ตรงบางส่วน — ขาด LangChain/LlamaIndex |
| Vector DB: Qdrant | ✅ มีใน ADR-023A | ✅ ตรง |
| Frontend: DataTables + Chat UI | 🟡 มี DataTables (shadcn/ui) | ⚠️ ขาด Chat UI component |
💡 **ข้อดีของ Stack ปัจจุบัน**:
- Full TypeScript → Type-safe AI Tool definitions
- NestJS Modules → Easy to add `ai-agent/` module
- BullMQ → Ready for async AI jobs
---
## 🔥 7. Flow การทำงานจริง
### 📥 Upload Drawing
| ขั้นตอนที่เสนอ | ที่มีอยู่ | Gap |
|--------------|----------|-----|
| 1. User upload PDF | ✅ มี Two-Phase Upload | ✅ พร้อม |
| 2. Extract text (OCR) | 🟡 มีแผนใน ADR-023A | ⚠️ ต้องเพิ่ม OCR service (Tesseract / PaddleOCR) |
| 3. Chunk + Embed → Vector DB | 🟡 มี Qdrant ในแผน | ⚠️ ต้องเขียน `DocumentIndexingService` |
| 4. AI tag metadata | 🟡 มี ADR-017B (Superseded) | ⚠️ ต้อง implement classification pipeline |
### 🔎 Query
| ขั้นตอนที่เสนอ | ที่มีอยู่ | Gap |
|--------------|----------|-----|
| 1. เข้าใจ intent | 🟡 ไม่มี NLU layer | ⭐⭐⭐ ต้องเพิ่ม Intent Classifier |
| 2. Call tool: `get_drawings()` | ✅ มี `DrawingService` | ✅ พร้อม (แต่ต้อง wrap เป็น AI Tool) |
| 3. Filter revision ล่าสุด | ✅ มี `getLatestRevision()` | ✅ พร้อม |
| 4. ตอบ | 🟡 มี API Response | ⚠️ ต้องเพิ่ม "Natural Language Generation" layer |
---
## 🧠 8. Insight สำคัญ (อย่าพลาด)
| ข้อควรระวัง | สถานะใน Repo | ผ่าน? |
|------------|-------------|-------|
| ❌ อย่าให้ AI query DB ตรงๆ | ✅ มี ADR-023 "AI Boundary" | ✅ ผ่าน |
| ❌ อย่าให้ AI ตัดสินใจ workflow | ✅ มี Workflow Engine แยก | ✅ ผ่าน |
| ✅ AI → call function (tool) | 🟡 มี Services แต่ไม่มี Tool Interface | ⚠️ ต้องเพิ่ม `@Tool()` decorator pattern |
| ✅ System → validate logic | ✅ มี CASL Guards + Validation | ✅ ผ่าน |
👉 **คุณทำถูกแล้ว**: การแยก "AI Intelligence" ออกจาก "Business Logic" เป็นหัวใจของระบบที่ปลอดภัย
---
## 🚀 9. Roadmap (ทำจริง)
### Phase 1 (24 สัปดาห์) — AI Chat + Query DB
| Task | สถานะ | ความยาก |
|------|--------|---------|
| สร้าง `AiAgentModule` ใน NestJS | ❌ ยังไม่มี | ⭐⭐ |
| สร้าง `AiToolsService` wrapper | ❌ ยังไม่มี | ⭐⭐ |
| เพิ่ม Chat UI component ใน Frontend | ❌ ยังไม่มี | ⭐⭐ |
| ทดสอบ: "RFA ล่าสุดคืออะไร" | ❌ ยังไม่มี | ⭐⭐ |
### Phase 2 — RAG + Embedding
| Task | สถานะ | ความยาก |
|------|--------|---------|
| Deploy Qdrant ใน Docker | 🟡 มีในแผน | ⭐⭐ |
| สร้าง `DocumentIndexingService` (OCR + Chunk + Embed) | ❌ ยังไม่มี | ⭐⭐⭐ |
| สร้าง `QdrantService` สำหรับ vector search | ❌ ยังไม่มี | ⭐⭐ |
| ทดสอบ: "สรุป spec นี้" | ❌ ยังไม่มี | ⭐⭐⭐ |
### Phase 3 — Automation + Alert
| Task | สถานะ | ความยาก |
|------|--------|---------|
| สร้าง `AiAlertService` สำหรับ rule-based alerts | ❌ ยังไม่มี | ⭐⭐⭐ |
| สร้าง `ClassificationPipeline` สำหรับ auto-tagging | ❌ ยังไม่มี | ⭐⭐⭐⭐ |
| Integrateกับ Notification Module | ✅ มี `notification/` module | ⭐⭐ |
---
## 🎯 10. ถ้าจะทำให้ "โหดจริง"
### Ultimate Version: AI = Document Controller
| ฟีเจอร์ | สิ่งที่ต้องเพิ่ม | ความยาก |
|--------|----------------|---------|
| 🔍 Auto check: revision mismatch | สร้าง `RevisionConsistencyChecker` | ⭐⭐⭐ |
| 🔍 Auto check: missing approval | สร้าง `ApprovalGapDetector` | ⭐⭐⭐ |
| 🔍 Auto check: outdated drawing | สร้าง `DrawingFreshnessMonitor` | ⭐⭐⭐ |
| 🤖 Proactive alert: "Drawing นี้ outdated" | Integrateกับ `notification/` module | ⭐⭐ |
---
## 💡 สรุปสั้นๆ (แบบเฮียก)
### ✅ สิ่งที่ "มีแล้ว" และ "ทำดีแล้ว"
1. **สถาปัตยกรรมพื้นฐาน** — NestJS + Next.js + MariaDB + Redis + Elasticsearch → Solid
2. **Workflow Engine** — DSL-based + ADR-001/021 → ตรงตามแผน 100%
3. **Security & RBAC** — CASL + 4-Level + JWT → พร้อมสำหรับ Enterprise
4. **File Storage** — Two-Phase + ClamAV + Versioning → ดีมาก
5. **AI Boundary** — ADR-023 กำหนดขอบเขตชัดเจน → ป้องกัน AI มั่ว
### ⚠️ สิ่งที่ "ต้องเพิ่ม" เพื่อให้เป็น AI DMS จริง
1. **AI Agent Runtime** — สร้าง `ai-agent/` module ที่รันใน Production (ไม่ใช่แค่ `.agents/` สำหรับ Dev)
2. **Tool Calling Interface** — Wrap Services เป็น `@Tool()` decorators สำหรับ AI Call
3. **Vector Search Pipeline** — Deploy Qdrant + สร้าง `DocumentIndexingService`
4. **Chat UI Component** — เพิ่ม Side Panel Chat ใน Drawing/RFA Pages
5. **Intent Recognition** — เพิ่ม NL→Query translator สำหรับ Smart Search
### 🎯 Quick Win (ทำใน 1 สัปดาห์)
```bash
# 1. สร้าง AI Agent Module
nest g module ai-agent
nest g service ai-agent/ai-tools
nest g controller ai-agent/chat
# 2. เพิ่ม Tool Wrapper
# src/ai-agent/ai-tools.service.ts
@Injectable()
export class AiToolsService {
@Tool({ name: 'get_rfa', description: 'Get RFA by publicId' })
async getRfa(@Arg('publicId') publicId: string) {
return this.rfaService.findOne({ where: { publicId } });
}
}
# 3. เพิ่ม Chat Endpoint
# src/ai-agent/chat.controller.ts
@Post('chat')
async chat(@Body() dto: ChatDto) {
// 1. Parse intent
// 2. Route to tools
// 3. Generate response
}
```
---
> 🎯 **Bottom Line**: Repo คุณ "พร้อม 80%" สำหรับ AI DMS — ขาดแค่ "AI Runtime Layer" ที่เชื่อม Agent → Tools → UI
> ถ้าเพิ่ม `ai-agent/` module + Tool Interface + Chat UI → จะได้ระบบที่ "โหดจริง" ตามที่วางแผนไว้ 🔥