Files
ExperionCrawler/docs/보조운전-브레인스토밍.md

345 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 보조운전 (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` (본 문서)