실습: LLM으로 정비 보고서에서 엔티티 자동 추출
GraphRAG 통합
실습: LLM으로 정비 보고서에서 엔티티 자동 추출
온톨로지 & Knowledge Graph > GraphRAG 통합
- 정비 보고서 텍스트에서 설비·알람·부품·원인·조치를 구조화해 뽑는다
- Pydantic 스키마로 LLM 출력 형식을 고정한다
- 추출 결과를 이번 주 온톨로지에 있는 관계로만 적재한다
- 그래프에 없는 설비·알람을 만들지 않고 사람 검토 큐로 보낸다
실습: 정비 보고서 → Knowledge Graph 자동 적재
목표
자유 형식 정비 보고서를 LLM으로 구조화해서, Day 2에서 만든 그래프에 정비 이력을 붙입니다.
새 설비나 새 관계 타입을 만드는 실습이 아닙니다. 이미 있는 온톨로지에 이력을 얹는 실습입니다.
실습 환경
pip install pydantic neo4j langchain-openai langchain-core
export OPENAI_API_KEY="sk-..." # 없으면 규칙 기반 대체 추출기로 돌아갑니다
이 실습이 막아야 하는 두 가지 사고
1. 온톨로지에 없는 관계를 만드는 것
(e:Equipment)-[:HAD_FAULT]->(f:Fault) 처럼 편한 이름을 붙이면 적재는 성공합니다.
그런데 이번 주의 모든 조회 쿼리는
(e:Equipment)-[:HAS_COMPONENT]->()-[:HAS_PART]->(p:Part)-[:CAN_CAUSE]->(f:Fault)를 따라가므로,
그렇게 넣은 데이터는 한 건도 매칭되지 않습니다. 적재는 성공하고 조회는 0행입니다.
이 KG에서 "언제 무슨 고장이 났는가"는 MaintenanceRecord가 담습니다.
2. 없는 값을 대표값으로 묶는 것
알람 코드가 없다고 alarmCode: "UNKNOWN"으로 MERGE하면
사출기 온도 센서 이상과 컨베이어 모터 과부하가 같은 노드가 됩니다.
샘플 보고서 넷 중 둘이 알람 코드가 없으므로 바로 일어나는 일입니다.
중복보다 과병합이 고치기 어렵습니다. 없는 값은 만들지 말고 검토 큐로 보내세요.
진행 순서
- Pydantic 스키마로 추출 형식을 고정합니다.
- 설비·알람·조치·작업자를 그래프에서
MATCH합니다. 하나라도 없으면 검토 큐로 보냅니다. - 통과한 건만
MaintenanceRecord로 적재합니다. - 검토 큐에 무엇이 왜 남았는지 출력합니다.
합격 기준
- 샘플 넷 중 그래프에 이름이 있는 둘만 적재되고, 나머지 둘은 사유와 함께 검토 큐에 남는다
- 같은 보고서를 두 번 넣어도
MaintenanceRecord수가 늘지 않는다 - 적재 후
MATCH (r:MaintenanceRecord)-[:FOR_EQUIPMENT]->(e) RETURN e.name, r.date에 새 행이 보인다
confidence는 LLM이 스스로 매긴 값이라 보정되어 있지 않습니다.
그 값을 자동 적재의 통과 기준으로 쓰지 말고, 그래프에 실제로 붙었는지로 판정하세요.
힌트 보기
- • with_structured_output()으로 Pydantic 모델을 넘기면 LLM 출력 형식이 고정됩니다
- • 설비·알람·조치는 MERGE가 아니라 MATCH입니다. 없으면 만들지 말고 검토 큐로 보내세요
- • MaintenanceRecord의 id를 설비+날짜+알람코드로 만들면 같은 보고서를 두 번 넣어도 늘지 않습니다
- • 추출 정확도를 말하려면 보고서 20건에 정답을 손으로 달아 두고 비교해야 합니다. 자기보고 신뢰도는 근거가 되지 않습니다
- • 한국어 보고서는 영어보다 토큰이 더 들어가므로 비용을 함께 봅니다
정답 보기
엔티티 추출 품질은 프롬프트가 좌우합니다. 아래를 바꿔가며 추출 결과가 어떻게 달라지는지 실험해보세요.
당신은 정보 추출 엔진입니다. 아래 정비 보고서에서 (설비)-[관계]->(부품 또는 고장) 트리플만 JSON으로 추출해줘. 본문에 없는 내용은 추측하지 마. [보고서] (여기에 정비 보고서를 붙여넣으세요)