# 보조운전 (Operation Assistant) — 브레인스토밍 > 2026-05-30, C-6111 PGMEA 측류 추출식 증류탑 기준 ## 1. 목표 LLM(MCP) + 실시간 DCS 데이터 + KB(SOP)를 결합하여 운전원의 startup / 생산 순도 확인 / 생산 모드 / shutdown 과정을 **단계별로 보조**하는 UI. ## 2. 핵심 설계 원칙 | 구분 | 처리 방식 | 예시 | |:----|:---------|:-----| | **DCS 계측 항목** | 시스템 자동 검증 (`find_tags`/`run_sql`/`query_events`) | Pump 상태, FICQ SP, XV open/close, 온도/압력 | | **수동 항목** (hand valve, local gauge, visual) | LLM 지시 → **운전원이 "확인완료" 클릭** | "HV-6115 개방하세요" → 버튼 클릭 | | **계산/분석 항목** | MCP tool + LLM 추론 | 물질수지 검증, 순도 확인, R/P 계산 | ## 3. 시스템 아키텍처 ``` ┌─────────────────────────────────────────────────────────────┐ │ 보조운전 UI (신규 pane ops.html + ops.js) │ │ ┌─ sub-tabs: [startup] [verify_purity] [production] [shutdown] │ │ └─ Step progress bar + 단계별 카드 + 확인 버튼 │ └──────────────────┬──────────────────────────────────────────┘ │ HTTP (JSON-RPC) ┌──────────────────▼──────────────────────────────────────────┐ │ C# Controller (/api/ops/*) │ │ - GET /api/ops/guide?unit=C-6111&mode=startup&step=1 │ │ - POST /api/ops/confirm { unit, mode, step, feedback } │ │ - GET /api/ops/state?unit=C-6111 │ └──────────────────┬──────────────────────────────────────────┘ │ IMcpService ┌──────────────────▼──────────────────────────────────────────┐ │ Python MCP Server (server.py) │ │ - execute_operation_guide(unit, mode, step, feedback) │ │ - KB 검색 (rag_query) + 실시간 데이터 검증 (find_tags) │ │ - 내부 state machine으로 현재 단계 추적 │ └──────────────────┬──────────────────────────────────────────┘ │ ┌──────────────────▼──────────────────────────────────────────┐ │ Data Sources │ │ ├─ Qdrant (KB — SOP 문서) │ │ ├─ PostgreSQL (DCS 실시간/이력 데이터) │ │ └─ vLLM (Qwen3.6-35B-A3B-FP8) │ └─────────────────────────────────────────────────────────────┘ ``` ## 4. SOP 문서 구조 (KB ingest 용) 각 SOP는 JSON 구조의 step 배열로 청킹: ```json { "doc_id": "c-6111-startup-sop", "title": "C-6111 Start-up 절차", "unit": "C-6111", "mode": "startup", "steps": [ { "step": 1, "title": "전단계 안전 확인", "actions": [ "비상정지 버튼(XV-6123, XV-6124) CLOSE 확인", "컬럼 진공압 PI-6111 확인 (~50 torr)" ], "verification_type": "operator", "expected": null }, { "step": 2, "title": "원료 라인 구성", "actions": [ "HV-6101 개방 (feed line, 수동밸브)", "HV-6115 개방 (reflux return, 수동밸브)", "HV-6116 개방 (bottom line, 수동밸브)" ], "verification_type": "operator", "expected": null }, { "step": 3, "title": "원료 공급 펌프 기동 및 유량 설정", "actions": [ "P-6102 R-RUN 전환", "FICQ-6101 SP=820 kg/hr 설정" ], "verification_type": "system", "expected": { "p-6102.pv": "R-RUN", "ficq-6101.pv": { "min": 800, "max": 840 } } }, { "step": 4, "title": "Reboiler 가온", "actions": [ "TICA-6111A SP=81.5°C 설정", "Reboiler 응축수 라인 확인" ], "verification_type": "mixed", "system_checks": [ { "tag": "tica-6111a.pv", "min": 78, "max": 85 } ], "operator_action": "Reboiler 응축수 드레인 밸브 개방 확인" } ] } ``` ### 청킹 전략 - 문서 1개 = 1개 unit × 1개 mode (startup/shutdown/production) - 각 step의 `verification_type`: `operator` | `system` | `mixed` - `expected` 필드: 자동 검증할 태그명(key)과 기대값(value) - KB collection: `plant_operation` ## 5. UI 구조 (보조운전 화면) ### 5.1 레이아웃 ``` ┌─────────────────────────────────────────────────┐ │ [pane-hdr] 보조운전 / C-6111 운전 보조 │ ├─────────────────────────────────────────────────┤ │ [mode-tabs] │ │ ● START-UP ○ 순도 확인 ○ 생산모드 ○ SHUTDOWN │ ├─────────────────────────────────────────────────┤ │ [step-progress] │ │ ■■■■□□□□□□□ Step 4/12 │ │ ●●●●○○○○○○○ 33% │ ├─────────────────────────────────────────────────┤ │ [step-card] │ │ ┌─────────────────────────────────────────┐ │ │ │ Step 4: Reboiler 가온 │ │ │ │ │ │ │ │ □ TICA-6111A SP=81.5°C 설정 │ │ │ │ ✓ PV=79.6°C (설정 중...) │ │ │ │ □ Reboiler 응축수 드레인 밸브 개방 확인 │ │ │ │ [✔ 확인완료] ← 운전원 클릭 │ │ │ │ │ │ │ │ [← 이전 단계] [다음 단계 →] │ │ │ └─────────────────────────────────────────┘ │ ├─────────────────────────────────────────────────┤ │ [참고 정보 패널 - collapsible] │ │ - 현재 컬럼 온도 프로파일 │ │ - 현재 물질수지 │ │ - 활성 알람 │ └─────────────────────────────────────────────────┘ ``` ### 5.2 sub-tab 구성 | 탭 | mode | 설명 | |:---|:-----|:------| | START-UP | `startup` | 초기 기동 → 정상 상태 도달 | | 순도 확인 | `verify_purity` | 생산 전 물질수지 + 온도 프로파일 검증 | | 생산모드 | `production` | 정상 운전 중 모니터링 및 미세 조정 | | SHUTDOWN | `shutdown` | 정지 절차 | ### 5.3 step-card 구성 요소 - Step 번호 + 제목 - Action 항목 리스트 (체크박스 형태) - 시스템 자동 확인 항목: ✓ / ✗ 아이콘 - 운전원 확인 항목: [확인완료] 버튼 - 진행 버튼: [← 이전] [다음 →] - 참고정보 패널: 현재 공정 데이터 요약 ## 6. MCP Tool: `execute_operation_guide` ### Signature ```python @mcp.tool() async def execute_operation_guide( unit: str, mode: str, # "startup" | "verify_purity" | "production" | "shutdown" operator_feedback: str | None = None, current_step: int = 1 ) -> str: """ KB에서 SOP 조회 → 실시간 데이터 검증 → 다음 action 반환 """ ``` ### 동작 흐름 1. KB에서 `unit` + `mode`에 해당하는 SOP 검색 2. `current_step`의 expected 조건을 실시간 데이터로 검증 3. 검증 실패 항목 있으면 → 경고 메시지 4. `operator_feedback`이 있으면 → 현재 step 메모에 기록 5. 다음 step 정보 + 검증 결과 + action 목록을 JSON으로 반환 ### 응답 구조 ```json { "success": true, "unit": "C-6111", "mode": "startup", "current_step": 4, "total_steps": 12, "title": "Reboiler 가온", "actions": [ { "description": "TICA-6111A SP=81.5°C 설정", "type": "system", "status": "in_progress", "detail": "PV=79.6°C, SP=81.5°C (설정 중...)" }, { "description": "Reboiler 응축수 드레인 밸브 개방 확인", "type": "operator", "status": "pending", "detail": null } ], "all_verified": false, "can_proceed": false } ``` ## 7. C# Controller: `/api/ops/*` | Route | Method | Description | |:------|:-------|:------------| | `/api/ops/guide` | GET | unit + mode + step → SOP 조회 + 검증 | | `/api/ops/confirm` | POST | 운전원 확인 feedback 전송 | | `/api/ops/state` | GET | 현재 진행 상태 조회 (재접속 등) | | `/api/ops/reset` | POST | 진행 상태 초기화 | ## 8. 프론트엔드 구현 순서 | 단계 | 파일 | 내용 | |:----:|:-----|:------| | 1 | `index.html` | nav item #18 + pane + script 추가 | | 2 | `panes/ops.html` | UI 레이아웃 (sub-tabs, progress, step-card) | | 3 | `css/ops.css` | 전용 스타일 | | 4 | `js/ops.js` | `paneInit.ops` — 탭 전환, step 렌더링, confirm 버튼 | | 5 | `server.py` | `execute_operation_guide` MCP tool | | 6 | C# Controller | `/api/ops/*` 라우트 | | 7 | SOP 문서 | KB ingest 용 청킹 | ## 9. 향후 확장 - **다중 unit 지원**: C-6111 외 C-6211 등으로 확장 - **에이전트 모드**: LLM이 조건 만족 시 자동으로 다음 단계 진행 - **히스토리 트래킹**: 각 startup/shutdown 이력 DB 저장 → 패턴 분석 - **Alarm 연동**: 비정상 상황 감지 시 자동 shutdown 권고 ## 10. 구현 전 사전 검증 항목 > ⚠️ 현재 이 문서는 **아이디어 스케치(브레인스토밍) 수준**이다. 아래 항목에 대한 검증과 사전 작업 없이 구현에 들어갈 경우, 실제 플랜트와의 정합성 문제로 재작업이 발생한다. ### 10.1 SOP JSON 구조 검증 | 검증 항목 | 상세 | 확인 방법 | |:----------|:-----|:---------| | step 필드 적절성 | title/actions/verification_type/expected만으로 모든 절차 표현 가능? | 실제 절차서 1개를 JSON으로 변환해보기 | | 중첩 조건 표현 | "A 또는 B 상태" 같은 OR 조건 필요? `expected` 값의 표현력 | 태그 상태가 binary가 아닌 경우 (범위, enum) | | 분기/조건부 step | 특정 조건에서만 수행하는 step 처리 | 예: "진공압이 50 torr 이하이면..." | | 병렬 step | 동시에 수행 가능한 여러 action | 정렬 순서 강제 vs 자유로운 병렬 | | 비정상 경로 | 정상 절차 외의 예외 처리 (재시도, 우회) | step 실패 시 fallback 절차 | ### 10.2 DCS 태그 계측 범위 검증 | 검증 항목 | 상세 | 확인 방법 | |:----------|:-----|:---------| | 검증 가능한 태그 목록 | SOP의 `expected` 조건에 사용할 태그들이 실제 realtime_table에 존재? | `find_tags` + `v_tag_summary` | | 태그 데이터 타입 | digital(R-RUN/L-STOP) / analog(PV float) / enum 구분 | 각 태그별 `.pv` 값 형식 확인 | | 계측 불가 항목 | 수동밸브, local gauge, visual check — 태그 없음 | SOP에서 `operator` 타입으로만 처리 | | 신뢰도 | 태그 값이 0 또는 null인 경우 (고장/fault) | TI-6111A(PV=0), LI-6128(PV=0) 같은 사례 | **C-6111 예비 조사 결과 (2026-05-30):** | 태그 | 계측됨 | 데이터형 | 비고 | |:----|:------:|:--------|:------| | ficq-6101.pv | ✅ | analog | Feed SP=820 ✓ | | ficq-6113.pv | ✅ | analog | Reflux SP=350 ✓ | | ficq-6118.pv | ✅ | analog | Product SP=777.2 ✓ | | pi-6111.pv | ✅ | analog | Vacuum ~48.5 torr ✓ | | tica-6111a.pv | ✅ | analog | Reboiler SP=81.5 ✓ | | ti-6111a.pv | ❌ | analog | PV=0 → 고장 의심 | | ti-6111b/c/d.pv | ✅ | analog | Column profile ✓ | | li-6128.pv | ❌ | analog | Scrubber level PV=0 → 미계측 | | p-6102.pv | ✅ | digital? | R-RUN / L-STOP (상태 확인 필요) | | xv-6123.pv | ? | digital | OPEN/CLOSE (태그 형식 확인 필요) | ### 10.3 Mode 분류 검증 | Mode | C-6111 적용 여부 | 비고 | |:-----|:--------------:|:------| | **startup** | ⬜ | 최초 기동 절차 존재? SIP(Startup Inspection Plan) 보유? | | **verify_purity** | ⬜ | 생산 전 순도 분석 절차? off-spec 시 재순환 루틴? | | **production** | ⬜ | 정상 운전 중 모니터링 항목? 조정 주기? | | **shutdown** | ⬜ | 정지 절차? emergency shutdown과 normal shutdown 분리? | | **grade_change** | ⬜ | 제품 grade 전환 절차 필요한가? (C-6111 연속식 단일 제품?) | | **emergency** | ⬜ | Alarm/interlock 조건 발동 시 대응 절차? | ### 10.4 운전원 피드백 종류 | 피드백 | 의미 | UI 액션 | |:-------|:-----|:---------| | ✅ **확인완료** | 지시받은 수동 조작 완료 | 다음 step 진행 가능 | | ⏸️ **보류** | 조건 미충족으로 일단 대기 | step 유지, 진행 불가 | | ⚠️ **이상있음** | 예상과 다른 상태 발견 | LLM이 재확인/대안 제시 | | 💬 **메모** | 자유 텍스트 기록 (운전일지) | step 로그에 기록 | ### 10.5 SOP 문서 소스 현황 | 항목 | 상태 | 액션 | |:-----|:----|:------| | C-6111 startup 절차서 | ❓ | 보유 여부 확인 필요 | | C-6111 shutdown 절차서 | ❓ | 보유 여부 확인 필요 | | 운전 체크리스트 양식 | ❓ | 기존 양식이 있다면 JSON 구조 맞출 기준 | | P&ID (PFD) | ✅ | 이미 추출 완료 (node_map_master) | | 물질수지/에너지수지 | ✅ | 오늘 작성한 공식 문서 | ### 10.6 사전 작업 목록 | 우선순위 | 작업 | 설명 | 담당 | |:--------:|:-----|:------|:-----| | **P0** | SOP 문서 확보 | C-6111 startup/shutdown 절차서 원본 수집 | 운전원/공정 | | **P0** | 태그 매핑 | SOP의 모든 valve/기기명을 실제 DCS 태그명에 매핑 | 공정+개발 | | **P0** | C-6111 startup 시나리오 시뮬 | JSON SOP 1건을 직접 작성해보며 필드 적절성 검증 | 개발 | | **P1** | DCS 태그 형식 확인 | digital 태그의 .pv 값 형식 (R-RUN/L-STOP 등) | 개발 | | **P1** | 예외 처리 정의 | 각 step별 실패 시나리오 및 fallback 정의 | 공정 | | **P1** | UI 프로토타입 | panes/ops.html mockup 제작 (하드코딩 step) | 개발 | | **P2** | MCP tool 구현 | `execute_operation_guide` server.py에 추가 | 개발 | | **P2** | 피드백 타입 시험 | 운전원 확인 → 다음 step 전환까지 end-to-end | 통합 | ### 10.7 구현 원칙 1. **SOP 구조는 실제 절차서를 JSON으로 변환해보기 전에 확정 금지** — 필드 부족/과잉이 발생할 수 있음 2. **하드코딩 mock으로 UI 먼저 검증** — MCP tool 구현 전에 pane HTML+JS를 mock data로 동작시켜 UX 확인 3. **P0 검증 완료 후 P1, P1 완료 후 P2 진행** — 병렬 가능한 항목은 병렬 4. **처음부터 모든 mode를 만들지 않음** — startup만 먼저 구현, 다른 mode는 startup 구조 검증 후 확장 --- ## 11. 참고 문서 - `docs/측류추출식-통합유량설정공식.md` — C-6111 물질수지/환류/온도보정/V_loss 공식 - `docs/보조운전-브레인스토밍.md` (본 문서)