# AI 기반 화면 자동 생성 시스템 설계서

## 1. 개요

### 1.1 목표

사용자가 자연어로 "자재입고페이지 만들어줘"라고 요청하면, AI가 자동으로 완성된 화면과 워크플로우를 생성

### 1.2 핵심 가치

- **제로 코딩**: 대화만으로 화면 생성
- **워크플로우 포함**: 저장 시 재고 업데이트 등 자동 설정
- **기존 시스템 활용**: 새 인프라 최소화, 기존 API 재사용

### 1.3 예상 시나리오

```
사용자: "자재입고페이지 만들어줘"

AI: "입고관리 화면 41개를 분석했습니다.

     ✅ 자동 적용 (90%+ 사용)
     - 레이아웃: 분할화면 (좌: 목록, 우: 상세)
     - 필수 필드: 입고번호, 입고일자, 품목코드, 수량

     💡 추천 기능 (60% 사용)
     - 저장 시 재고 자동 증가
     [추가하기]

     ➕ 선택 필드
     [ ] 창고 (68%)  [ ] 공급업체 (61%)

     [화면 생성하기]"

사용자: "재고 연동 추가하고, 창고 필드도 넣어줘"

AI: "화면을 생성했습니다.
     - 화면명: 자재 입고관리
     - 레이아웃: 분할화면
     - 필드: 입고번호, 입고일자, 품목, 수량, 창고
     - 워크플로우: 저장 시 inventory_stock +qty
     
     [미리보기] [메뉴에 추가]"
```

---

## 2. 시스템 아키텍처

```
 ┌───────────────────────────────────────────────────────────────┬───────────────────────────────┐
│                     신규 개발 (AI 담당)                          │ 기존 드래그앤드랍 시스템          │
│  ┌─────────────┐     ┌──────────────────────────────┐         │  ┌─────────────────────┐    │
│  │  Chat UI    │────▶│     AI 서비스               │           │   │ D&D UI Builder      │    │
│  └─────────────┘     │ • LLM 호출 (Claude/GPT)     │           │   └─────────┬──────────┘    │
│                      │ • 패턴 분석 + RAG 검색       │             │            │               │
│                      │ • JSON 생성                  │           │            ▼               │
│                      └──────────────┬──────────────┘          │  ┌─────────────────────┐    │
└─────────────────────────────────────┼─────────────────────---──┴─┼─────────────────────┬─────┘
                                      │ 기존 API 호출                │ 기존 API 호출          │
                                      ▼                            ┼─────────────────────┘
                                                                   ▼
┌-------------------------------------------------------------------------------┐
│                          기존 시스템 (vexplor)                                  │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐                           │
│  │ Screen API  │  │  Flow API   │  │ Dataflow API│                           │
│  └─────────────┘  └─────────────┘  └─────────────┘                           │
│                           │                                                  │
│                    ┌──────┴──────┐                                           │
│                    │  PostgreSQL │                                           │
│                    └─────────────┘                                           │
└-------------------------------------------------------------------------------┘
```

### 설계 원칙

| 원칙                  | 설명                              |
| --------------------- | --------------------------------- |
| 기존 코드 변경 최소화 | 기존 백엔드/프론트 수정 없음      |
| 기존 API 재사용       | AI가 기존 API를 "사용자처럼" 호출 |
| RAG 기반 지식 주입    | 필요한 패턴만 동적으로 LLM에 주입 |
| **Assistive AI**      | AI는 결정하지 않고, 사용자의 결정을 돕는다 |

---

## 3. AI가 화면을 "알아서" 만드는 방법

### 3.1 지식 소스

| 데이터          | 테이블                             | 활용                |
| --------------- | ---------------------------------- | ------------------- |
| 기존 화면       | screen_definitions, screen_layouts | 패턴 학습           |
| 테이블 라벨     | table_labels                       | 테이블 검색         |
| 컬럼 라벨       | column_labels                      | 필드→컴포넌트 매핑 |
| 워크플로우 패턴 | workflow_patterns (신규)           | 비즈니스 로직       |

### 3.2 통계 기반 패턴 분석

> **핵심 아이디어**: 사용자들이 이미 만든 화면들을 분석해서 "입고 화면은 보통 이렇게 생겼더라"를 알아내는 것

#### 예시: "입고페이지 만들어줘" 요청 시

**Step 1. 테이블 찾기**

```sql
-- "입고"라는 단어로 table_labels 검색
SELECT table_name, table_label FROM table_labels 
WHERE table_label LIKE '%입고%';

-- 결과: inbound_mng (입고관리)
```

