Files
ExperionCrawler/사용자-TODO-KB-RAG.md
windpacer 302183c97e feat: P&ID 연결 분석, LLM 에이전트 모드, KB 확장, MCP 서버 리팩토링
- P&ID: 연결 분석 API, Prefix 규칙 관리, 카테고리 분류, DXF 그래프 빌드
- LLM: 대화 요약, tool card 영구 보존, 시계열 차트(uPlot), 에이전트 모드
- KB: 청크 미리보기, Field Instrument Inference, 인증/Qdrant 클라이언트
- MCP: 서버 기능 확장, 파이프라인 수정, timeout 개선
- Frontend: P&ID UI, LLM UI, KB UI, OPC UA Write 탭 추가
- 설정: AGENTS.md, plant_context, README, opencode.json 업데이트
- 정리: 진단 체크리스트 문서 삭제
2026-05-21 23:36:57 +09:00

8.8 KiB

사용자 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# 코드 변경은 재시작 필수.

실행:

# 사용자가 직접 (포그라운드든 백그라운드든 본인 선호 방식)
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 검증 시행착오 기록