# 사용자 TODO — KB / RAG 지식 강화

**작성일**: 2026-05-15
**컨텍스트**: 27B 복귀 후, plant_context.md/v_plant_running_state 뷰/PID 추출 마크다운까지 코드/데이터 준비 완료. 운영자 측에서 수행해야 할 후속 작업 모음.

---

## ⚡ 즉시 필요 (오늘~내일)

### 1. C# 앱 재시작 — 시스템 프롬프트 변경 반영

지난 대화에서 작성한 코드 변경(빌드는 완료, 실행 중인 프로세스에 미적용):

| 파일 | 변경 |
|---|---|
| `OllamaController.cs` | `BuildDateContextKo` 시:분/UTC/상대시간 변환 표 + 미래 금지 |
| `OllamaController.cs` | `BaseSystemPromptKo` 한자(중국어) 금지 강화 |
| `OllamaController.cs` | `GetModels` 임베딩 모델 필터링 (bge-m3 등 채팅 셀렉터에서 제외) |
| `ExperionDbContext.cs` | `v_plant_running_state` 뷰 부팅 시 자동 생성 (현재는 수동 생성됨) |
| `mcp-server/server.py` | `_CLASSIFY_RULES`에 "이상 상황" 추가 |

> ⚠️ `plant_context.md`는 mtime 캐시 자동 감지 — 재시작 안 해도 새 채팅부터 반영. 다만 C# 코드 변경은 재시작 필수.

**실행**:
```bash
# 사용자가 직접 (포그라운드든 백그라운드든 본인 선호 방식)
cd /home/windpacer/projects/ExperionCrawler
dotnet run --project src/Web/ExperionCrawler.csproj
```

C# 앱 시작 시 MCP 서버는 자동 기동 (`McpServerHostedService`가 ping 후 spawn).

---

### 2. PID 추출 데이터를 KB에 업로드 — `plans/no10-pid-extraction.md` (31 KB)

⚙️ **관리자 인증 필요** — 제가 대신 못 함.

**파일 위치**: `plans/no10-pid-extraction.md`
- 내용: No-10 Plant 도면에서 추출한 460건 (파이프 247 + 장비 78 + 계기 110 + 미분류 25)
- 형식: 마크다운. 통계 → 영역별 분포 → 장비/계기/파이프 상세 목록
- 풀어쓴 의미 포함 (FCV → Flow Control Valve, P → PROCESS FLUID 등)

**업로드 절차**:
1. C# 앱 기동 후 UI → 사이드바 **14번 RAG 관리** 탭
2. 관리자 비밀번호 로그인
3. **컬렉션**: `system_instrument` 선택
4. **업로드**: `plans/no10-pid-extraction.md` 파일 선택 + 업로드
5. 1.5초 진행률 폴링이 자동 갱신 — `pending → parsing → embedding → indexed`까지 보임
6. **태그(선택)**: `pid, no10-plant, dxf, area-10` 같은 태그 입력하면 검색 정확도 ↑

**검증**:
KB 업로드 완료 후 채팅에서 검증 질문:
- "P-10138 어떤 fluid야?" → "PROCESS FLUID, 600A, F2A spec" 답이 나와야 함
- "10차 플랜트에 펌프 몇 대?" → search_kb 결과 인용
- "PSV-10217이 뭐야?" → "Pressure Safety Valve" 답

---

## 🔧 권장 (이번 주)

### 3. 다른 P&ID 도면도 추출 + 인덱싱

현재 KB에는 **No-10 도면만**. P-1~P-9 도면들도 추출하면:
- `find_pid_equipment` MCP 도구가 모든 area 커버 가능
- 알람 발생 시 LLM이 P&ID 컨텍스트 자동 인용

**진행 방법**:
1. mcp-server의 `parse_pid_dxf(filepath)` 또는 `build_pid_graph_parallel(filepath)` 도구 사용
2. 결과가 pid_equipment 테이블에 적재됨
3. 다시 마크다운 변환 → 업로드 (스크립트는 `/tmp/pid_data.json` 생성 패턴 재사용 가능)

