파이프라인 구조
graph LR
A["🧠 LLM 처리"] --> B["📊 인과 그래프"]
B --> C["🔍 검증"]
C --> D["⚙️ 룰베이스"]
style A fill:#7c3aed,stroke:#a78bfa,color:#fff
style B fill:#0891b2,stroke:#06b6d4,color:#fff
style C fill:#ea580c,stroke:#f97316,color:#fff
style D fill:#00A843,stroke:#00C853,color:#fff
LLM 처리
자연어 → Flow/Work/Call 구조 생성
창의적 설계 (비결정적)
인과 그래프
JSON 기반 벤더 중립 모델
검증/시뮬레이션 가능
검증
타입/흐름/리소스/Safety 검증
ISO/TS 15066 준수
룰베이스
IR → PLC 코드 변환
결정적 (동일 입력 = 동일 출력)
LLM vs 룰베이스 역할 분담
LLM의 역할 (창의적 부분)
- 자연어 요구사항 이해
- 공법 설계 (Flow/Work 구조)
- 적절한 세그먼트 조합 선택
- 파라미터 값 추론
→ 중간표현(인과 그래프)까지만 생성
룰베이스의 역할 (결정적 부분)
- 인과 그래프 → PLC 코드 변환
- 벤더별 문법/구조 적용
- 최적화 (Dead Code 제거, 병합)
- 프로젝트 파일 포맷 생성
→ 동일 그래프 = 동일 코드 (재현성 100%)
왜 이 방식이 더 나은가?
| 비교 항목 | LLM 직접 코드 생성 | 인과 그래프 + 룰베이스 |
|---|---|---|
| 재현성 | 같은 프롬프트 → 다른 코드 | 같은 그래프 → 동일 코드 |
| 검증 | 블랙박스, 검증 어려움 | 그래프 구조로 명시적 검증 |
| 안전성 | 규격 준수 미보장 | Safety Agent가 규칙 체크 |
| 멀티벤더 | 각 벤더별 LLM 학습 필요 | 하나의 그래프 → N개 벤더 |
| 유지보수 | 수정 시 LLM 재생성 | 그래프 수정 → 자동 재생성 |
실제 변환 예시
1. 자연어 입력
"컨베이어 시작,
센서 감지 대기,
실린더 전진,
클램프"
센서 감지 대기,
실린더 전진,
클램프"
↓ LLM
2. 인과 그래프 (IR)
{ "Flow": "Clamp",
"Works": [
"Conv", "Wait",
"CylFwd", "Clamp"]
}
"Works": [
"Conv", "Wait",
"CylFwd", "Clamp"]
}
↓ 검증
3. 검증 결과
✓ 타입 검증 통과
✓ 흐름 검증 통과
✓ 리소스 충돌 없음
✓ Safety 규칙 준수
✓ 흐름 검증 통과
✓ 리소스 충돌 없음
✓ Safety 규칙 준수
↓ 룰베이스
4. PLC 코드
CASE Step OF
0: Conv:=ON;
1: WAIT Sens;
2: Cyl:=ON;
3: Clamp:=ON;
END_CASE
0: Conv:=ON;
1: WAIT Sens;
2: Cyl:=ON;
3: Clamp:=ON;
END_CASE
핵심 인사이트
- LLM은 창의적 설계에 집중: 공법 구조를 만드는 데 LLM의 강점 활용
- 룰베이스는 정확한 변환에 집중: 결정적 코드 생성으로 재현성/안전성 확보
- 검증 레이어가 중간에 위치: LLM 출력을 검증한 후에만 코드 생성 진행
- 각 단계가 분리되어 디버깅 가능: 문제 발생 시 어느 단계인지 명확히 파악