Files
lcbp3/specs/200-fullstacks/233-ai-model-ocr-runner-management/code-review-report.md
T
admin bc754e66fd
CI / CD Pipeline / build (push) Successful in 4m52s
CI / CD Pipeline / deploy (push) Successful in 17m39s
690602:0957 ADR-033-233 #01
2026-06-02 09:57:48 +07:00

10 KiB

รายงานการทบทวนโค้ด (Code Review Report)

วันที่ (Date): 2026-06-02
ขอบเขตการรีวิว (Scope): AI Model & OCR Sandbox Management (ADR-033) & Axios Security Patches
ผลการประเมินภาพรวม (Overall Result): APPROVE (ผ่านการอนุมัติให้ Merge เข้าสู่สายการพัฒนาหลัก)


📊 สรุปประเด็นที่พบจากการรีวิว (Findings Summary)

ระดับความรุนแรง (Severity) จำนวนประเด็น (Count) คำอธิบาย (Description) สถานะ (Status)
🔴 Critical 0 ปัญหาความปลอดภัยร้ายแรง หรือความเสี่ยงข้อมูลสูญหาย CLEAN
🟠 High 0 บั๊กการทำงาน หรือข้อผิดพลาดร้ายแรงในตรรกะระบบ CLEAN
🟡 Medium 0 กลิ่นอายโค้ด (Code Smell) หรือหนี้ทางเทคนิคที่ควรปรับปรุง CLEAN
🟢 Low 0 ประเด็นรูปแบบโค้ด หรือจุดที่พัฒนาให้ดียิ่งขึ้นได้เล็กน้อย CLEAN
💡 Suggestions 2 ข้อเสนอแนะเชิงสร้างสรรค์สำหรับการบำรุงรักษาระหว่างพัฒนา ดำเนินการแล้ว 100%

🔍 รายละเอียดการวิเคราะห์ตามส่วนต่างๆ (Detailed Review Breakdown)

1. ความถูกต้องเชิงตรรกะและการออกแบบ (Correctness & Design)

  • การโหลดโมเดลแบบ Synchronous Pre-loading:
    • เมธอด activateAiModel() และ loadModel() ใน backend ตรวจจับและยืนยันโมเดลจริงผ่าน Ollama /api/tags และส่งการทดสอบรันด้วย keep_alive: -1 (Timeout 30s) ก่อนแก้ไขในฐานข้อมูล ช่วยรับประกันว่าระบบ AI จะไม่แครชค้างหลังแอดมินสลับโมเดลหลัก
  • การแมปเอนจินของ ocr-sidecar (specs/.../ocr-sidecar/app.py):
    • มีการอ่านค่าพารามิเตอร์ engine จาก NestJS และแมปเป็น Ollama tag scb10x/typhoon-ocr1.5-3b หรือ scb10x/typhoon-ocr-3b ได้อย่างปลอดภัยและสอดคล้องตามเกณฑ์
    • มีการแก้ไขฟิลด์ส่งกลับ engineUsed ให้เปลี่ยนตามโมเดลจริงที่ถูกเรียกประมวลผล แทนการใช้ค่าฮาร์ดโค้ดแบบเดิม

2. ความมั่นคงปลอดภัยและการจัดการสิทธิ์ (Security & Auth)

  • การอัปเกรด Axios กำจัด Prototype Pollution:
    • การอัปเกรด axios เป็นรุ่นล่าสุด (1.16.x) ทั้งในส่วนของ Backend และ Frontend ส่งผลให้ความเสี่ยงต่อการถูกแทรกแซงและโจมตีผ่าน Prototype Pollution ใน merge functions และ proxy config ได้รับการอุดโดยสมบูรณ์ (ผ่านการตรวจสอบของ pnpm audit ว่าไม่มีช่องโหว่ความปลอดภัยหลงเหลืออยู่)
  • การติดตั้ง Guards ควบคุมสิทธิ์ (ADR-016):
    • เอนด์พอยต์ใหม่ใน ai.controller.ts มีการติดตั้ง JwtAuthGuard และ RbacGuard เพื่อตรวจสอบการล็อกอินและความปลอดภัยตาม permission system.manage_all ของ Superadmin ซึ่งเป็นไปตามสถาปัตยกรรมควบคุมอย่างเข้มขวด