또는 채팅에서 직접: "P-6 도면 파싱해줘" 같이 (도구 호출됨).

---

### 4. 운영 절차서 / SOP 문서 KB 인덱싱

산업 환경 운전원 질의의 대부분은 절차서 영역:
- "P6 펌프 트립 시 대응 절차"
- "교대 인수인계 체크리스트"
- "정기 점검 항목"

**컬렉션**:
- `procedure` — 운전 절차서, SOP, 작업 지침서
- `vendor_doc` — 제조사 매뉴얼 (Honeywell R530 외 펌프/밸브/계기 매뉴얼)
- `report` — 운영 보고서, 사고 보고서, 정비 기록

**업로드 형식**:
- xlsx (시트+행 청킹), pdf (페이지+표 청킹), docx (헤딩 기반), md/txt
- 1개 문서 최대 500 MB (현재 RequestSizeLimit)

---

### 5. 펌프 enum 매핑이 누락된 area 보충

현재 `v_plant_running_state` 결과:

| area | 펌프 enum 데이터 |
|---|---|
| P3, P4, P5, P6, P8 | ✅ 있음 (펌프 등록 완료) |
| P1, P2, P7, P9, P10, UTIL, PACKING | ❌ 없음 (운전 판정 불가) |

P1/P2/P9/P10에 펌프 등록이 필요합니다:
- 옵션 a: 포인트빌더 탭(06번)에서 해당 area 펌프 태그 추가
- 옵션 b: `node_map_master`의 디지털 포인트를 일괄 추가하는 스크립트
- 옵션 c: 운영자 인터뷰 후 "어느 펌프가 P9를 대표하는지" 확정

옵션 c가 정확. 운영자 1회 인터뷰면 끝.

---

## 📋 선택 (시간 여유 있을 때)

### 6. 운영자가 작성해야 할 콘텐츠

KB가 풍부해질수록 RAG 효과 커짐. 우선순위:

| 콘텐츠 | 가치 | 컬렉션 |
|---|---|---|
| 펌프별 정상 운전값 범위 (PV/SP) | ⭐⭐⭐ 알람 판정 정확도 ↑ | system_instrument |
| 인터록 조건 표 | ⭐⭐⭐ "왜 트립됐는지" 답변 가능 | procedure |
| 시운전 절차 | ⭐⭐ 교대 시작 시 참고 | procedure |
| 비상 정지 절차 | ⭐⭐⭐ 사고 대응 | procedure |
| 청소/세척 사이클 | ⭐ 정비 일정 | procedure |
| 과거 사고 보고 (Lessons Learned) | ⭐⭐ 유사 상황 인용 | report |

각각 마크다운/PDF/Word로 작성 → KB 14번 탭 업로드.

---

### 7. CLAUDE.md outdated 정보 정정

CLAUDE.md에 `.instate0..7` suffix 언급이 있는데 실제 DB에는 그런 suffix가 없습니다 (`.pv, .sp, .op, .qv` 4종만). 다른 환경에서 가져온 정보로 추정.

→ CLAUDE.md 해당 줄 정정:
- 기존: "접미사 .pv/.sp/.op/.instate0..7"
- 변경: "접미사 .pv/.sp/.op/.qv (펌프 등 디지털 포인트는 .pv 값에 enum '{N | L-RUN | }' 형식으로 표현)"

---

### 8. v_plant_running_state 뷰의 활용도 확인

운영하면서 LLM이 이 뷰를 잘 사용하는지 점검:
- "지금 운전 중인 플랜트 알려줘" → `SELECT * FROM v_plant_running_state WHERE status='RUNNING'` 호출되는지
- 아니면 LLM이 직접 복잡 SQL 짜는지

후자라면 `plant_context.md`에 뷰 사용 강제 문구 추가 필요 — 지금은 안내만 있음.

