Files
ExperionCrawler/DXF추출후수정된엑셀파일-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

99 lines
8.8 KiB
Markdown

pid 추출에서 다운받은 엑셀을 다시 사용자가 정리해서 RAG 관리 페이지를 통해서 RAG indexing을 시킬건데, 현재
pid추출에서 다운받은 엑셀 파일 인덱싱시 각 시트 및 컬럼이 어떤 식으로 인덱싱이 되는지 알고싶어
● Excel RAG 인덱싱 파이프라인을 추적하겠습니다.
Searched for 4 patterns, read 5 files, listed 1 directory (ctrl+o to expand)
● 전체 인덱싱 파이프라인을 파악했습니다. 설명드리겠습니다.
---
Excel RAG 인덱싱 전체 흐름
업로드 → parse_document(MCP) → xlsx_parser.py → 청크 목록
→ Ollama nomic-embed-text → 768차원 벡터
→ Qdrant upsert (cosine similarity)
---
xlsx_parser.py가 만드는 청크 구조
시트 1개당 두 종류 청크를 생성합니다.
1) Sheet 청크 (시트당 1개)
chunk_kind = "sheet"
locator = "sheet=Instrument"
text = 마크다운 표 (최대 1000행)
| 태그번호 | 장비명 | 장비타입 | 라인번호 | 도면번호 | 신뢰도 | ... |
| --- | --- | --- | ... |
| FT-9101 | Flow Transmitter | FT | | | 0.95 | ... |
| PT-9111A | Pressure Transmitter | PT | | | 0.92 | ... |
...
→ 시트 전체가 하나의 벡터. "Instrument 시트 전체 목록" 같은 쿼리에 매칭.
2) Row 청크 (데이터 행마다 1개)
chunk_kind = "row"
locator = "sheet=Instrument; row=2"
text = "Instrument: 태그번호=FT-9101, 장비명=Flow Transmitter, 장비타입=FT, 신뢰도=0.95"
→ 빈 셀 컬럼은 제외, 값이 있는 컬럼만 컬럼명=값 형식으로 연결.
---
P&ID 추출 엑셀 시트별 청크 수 예측
┌─────────────────┬────────────┬─────────────────┬───────────────────────────────────────────────────────────────┐
│ 시트명 │ sheet 청크 │ row 청크 │ row 청크 텍스트 예시 │
├─────────────────┼────────────┼─────────────────┼───────────────────────────────────────────────────────────────┤
│ Instrument │ 1 │ 태그 수만큼 │ Instrument: 태그번호=FT-9101, 장비명=Flow Transmitter, ... │
├─────────────────┼────────────┼─────────────────┼───────────────────────────────────────────────────────────────┤
│ Power Equipment │ 1 │ 태그 수만큼 │ Power Equipment: 태그번호=P-9101, 장비명=Pump, ... │
├─────────────────┼────────────┼─────────────────┼───────────────────────────────────────────────────────────────┤
│ Pipings │ 1 │ 배관번호 수만큼 │ Pipings: 태그번호=P-9107-25A-F-n, 장비타입=PROCESS FLUID, ... │
├─────────────────┼────────────┼─────────────────┼───────────────────────────────────────────────────────────────┤
│ Unmatched │ 1 │ 수만큼 │ Unmatched: 태그번호=UFD-001, ... │
└─────────────────┴────────────┴─────────────────┴───────────────────────────────────────────────────────────────┘
---
Qdrant에 저장되는 payload (청크당)
{
"doc_id": "uuid",
"collection_key": "컬렉션키",
"title": "문서 제목",
"text": "Instrument: 태그번호=FT-9101, 장비명=...",
"chunk_kind": "row",
"locator": "sheet=Instrument; row=2",
"uploaded_at": "2026-05-17T...",
"tags": ["pid", "instrument"]
}
---
검색 시 동작 (search_kb)
사용자가 "FT-9101 태그 정보" 질의 →
nomic-embed-text 임베딩 → Qdrant cosine 검색 →
row 청크 "Instrument: 태그번호=FT-9101, 장비명=Flow Transmitter..." 상위 매칭
---
알아두실 주의사항
┌─────────────────────┬───────────────────────────────────────────────────────────────────────────────────────────┐
│ 항목 │ 내용 │
├─────────────────────┼───────────────────────────────────────────────────────────────────────────────────────────┤
│ 1000행 한도 │ sheet 청크는 선두 1000행만 — Pipings처럼 행이 많으면 sheet 청크 불완전. row 청크는 영향 │
│ │ 없음 │
├─────────────────────┼───────────────────────────────────────────────────────────────────────────────────────────┤
│ 빈 셀 제외 │ 라인번호/도면번호가 비어있으면 row 청크 텍스트에서 생략됨 │
├─────────────────────┼───────────────────────────────────────────────────────────────────────────────────────────┤
│ 컬럼명이 RAG 질의 │ "태그번호", "장비명" 등 한국어 컬럼명이 그대로 검색 텍스트 됨. 컬럼명 정리가 검색 품질에 │
│ 키 │ 직결 │
├─────────────────────┼───────────────────────────────────────────────────────────────────────────────────────────┤
│ 중복 태그 주의 │ 같은 태그가 여러 시트에 있으면 row 청크 중복 생성 → 검색 결과 중복 │
├─────────────────────┼───────────────────────────────────────────────────────────────────────────────────────────┤
│ Experion 태그 컬럼 │ 연결된 Experion 태그가 있으면 row 청크에 포함 → "FT-9101의 Experion 태그" 쿼리에 잘 매칭 │
└─────────────────────┴───────────────────────────────────────────────────────────────────────────────────────────┘
RAG 검색 최적화를 위해 사용자가 정리할 때 권장하는 사항:
- 불필요한 시트 제거 (Unmatched는 제외 권장)
- 빈 컬럼(라인번호, 도면번호)을 채워서 업로드하면 row 청크 정보 밀도 향상
- 컬럼명을 영문으로 바꾸면 영문 질의에도 잘 매칭 (현재 한국어)