feat: Knowledge Base RAG 시스템 + 채팅 LLM 개선 (Phase 0~5 완료)
- KB RAG 전체 파이프라인: 업로드, 파싱(xlsx/pdf/docx/text), 임베딩, Qdrant 인덱싱 - KB 관리 UI(14번 탭): 로그인, 문서 목록, 업로드, 삭제, 재인덱스 - OllamaController: 한글 시스템 프롬프트, plant_context.md 외부 파일화, SSE tool_start/tool_result 이벤트 - 프론트: 툴 실행 카드, KB 인용 링크, 표 자동 렌더, 추천 질문 칩 - nl2sql_worker: history_table.recorded_at 사용, tag_metadata 응답 개선 - DB: KB 테이블 5개 DDL + 시드, pgcrypto 확장
This commit is contained in:
142
plans/LLM채팅+지식증강-phase5-사용자체크리스트.md
Normal file
142
plans/LLM채팅+지식증강-phase5-사용자체크리스트.md
Normal file
@@ -0,0 +1,142 @@
|
||||
❯ 현재까지 작업한 것의 사용자가 해야할 일 정리해줘
|
||||
|
||||
● 사용자 액션 가이드 (Phase 0~5 구현물 사용 절차)
|
||||
|
||||
1. 사전 환경 셋업 (1회만)
|
||||
|
||||
1.1 Python 의존성 추가 설치 — Phase 2에서 openpyxl/python-docx/pdfplumber를 추가했으므로
|
||||
mcp-server 가상환경에 설치 필요:
|
||||
cd ~/projects/ExperionCrawler/mcp-server
|
||||
uv pip install -e .
|
||||
|
||||
1.2 외부 서비스 동작 확인 — 셋 다 떠 있어야 함:
|
||||
curl -s http://localhost:6333/collections | jq # Qdrant
|
||||
curl -s http://localhost:11434/api/tags | jq # Ollama (nomic-embed-text 필요)
|
||||
curl -s http://localhost:8000/v1/models | jq # vLLM (Qwen3.6-27B-FP8)
|
||||
- Ollama에 nomic-embed-text 모델이 없으면: ollama pull nomic-embed-text
|
||||
|
||||
1.3 (선택) 관리자 초기 비번을 환경변수로 미리 설정 — 콘솔 로그에 비번 노출이 싫으면:
|
||||
export KB_ADMIN_INITIAL_PASSWORD='원하는초기비번'
|
||||
설정 안 하면 첫 부팅 시 자동 생성 후 콘솔에 1회 출력.
|
||||
|
||||
---
|
||||
2. 첫 부팅
|
||||
|
||||
2.1 mcp-server 재시작 — 새 도구(parse_document, search_kb) 등록:
|
||||
# 기존 프로세스 종료 후
|
||||
cd ~/projects/ExperionCrawler/mcp-server
|
||||
# 기존 기동 방식 그대로 (예: uv run / python server.py --http 등)
|
||||
|
||||
2.2 ExperionCrawler 앱 빌드/기동:
|
||||
cd ~/projects/ExperionCrawler
|
||||
dotnet build src/Web/ExperionCrawler.csproj
|
||||
dotnet run --project src/Web/ExperionCrawler.csproj
|
||||
# 또는 deploy.sh 사용
|
||||
|
||||
2.3 콘솔 로그 확인 — 다음 두 줄이 보이는지:
|
||||
[Kb] 관리자 초기 비밀번호 자동 생성: XXXXXXXXXXXXXXXX ← 즉시 변경하세요
|
||||
[Kb] Qdrant 컬렉션 ensure 완료: 5건
|
||||
랜덤 비번을 즉시 메모. (env var 사용했다면 "환경변수 사용" 로그 1줄만 출력)
|
||||
|
||||
2.4 Qdrant 컬렉션 5개 생성 확인:
|
||||
curl -s http://localhost:6333/collections | jq '.result.collections[] | .name'
|
||||
# kb_system_instrument, kb_plant_operation, kb_procedure, kb_report, kb_vendor_doc
|
||||
포함되어야 함
|
||||
|
||||
---
|
||||
3. 관리자 첫 로그인 + 비번 변경 (필수)
|
||||
|
||||
1. 브라우저 → http://localhost:5000 → 사이드바 14 RAG 관리 클릭
|
||||
2. 콘솔에서 받은 초기 비번 입력 → 로그인
|
||||
3. 상단 [비밀번호 변경] → 새 비번 (6자 이상) 설정 → 자동 로그아웃
|
||||
4. 새 비번으로 재로그인
|
||||
|
||||
---
|
||||
4. (선택) plant_context.md 작성
|
||||
|
||||
prompts/plant_context.md는 현재 빈 골격입니다. 채워두면 채팅의 시스템 프롬프트에 자동
|
||||
주입되어 답변 품질이 좋아집니다:
|
||||
nano prompts/plant_context.md
|
||||
채울 항목 (파일 안 주석 참고):
|
||||
- 단위 (Unit A: 압축, Unit B: 분리 …)
|
||||
- 계기 prefix 약어 (FIC/PT/TI/XV …)
|
||||
- 태그 명명 규칙 (소문자, .pv/.sp/.op/.instate0~7)
|
||||
- 시간대 (UTC 저장, KST 표시)
|
||||
- 예시 질문 → 도구 매핑
|
||||
|
||||
수정 후 앱 재기동 없이 즉시 반영됩니다 (요청 시마다 파일 읽음).
|
||||
|
||||
---
|
||||
5. KB 문서 업로드 워크플로우
|
||||
|
||||
1. 14번 탭 → [📁 파일 업로드] 클릭
|
||||
2. 컬렉션 선택 (5종 중 1개):
|
||||
- system_instrument — 계기 datasheet, P&ID 사양서
|
||||
- plant_operation — 재고, 생산현황, 정비이력, 교대일지
|
||||
- procedure — SOP, 정비 절차, 알람 대응 매뉴얼
|
||||
- report — 일/주/월 보고서
|
||||
- vendor_doc — 벤더 카탈로그, 매뉴얼
|
||||
3. 제목(기본: 파일명) / 태그(콤마 구분, 예: unit-a, P-6201) 입력
|
||||
4. 파일 선택 → [업로드]
|
||||
5. 목록에 새 행이 pending 상태로 등장 → 1.5초마다 자동 갱신 → parsing → embedding → indexed
|
||||
✓
|
||||
6. 실패(failed) 시 해당 행의 에러 메시지 확인, [↻] 재인덱스 가능
|
||||
|
||||
지원 형식: .xlsx / .xlsm / .pdf / .docx / .md / .txt
|
||||
|
||||
---
|
||||
6. 채팅에서 KB 활용
|
||||
|
||||
1. 사이드바 13 로컬 LLM 채팅 클릭
|
||||
2. LLM 종류 = vLLM 선택 (tool 사용은 vLLM 전용)
|
||||
3. 모델 = Qwen3.6-27B-FP8 선택
|
||||
4. MCP 도구 ✓ 체크박스 켜기
|
||||
5. welcome 화면의 추천 칩 중 하나 클릭 (예: "P-6201 펌프의 정비 이력") → 자동으로 입력창에
|
||||
채워짐 → Enter
|
||||
6. 진행 상황 가시화:
|
||||
- 회색 spinning 카드: 툴 호출 시작
|
||||
- 녹색 ✓: 성공 + 결과 (클릭하면 전체 펼침, 표/KB hits 자동 렌더)
|
||||
- 빨간 ✗: 실패 + 에러 메시지
|
||||
7. KB에서 가져온 문서 제목이 답변 본문에 점선 밑줄 링크로 자동 표시됨 → 클릭하면 원본 파일
|
||||
다운로드
|
||||
|
||||
---
|
||||
7. 검증 (옵션)
|
||||
|
||||
항목: 작은 txt 업로드 → 30초 내 indexed
|
||||
확인 방법: 14번 탭에서 상태 칩 색상 변화
|
||||
────────────────────────────────────────
|
||||
항목: 큰 PDF 실패 시 재시도 동작
|
||||
확인 방법: jobs 테이블 attempts 누적 (앱 콘솔 로그)
|
||||
────────────────────────────────────────
|
||||
항목: 세션 60분 자동 만료
|
||||
확인 방법: 60분 방치 후 동작 시 재로그인 요구
|
||||
────────────────────────────────────────
|
||||
항목: KB 인용 다운로드
|
||||
확인 방법: search_kb 호출 후 답변 안의 제목 링크 클릭
|
||||
────────────────────────────────────────
|
||||
항목: Qdrant 청크 확인
|
||||
확인 방법: curl http://localhost:6333/collections/kb_plant_operation | jq
|
||||
'.result.points_count'
|
||||
|
||||
---
|
||||
8. 운영 팁
|
||||
|
||||
- 재인덱스: 청킹 정책을 바꿨거나 파일 손상 시 → 행의 [↻] 버튼
|
||||
- 임시 숨김: 잘못 올렸지만 보관은 유지 → [🚫] (비활성화, 검색 결과에서 제외)
|
||||
- 영구 삭제: [✖] 또는 하단 [비활성화 영구삭제(90일 이상)]
|
||||
- 동일 제목 일괄 비활성화: 재업로드 후 구버전 한 번에 비활성화 — 하단 [🚫 동일 제목 일괄
|
||||
비활성화]
|
||||
- 로그 위치: mcp-server/logs/, dotnet 콘솔 — [Kb] [Kb][Worker] [Kb][Qdrant] 접두사로 grep
|
||||
|
||||
---
|
||||
9. 알려진 제약 / 다음 단계
|
||||
|
||||
- 시계열 시각화는 표만 자동 렌더됨 (스파클라인 보류)
|
||||
- 툴 실행 카드는 스트리밍 중에만 보임 — 메시지 영구 보존은 Phase 6 이후
|
||||
- 이벤트/알람 도구 (active_alarms 등), find_tags, generate_status_report 매크로는 Phase
|
||||
6에서 추가 예정 — 현재 추천 칩 중 일부는 모델이 직접 SQL을 짜서 답변
|
||||
- run_sql 안전장치 (자동 LIMIT, statement_timeout)도 Phase 6
|
||||
|
||||
---
|
||||
막힘이 있는 단계가 있으면 어디서 멈췄는지 알려주시면 함께 보겠습니다.
|
||||
@@ -64,20 +64,20 @@
|
||||
|
||||
### 2.1 채팅 페이지 개선 방향 (별도 사용자 결정 대기 항목 있음)
|
||||
|
||||
| # | 항목 | 합의 |
|
||||
|---|---|---|
|
||||
| C1 | 추천 질문 칩(welcome 화면) | 추천 — 구현 예정 |
|
||||
| C2 | plant_context.md 시스템 프롬프트 주입 | 추천 — 구현 예정 |
|
||||
| C3 | event MCP 툴 3종 (`query_events`/`summarize_events`/`active_alarms`) | 추천 — 구현 예정 |
|
||||
| C4 | SSE `tool_start`/`tool_result` 이벤트 + UI 가시화 | 추천 — 구현 예정 |
|
||||
| C5 | 테이블/시계열 자동 렌더링 | 추천 — 구현 예정 |
|
||||
| C6 | `generate_status_report` 매크로 툴 | 추천 — 구현 예정 |
|
||||
| C7 | 태그 시맨틱 검색(`find_tags`) | 추천 — 구현 예정 |
|
||||
| C8 | SQL 안전장치 (LIMIT 자동/statement_timeout) | 추천 — 구현 예정 |
|
||||
| C9 | NL2SQL 의도 라우터 | 검토 후 결정 |
|
||||
| C10 | 대화 요약/압축 | 후순위 |
|
||||
| C11 | 에이전트 모드(자율 멀티스텝) | 후순위 |
|
||||
| C12 | 위 1.3 결함 픽스 | 즉시 진행 |
|
||||
| # | 항목 | 합의 | 상태 (2026-05-13) |
|
||||
|---|---|---|---|
|
||||
| C1 | 추천 질문 칩(welcome 화면) | 추천 — 구현 예정 | ✅ 완료 (Phase 5.5) |
|
||||
| C2 | plant_context.md 시스템 프롬프트 주입 | 추천 — 구현 예정 | ✅ 완료 (Phase 0.3, 빈 골격 생성) |
|
||||
| C3 | event MCP 툴 3종 (`query_events`/`summarize_events`/`active_alarms`) | 추천 — 구현 예정 | ⏳ Phase 6.1 |
|
||||
| C4 | SSE `tool_start`/`tool_result` 이벤트 + UI 가시화 | 추천 — 구현 예정 | ✅ 완료 (Phase 5.1, 5.2) |
|
||||
| C5 | 테이블/시계열 자동 렌더링 | 추천 — 구현 예정 | ✅ 표 완료 / 스파클라인 보류 (Phase 5.4) |
|
||||
| C6 | `generate_status_report` 매크로 툴 | 추천 — 구현 예정 | ⏳ Phase 6.3 |
|
||||
| C7 | 태그 시맨틱 검색(`find_tags`) | 추천 — 구현 예정 | ⏳ Phase 6.2 |
|
||||
| C8 | SQL 안전장치 (LIMIT 자동/statement_timeout) | 추천 — 구현 예정 | ⏳ Phase 6.4 |
|
||||
| C9 | NL2SQL 의도 라우터 | 검토 후 결정 | ⏳ 보류 (Phase 7.1) |
|
||||
| C10 | 대화 요약/압축 | 후순위 | ⏳ 보류 (Phase 7.2) |
|
||||
| C11 | 에이전트 모드(자율 멀티스텝) | 후순위 | ⏳ 보류 (Phase 7.3) |
|
||||
| C12 | 위 1.3 결함 픽스 | 즉시 진행 | ✅ 완료 (Phase 0.1, 0.2) |
|
||||
|
||||
### 2.2 지식 증강(RAG ingest) 결정
|
||||
|
||||
@@ -477,56 +477,51 @@ rag_query(question: str,
|
||||
|
||||
## 4. 구현 순서 (Todo)
|
||||
|
||||
### Phase 0 — 사전 정비 (반나절)
|
||||
0.1 `mcp-server/worker/nl2sql_worker.py:244` `time_bucket('1 min', ts)` 버그 수정
|
||||
0.2 `mcp-server/llm-model.json` 모델명을 실제 vLLM 서빙명과 일치
|
||||
0.3 `OllamaController.cs:608` 시스템 프롬프트 한글화 + plant_context.md 외부 파일화
|
||||
### Phase 0 — 사전 정비 (반나절) ✅ 완료
|
||||
0.1 ✅ `mcp-server/worker/nl2sql_worker.py:244` `time_bucket('1 min', ts)` 버그 수정 (history_table.recorded_at 사용, `_get_tag_metadata`도 같이 수정)
|
||||
0.2 ✅ `mcp-server/llm-model.json` — 실제 서빙 `Qwen3.6-27B-FP8`과 이미 동기화 (memory만 갱신)
|
||||
0.3 ✅ `OllamaController.ComposeSystemPrompt(...)` — 한글 base + `prompts/plant_context.md`(빈 골격) + tool guide 합성, app.js 영문 하드코딩 제거
|
||||
|
||||
### Phase 1 — 데이터 모델 & 인증 (1일)
|
||||
1.1 PostgreSQL 마이그레이션: `kb_collections`, `kb_documents`, `kb_ingest_jobs`,
|
||||
`kb_admin_credential`, `kb_admin_sessions` 테이블 생성
|
||||
1.2 시드 데이터 INSERT: kb_collections 5건 (system_instrument, plant_operation, procedure,
|
||||
report, vendor_doc)
|
||||
1.3 Qdrant 컬렉션 5개 생성 (kb_system_instrument, kb_plant_operation, kb_procedure,
|
||||
kb_report, kb_vendor_doc) — 임베딩 차원에 맞춰
|
||||
1.4 `KbAuthController` (login/logout/status/change-password) + Argon2 해시 유틸
|
||||
1.5 첫 실행 시 초기 비번 시드 로직
|
||||
### Phase 1 — 데이터 모델 & 인증 (1일) ✅ 완료
|
||||
1.1 ✅ DDL 5개 + 시드 5건 (ExperionDbContext.InitializeAsync 자동 적용, pgcrypto 활성화)
|
||||
1.2 ✅ KbStartupService — 부팅 시 활성 컬렉션 5개 Qdrant idempotent ensure (`KbQdrantClient.EnsureCollectionAsync`)
|
||||
1.3 ✅ KbAuthController (login/logout/status/change-password) + `PasswordHasher` (Konscious Argon2id), `X-Kb-Token` 헤더, 초기 비번 env or 자동 생성
|
||||
|
||||
### Phase 2 — 업로드 & 비동기 워커 (2일)
|
||||
2.1 `KbController.Upload` — multipart 수신 → storage 저장 → kb_documents/kb_ingest_jobs INSERT
|
||||
2.2 `KbIngestWorker (BackgroundService)` — 큐 폴링 + 단계별 처리
|
||||
2.3 MCP `parse_document` — xlsx (행+시트), pdf (섹션+표), docx, md/txt
|
||||
2.4 MCP `_embed` 배치 호출 + Qdrant upsert (collection_key 기반 라우팅)
|
||||
2.5 `KbController.Documents/Jobs` — 목록·상세·진행률 폴링
|
||||
### Phase 2 — 업로드 & 비동기 워커 (2일) ✅ 완료
|
||||
2.1 ✅ KbController.Upload — multipart 수신, `storage/kb/{yyyy-MM}/{uuid}.{ext}` 저장, SHA256, kb_documents/kb_ingest_jobs INSERT
|
||||
2.2 ✅ KbIngestWorker — 2초 폴링, parse→embed→index 단일 패스, attempts ≥3=failed
|
||||
2.3 ✅ MCP `parse_document` + `parsers/{xlsx,pdf,docx,text}_parser.py` (행+시트 / 페이지+표 / 헤딩 path / md헤딩·txt단락)
|
||||
2.4 ✅ KbEmbeddingClient (Ollama nomic-embed-text 768-dim) + KbQdrantClient.UpsertAsync (collection_key 라우팅)
|
||||
2.5 ✅ Documents/Jobs/Download/Delete/Reindex/Disable/BulkDisable/PurgeDisabled
|
||||
|
||||
### Phase 3 — 관리 탭 #14 (1일)
|
||||
3.1 사이드바 14번 탭 추가, `<section id="pane-kbadmin">` 신설
|
||||
3.2 비번 입력 → 토큰 받아 sessionStorage 저장
|
||||
3.3 컬렉션 필터, 상태/태그 필터, 검색
|
||||
3.4 업로드 모달(드래그앤드롭 + collection_key 드롭다운 + 태그)
|
||||
3.5 목록, 상세 보기, 삭제, 재인덱스, 일괄 비활성화, 비활성화 영구삭제
|
||||
3.6 1초 폴링으로 ingesting 진행률 표시
|
||||
### Phase 3 — 관리 탭 #14 (1일) ✅ 완료
|
||||
3.1 ✅ 사이드바 14번 + pane-kbadmin
|
||||
3.2 ✅ 비번 로그인 → sessionStorage 토큰 (X-Kb-Token)
|
||||
3.3 ✅ 컬렉션/상태/제목 필터
|
||||
3.4 ✅ 업로드 모달 (collection_key 드롭다운 강제 + 제목 + 태그) — 드래그앤드롭은 후순위
|
||||
3.5 ✅ 목록, 다운로드, 삭제, 재인덱스, 일괄 비활성화, 비활성화 영구삭제
|
||||
3.6 ✅ 1.5초 폴링 (pending/parsing/embedding 있을 때만 새로고침)
|
||||
|
||||
### Phase 4 — 다운로드 & 검색 (반나절)
|
||||
4.1 `/api/kb/download/{docId}` — 원본 스트림, Content-Disposition
|
||||
4.2 MCP `search_kb` — 다중 컬렉션 + uploaded_at 최신 가중치 + 태그 필터
|
||||
4.3 기존 `rag_query` 확장: `search_kb` 통합 옵션
|
||||
### Phase 4 — 다운로드 & 검색 (반나절) ✅ 완료
|
||||
4.1 ✅ /api/kb/download/{docId} — Content-Disposition + MIME (KbController.Download)
|
||||
4.2 ✅ MCP `search_kb` — `_search_kb_collection`(태그 filter), `_recency_factor`(7d+10%/30d+5%/90d+2%), `_search_kb_raw`(다중 컬렉션 + since 후필터 + doc_id::locator dedup)
|
||||
4.3 ✅ rag_query 확장 — `search_kb`, `kb_collections` 인자 + `_format_kb_results` 인용 직렬화
|
||||
|
||||
### Phase 5 — 채팅 통합 (1~2일)
|
||||
5.1 SSE 이벤트 추가: `tool_start`, `tool_result` (백엔드 `VllmChatStreamWithTools` 안)
|
||||
5.2 프론트 채팅 메시지에 툴 실행 카드 렌더 (접이식)
|
||||
5.3 모델 인용 자동 → 다운로드 링크 치환
|
||||
5.4 테이블/시계열 자동 렌더 (`{success, columns, data}` JSON 감지)
|
||||
5.5 추천 질문 칩(welcome 화면)
|
||||
5.6 system prompt 합성 로직 (plant_context.md + 도구 가이드 + 사용자 입력)
|
||||
### Phase 5 — 채팅 통합 (1~2일) ✅ 완료
|
||||
5.1 ✅ SSE `tool_start`/`tool_result` 이벤트 — `EmitToolStart/EmitToolResult` 헬퍼, 공식 tool_calls 경로 + JSON-텍스트 폴백 경로 둘 다 발행
|
||||
5.2 ✅ 툴 실행 카드 (접이식, running/ok/err 색상, spin 애니메이션)
|
||||
5.3 ✅ KB 인용 자동 링크 — `llmKbDocMap`에 search_kb hits title→docId 누적, `llmLinkKbCitations`로 본문 치환
|
||||
5.4 ✅ 표 자동 렌더 (`{success, columns, data}` 및 `data:[{...}]` 감지, 최대 50행) / 스파클라인은 보류
|
||||
5.5 ✅ 추천 질문 칩 7종 (활성 알람, Unit A 요약, FIC-6113 추이, 디지털 이벤트, 정비 이력, 주간 보고, find_tags)
|
||||
5.6 ✅ Phase 0.3에서 이미 완료
|
||||
|
||||
### Phase 6 — 보강 도구 (1일)
|
||||
### Phase 6 — 보강 도구 (1일) ⏳ 미구현
|
||||
6.1 MCP `query_events`, `summarize_events`, `active_alarms` (event_history_table 기반)
|
||||
6.2 MCP `find_tags` — tag_metadata 시맨틱 검색 (별도 Qdrant 컬렉션 또는 KB와 통합)
|
||||
6.3 MCP `generate_status_report` — 매크로 툴
|
||||
6.4 `run_sql` LIMIT 자동 + `SET LOCAL statement_timeout = 10s`
|
||||
|
||||
### Phase 7 — 운영 보강 (옵션)
|
||||
### Phase 7 — 운영 보강 (옵션) ⏳ 미구현
|
||||
7.1 NL2SQL 의도 라우터
|
||||
7.2 대화 요약/압축 (장기 세션)
|
||||
7.3 에이전트 모드 (자율 멀티스텝 계획)
|
||||
|
||||
0
plans/phase5-사용자점검리스트.md
Normal file
0
plans/phase5-사용자점검리스트.md
Normal file
Reference in New Issue
Block a user