**Step 2. 이 테이블을 쓰는 기존 화면 찾기**

```sql
-- inbound_mng 테이블을 사용하는 화면들 조회
SELECT * FROM screen_definitions 
WHERE table_name = 'inbound_mng';

-- 결과: 41개 화면 발견!
```

**Step 3. 41개 화면의 "공통점" 분석**

레이아웃 통계:

| 레이아웃                         | 개수  | 비율     |
| -------------------------------- | ----- | -------- |
| split-panel (좌: 목록, 우: 상세) | 32개  | **78%**  |
| table-list (목록만)              | 6개   | 15%      |
| form (폼만)                      | 3개   | 7%       |

필드 사용 통계:

| 필드                   | 사용 화면 수 | 비율     |
| ---------------------- | ------------ | -------- |
| inbound_no (입고번호)  | 41개         | **100%** |
| inbound_date (입고일자)| 41개         | **100%** |
| item_code (품목코드)   | 40개         | **98%**  |
| qty (수량)             | 39개         | **95%**  |
| warehouse_code (창고)  | 28개         | 68%      |
| supplier_code (공급업체)| 25개        | 61%      |

**Step 4. 확신도(Confidence)에 따라 다르게 처리**

AI는 통계 결과의 확신도에 따라 행동을 다르게 합니다:

| 확신도 | 기준 | AI 행동 | 예시 |
| ------ | ---- | ------- | ---- |
| **높음** | 90%+ | 자동 적용 | 필수 필드(입고번호, 일자) 자동 추가 |
| **중간** | 60~90% | 추천하며 확인 | "분할화면으로 만들까요? (78% 사용)" |
| **낮음** | 60% 미만 | 옵션 나열 | "창고 필드 추가할까요? (68%)" |

```
AI 판단 예시:
- 레이아웃: split-panel (78%) → "분할화면으로 생성합니다"
- 필수 필드: 입고번호, 입고일자 (100%) → 자동 추가
- 워크플로우: 입고→재고 (60%) → "💡 재고 자동 연동 추가할까요?"
- 선택 필드: 창고 (68%) → "추가 필드: [ ] 창고 [ ] 공급업체"
```

**핵심**: 확실한 것은 빠르게 처리하고, 애매한 것은 사용자에게 물어본다.

#### 비유: "맛집 추천 AI"와 같은 원리

| 맛집 추천 AI | 화면 생성 AI |
| ------------ | ------------ |
| "강남에서 점심 뭐 먹지?" | "입고페이지 만들어줘" |
| 강남 식당 1000개 리뷰 분석 | 기존 입고 화면 41개 분석 |
| "70%가 파스타집, 평균 1.5만원" | "78%가 분할화면, 100%가 입고번호 사용" |
| "파스타집 추천드릴까요?" | "분할화면으로 만들까요?" |

### 3.3 RAG 기반 동적 지식 주입 (핵심)

> **문제**: 모든 도메인 지식을 프롬프트에 넣으면 Context Window 초과

> **해결**: 필요한 지식만 검색해서 동적 주입

```
사용자: "입고페이지 만들어줘"
        ↓
1. 키워드 추출: "입고"
        ↓
2. workflow_patterns 검색 → "입고→재고 증가" 패턴 발견
        ↓
3. LLM 프롬프트에 해당 패턴만 주입
        ↓
4. 재고 증가 로직 포함된 화면 생성
```

#### 장점

| 장점          | 설명                               |
| ------------- | ---------------------------------- |
| 토큰 절약     | 관련 패턴 1-2개만 주입             |
| 확장성        | 패턴 1000개여도 프롬프트 길이 동일 |
| 회사별 커스텀 | company_code로 회사별 패턴 적용    |

### 3.4 멀티테넌트 & Fallback 전략

회사마다 테이블명이 다르거나, 신규 회사라 기존 화면이 없을 수 있습니다.

**데이터 검색 우선순위:**

```
1순위: 해당 회사의 기존 화면 (가장 정확)
       ↓ 없거나 부족하면
2순위: 전체 회사의 익명화된 통계 (company_code 제외, 패턴만)
       ↓ 그래도 부족하면
3순위: vexplor 표준 템플릿 (기본 레이아웃 + 필수 필드)
```

**여러 테이블이 검색될 때:**

