การตัดสินใจเลือกเทคโนโลยี (Technology Choices)
การตัดสินใจเลือกเทคโนโลยีหลัก ทางเลือกที่พิจารณา และเหตุผลทางวิศวกรรม
การตัดสินใจเลือกเทคโนโลยี
การตัดสินใจเลือกเทคโนโลยีหลัก ทางเลือกที่พิจารณา และเหตุผลทางวิศวกรรม
การตัดสินใจ 1: ใช้ Flutter สำหรับ Mobile
สิ่งที่เลือก: Flutter (Dart) ทางเลือก: React Native (JavaScript)
เหตุผล:
- Flutter ให้ Codebase เดียว (Dart) สำหรับ Android (และ iOS ในอนาคต)
- ประสิทธิภาพการ Render ดีกว่า — Flutter วาด Widget ของตัวเองโดยไม่ต้องพึ่ง Native UI Component Bridge
- รองรับ Dark Mode ทันที
- BLoC State Management มี Document ครบถ้วนและเขียน Test ง่าย
สรุป: โครงการนี้ใช้ Flutter เป็นเทคโนโลยีหลักสำหรับการพัฒนาแอปพลิเคชันมือถือ ดูข้อมูลเพิ่มเติมที่ entities/tech-stack
การตัดสินใจ 2: ใช้ SegFormer แทน CNN สำหรับตรวจภาพตัดต่อ
สิ่งที่เลือก: SegFormer (Transformer-based semantic segmentation) ทางเลือก: CNN-based Classifiers (ResNet, EfficientNet), Traditional Semantic Segmentation Standalone
เหตุผล:
- งานนี้ต้องระบุการดัดแปลงใน ระดับพิกเซล ซึ่งเป็นปัญหา Segmentation ที่ต้องระบุตำแหน่งระดับพิกเซล
- SegFormer จัดการเรื่อง Multi-scale Features (ทั้ง Global Context และ Local Pixel Detail) ได้ดีกว่า Transformer รุ่นแรกๆ
- ไม่มี Fixed Positional Encoding → Generalize กับรูปหลายขนาดได้ดีกว่า
- เร็วกว่า ViT-based Model ตัวเต็ม
- นำไปใช้ร่วมกับ Semantic Segmentation Preprocessing ได้ดี
ข้อแลกเปลี่ยน (Trade-off): กิน RAM/VRAM มากกว่า CNN Classifier แต่ยอมรับได้เมื่อรันบน Cloud
การตัดสินใจ 3: ใช้ FastAPI แทน Django/Flask/Node.js สำหรับ Backend
สิ่งที่เลือก: Python FastAPI ทางเลือก: Django REST Framework, Flask, Node.js Express
เหตุผล:
- Async I/O — FastAPI จัดการ Concurrent Request ได้อย่างมีประสิทธิภาพโดยไม่ติดเรื่อง Threading Overhead
- Performance — Throughput สำหรับงาน I/O-bound เทียบชั้นได้กับ Go และ Node.js
- Pydantic Validation — ตรวจสอบ Schema เข้า-ออกแบบอัตโนมัติ
- OpenAPI Docs — สร้าง API Document ให้โดยอัตโนมัติที่
/docs - ใช้ภาษา Python เช่นเดียวกับฝั่ง AI/ML ทำให้ทีมดูแลรักษาง่ายกว่าต้องสลับภาษา
การตัดสินใจ 4: ใช้ ONNX Runtime แทน Native PyTorch เพื่อ Serving
สิ่งที่เลือก: ONNX Runtime (เฉพาะตอน Serving) การเทรน (Training): ยังใช้ PyTorch เหมือนเดิม
เหตุผล:
- Inference เป้าหมายเร็วกว่า PyTorch baseline รุ่นเดียวกัน ≥ 2 เท่า (ภาพ 1080p เฉลี่ย 100 ภาพ บน T4; ยืนยันด้วย benchmark ก่อนอ้างภายนอก)
- ONNX ทำงานแยกจาก Framework — สามารถรัน Model ได้โดยไม่ต้องลง PyTorch ในฝั่ง Inference
- ลด Dependency และขนาด Container ของฝั่ง Serving
- Flow มาตรฐาน: Train ใน PyTorch → Export เป็น ONNX → Serve ด้วย ONNX Runtime
การตัดสินใจ 5: ใช้ PostgreSQL เป็นฐานข้อมูลหลัก
สิ่งที่เลือก: PostgreSQL ทางเลือก: MongoDB, Firestore (NoSQL)
เหตุผล:
- ระบบต้องการ ACID Transactions เพื่อรักษาความถูกต้องของข้อมูลสแกนและการเก็บ Consent PDPA
- ข้อมูลมีโครงสร้างแบบ Relational ชัดเจน (Users → Scans → Results, Reports)
- มี Extension PostGIS เผื่ออนาคตหากต้องการฟีเจอร์แผนที่จาก EXIF GPS
- เป็นฐานข้อมูลที่มีเสถียรภาพและได้รับความนิยมสูง
การตัดสินใจ 6: ใช้ Google Vision API สำหรับ Reverse Image Search
สิ่งที่เลือก: Google Vision API ทางเลือก: Bing Visual Search
เหตุผล:
- ฐานข้อมูลภาพบนเว็บใหญ่และครอบคลุมที่สุด
- เรียก API ครั้งเดียวสามารถค้นหาครอบคลุมอินเทอร์เน็ตส่วนใหญ่
- เสถียรและมี Document อธิบาย API ดีเยี่ยม
สถานะ v1: ยังไม่เชื่อมต่อ Google Vision API จริง จึงต้องคืน source_status = "unavailable", ไม่ส่ง source_score ที่สร้างขึ้นเอง และคำนวณคะแนนรวมจากมิติที่สำเร็จเท่านั้น พร้อมแจ้งผู้ใช้ว่า Source Verification ยังไม่พร้อมใช้งาน
ความเสี่ยงเมื่อเปิดใช้: ยึดติดกับบริการภายนอก — หาก Google Vision ล่ม ให้ใช้พฤติกรรมเดียวกับสถานะข้างต้น ไม่ใช้ค่า neutral 50; Bing Visual Search เป็นแผนสำรองที่ยังวางแผนอยู่
การตัดสินใจ 7: ใช้ Surya OCR Native PyTorch แทน Tesseract สำหรับอ่านตัวอักษร
สิ่งที่เลือก: Surya OCR v0.5.0 (Native PyTorch) ทางเลือก: Tesseract OCR (ดั้งเดิม), Google Cloud Vision API (Text Detection)
เหตุผล:
- Tesseract OCR ขาดความแม่นยำในการอ่านภาษาไทย โดยเฉพาะรูปที่มีพื้นหลังลวดลายเยอะหรือมีสัญญาณรบกวน (Noise)
- Surya OCR Native รันบน PyTorch/CUDA โดยตรง เสถียรและใช้ GPU ได้เต็มประสิทธิภาพ โดยไม่ต้องพึ่งเซิร์ฟเวอร์แยก
- ช่วยคัดกรอง "Scam Keywords" หลอกลวง (เช่น ด่วน, โบนัส, กู้เงิน) ได้แม่นยำ ลด False Negative
ส่วน Qwen2.5-1.5B ใช้สำหรับสร้างคำอธิบายภาษาไทย (XAI reasoning)
ประเด็นสำคัญ
- การตัดสินใจเลือกเทคโนโลยีเกือบทั้งหมดอิงจาก Requirement: เช่น ต้องการผลระดับพิกเซล, PDPA Compliance, ประสิทธิภาพ, และทีมถนัด Python
- Trade-off ที่ยอมรับคือ SegFormer กิน Memory เยอะกว่า แต่นำมาซึ่งความแม่นยำของ Segmentation
- ONNX Runtime คือการ Optimization เพื่อความเร็วล้วนๆ ไม่ต้องแลกเปลี่ยนกับประสิทธิภาพของอัลกอริทึม