report_problem
Problem: 수동 분석의 한계
error
현재 상태: 이상 감지(Detection) 후 근본원인분석(RCA)까지 사람이 직접 "딥 RCA 시작" 버튼을 눌러야 한다.
야간/주말에 발생한 이상은 다음 근무일까지 분석이 지연되고, 반복적인 이상에 대해 매번 동일한 분석을 수동으로 수행해야 한다.
Detection Cycle (60초 tick)
│
├── 규칙 평가 (threshold / delta / absence / llm)
├── 위반 시 → analyze_and_save()
├── anomalies 테이블 INSERT (status: "detected")
│
└── 🛑 여기서 끝 — RCA는 수동으로만 가능
│
└── 사용자가 UI에서 "딥 RCA 시작" 클릭해야 분석 시작
핵심 문제 3가지:
- 대응 지연 — 야간/주말 이상은 다음 근무일까지 미분석 상태로 방치
- 반복 수동 작업 — 동일 유형 이상에 대해 매번 같은 분석을 사람이 수행
- 지식 단절 — 이상 발생 시점의 데이터 컨텍스트가 시간이 지나면 소실
visibility
Vision: 이상 감지부터 분석까지 자동화
auto_fix_high
목표: 이상이 감지되면 규칙별로 지정된 RCA 전략에 따라 AI 에이전트가 자동으로 근본원인분석을 수행하고,
결과를 저장하여 엔지니어가 출근 시 이미 분석된 리포트를 확인할 수 있게 한다.
Detection Cycle (60초 tick)
│
├── 규칙 위반 감지
├── anomaly INSERT (rca_status: 'pending')
│
Auto RCA Scheduler (30초 간격 폴링)
│
├── pending anomaly 조회
├── 규칙별 RCA 설정 확인 (auto_rca? severity 조건?)
├── RCA 에이전트 실행 (ReAct + 지정 툴셋)
│ ├── rca_prompt 또는 카테고리 기본 템플릿
│ ├── rca_tools 또는 카테고리 기본 툴셋
│ └── 다중 라운드 분석 (최대 5회 도구 호출)
│
├── rca_analyses 테이블에 결과 저장
├── anomaly.rca_status = 'done'
└── (옵션) 텔레그램/워크플로우 알림
architecture
Architecture
기존 FLOPI 아키텍처에 Auto RCA Scheduler를 추가한다.
Detection 엔진과 완전히 분리된 별도 스케줄러로 동작하여, 감지 성능에 영향을 주지 않는다.
┌─────────────────────────────────────────────────────────────────┐
│ FLOPI v1.7.0 │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌────────────────┐ │
│ │ Detection │ │ RCA │ │ Workflow │ │ Tool Studio │ │
│ │ Engine │ │Studio │ │ Converter│ │ + AI Chat │ │
│ └────┬──────┘ └────┬─────┘ └────┬─────┘ └────────────────┘ │
│ │ │ │ │
│ │ anomaly │ scenario │ workflow │
│ │ INSERT │ nodes/edges │ graph_data │
│ │ │ │ │
│ ┌────┴──────────────┴──────────────┴───────────────────────┐ │
│ │ Database (Oracle/SQLite) │ │
│ │ anomalies │ rca_scenarios │ workflows │ tools ... │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Sample Data (FDC + SPC + Alarms) — 시뮬레이터/데모 환경 │
│ └──────────────────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Tool Registry (built-in + Tool Studio 도구) │ │
│ └──────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
설계 원칙
| 원칙 | 설명 | 이유 |
| Detection과 분리 |
별도 APScheduler 잡으로 동작 |
RCA의 LLM 호출이 Detection tick을 블로킹하지 않음 |
| DB 기반 큐 |
anomalies.rca_status 컬럼으로 상태 관리 |
서버 재시작해도 pending 작업 유실 없음 |
| 규칙별 RCA 설정 |
detection_rules에 rca 관련 필드 추가 |
이상 유형마다 다른 분석 전략 적용 |
| 카테고리 기본값 |
설정 없는 규칙은 카테고리 기본 템플릿 사용 |
모든 규칙에 개별 설정하는 번거로움 제거 |
| 동시성 제어 |
한 번에 최대 2개 RCA만 병렬 실행 |
LLM API 부하 관리 + 분석 품질 보장 |
psychology
RCA Studio — AI Analyst
check_circle
구현 완료 (v1.7.0): RCA Studio는 엔지니어와 AI 분석가의 대화형 분석으로
암묵지를 플로차트 노드/엣지로 구조화합니다. 직접 분석이 아니라 엔지니어의 지식을 끌어내는 가이드 역할입니다.
rca/
├── analyst.py Analyst 클래스 — 스트리밍 대화 + 구조 추출
├── structurer.py 응답 파싱 → 플로차트 노드/엣지 구조화
├── workflow_converter.py RCA → AI 워크플로우 LLM 변환
├── prompts.py 시스템 프롬프트 (ANALYST_SYSTEM, STRUCTURER_SYSTEM, ...)
├── models.py 데이터 모델
├── queries.py DB CRUD (시나리오 저장/조회)
└── sample_data/ FDC + SPC + Alarm 샘플 데이터
Analyst 클래스 — 대화형 분석
rca/analyst.py의 Analyst 클래스는 LLM과의 대화를 관리하며,
엔지니어가 설명하는 분석 과정을 실시간으로 플로차트 노드로 추출합니다.
class Analyst:
"""대화를 통해 엔지니어의 암묵지를 추출하는 AI 분석가."""
def _build_context(self, scenarios_context, tools_context, existing_nodes):
context = ANALYST_SYSTEM
if tools_context:
context += f"\n\n## 사용 가능한 도구\n{tools_context}"
if scenarios_context:
context += f"\n\n## 참고 시나리오\n{scenarios_context}"
if existing_nodes:
context += f"\n\n## 현재 추출된 노드\n{json.dumps(existing_nodes)}"
return context
async def analyze_stream(self, messages, existing_nodes, ...):
"""스트리밍 응답 — 토큰 단위로 yield."""
set_llm_module("deep_rca")
...
async def validate_graph(self, nodes, edges):
"""플로우차트 전체 검증 — 빠진 분기, 고립 노드, 불일치 탐지."""
대화 규칙 (ANALYST_SYSTEM 프롬프트)
| 원칙 | 설명 |
| 경청 → 질문 → 조언 |
엔지니어 설명 → 간단 요약 → 빠진 부분 1~2개 질문 → 필요 시 제안 |
| 동의 후 노드 생성 |
노드를 바로 만들지 않음. "추가해드릴까요?" → 동의 시 extracted_nodes에 반영 |
| 도구 활용 유도 |
Tool Studio 도구를 구체적으로 언급하며 질문. 노드의 data_sources에 도구명 연결 |
| 기존 시나리오 참조 |
축적된 시나리오와 관련 있으면 확인 질문. 차이가 있으면 knowledge_gaps에 기록 |
노드 타입 (RCA 플로차트)
| 타입 | 역할 | 예시 |
check |
데이터 확인 단계 |
"FDC 파라미터 확인", "SPC Cpk 값 조회" |
decision |
판단 분기점 |
"Cpk < 1.0?", "알람 발생 여부?" |
action |
조치 수행 |
"PM 요청", "공정 파라미터 보정" |
end |
분석 종료 |
"정상 확인", "설비 정지 필요" |
transform
RCA → Workflow Converter
rca/workflow_converter.py의 RCAWorkflowConverter 클래스는
RCA Studio에서 생성된 분석 시나리오(check/decision/action/end 노드)를
AI 워크플로우 빌더의 12종 노드로 LLM 기반 지능 변환합니다.
| RCA 노드 | 워크플로우 노드 | 매핑 로직 |
check |
data_query |
Tool Studio 도구로 데이터 조회. data_sources에서 도구 자동 매칭 |
decision |
condition |
조건 분기 (Python 식). threshold 정보를 조건식으로 변환 |
action (알림) |
notification |
알림 메시지 출력 |
action (외부 호출) |
http_request |
외부 시스템 API 호출 |
end |
end |
워크플로우 종료 |
class RCAWorkflowConverter:
"""LLM 기반 RCA → 워크플로우 변환기."""
async def convert(self, nodes, edges, tools,
trigger_type="manual", scenario_title="", process_type=""):
"""RCA 시나리오를 워크플로우로 변환."""
ConversionResult 구조
{
"graph_data": {"nodes": [...], "edges": [...]},
"warnings": [...],
"mapping_log": [...],
"suggested_name": "...",
"suggested_description": "..."
}
UI 진입점
- RCA Studio 플로차트 패널 → "워크플로우 변환" 버튼
- 시나리오 카드 → "워크플로우" 버튼
- 변환 프리뷰 확인 후 워크플로우 빌더에 생성
science
Sample Data (FDC / SPC / Alarm)
RCA Studio는 시뮬레이터/데모 환경에서 반도체 FAB 공정별 샘플 데이터를 제공합니다.
rca/sample_data/ 디렉토리에 3종의 데이터가 구현되어 있습니다.
| 항목 | 내용 |
| 데이터 구조 | 공정별 FDC 파라미터 (정상 스펙 + 실시간 센서값) |
| 이상 시나리오 | FDC 값 이탈 패턴 — get_fdc_anomaly_scenarios() |
| 조회 함수 | get_sample_fdc_data(process, equipment, scenario) |
| 활용 | Data Panel UI에서 FDC 현황 테이블 표시, RCA 분석 컨텍스트 |
| 항목 | 내용 |
| 데이터 구조 | Xbar-R Chart 데이터, Cpk, OOC 판정 (Western Electric Rules) |
| 이상 시나리오 | OOC 패턴 주입 — get_spc_ooc_scenarios() |
| 조회 함수 | get_sample_spc_data(item, scenario) |
| 활용 | Data Panel UI에서 SPC 현황 표시, 품질 이상 RCA 분석 |
| 항목 | 내용 |
| 데이터 구조 | 알람 코드 마스터 + 알람 이력 + 심각도 분류 |
| 분석 함수 | get_alarm_correlations(), get_alarm_summary() |
| 조회 함수 | get_sample_alarm_data(equipment, severity, time_range) |
| 활용 | 설비 알람 연관 분석, RCA 시 알람 이력 컨텍스트 제공 |
info
시뮬레이터 모드: --sqlite simulator.db로 실행하면 샘플 데이터가 자동 활성화됩니다.
운영(Oracle) 모드에서는 실제 MES/EAP 데이터가 사용됩니다.
link
Rule-RCA Mapping
핵심 아이디어: 규칙(Rule)마다 "이 이상이 발생하면 어떤 방식으로 RCA를 할 것인가"를 설정한다.
이를 통해 물류 이상에는 물류 전문 분석을, 설비 이상에는 설비 전문 분석을 자동으로 적용할 수 있다.
2계층 설정 구조
| 필드 | 타입 | 설명 | 기본값 |
auto_rca |
boolean |
자동 RCA 활성화 여부 |
false |
rca_severity |
string |
트리거 조건: critical / warning / all |
critical |
rca_prompt |
text |
RCA 에이전트에게 줄 분석 지시 프롬프트 |
null (카테고리 기본값) |
rca_tools |
JSON array |
RCA 시 사용할 도구 목록 |
null (카테고리 기본값) |
rca_max_rounds |
integer |
ReAct 최대 라운드 수 |
5 |
규칙에 rca_prompt/rca_tools가 null이면, 해당 규칙의 category에 따라
미리 정의된 기본 템플릿이 자동으로 적용된다.
규칙 위반 감지
│
├── auto_rca = true? ──NO──→ 수동 대기 (기존대로)
│ YES
│
├── severity >= rca_severity? ──NO──→ 수동 대기
│ YES
│
├── rca_prompt 있으면 → 규칙 전용 프롬프트 사용
│ 없으면 → 카테고리 기본 템플릿 사용
│
├── rca_tools 있으면 → 지정 도구만 등록
│ 없으면 → 카테고리 기본 도구셋
│
└── RCA 에이전트 실행
schedule
RCA Scheduler
Detection 엔진과 독립적으로 동작하는 별도 APScheduler 잡.
DB를 폴링하여 rca_status = 'pending'인 이상을 찾아 분석을 실행한다.
| 항목 | 값 | 비고 |
| 폴링 간격 |
30초 |
환경변수 RCA_POLL_SEC로 조절 가능 |
| 동시 실행 제한 |
최대 2개 |
asyncio.Semaphore(2) |
| 타임아웃 |
분석당 120초 |
초과 시 rca_status = 'failed' |
| 재시도 |
최대 2회 |
LLM 오류 시 자동 재시도 |
| 쿨다운 |
같은 rule_id 5분 이내 중복 방지 |
반복 감지 시 RCA 폭주 방지 |
스케줄러 의사코드
async def poll_and_analyze():
"""30초마다 실행되는 Auto RCA 폴링 잡"""
anomalies = await queries.get_pending_rca_anomalies(limit=5)
for anomaly in anomalies:
rule = await queries.get_rule(anomaly["rule_id"])
if not rule["auto_rca"]:
continue
if not _severity_matches(anomaly, rule):
continue
if _in_cooldown(rule["rule_id"]):
continue
await sem.acquire()
asyncio.create_task(_run_rca(anomaly, rule, sem))
async def _run_rca(anomaly, rule, sem):
try:
await queries.update_rca_status(anomaly["anomaly_id"], "running")
prompt = rule["rca_prompt"] or CATEGORY_DEFAULTS[rule["category"]]["prompt"]
tools = rule["rca_tools"] or CATEGORY_DEFAULTS[rule["category"]]["tools"]
result = await run_rca_agent(anomaly, prompt, tools,
max_rounds=rule.get("rca_max_rounds", 5))
await queries.insert_rca_analysis(anomaly["anomaly_id"], result)
await queries.update_rca_status(anomaly["anomaly_id"], "done")
except Exception:
await queries.update_rca_status(anomaly["anomaly_id"], "failed")
finally:
sem.release()
smart_toy
RCA Agent
기존 Detection Agent(detection/agents.py)의 ReAct 루프를 재활용하되,
RCA 전용 시스템 프롬프트와 규칙별 도구셋으로 동작한다.
{
"root_cause": "컨베이어 C3 → EQ-PHO-02 구간 캐리어 적체",
"confidence": 0.85,
"severity": "critical",
"evidence": [
"C3 부하율 97% (정상 대비 +42%)",
"EQ-PHO-02 DOWN 상태 40분 지속",
"상류 큐 대기 12건 (평균 3건)"
],
"affected_scope": "LINE-B / PHOTO 공정",
"recommendation": [
"EQ-PHO-02 즉시 PM 점검",
"C3 → C4 우회 반송 경로 활성화",
"WIP 유입 속도 일시 조절 (30% 감속)"
],
"tool_calls_used": [
"get_conveyor_load",
"get_equipment_status",
"get_queue_length"
]
}
storage
DB Schema Changes
1. detection_rules 테이블 (ALTER)
ALTER TABLE detection_rules ADD (
auto_rca NUMBER(1) DEFAULT 0,
rca_severity VARCHAR2(20) DEFAULT 'critical',
rca_prompt CLOB,
rca_tools CLOB,
rca_max_rounds NUMBER DEFAULT 5
);
2. anomalies 테이블 (ALTER)
ALTER TABLE anomalies ADD (
rca_status VARCHAR2(20) DEFAULT 'none',
rca_started_at TIMESTAMP,
rca_completed_at TIMESTAMP
);
3. rca_analyses 테이블 (기존 — 활성화)
CREATE TABLE rca_analyses (
rca_id NUMBER PRIMARY KEY,
anomaly_id NUMBER REFERENCES anomalies,
root_cause CLOB,
confidence NUMBER(3,2),
evidence CLOB,
recommendation CLOB,
affected_scope VARCHAR2(200),
tool_calls_used CLOB,
duration_ms NUMBER,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
description
Rule YAML Spec
rules.yaml에 Auto RCA 필드를 추가한 전체 예시.
기존 필드는 그대로 유지하고, RCA 관련 필드만 하단에 추가된다.
rules:
- name: 컨베이어 부하율 과부하
category: logistics
check_type: threshold
source_type: tool
tool: get_conveyor_load
tool_column: load_pct
threshold_op: '>'
warning_value: 85
critical_value: 95
eval_interval: 300
llm_enabled: true
llm_prompt: >
컨베이어 부하율이 높습니다.
해당 존의 반송 이력과 병목 여부를 확인하세요.
auto_rca: true
rca_severity: critical
rca_prompt: |
컨베이어 부하율 과부하의 근본 원인을 분석하세요.
1. 해당 존의 반송 이력 확인 (최근 1시간)
2. 상류/하류 설비 상태 확인 (DOWN/PM 여부)
3. WIP 적체 여부 확인 (큐 대기 길이)
4. AGV/OHT 가동률 확인
rca_tools:
- get_conveyor_load
- get_bottleneck_zones
- get_equipment_status
- get_queue_length
- get_agv_utilization
rca_max_rounds: 5
- name: 설비 비계획정지 빈발
category: equipment
check_type: threshold
source_type: tool
tool: get_unscheduled_downs
tool_column: _count
threshold_op: '>'
warning_value: 3
critical_value: 5
eval_interval: 600
llm_enabled: true
auto_rca: true
rca_severity: all
- name: WIP 흐름 불균형
category: wip
check_type: delta
source_type: tool
tool: get_flow_balance
tool_column: net_wip
warning_value: 30
eval_interval: 300
llm_enabled: false
category
Category Defaults
규칙에 rca_prompt/rca_tools가 없으면, 카테고리별 기본 템플릿이 자동 적용된다.
| 항목 | 기본값 |
| 기본 프롬프트 |
물류 이상의 근본 원인을 분석하세요. 반송 처리량, 병목 존, AGV 가동률, 컨베이어 부하를 종합 확인하세요. |
| 기본 도구 |
get_conveyor_load,
get_transfer_throughput,
get_bottleneck_zones,
get_agv_utilization,
get_queue_length
|
| 항목 | 기본값 |
| 기본 프롬프트 |
설비 이상의 근본 원인을 분석하세요. 설비 상태, 알람 이력, PM 일정, 비계획정지 기록을 종합 확인하세요. |
| 기본 도구 |
get_equipment_status,
get_equipment_utilization,
get_unscheduled_downs,
get_pm_schedule,
get_equipment_alarms
|
| 항목 | 기본값 |
| 기본 프롬프트 |
WIP 이상의 근본 원인을 분석하세요. WIP 추이, 유입/유출 밸런스, 큐 대기 상황, 에이징 LOT을 종합 확인하세요. |
| 기본 도구 |
get_wip_levels,
get_wip_trend,
get_flow_balance,
get_queue_length,
get_aging_lots
|
dashboard
UI Changes
1. 규칙 관리 페이지 — "자동 RCA" 탭 추가
기존 2탭(조건감시 / AI판단) 구조에 3번째 탭 "자동 RCA"를 추가한다.
2. 이상 목록 페이지 — RCA 상태 표시
이상 목록 테이블에 RCA 상태 뱃지를 추가한다.
| 상태 | 뱃지 | 설명 |
none | 미설정 | Auto RCA 비활성 규칙 |
pending | 대기중 | 분석 대기열에 있음 |
running | 분석중 | RCA 에이전트 실행 중 |
done | 완료 | 분석 완료 → 클릭 시 결과 보기 |
failed | 실패 | 분석 실패 → 수동 RCA 유도 |
3. 이상 상세 다이얼로그 — RCA 결과 섹션
Auto RCA 완료 시, 이상 상세 다이얼로그에 "AI 자동 분석 결과" 카드가 추가된다.
근본 원인 + 근거 + 조치 제안 + 사용된 도구 + 소요 시간 표시.
api
API Endpoints
| Method | Endpoint | 설명 |
GET |
/api/anomalies/{id}/rca |
Auto RCA 결과 조회 |
POST |
/api/anomalies/{id}/rca/retry |
실패한 RCA 재시도 |
GET |
/api/rca/stats |
Auto RCA 통계 (성공률, 평균 소요시간) |
GET |
/api/rca/queue |
현재 RCA 대기열 조회 |
POST |
/api/system/settings |
RCA 스케줄러 설정 변경 (폴링 간격, 동시 실행 수) |
timeline
Implementation Phases
Phase 1 — Foundation
DB 스키마 + 규칙 설정 + 스케줄러 뼈대
detection_rules ALTER — auto_rca 관련 5개 컬럼 추가
anomalies ALTER — rca_status, rca_started_at, rca_completed_at 추가
rca_analyses 테이블 활성화 (기존 스키마 활용)
rules.yaml 로더에 새 필드 매핑 추가
detection/auto_rca.py — 폴링 스케줄러 구현
main.py lifespan에 Auto RCA 스케줄러 등록
Phase 2 — Agent & UI
RCA 에이전트 + UI 통합
- RCA 전용 시스템 프롬프트 + 카테고리 기본 템플릿 구현
- 규칙 편집 UI — "자동 RCA" 3번째 탭 추가
- 이상 목록 — RCA 상태 뱃지 표시
- 이상 상세 — RCA 결과 카드 표시
- API 엔드포인트 구현 (결과 조회, 재시도, 통계)
Phase 3 — Extension
알림 연동 + 워크플로우 트리거 + 대시보드 KPI
- RCA 완료 시 텔레그램/이메일 알림 (선택적)
- 워크플로우 이벤트 트리거 — "RCA 완료" 이벤트로 후속 워크플로우 자동 실행
- 대시보드 KPI에 "Auto RCA 성공률", "평균 분석 시간" 추가
- RCA 결과 기반 Knowledge Base 자동 등록 (학습 루프)
shield
Risks & Mitigations
| 리스크 | 영향 | 완화 전략 |
| LLM API 비용 폭증 |
높음 |
동시 실행 제한 (2개) + 쿨다운 (같은 규칙 5분) + rca_severity로 트리거 범위 제한.
월간 RCA 호출 상한 설정 (시스템 설정).
|
| Detection 성능 저하 |
높음 |
RCA는 별도 스케줄러로 완전 분리. Detection tick과 LLM 호출을 공유하지 않음.
|
| RCA 품질 불균일 |
중간 |
카테고리별 기본 프롬프트를 FAB 전문가와 함께 튜닝.
RCA 결과에 confidence 점수 포함 → 저신뢰 결과 플래깅.
|
| 반복 이상에 의한 RCA 폭주 |
중간 |
같은 rule_id 5분 쿨다운 + anomaly occurrence_count 증가 시 RCA 스킵 옵션.
|
| 서버 재시작 시 진행 중 분석 유실 |
낮음 |
DB 기반 상태 관리 — 'running' 상태로 남은 건은 재시작 시 'pending'으로 리셋하여 재분석.
|
check_circle
현재 상태 (v1.7.0): RCA Studio(AI Analyst + 플로차트 + 워크플로우 변환)와
FDC/SPC/Alarm 샘플 데이터는 구현 완료되었습니다.
Auto RCA Scheduler(이상 감지 → 자동 RCA 실행)는 설계 단계이며 Phase별 구현이 진행됩니다.