23

실습: LLM으로 정비 보고서에서 엔티티 자동 추출

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하면 사출기 온도 센서 이상과 컨베이어 모터 과부하가 같은 노드가 됩니다. 샘플 보고서 넷 중 둘이 알람 코드가 없으므로 바로 일어나는 일입니다. 중복보다 과병합이 고치기 어렵습니다. 없는 값은 만들지 말고 검토 큐로 보내세요.

진행 순서

  1. Pydantic 스키마로 추출 형식을 고정합니다.
  2. 설비·알람·조치·작업자를 그래프에서 MATCH합니다. 하나라도 없으면 검토 큐로 보냅니다.
  3. 통과한 건만 MaintenanceRecord로 적재합니다.
  4. 검토 큐에 무엇이 왜 남았는지 출력합니다.

합격 기준

  • 샘플 넷 중 그래프에 이름이 있는 둘만 적재되고, 나머지 둘은 사유와 함께 검토 큐에 남는다
  • 같은 보고서를 두 번 넣어도 MaintenanceRecord 수가 늘지 않는다
  • 적재 후 MATCH (r:MaintenanceRecord)-[:FOR_EQUIPMENT]->(e) RETURN e.name, r.date 에 새 행이 보인다

confidence는 LLM이 스스로 매긴 값이라 보정되어 있지 않습니다. 그 값을 자동 적재의 통과 기준으로 쓰지 말고, 그래프에 실제로 붙었는지로 판정하세요.

에디터 로딩 중...
힌트 보기
  • with_structured_output()으로 Pydantic 모델을 넘기면 LLM 출력 형식이 고정됩니다
  • 설비·알람·조치는 MERGE가 아니라 MATCH입니다. 없으면 만들지 말고 검토 큐로 보내세요
  • MaintenanceRecord의 id를 설비+날짜+알람코드로 만들면 같은 보고서를 두 번 넣어도 늘지 않습니다
  • 추출 정확도를 말하려면 보고서 20건에 정답을 손으로 달아 두고 비교해야 합니다. 자기보고 신뢰도는 근거가 되지 않습니다
  • 한국어 보고서는 영어보다 토큰이 더 들어가므로 비용을 함께 봅니다
정답 보기
에디터 로딩 중...
AI로 학습하기 — 꿀팁
추출 프롬프트를 직접 튜닝하기AI 학습 팁

엔티티 추출 품질은 프롬프트가 좌우합니다. 아래를 바꿔가며 추출 결과가 어떻게 달라지는지 실험해보세요.

당신은 정보 추출 엔진입니다. 아래 정비 보고서에서 (설비)-[관계]->(부품 또는 고장) 트리플만 JSON으로 추출해줘. 본문에 없는 내용은 추측하지 마.

[보고서] (여기에 정비 보고서를 붙여넣으세요)
이 팁이 도움이 됐나요?
실습 — 직접 해보기
LLM Graph Builder
텍스트에서 엔티티와 관계를 뽑는 흐름을 그대로 따라가 볼 수 있습니다. 다만 기본값인 Mock 모드가 만드는 관계는 전부 `RELATED_TO` 하나입니다 — 한 문장에 함께 나온 것을 이었을 뿐이라 관계의 뜻이 없습니다. 지금 짜는 추출 프롬프트가 관계 타입을 왜 갈라야 하는지 거꾸로 확인하는 자리로 쓰세요.
용어