205 lines
5.0 KiB
Markdown
205 lines
5.0 KiB
Markdown
✔ 🎯 End-to-End P&ID Graph Pipeline (실전 구조)
|
||
|
||
┌──────────────────────┐
|
||
│ P&ID PDF Input │
|
||
└─────────┬────────────┘
|
||
↓
|
||
┌─────────────────────────────────┐
|
||
│ 1. Document Parsing Layer │
|
||
│ (layout + text + tables) │
|
||
└─────────┬──────────────────────┘
|
||
↓
|
||
┌─────────────────────────────────┐
|
||
│ 2. Spatial Element Extraction │
|
||
│ (symbols + coordinates) │
|
||
└─────────┬──────────────────────┘
|
||
↓
|
||
┌─────────────────────────────────┐
|
||
│ 3. Entity Extraction (LLM) │
|
||
│ FIC-101, Pump-01, Valve... │
|
||
└─────────┬──────────────────────┘
|
||
↓
|
||
┌─────────────────────────────────┐
|
||
│ 4. Relationship Inference │
|
||
│ (rules + LLM hybrid) │
|
||
└─────────┬──────────────────────┘
|
||
↓
|
||
┌─────────────────────────────────┐
|
||
│ 5. Graph Builder │
|
||
│ nodes + edges │
|
||
└─────────┬──────────────────────┘
|
||
↓
|
||
┌─────────────────────────────────┐
|
||
│ 6. DB Integration Layer │
|
||
│ (existing OPC + SQL system) │
|
||
└─────────────────────────────────┘
|
||
|
||
|
||
|
||
✔ 1️⃣ Document Parsing Layer (PDF → 구조화)
|
||
기술
|
||
|
||
Unstructured
|
||
|
||
역할
|
||
텍스트 추출
|
||
표 추출
|
||
블록 segmentation
|
||
page coordinate 유지
|
||
출력 예시
|
||
|
||
{
|
||
"page": 12,
|
||
"elements": [
|
||
{
|
||
"text": "FIC-101",
|
||
"bbox": [120, 300, 160, 320]
|
||
}
|
||
]
|
||
}
|
||
|
||
👉 핵심: 좌표 반드시 유지
|
||
|
||
✔ 2️⃣ Spatial Element Extraction (핵심 단계)
|
||
|
||
여기서 P&ID가 살아난다.
|
||
|
||
해야 할 것
|
||
symbol detection
|
||
line detection
|
||
proximity mapping
|
||
결과
|
||
JSON
|
||
{
|
||
"FIC-101": { "x": 120, "y": 300 },
|
||
"FT-101": { "x": 110, "y": 220 },
|
||
"Valve-203": { "x": 300, "y": 310 }
|
||
}
|
||
|
||
|
||
|
||
✔ 3️⃣ Entity Extraction (LLM)
|
||
모델
|
||
|
||
Qwen (via vLLM)
|
||
|
||
입력
|
||
Extract all P&ID entities:
|
||
- controller
|
||
- sensor
|
||
- valve
|
||
- pump
|
||
출력
|
||
[
|
||
{"name":"FIC-101","type":"controller"},
|
||
{"name":"FT-101","type":"sensor"},
|
||
{"name":"Valve-203","type":"valve"}
|
||
]
|
||
|
||
|
||
|
||
✔ 4️⃣ Relationship Inference (가장 중요)
|
||
|
||
여기서 2개를 섞는다:
|
||
|
||
A. Rule Engine (필수)
|
||
if sensor near controller:
|
||
relation = "signal"
|
||
|
||
if controller connected to valve:
|
||
relation = "control"
|
||
|
||
if pump → tank:
|
||
relation = "flow"
|
||
|
||
|
||
B. LLM 보조 판단
|
||
Determine relationship based on P&ID context:
|
||
Entities + coordinates
|
||
최종 출력
|
||
[
|
||
{
|
||
"source": "FT-101",
|
||
"target": "FIC-101",
|
||
"relation": "signal",
|
||
"confidence": 0.93
|
||
},
|
||
{
|
||
"source": "FIC-101",
|
||
"target": "Valve-203",
|
||
"relation": "control",
|
||
"confidence": 0.91
|
||
}
|
||
]
|
||
✔ 5️⃣ Graph Builder
|
||
nodes = set()
|
||
edges = []
|
||
|
||
for r in relations:
|
||
nodes.add(r["source"])
|
||
nodes.add(r["target"])
|
||
edges.append(r)
|
||
Graph 구조
|
||
{
|
||
"nodes": [...],
|
||
"edges": [...]
|
||
}
|
||
✔ 6️⃣ DB Integration (너 기존 시스템)
|
||
|
||
여기서 너 강점:
|
||
|
||
OPC UA 있음 ✔
|
||
NL2SQL 있음 ✔
|
||
DB 있음 ✔
|
||
저장 전략
|
||
P&ID Graph DB
|
||
↓
|
||
Mapping Layer
|
||
↓
|
||
OPC Tags / SQL semantic layer
|
||
|
||
|
||
✔ 🔥 핵심 설계 포인트 (진짜 중요)
|
||
❗ 1. LLM은 “결정자”가 아니다
|
||
|
||
👉 “해석 보조” 역할
|
||
|
||
❗ 2. 좌표가 핵심이다
|
||
|
||
P&ID는 텍스트가 아니라:
|
||
|
||
공간 + 연결 구조
|
||
|
||
❗ 3. Rule Engine 없으면 실패한다
|
||
|
||
LLM 단독 = hallucination
|
||
|
||
|
||
✔ 📌 최종 아키텍처 (완성형)
|
||
P&ID PDF
|
||
↓
|
||
Unstructured Parser
|
||
↓
|
||
Spatial Engine
|
||
↓
|
||
Qwen (Entity Extraction)
|
||
↓
|
||
Rule Engine (relationship)
|
||
↓
|
||
Graph Builder
|
||
↓
|
||
DB + OPC Integration
|
||
✔ 🚀 이 구조의 의미
|
||
|
||
이건 단순 기능이 아니라:
|
||
|
||
👉 “Engineering Knowledge Graph 생성 엔진”
|
||
|
||
✔ 다음 단계 (진짜 실전)
|
||
|
||
원하면 여기서 바로 이어서:
|
||
|
||
1️⃣ P&ID 실제 PDF 기준 코드
|
||
2️⃣ Rule engine 상세 설계 (ISA 기반)
|
||
3️⃣ Qwen prompt 최적화 (산업용)
|
||
4️⃣ Graph DB vs SQL 구조 선택 |