MMCL/docs/mmcl_project_proposal.md
2026-09-04 11:24:42 +09:00

131 lines
7.2 KiB
Markdown

# MMCL (Machine Monitoring Control 소포 LLM) 목업 프로젝트 기획서
> [!NOTE]
> 본 문서는 실제 장비 납품이 아닌, 전체적인 아키텍처의 가능성을 타진하고 흐름을 테스트하기 위한 **PoC (Proof of Concept) 목업 프로젝트**용 기획서입니다.
## 1. 프로젝트 개요 (Overview)
* **프로젝트명**: MMCL (Machine Monitoring Control for LLM) Mockup
* **목표**: NILM(비침입형 부하 모니터링) 데이터를 수집하고, 기구축된 Mistral LLM과 연동하여 자연어로 장비 상태를 파악하며, 장비의 경광등 상태를 제어하는 전체 시스템 구조 설계 및 구현.
* **핵심 컨셉**: NILM과 DB 사이에 Agent를 배치하고, 하드웨어 직접 제어를 배제하여 **데이터베이스(MariaDB)의 특정 상태 필드를 조작**하고 Agent가 이를 동기화함으로써 제어를 시뮬레이션합니다.
## 2. 주요 기능 요구사항 (Key Requirements)
### 2.1. 데이터 수집 및 통신 에이전트 (MQTT & Agents)
* **NILM MQTT 통신**: NILM 장비는 MQTT 통신을 이용해 장비의 전력, 전류 등 상태 정보를 브로드캐스트합니다.
* **NILM Agent**: MQTT 브로커를 구독(Subscribe)하여 데이터를 수신하고, 이를 파싱해 실시간으로 MariaDB에 저장(Insert)합니다.
* **경광등 Agent**: DB의 경광등 제어 상태값을 지속적으로 확인(또는 이벤트 수신)하여, 장비 옆에 부착된 실제/모의 경광등의 불빛 상태를 동기화합니다. **물리적 제어 로직 완료 후 DB에 완료 상태를 기록하여 백엔드에 알립니다.**
### 2.2. 상태 및 제어 데이터베이스 (MariaDB)
* **모니터링 데이터**: NILM 장비에서 넘어온 측정값을 저장하는 시계열 특성의 테이블.
* **경광등 상태 데이터**: 장비 상태에 따른 경광등 색상을 제어하기 위한 테이블.
* 🔴 **적색 (Red)**: 에러 상태
* 🟡 **노란색 (Yellow)**: 대기 상태
* 🟢 **초록색 (Green)**: 작동 상태
### 2.3. Python 백엔드 서버 및 Mistral LLM 연동
* **Python API 서버**: 파이썬으로 구동되는 서버를 구축하여 프론트엔드와 LLM/DB 간의 통신(자연어 질의응답 및 제어)을 중계합니다.
* **Mistral LLM**: 로컬에 설치된 Mistral LLM을 호출하여 사용자의 자연어를 분석하고 SQL 변환 또는 룰 판단을 수행합니다.
* **제어 결과 검증 로직 (Handshake Validation)**:
- 사용자가 자연어로 제어를 지시하면 파이썬 서버가 DB에 **목표 상태(Target Status)**를 업데이트하고 대기합니다.
- `경광등 Agent`가 이를 감지하여 실제 경광등의 상태를 변경한 뒤, DB에 **제어 완료(Current Status 반영)** 상태를 업데이트합니다.
- 파이썬 서버는 이 완료 정보를 확인한 후에야 비로소 "정상적으로 적용이 완료되었습니다." 와 같은 자연어 응답을 사용자에게 리턴합니다.
---
## 3. 시스템 아키텍처 (System Architecture)
> [!TIP]
> 파이썬 서버와 경광등 Agent 간의 확실한 상태 동기화를 위해, 비동기 폴링(Polling) 방식 또는 데이터베이스 이벤트를 통한 대기(Wait) 로직이 적용됩니다.
```mermaid
graph TD
subgraph Equipment Layer
NILM_Equip[NILM 장비]
Warning_Light[장비 경광등]
end
subgraph Messaging & Agents
MQTT_Broker((MQTT Broker))
NILM_Agent[NILM Agent]
LED_Agent[경광등 Agent]
end
subgraph Database MariaDB
DB_NILM[(NILM Status Table)]
DB_LED[(Warning Light Table)]
end
subgraph Backend Server
Python_API[Python Server API]
LLM_Agent[Mistral LLM]
end
subgraph User Interface
UI[Web Dashboard / Chat]
end
%% Data Flow
NILM_Equip -- "1. MQTT Publish" --> MQTT_Broker
MQTT_Broker -- "2. Subscribe" --> NILM_Agent
NILM_Agent -- "3. Insert 실시간 데이터" --> DB_NILM
UI -- "4. 자연어 제어 명령" --> Python_API
Python_API <--> LLM_Agent
Python_API -- "5. Update 목표 상태 설정 및 대기" --> DB_LED
LED_Agent -- "6. Select 목표 상태 감지" --> DB_LED
LED_Agent -- "7. 물리적 제어 수행" --> Warning_Light
LED_Agent -- "8. Update 제어 완료(현재 상태) 기록" --> DB_LED
Python_API -. "9. 완료 기록 확인 (Polling/Event)" .-> DB_LED
Python_API -- "10. '적용완료' 응답 반환" --> UI
```
---
## 4. 데이터베이스 스키마 설계 (Draft)
### 4.1. 장비 상태 로그 테이블 (`nilm_status_log`)
| 컬럼명 | 데이터 타입 | 설명 | 비고 |
|---|---|---|---|
| `id` | INT (PK) | 고유 식별자 | Auto Increment |
| `timestamp` | DATETIME | 측정 시간 | |
| `device_id` | VARCHAR | 대상 장비 식별자 | 예: "MACHINE_01" |
| `active_power` | FLOAT | 유효 전력 (W) | |
| `current` | FLOAT | 전류 (A) | |
| `voltage` | FLOAT | 전압 (V) | |
### 4.2. 경광등 제어 테이블 (`warning_light_control`)
파이썬 서버와 경광등 Agent 간의 상태 동기화(핸드쉐이크)를 위해 상태 필드를 `target_status``current_status`로 분리하여 설계합니다.
| 컬럼명 | 데이터 타입 | 설명 | 비고 |
|---|---|---|---|
| `device_id` | VARCHAR (PK)| 제어 장비 식별자 | 예: "MACHINE_01_LIGHT" |
| `target_status` | VARCHAR | 파이썬 서버가 지시한 목표 상태 | "RED", "YELLOW", "GREEN" |
| `current_status` | VARCHAR | Agent가 물리적 적용을 완료한 현재 상태 | "RED", "YELLOW", "GREEN" |
| `last_updated_by` | VARCHAR | 마지막 제어 주체 | "USER", "LLM_RULE" |
| `updated_at` | DATETIME | 마지막 변경 시간 | |
> [!IMPORTANT]
> `target_status`와 `current_status`가 다를 경우, 시스템은 제어 명령이 내려졌으나 아직 하드웨어에 적용되지 않은 **진행 중(Pending)** 상태로 인식합니다. 두 값이 같아지면 제어가 **완료(Completed)**된 것으로 간주합니다.
---
## 5. 예상 시나리오 (User Story)
1. **데이터 적재 시작**: NILM 장비가 MQTT로 데이터를 쏘면, `NILM Agent`가 이를 받아 MariaDB `nilm_status_log` 테이블에 Insert 합니다.
2. **자연어 제어 명령**: 사용자가 채팅 인터페이스에 "1번 장비를 작동상태(초록색)로 변경해줘"라고 명령합니다.
3. **서버의 제어 지시 및 대기**:
- 파이썬 서버(LLM 연동)가 DB의 `target_status` 필드를 `GREEN`으로 Update 합니다.
- 서버는 `current_status` 필드값이 `GREEN`으로 바뀔 때까지 비동기 폴링 방식으로 대기합니다.
4. **Agent 물리 제어 및 동기화**:
- `경광등 Agent`가 DB를 주기적으로 확인하여 `target_status`(`GREEN`)와 `current_status`(기존 상태)가 다름을 감지합니다.
- 실제 경광등의 불빛을 초록색으로 물리적으로 변경합니다.
- 변경 완료 후, `경광등 Agent`는 DB의 `current_status``GREEN`으로 Update 하여 완료를 알립니다.
5. **서버 최종 확인 및 응답**:
- 대기 중이던 파이썬 서버가 `current_status``GREEN`으로 변경된 것을 데이터베이스에서 확인합니다.
- 프론트엔드로 "정상적으로 장비를 작동상태(초록색)로 변경 완료했습니다." 라고 자연어 결과를 리턴합니다.