35 lines
2.9 KiB
Plaintext
35 lines
2.9 KiB
Plaintext
# 자연어 제어 고도화 (부분/전체 제어 및 장비명 유사도 매칭) 구현 계획
|
|
|
|
사용자의 피드백을 반영하여, 장비의 특정 색상만 켜거나 끌 수 있고, 모든 불을 한 번에 켜거나 끄는 세밀한 동작을 지원합니다. 아울러 "CNC 1호기"처럼 장비명을 살짝 다르게 부르더라도 가장 유사한 장비를 찾아내어 제어하도록 파이썬 백엔드를 고도화합니다.
|
|
|
|
## ⚠️ User Review Required (검토 및 확인 필요)
|
|
|
|
> [!IMPORTANT]
|
|
> **제어 동작 정의 (State 유지)**
|
|
> 특정 색상을 끄거나 켤 때, **나머지 색상의 현재 상태는 그대로 유지**하는 방식으로 동작합니다.
|
|
> * "빨간불 꺼" -> 현재 초록불이 켜져 있었다면 초록불은 계속 켜둔 채로 빨간불만 끕니다.
|
|
> * "모든 불 켜" -> 빨강, 노랑, 초록 3개의 경광등을 모두 점등합니다.
|
|
> 이 방식이 맞는지 확인해 주세요. 맞다면 승인("진행해" 등)을 부탁드립니다.
|
|
|
|
## 🛠️ Proposed Changes (제안하는 코드 변경 사항)
|
|
|
|
### `backend/main.py` 수정
|
|
* **[MODIFY] 프롬프트 (`get_control_prompt`)**:
|
|
* JSON 출력 키에 `"action": "ON" | "OFF"` 와 `"color": "RED" | "YELLOW" | "GREEN" | "ALL"` 을 명시하도록 지시문을 개선합니다.
|
|
* 예: `{"machine_name": "CNC 선반 1호기", "color": "ALL", "action": "OFF"}` 또는 `{"machine_name": "...", "color": "RED", "action": "ON"}`
|
|
* **[MODIFY] 의도 분석 함수 (`analyze_intent_with_llm`)**:
|
|
* 파싱된 JSON에서 `machine_name`, `color`, `action` 세 가지 값 자체를 반환하도록 수정합니다. (타겟값(tuple) 생성은 현재 DB 상태를 알아야 하므로 API 엔드포인트로 위임)
|
|
* **[MODIFY] 장비명 매칭 로직 (`chat_control` 내 DB 검색부)**:
|
|
* 기존 `LIKE %...%` 방식의 쿼리를 제거합니다.
|
|
* `SELECT dev_no, dev_name, led_sensorNo FROM dev_info` 로 전체 장비 목록을 가져옵니다.
|
|
* 파이썬의 `difflib.get_close_matches()` 함수를 사용하여, LLM이 추출한 `machine_name`과 가장 유사한 실제 `dev_name`을 찾아냅니다.
|
|
* **[MODIFY] 타겟 상태 연산 로직 (`chat_control`)**:
|
|
* 장비를 찾으면 `sensor_info`에서 해당 경광등의 **현재 상태값(`value_ch1`, `value_ch2`, `value_ch3`)**을 읽어옵니다.
|
|
* `ALL` & `OFF` -> 타겟을 모두 `0`으로 덮어씁니다.
|
|
* `ALL` & `ON` -> 타겟을 모두 `1`로 덮어씁니다.
|
|
* 특정 색상(예: `RED`) & `OFF` -> 다른 색상의 타겟값은 현재 상태를 그대로 유지하고, `RED`에 해당하는 타겟값만 `0`으로 세팅하여 DB를 업데이트합니다.
|
|
|
|
## ✅ Verification Plan (검증 계획)
|
|
* API 호출 시 `{"message": "CNC 1호기 모든 불 켜줘"}` 를 전송하여 3가지 색상 타겟이 모두 1로 변경되는지 확인합니다.
|
|
* 이어서 `{"message": "빨간불만 꺼"}` 를 전송하여 초록/노랑은 1로 유지된 채 빨강 타겟만 0으로 변경되는지 확인합니다.
|