Files
lcbp3/specs/200-fullstacks/224-intent-classification/plan.md
T
admin 1564f8648d
CI / CD Pipeline / build (push) Successful in 4m10s
CI / CD Pipeline / deploy (push) Successful in 3m52s
690524:1919 ADR-028-228-migration #04
2026-05-24 19:19:46 +07:00

174 lines
7.3 KiB
Markdown

# Implementation Plan: Intent Classification System
**Branch**: `224-intent-classification` | **Date**: 2026-05-19 | **Spec**: [spec.md](./spec.md)
**Input**: ADR-024 Intent Classification Strategy + CONTEXT.md AI Runtime Layer
---
## Summary
สร้าง Intent Classification System สำหรับ AI Runtime Layer ตามกลยุทธ์ Hybrid (Pattern First → LLM Fallback) ที่กำหนดใน ADR-024 ระบบจะแปลงคำถามธรรมชาติ (ภาษาไทย/อังกฤษปน) จาก User เป็น Server-side Intent enum ก่อน Route ไปยัง AI Tool Layer (ADR-025)
**แนวทางเทคนิค**:
- Backend: NestJS Module (IntentClassifierModule) พร้อม Service สำหรับ Pattern Matching และ LLM Fallback
- Database: ตาราง `ai_intent_definitions` และ `ai_intent_patterns` (SQL Delta ตาม ADR-009)
- Caching: Redis (TTL 5 นาที) สำหรับ Patterns
- AI: Ollama gemma4:e2b บน Admin Desktop (Desk-5439) สำหรับ LLM Fallback
- Frontend: Admin UI สำหรับจัดการ Intent และ Patterns + Test Console
---
## Technical Context
**Language/Version**: TypeScript 5.x (NestJS 11) + Next.js 16
**Primary Dependencies**:
- Backend: NestJS, TypeORM, ioredis (Redis), axios (Ollama HTTP)
- Frontend: React, TanStack Query, shadcn/ui components
**Storage**: MariaDB 11.8 (Intent Definitions/Patterns), Redis (Cache), Ollama (LLM)
**Testing**: Jest (Backend Unit/Integration), Vitest (Frontend Unit), Playwright (E2E)
**Target Platform**: QNAP NAS (Docker), Admin Desktop (Ollama)
**Project Type**: Web application (Backend + Frontend)
**Performance Goals**:
- Pattern Match: < 10ms (cache hit), < 50ms (cache miss)
- LLM Fallback: < 2000ms (รวม Pattern Check)
**Constraints**:
- GPU Budget: RTX 2060 Super 8GB (ใช้ร่วมกับ RAG, OCR, Embedding)
- LLM Semaphore: Max 3 concurrent calls
- Bilingual Input: ไทย/อังกฤษปน + typo tolerance
**Scale/Scope**:
- 12 Intent Definitions (v1)
- 50+ concurrent users
- 70-80% Pattern Hit Rate target
---
## Constitution Check
_GATE: Must pass before Phase 0 research. Re-check after Phase 1 design._
| Rule | Status | Notes |
|------|--------|-------|
| ADR-019 UUID | ✅ | ใช้ `publicId` (UUIDv7 string) ทุก API — ไม่มี `parseInt` |
| ADR-009 Schema | ✅ | SQL Delta file สำหรับตารางใหม่ — ไม่ใช้ TypeORM migration |
| ADR-016 Security | ✅ | CASL Guard บน Admin API, JWT Auth, Rate Limiting |
| ADR-023A AI Boundary | ✅ | Ollama บน Admin Desktop — AI ไม่เข้า DB โดยตรง |
| ADR-007 Error Handling | ✅ | Layered error classification — user-friendly messages |
| TypeScript Strict | ✅ | Zero `any`, zero `console.log` (ใช้ NestJS Logger) |
| i18n | ✅ | ใช้ i18n keys — ไม่ hardcode ภาษาไทย/อังกฤษ |
**ผ่าน Gate ทั้งหมด** — พร้อมดำเนินการ Phase 0
---
## Project Structure
### Documentation (this feature)
```text
specs/200-fullstacks/224-intent-classification/
├── plan.md # This file
├── research.md # Phase 0 output
├── data-model.md # Phase 1 output
├── quickstart.md # Phase 1 output
├── contracts/ # Phase 1 output (OpenAPI specs)
├── tasks.md # Phase 2 output (speckit-tasks)
└── checklists/ # Quality checklists
```
### Source Code (repository root)
```text
backend/
├── src/
│ ├── modules/
│ │ └── ai/
│ │ ├── intent-classifier/ # NEW: Intent Classification Module
│ │ │ ├── intent-classifier.module.ts
│ │ │ ├── intent-classifier.service.ts
│ │ │ ├── intent-classifier.controller.ts
│ │ │ ├── entities/
│ │ │ │ ├── intent-definition.entity.ts
│ │ │ │ └── intent-pattern.entity.ts
│ │ │ ├── dto/
│ │ │ │ ├── classify-query.dto.ts
│ │ │ │ ├── classification-result.dto.ts
│ │ │ │ ├── create-intent-definition.dto.ts
│ │ │ │ └── create-intent-pattern.dto.ts
│ │ │ └── interfaces/
│ │ │ ├── classification-result.interface.ts
│ │ │ └── intent-category.enum.ts
│ │ └── ai.module.ts # UPDATE: Add IntentClassifierModule
│ └── database/
│ └── seeds/
│ └── ai-intent.seed.ts # Seed 12 Intent Definitions
frontend/
├── app/
│ └── (admin)/
│ └── admin/
│ └── ai/
│ └── intent-classification/ # NEW: Admin UI
│ ├── page.tsx # Intent Definitions List
│ ├── [intentCode]/
│ │ ├── page.tsx # Intent Detail + Patterns
│ │ └── patterns/
│ │ └── page.tsx # Pattern Management
│ └── test-console/
│ └── page.tsx # Test Console
├── components/
│ └── ai/
│ └── intent-classification/ # NEW: Reusable Components
│ ├── intent-form.tsx
│ ├── pattern-form.tsx
│ ├── test-console-panel.tsx
│ └── classification-result-card.tsx
├── hooks/
│ └── ai/
│ └── use-intent-classification.ts # TanStack Query hooks
└── lib/
└── services/
└── ai-intent.service.ts # API client
```
**Structure Decision**: Web application (NestJS Backend + Next.js Frontend) — ตามโครงสร้างที่มีอยู่แล้วใน LCBP3
---
## Complexity Tracking
ไม่มี Constitution Violations ที่ต้องอธิบายเพิ่มเติม — ทุกอย่างสอดคล้องกับ ADRs ที่มีอยู่
---
## Phase 0: Research
ดูรายละเอียดใน [research.md](./research.md)
**หัวข้อที่ต้อง Research**:
1. Redis Cache Strategy สำหรับ Patterns (TTL + Invalidation)
2. Ollama HTTP API Integration (gemma4:e2b)
3. Semaphore Pattern ใน NestJS (p-limit หรือ RxJS)
4. Regex Validation ใน TypeORM/Class-Validator
---
## Phase 1: Design Artifacts
### Data Model
ดูรายละเอียดใน [data-model.md](./data-model.md)
### API Contracts
ดูรายละเอียดใน [contracts/](./contracts/)
### Quick Start
ดูรายละเอียดใน [quickstart.md](./quickstart.md)
---
## Next Steps
1.**Phase 0 Complete** — Research ใน [research.md](./research.md)
2.**Phase 1 Complete** — Design artifacts: data-model.md, contracts/, quickstart.md
3.**Phase 2** — รอ `/speckit-tasks` สร้าง tasks.md
4.**Phase 3** — รอ `/speckit-analyze` ตรวจสอบความสอดคล้อง