8.4 KiB
AI Refactor
เนื่องจากการอัพเกรด จาก RTX2060 SUPER 8GB เป็น ASUS DUAL RTX5060 Ti 16GB
เป้าหมาย
ปรับปรุงประสิทธิภาพการประมวลผล AI โดยใช้ทรัพยากรใหม่ให้เหมาะสม, รวมถึงปรับปรุงขั้นตอนการทำงานให้เหมาะสมกับทรัพยากรใหม่
Typhoon OCR 1.5
Typhoon2.5-Qwen3-4B
BGE-M3
การตั้งค่าระบบคิว (BullMQ) ร่วมกับ AI
Model
| Model Name | Size | Base FROM | PARAMETER | File |
|---|---|---|---|---|
| np-dms-ocr | 2.9GB | scb10x/typhoon-ocr1.5-3b:latest | num_ctx 8192 | np-dms-ocr-model.md |
| np-dms-typhoon2.5 | 3.6GB | scb10x/typhoon2.5-qwen3-4b:latest | num_ctx 8192 | np-dms-typhoon2.5.model.md |
| np-dms-llama3.1-typhoon2-8b | 5.5GB | scb10x/llama3.1-typhoon2-8b-instruct | num_ctx 8192 | np-dms-llama3.1-typhoon2-8b.model.md |
| np-dms-gemma4-4eb | 3.2GB | gemma4:e4b | num_ctx 8192 | np-dms-gemma4-4eb.model.md |
| np-dms-openthaigpt-7b | 8GB | promptnow/openthaigpt1.5-7b-instruct-q4_k_m | num_ctx 8192 | np-dms-openthaigpt-7b.model.md |
| np-dms-openthaigpt-14b | 9.7GB | promptnow/openthaigpt1.5-14b-instruct-q4_k_m | num_ctx 8192 | np-dms-openthaigpt-14b.model.md |
ollama create np-dms-typhoon2.5 -f np-dms-typhoon2.5.model.md
ollama create np-dms-llama3.1-typhoon2-8b -f np-dms-llama3.1-typhoon2-8b.model.md
ollama create np-dms-gemma4-4eb -f np-dms-gemma4-4eb.model.md
ollama create np-dms-openthaigpt-7b -f np-dms-openthaigpt-7b.model.md
ollama create np-dms-openthaigpt-14b -f np-dms-openthaigpt-14b.model.md
Architecture Decisions (RTX5060 Ti 16GB Optimized)
สรุปการตัดสินใจจาก grilling session — อัปเกรดจาก RTX2060 SUPER 8GB
VRAM Budget
| คอมโพเนนต์ | VRAM | หมายเหตุ |
|---|---|---|
typhoon2.5-np-dms |
3.6GB | โหลดค้างตลอด (resident) |
typhoon-np-dms-ocr |
2.9GB | transient (load on-demand) |
| BGE-M3 | 2.3GB | ย้ายเข้า GPU (Sidecar device='cuda') |
| BGE-Reranker-Large | 1.5GB | ย้ายเข้า GPU (Sidecar device='cuda') |
| รวมสูงสุด | ~10.3GB | เหลือ headroom ~5.7GB |
BullMQ Concurrency
| Queue | Concurrency | เหตุผล |
|---|---|---|
ai-realtime |
2 | VRAM เหลือเยอะ, response เร็วขึ้น |
ai-batch |
1 | background job, ป้องกัน VRAM overflow |
Model Loading Strategy
| โมเดล | กลยุทธ์ | keep_alive |
|---|---|---|
typhoon2.5-np-dms |
โหลดค้างตลอด (ไม่ unload) | — |
typhoon-np-dms-ocr |
โหลดตาม demand, unload อัตโนมัติหลัง 5 นาที | 300 |
Sidecar Changes (port 8765)
# ปัจจุบัน (CPU RAM)
POST /embed → BGE-M3 (CPU)
POST /rerank → BGE-Reranker (CPU)
# หลังอัปเกรด (GPU)
POST /embed → BGE-M3 (GPU via device='cuda')
POST /rerank → BGE-Reranker (GPU via device='cuda')
POST /ocr-upload → Typhoon OCR (Ollama) ← ไม่เปลี่ยน
POST /normalize → PyThaiNLP (CPU) ← ไม่เปลี่ยน
Implementation Tasks
- แก้ไข Sidecar Dockerfile — เพิ่ม CUDA runtime
- แก้ไข Sidecar app.py — เปลี่ยน
device='cuda'สำหรับ BGE models - แก้ไข docker-compose.yml — เพิ่ม NVIDIA Container Toolkit
- อัปเดต BullMQ concurrency config (ai-realtime=2)
- อัปเดต OCR keep_alive จาก 0 เป็น 300
- ตรวจสอบ OllamaService รองรับ resident model
- ทดสอบ VRAM usage จริงกับเอกสารขนาดใหญ่
Rollout Strategy
Big Bang — ระบบยังไม่เปิดใช้งาน production ทำการเปลี่ยนแปลงทั้งหมดในครั้งเดียว
Phase 1 : Foundation
1. Infrastructure
AI Services
Ollama
├── Typhoon OCR 1.5
├── Typhoon2.5-Qwen3-4B
└── BGE-M3
Database
Qdrant
Storage AI
File Serv
├── OCR Output
└── Processed Data
Phase 2 : Ingestion Pipeline
Step 1 Upload
PDF Upload
↓
Store Original File
↓
Create Job
Step 2 OCR
Input
PDF
Process
Typhoon OCR
Output
{
"page": 1,
"content": "..."
}
Store
raw_ocr
Table
document_pages
document_id
page_no
raw_text
Step 3 Structure
Input
Raw OCR Text
Process
Typhoon2.5
Prompt
จัดโครงสร้างเอกสาร
แยก Heading
Section
Metadata
ห้ามสรุป
Output
{
"document_type": "ITP",
"project": "...",
"heading": "...",
"content": "..."
}
Store
structured_document
Step 4 Chunking
ไม่ใช้ LLM
ใช้
Markdown Header Splitter
+
Recursive Splitter
Config
chunk_size: 800
chunk_overlap: 120
Output
{
"chunk_id": "...",
"heading": "...",
"content": "...",
"page": 12
}
Step 5 Embedding
Input
Chunk
Process
BGE-M3
Output
Vector
Step 6 Index
Store in
Qdrant
Payload
{
"document_id": "...",
"page": 12,
"document_type": "ITP",
"heading": "Inspection",
"content": "..."
}
Phase 3 : Retrieval
Step 1 User Query
Slump Test สำหรับงานพื้นชั้น 2 คืออะไร
Step 2 Query Embedding
BGE-M3
Step 3 Search
Qdrant
Top K
10-20
Step 4 Re-rank (แนะนำ)
ใช้
Typhoon2.5
หรือภายหลังเพิ่ม
bge-reranker-v2
Flow
Top20
↓
Top5
Step 5 Answer
ใช้
Typhoon2.5
Prompt
ตอบจาก Context เท่านั้น
อ้างอิงเอกสาร
อ้างอิงหน้า
ห้ามเดา
Output
คำตอบ
อ้างอิง:
ITP-001 หน้า 12
MS-005 หน้า 8
Phase 4 : Metadata Extraction
เพิ่มภายหลัง
Typhoon2.5 Extract
Project
Contractor
Subcontractor
Discipline
Document Type
Revision
Date
เก็บใน PostgreSQL
ช่วยทำ Filter Search เช่น
Project = ABC
Type = MIR
Revision = C
ก่อนเข้า Qdrant
Ollama Models
Typhoon OCR
FROM scb10x/typhoon-ocr1.5-3b:latest
ไม่ต้อง custom
Typhoon2.5
FROM scb10x/typhoon2.5-qwen3-4b:latest
PARAMETER temperature 0.1
PARAMETER top_p 0.9
PARAMETER repeat_penalty 1.05
PARAMETER num_ctx 8192
ไม่มี SYSTEM
Runtime Config
Structure
{
"num_ctx": 8192,
"temperature": 0
}
Answer
{
"num_ctx": 16384,
"temperature": 0.1
}
MVP Roadmap
Sprint 1
✅ Upload PDF ✅ OCR ✅ Store OCR ✅ Chunking ✅ Embedding ✅ Qdrant Search
Sprint 2
✅ Typhoon2.5 Structuring ✅ Metadata Extraction ✅ Better Chunking
Sprint 3
✅ RAG QA ✅ Citation ✅ Source Reference
Sprint 4
✅ Hybrid Search (Vector + Metadata) ✅ Re-ranking ✅ Multi-document QA
Architecture สุดท้าย
PDF
↓
Typhoon OCR
↓
Raw OCR
↓
Typhoon2.5
(Structure + Metadata)
↓
Markdown/Header Splitter
↓
Recursive Splitter
↓
BGE-M3
↓
Qdrant
--------------------------------
Question
↓
BGE-M3
↓
Qdrant
↓
Top-K Chunks
↓
Typhoon2.5
↓
Answer + Citation
สำหรับ MVP ผมจะ ตัด Metadata Extraction ขั้นสูงและ Re-ranker ออกก่อน แล้วทำให้ OCR → Search → Answer ใช้งานได้จริงภายใน 2–3 สัปดาห์แรก จากนั้นค่อยเพิ่มความแม่นยำทีละส่วน.