7.2 KiB
7.2 KiB
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) 로직이 적용됩니다.
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)
- 데이터 적재 시작: NILM 장비가 MQTT로 데이터를 쏘면,
NILM Agent가 이를 받아 MariaDBnilm_status_log테이블에 Insert 합니다. - 자연어 제어 명령: 사용자가 채팅 인터페이스에 "1번 장비를 작동상태(초록색)로 변경해줘"라고 명령합니다.
- 서버의 제어 지시 및 대기:
- 파이썬 서버(LLM 연동)가 DB의
target_status필드를GREEN으로 Update 합니다. - 서버는
current_status필드값이GREEN으로 바뀔 때까지 비동기 폴링 방식으로 대기합니다.
- 파이썬 서버(LLM 연동)가 DB의
- Agent 물리 제어 및 동기화:
경광등 Agent가 DB를 주기적으로 확인하여target_status(GREEN)와current_status(기존 상태)가 다름을 감지합니다.- 실제 경광등의 불빛을 초록색으로 물리적으로 변경합니다.
- 변경 완료 후,
경광등 Agent는 DB의current_status를GREEN으로 Update 하여 완료를 알립니다.
- 서버 최종 확인 및 응답:
- 대기 중이던 파이썬 서버가
current_status가GREEN으로 변경된 것을 데이터베이스에서 확인합니다. - 프론트엔드로 "정상적으로 장비를 작동상태(초록색)로 변경 완료했습니다." 라고 자연어 결과를 리턴합니다.
- 대기 중이던 파이썬 서버가