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

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_statuscurrent_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_statuscurrent_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_statusGREEN으로 Update 하여 완료를 알립니다.
  5. 서버 최종 확인 및 응답:
    • 대기 중이던 파이썬 서버가 current_statusGREEN으로 변경된 것을 데이터베이스에서 확인합니다.
    • 프론트엔드로 "정상적으로 장비를 작동상태(초록색)로 변경 완료했습니다." 라고 자연어 결과를 리턴합니다.