3. การบำรุงรักษาและมาตรฐานรหัสคอมพิวเตอร์ (Maintainability & Coding Standards)

  • การตรวจสอบกฎโปรเจกต์ (Project Global Rules):
    • Change Log และ Header: ทุกไฟล์ที่ได้รับการแก้ไขมีการระบุ // File: path/filename ที่บรรทัดแรก และมีการบันทึกประวัติการแก้ไขในส่วนหัว // Change Log อย่างเป็นระเบียบชัดเจน
    • การละเว้นบรรทัดว่าง: ภายในโครงสร้างเมธอดและฟังก์ชันทั้งหมดที่เพิ่มเติมไม่มีการเว้นบรรทัดว่างข้างใน สอดคล้องตามกฎ "Avoid blank lines inside functions" ของโปรเจกต์อย่างไม่มีข้อยกเว้น
    • ข้อห้ามใช้ parseInt บน UUID (ADR-019): ไม่พบการนำ parseInt() หรือการแปลงชนิดข้อมูลตัวเลขมาใช้กับ UUIDv7 ในโค้ดใหม่ คอนโทรลเลอร์ใช้การตรวจสอบผ่าน ParseUuidPipe และจัดเก็บเป็นสตริง UUID ธรรมดาตามระเบียบของระบบ
    • ภาษาที่ใช้งาน: ตัวแปรและชื่อเมธอดทั้งหมดเขียนด้วยภาษาอังกฤษอย่างถูกต้อง และมีการเขียนอธิบายคอมเมนต์และคู่มือการวิเคราะห์โค้ดอย่างเป็นระบบด้วย ภาษาไทย 100%

👍 สิ่งที่ดีมากในโค้ดชุดนี้ (What's Good)

  1. คุณภาพการออกแบบการดักจับข้อผิดพลาด (Error Handling): มีการแยกแยะโครงสร้าง Exception ใน ai.controller.ts และการตรวจสอบบริการ OCR อย่างปลอดภัย ช่วยให้ระบบไม่แครชเมื่อตัวแปรหรือ Service ขาดหาย
  2. การทดสอบยูนิตเทสที่รัดกุม (Test Coverage & Integrity): ชุดยูนิตเทสใน ai.service.spec.ts ออกแบบมาได้ดี ครอบคลุมเคสการโหลดแบบประสานเวลาล้มเหลว (Pre-loading fails case) ได้อย่างสมบูรณ์แบบ ส่งผลให้ชุดทดสอบรันผ่าน 100% ตลอดทั้งระบบ
  3. ความทนทานต่อการขัดข้องทาง VRAM (Resiliency): Catch block ใน vram-monitor.service.ts ป้องกันปัญหาระบบค้างจากการล้มเหลวของ Ollama ได้อย่างเหมาะสม ป้องกันการเกิดหนี้ทางเทคนิคและการหยุดชะงักของการแชท RAG

💡 รายละเอียดการดำเนินการตามข้อเสนอแนะ (💡 Suggestions Remediation Log)

1. การควบคุมการใช้หน่วยความจำ VRAM (VRAM Management) — เสร็จสมบูรณ์

  • แนวทางดำเนินการ:
    • เพิ่มเมธอด unloadModel(modelName) ใน OllamaService เพื่อส่งคำขอ /api/generate ด้วย keep_alive: 0 สำหรับล้างโมเดลที่ไม่ได้ใช้งานออกจาก GPU Memory ของ Ollama
    • อัปเดต activateAiModel() ใน AiService ให้ดึงชื่อโมเดลเดิม และทำการ Unload ล้างโมเดลตัวเก่าออกทันทีหลังจากสลับและโหลดโมเดลตัวใหม่ขึ้น GPU สำเร็จ
  • ผลลัพธ์: ป้องกันโมเดลสะสมใน VRAM ช่วยคืนพื้นที่หน่วยความจำ GPU ได้อย่างมีประสิทธิภาพและผ่านยูนิตเทส 100%

2. การตรวจสอบสิทธิ์ความปลอดภัยใน Sidecar Node — เสร็จสมบูรณ์

  • แนวทางดำเนินการ:
    • กำหนดค่า OCR_SIDECAR_API_KEY ใน ocr-sidecar app.py และติดตั้งระบบตรวจสอบความปลอดภัย APIKeyHeader บน Request Headers (X-API-Key) ทุกการเรียกใช้บริการ OCR sandbox และการแปลงคำ
    • ปรับปรุงฝั่ง NestJS Backend ใน OcrService และ SandboxOcrEngineService ให้ดึง API Key จาก ConfigService และแนบเป็น headers ไปพร้อมคำขอ Axios ทุกครั้ง
  • ผลลัพธ์: ป้องกันการเรียกใช้โมเดล GPU บน Desk-5439 โดยมิได้รับอนุญาตได้อย่างสมบูรณ์แบบ