16 KiB
16 KiB
보조운전 (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 배열로 청킹:
{
"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
@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 반환
"""
동작 흐름
- KB에서
unit+mode에 해당하는 SOP 검색 current_step의 expected 조건을 실시간 데이터로 검증- 검증 실패 항목 있으면 → 경고 메시지
operator_feedback이 있으면 → 현재 step 메모에 기록- 다음 step 정보 + 검증 결과 + action 목록을 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 구현 원칙
- SOP 구조는 실제 절차서를 JSON으로 변환해보기 전에 확정 금지 — 필드 부족/과잉이 발생할 수 있음
- 하드코딩 mock으로 UI 먼저 검증 — MCP tool 구현 전에 pane HTML+JS를 mock data로 동작시켜 UX 확인
- P0 검증 완료 후 P1, P1 완료 후 P2 진행 — 병렬 가능한 항목은 병렬
- 처음부터 모든 mode를 만들지 않음 — startup만 먼저 구현, 다른 mode는 startup 구조 검증 후 확장
11. 참고 문서
docs/측류추출식-통합유량설정공식.md— C-6111 물질수지/환류/온도보정/V_loss 공식docs/보조운전-브레인스토밍.md(본 문서)