---

### 9. 임베딩 모델 BGE-M3-ko 마이그레이션 (큰 작업)

현재 임베딩: `nomic-embed-text` (768-dim, 영어 위주). 한국어 KB 검색 시 정확도 한계.

**계획**:
- `dragonkue/BGE-m3-ko` (1024-dim, 한국어 특화) 또는 `BAAI/bge-m3` (다국어, 1024-dim)
- 서빙 방식: TEI(text-embeddings-inference) 컨테이너 또는 Ollama (GGUF 변환 필요)
- Qdrant 5개 컬렉션 재생성 (768→1024 차원 변경)
- 기존 KB 문서 전체 재임베딩 (KbIngestWorker가 자동, attempts ≥3=failed)

**언제 할까**: KB 콘텐츠가 충분히 축적된 후. 지금처럼 PID 1개만 있을 때는 효과 비교 어려움.

---

## ✅ 완료 체크리스트 (작업 시 마크업)

- [ ] 1. C# 앱 재시작
- [ ] 2. PID 마크다운 KB 업로드 (system_instrument)
- [ ] 2-검증. "P-10138 fluid?" 채팅 질의 통과
- [ ] 3. 다른 P&ID 도면 추출/인덱싱
- [ ] 4. 절차서/SOP 문서 KB 인덱싱
- [ ] 5. P1/P2/P9/P10 펌프 매핑 추가
- [ ] 6. 운영자 콘텐츠 수집 (각 항목 별도 진행)
- [ ] 7. CLAUDE.md .instate0..7 정정
- [ ] 8. v_plant_running_state 활용도 1주 모니터링
- [ ] 9. BGE-M3-ko 마이그레이션 (KB 안정화 후)

---

## 참고 — 이번 세션 변경 사항 요약

코드 측 변경(이미 빌드 완료, 재시작만 하면 됨):

| 파일 | 변경 요약 |
|---|---|
| `src/Web/Controllers/OllamaController.cs` | `BuildDateContextKo` 시:분/UTC/상대시간 표/미래 금지 (`193-241줄`) + 한자 금지 강화 (`106-114줄`) + `GetModels` 임베딩 필터링 (`241-307줄`) |
| `prompts/plant_context.md` | area 매핑 + 태그 규칙 + **펌프 운전 enum + v_plant_running_state 사용법** + 의도별 권장 도구 |
| `mcp-server/server.py` | `_CLASSIFY_RULES`에 "이상.\*상황" 패턴 |
| `mcp-server/llm-model.json` | `Qwen3.6-27B-FP8` (7B 테스트 후 복귀) |
| `src/Infrastructure/Database/ExperionDbContext.cs` | `v_plant_running_state` 뷰 부팅 시 자동 생성 |

DB 측 변경(이미 실제 적용됨, 재시작 불필요):

- ✅ `v_plant_running_state` 뷰 즉시 생성 완료 (psql 직접 실행)

데이터:
- ✅ `plans/no10-pid-extraction.md` (31KB) 생성 완료 — KB 업로드 대기 중

---

## 📞 막힐 때

| 증상 | 조치 |
|---|---|
| 채팅에서 한자 섞임 다시 발생 | C# 앱 재시작 안 했을 가능성. `BaseSystemPromptKo` 변경 반영 필요 |
| "데이터 갱신 = 운전 중"으로 잘못 답변 | UI 새 대화로 시작 (sess.summary 잔존 차단) + plant_context.md mtime 변경 확인 |
| KB 업로드 후에도 검색 안 됨 | `KbIngestJob`에서 `failed` 상태인지 확인 (14번 탭 진행률 영역). attempts ≥3 = failed |
| MCP 도구 호출 안 됨 | 도구 토글 ON 확인. 새 세션 시작 |
| 다시 모델 전환 검토 시 | `plans/배포테스트-qwen2.5-모델전환.md` 참고 — 7B 검증 시행착오 기록 |