```
사용자: "입고페이지 만들어줘"

AI: "입고 관련 테이블이 3개 있습니다:
     1. 자재입고관리 (material_inbound)
     2. 제품입고관리 (product_inbound)
     3. 반품입고관리 (return_inbound)
     
     어떤 테이블로 만들까요?"
```

### 3.5 기존 시스템 분석 결과

**발견된 학습 가능 데이터:**

- `transferData` 액션: 14개 (발주→입고, 수주→출고 등)
- 제어관리 프레임워크: `dataflowControlService.ts` 존재
- 입고→재고 규칙: 아직 정의되지 않음 → AI가 생성하면 됨

---

## 4. 개발 범위

### 4.1 AI 담당 (신규)

| 작업                                 | 파일                          | 우선순위     |
| ------------------------------------ | ----------------------------- | ------------ |
| AI 채팅 API                          | `aiRoutes.ts`               | P0           |
| 화면 패턴 분석                       | `screenAnalyzer.ts`         | P0           |
| LLM 호출                             | `llmService.ts`             | P0           |
| **워크플로우 패턴 검색 (RAG)** | `workflowPatternService.ts` | **P0** |
| 채팅 UI                              | `AIChatPanel.tsx`           | P0           |
| **workflow_patterns 테이블**   | DB                            | **P0** |

```typescript
// 패턴 검색 핵심 로직
export async function searchWorkflowPatterns(userIntent: string, companyCode: string) {
  const keywords = extractKeywords(userIntent);
  
  return await query(`
    SELECT * FROM workflow_patterns
    WHERE intent_keywords && $1::text[]
      AND (company_code = $2 OR company_code = '*')
    ORDER BY priority DESC
    LIMIT 3
  `, [keywords, companyCode]);
}
```

### 4.2 vexplor 담당 (기존 보완)

| 작업           | 현재 상태 | 필요 작업           |
| -------------- | --------- | ------------------- |
| 화면 생성 API  | ✅ 존재   | 문서화              |
| 워크플로우 API | ✅ 존재   | 문서화              |
| 제어관리 API   | ✅ 존재   | AI 활용 가능        |
| table_labels   | 부분 존재 | 주요 테이블 한글 라벨 |
| column_labels  | 부분 존재 | web_type 보완       |

#### 4.2.1 table_labels가 필요한 이유

AI가 "입고"라는 단어로 테이블을 찾으려면 한글 라벨이 있어야 합니다.

**현재 상태:**

| table_name | table_label | AI 검색 |
| ---------- | ----------- | ------- |
| inbound_mng | **입고관리** | ✅ "입고" 검색 가능 |
| outbound_mng | **출고관리** | ✅ "출고" 검색 가능 |
| production_record | production_record | ❌ "생산" 검색 불가 |
| purchase_order_master | purchase_order_master | ❌ "발주" 검색 불가 |

**필요 작업**: 주요 업무 테이블에 한글 라벨 추가

```sql
UPDATE table_labels SET table_label = '생산실적' WHERE table_name = 'production_record';
UPDATE table_labels SET table_label = '발주관리' WHERE table_name = 'purchase_order_master';
```

#### 4.2.2 column_labels의 web_type이 필요한 이유

AI가 컬럼을 보고 **어떤 컴포넌트를 생성할지** 결정해야 합니다.

**현재 상태** (inbound_mng):

| column_name | column_label | web_type |
| ----------- | ------------ | -------- |
| inbound_date | 입고일 | **null** |
| inbound_qty | 입고수량 | **null** |
| item_code | 품목코드 | **null** |

**web_type이 null이면?** → AI가 모든 필드를 text-input으로 만들어버림

**web_type이 있으면:**

| column_name | web_type | AI가 생성할 컴포넌트 |
| ----------- | -------- | ------------------- |
| inbound_date | **date** | 📅 날짜 선택기 |
| inbound_qty | **number** | 🔢 숫자 입력 |
| item_code | **entity** | 🔍 품목 검색 팝업 |
| memo | **textarea** | 📝 여러 줄 텍스트 |

**필요 작업**: 주요 테이블 컬럼에 web_type 추가

```sql
UPDATE column_labels SET web_type = 'date' WHERE column_name LIKE '%_date';
UPDATE column_labels SET web_type = 'number' WHERE column_name LIKE '%_qty';
UPDATE column_labels SET web_type = 'entity' WHERE column_name LIKE '%_code' AND column_name != 'company_code';
UPDATE column_labels SET web_type = 'textarea' WHERE column_name = 'memo';
```

---

## 5. 데이터베이스 스키마 (AI 전용)

