174 lines
7.3 KiB
Markdown
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` ตรวจสอบความสอดคล้อง
|