- 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 업데이트 - 정리: 진단 체크리스트 문서 삭제
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 등)
업로드 절차:
- C# 앱 기동 후 UI → 사이드바 14번 RAG 관리 탭
- 관리자 비밀번호 로그인
- 컬렉션:
system_instrument선택 - 업로드:
plans/no10-pid-extraction.md파일 선택 + 업로드 - 1.5초 진행률 폴링이 자동 갱신 —
pending → parsing → embedding → indexed까지 보임 - 태그(선택):
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_equipmentMCP 도구가 모든 area 커버 가능- 알람 발생 시 LLM이 P&ID 컨텍스트 자동 인용
진행 방법:
- mcp-server의
parse_pid_dxf(filepath)또는build_pid_graph_parallel(filepath)도구 사용 - 결과가 pid_equipment 테이블에 적재됨
- 다시 마크다운 변환 → 업로드 (스크립트는
/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 검증 시행착오 기록 |