```sql
-- 핵심: 워크플로우 패턴 (RAG 지식 베이스)
CREATE TABLE workflow_patterns (
    pattern_id SERIAL PRIMARY KEY,
    category VARCHAR(50) NOT NULL,           -- 'inventory', 'sales'
    pattern_name VARCHAR(200) NOT NULL,      -- '입고→재고 증가'
    intent_keywords TEXT[] NOT NULL,         -- ['입고', '자재입고', 'inbound']
    description TEXT,
    source_table_hint VARCHAR(100),          -- 'inbound_mng'
    target_table_hint VARCHAR(100),          -- 'inventory_stock'
    logic_template JSONB NOT NULL,           -- 제어관리 생성 템플릿
    company_code VARCHAR(20) DEFAULT '*',
    priority INTEGER DEFAULT 100,
    is_active BOOLEAN DEFAULT true
);

CREATE INDEX idx_workflow_patterns_keywords ON workflow_patterns USING GIN(intent_keywords);

-- 초기 데이터
INSERT INTO workflow_patterns (category, pattern_name, intent_keywords, description, source_table_hint, target_table_hint, logic_template) VALUES
('inventory', '입고→재고 증가', 
 ARRAY['입고', '구매입고', '자재입고', 'inbound'],
 '입고 저장 시 재고 수량 증가',
 'inbound_mng', 'inventory_stock',
 '{"actionType": "upsert", "operation": "increment", "fieldMappings": [{"source": "item_code", "target": "item_code", "type": "key"}, {"source": "inbound_qty", "target": "qty", "type": "increment"}]}'::jsonb
),
('inventory', '출고→재고 감소', 
 ARRAY['출고', '판매출고', 'outbound'],
 '출고 저장 시 재고 수량 감소',
 'outbound_mng', 'inventory_stock',
 '{"actionType": "update", "operation": "decrement", "fieldMappings": [{"source": "item_code", "target": "item_code", "type": "key"}, {"source": "outbound_qty", "target": "qty", "type": "decrement"}]}'::jsonb
);

-- 동의어 매핑 (P1)
CREATE TABLE keyword_mapping (
    id SERIAL PRIMARY KEY,
    keyword VARCHAR(100) NOT NULL,
    table_name VARCHAR(100) NOT NULL,
    company_code VARCHAR(20) DEFAULT '*'
);

-- AI 대화 이력 (P2)
CREATE TABLE ai_conversations (
    id SERIAL PRIMARY KEY,
    session_id VARCHAR(100) NOT NULL,
    company_code VARCHAR(20) NOT NULL,
    user_id VARCHAR(50) NOT NULL,
    created_at TIMESTAMPTZ DEFAULT NOW()
);

CREATE TABLE ai_messages (
    id SERIAL PRIMARY KEY,
    conversation_id INTEGER REFERENCES ai_conversations(id),
    role VARCHAR(20) NOT NULL,
    content TEXT NOT NULL,
    metadata JSONB,
    created_at TIMESTAMPTZ DEFAULT NOW()
);
```

---

## 6. 개발 로드맵

### Phase 1: MVP

**AI:**

- 채팅 UI + LLM 연동
- 화면 패턴 분석
- workflow_patterns 테이블 + RAG 검색

**vexplor:**

- API 스펙 문서화 (screen, flow)
- 주요 테이블 한글 라벨 20개

### Phase 2: 워크플로우

**AI:**

- 자연어 → 워크플로우 변환
- dataflow_diagrams 자동 생성

**vexplor:**

- 워크플로우 API 문서화

### Phase 3: 고도화

- 대화형 수정 ("왼쪽 패널 넓혀줘")
- 멀티턴 컨텍스트
- 사용자 피드백 학습

---

## 7. vexplor 체크리스트

### 즉시 (P0)

- [ ] POST /api/screen/create 스펙
- [ ] POST /api/flow/definitions 스펙
- [ ] 화면 레이아웃 JSON 예시

### 1주 내 (P1)

- [ ] 주요 테이블 20개 한글 라벨
  - inbound_mng, outbound_mng, inventory_stock
  - item_info, customer_mng, supplier_mng
  - sales_order_mng, purchase_order_mng
- [ ] column_labels web_type 보완

---

## 8. 성공 지표

| 지표                 | 목표      |
| -------------------- | --------- |
| 화면 생성 성공률     | 90%+      |
| 평균 생성 시간       | 10초 이내 |
| 수정 없이 사용       | 70%+      |
| 워크플로우 자동 연결 | 80%+      |
