하이퍼이지
경력근거: 온톨로지 데이터 통합 기술 기반 B2B AX 기술 파트너
하이퍼이지는 온톨로지 데이터 통합 기술 기반 B2B AX 기술 파트너로 포스코DX·LG화학 같은 제조 현장에 들어가는데, 통합의 첫 관문은 담당자가 손으로 채워 보내온 대장 엑셀과 스캔 PDF를 다시 물어보지 않아도 되게 맞춰 놓는 일입니다. 이 도구가 보여주는 것은 비정형 문서 파싱과 규칙 기반 결함 판정 기술이며, 설비 보전과 플랜트 운영 도메인 전문성은 주장하지 않습니다.
'고객 현장의 데이터, 프로세스를 깊이 있게 이해하고 실제 문제 진단'이 첫 업무로 적혀 있습니다. 받은 파일에서 결함을 짚어내는 일이 곧 그 진단입니다.
'온톨로지 데이터 통합 기술 기반 B2B AX 기술 파트너'입니다. 통합에 앞서 원자료를 같은 모양으로 맞추는 일이 이 도구의 몫입니다.
포스코DX 공식 기술 협력사이고 LG화학과도 일하며 '제조·플랜트 현장의 디지털트윈'을 구축합니다. 현장에서 받는 자료가 설비 대장과 작업지시서입니다.
고객사 설비관리 담당자에게서 받은 점검 대장 엑셀과 작업지시 PDF를 규칙으로 정규화하고, 빈 값과 서로 어긋난 값을 찾아 확인 질문서로 내는 1주 FDE PoC 입니다.
제조 고객사 현장에 파견된 하이퍼이지 FDE 입니다. 설비관리팀이 ERP에서 내려받아 보내준 엑셀과 스캔 PDF를 매번 손으로 맞춰 보느라, 무엇을 다시 물어봐야 하는지 추리는 데만 이틀을 쓰고 있습니다.
점검 대장 엑셀과 작업지시 PDF를 규칙으로 정규화하면, (a) 빈 값과 두 자료가 어긋난 항목을 사람 손 없이 전부 찾아내고 (b) 결함 한 건을 담당자가 그대로 답할 수 있는 질문 한 줄로 바꿀 수 있습니다.
엑셀과 PDF를 한 장의 표로 정규화하고 결함마다 확인 질문을 붙인 마크다운 문서를 내는 CLI입니다.
직접 만든 정답 라벨과 대조해 결함 검출 일치도를 재고 오탐 규칙을 보정한 리포트입니다.
컬럼 매핑표와 규칙 파일만 바꿔 다른 양식의 대장에 그대로 도는지 확인한 이식 기록입니다.
FDE 가 엑셀과 PDF를 한 줄 명령으로 넣으면 정규화된 표 한 장과 확인 질문서 마크다운이 나옵니다
일부러 섞은 병합셀·소계 행·표기 흔들림·스캔 오인식 30종을 넣어도 도구가 멈추지 않고 결함으로 분류해 냅니다
직접 만든 정답 라벨 대비 결함 검출 일치도 90% 이상입니다
측정: 규칙 판정과 수기 라벨 비교, 표본: 행 400건, 2주차
진짜 성능 검증은 여기서 멈춥니다. 위 수치는 제가 만든 더미 대장을 제가 채점한 결과이고, 실제 검출 정확도는 하이퍼이지 고객사의 실제 대장과 설비관리 담당자의 회신이 있어야 측정됩니다. 이 포트폴리오는 그 확인을 바로 돌릴 수 있는 상태로 만듭니다.
이 포트폴리오가 보여주는 것은 비정형 엑셀·PDF 파싱과 규칙 기반 결함 판정, 그리고 LLM을 보조로만 쓰는 설계입니다. 설비 보전과 플랜트 운영 도메인 전문성은 주장하지 않습니다. 모르는 깊이는 면접에서 모른다고 말하는 편이 낫습니다.
고객사도 실데이터도 없이 혼자 만든 포트폴리오라 모든 수치는 합성 대장을 제가 채점한 결과입니다. 면접에서는 '도구는 돌고 실검증은 대기 중'이라고 그대로 말하는 편이 신뢰를 얻습니다.
정답 라벨을 제가 만들었으니 잘 맞는 것이 당연합니다. 병합셀·소계 행·표기 흔들림·스캔 오인식을 더미에 일부러 섞어 쉬운 문제만 푸는 것이 아님을 보입니다.
LLM이 결함을 판정하지 않습니다. 판정은 전부 규칙이 내리고 LLM은 비고 칸 추출과 질문 문안 다듬기만 맡아, 환각이 결함 목록을 통과하지 못하게 막습니다.
실제 도입 시 달라지는 것: 고객사마다 대장 양식과 측정값 허용 범위가 달라 컬럼 매핑표와 규칙 파일을 현장에서 다시 맞춰야 합니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
고객사 설비관리팀이 ERP에서 내려받아 보내준 월간 점검 대장 엑셀의 원본 행입니다
| row_id | sheet | equip_no_raw | equip_name_raw | check_date_raw | vibration_raw | temp_raw | inspector_raw | note_free | is_subtotal_row |
|---|---|---|---|---|---|---|---|---|---|
| R001 | 1공장_7월 | P-101 | 1호 급수펌프 | 2026-07-03 | 2.1 | 48 | 김현수 | — | false |
| R002 | 1공장_7월 | — | — | 26.7.10 | 2.4 | 49 | 김현수 | — | false |
| R003 | 1공장_7월 | P-102 | 2호 급수펌프 | 2026/07/03 | 3.8 | 51 | 이수민 | 베어링 소음 있음, 다음주 재점검 요청 | false |
| R004 | 1공장_7월 | — | 소계 | — | 8.3 | — | — | — | true |
| R005 | 1공장_7월 | 설비번호 | 설비명 | 점검일 | 진동(mm/s) | 온도(℃) | 점검자 | — | false |
{"type":"object","properties":{"row_id":{"type":"string"},"sheet":{"type":"string"},"equip_no_raw":{"type":["string","null"]},"equip_name_raw":{"type":["string","null"]},"check_date_raw":{"type":["string","null"]},"vibration_raw":{"type":["string","null"]},"temp_raw":{"type":["string","null"]},"inspector_raw":{"type":["string","null"]},"note_free":{"type":["string","null"]},"is_subtotal_row":{"type":"boolean"}},"required":["row_id","sheet","equip_no_raw","equip_name_raw","check_date_raw","vibration_raw","temp_raw","inspector_raw","note_free","is_subtotal_row"]}. 쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라: 병합셀 때문에 equip_no_raw·equip_name_raw 가 null 인 이어지는 행, 시트 중간에 다시 나오는 머리글 행, is_subtotal_row true 인 소계 행, 날짜 표기 흔들림(2026-07-03 · 2026/07/03 · 26.7.3 · 7월 3일)과 존재하지 않는 날짜, 숫자 칸에 들어간 'N/A'·'-'·단위 문자, 같은 설비의 표기 흔들림(뒤 공백·컴프레서/컴프레샤), inspector_raw 공백. 형식을 깨뜨리는 행 3건도 별도로 넣어라.{"type":"object","properties":{"row_id":{"type":"string"},"sheet":{"type":"string"},"equip_no_raw":{"type":["string","null"]},"equip_name_raw":{"type":["string","null"]},"check_date_raw":{"type":["string","null"]},"vibration_raw":{"type":["string","null"]},"temp_raw":{"type":["string","null"]},"inspector_raw":{"type":["string","null"]},"note_free":{"type":["string","null"]},"is_subtotal_row":{"type":"boolean"}},"required":["row_id","sheet","equip_no_raw","equip_name_raw","check_date_raw","vibration_raw","temp_raw","inspector_raw","note_free","is_subtotal_row"]}같은 기간의 작업지시서 스캔 PDF에서 뽑아낸 행이며 점검 대장과 대조할 상대 자료입니다
| wo_id | page | equip_no_raw | work_date_raw | action_text | part_replaced | signed_by | ocr_confidence |
|---|---|---|---|---|---|---|---|
| W001 | 1 | P-102 | 2026-07-05 | 베어링 교체 | 6205ZZ | 이수민 | 0.97 |
| W002 | 1 | P-1O2 | 2026-07-05 | 커플링 정렬 | — | 이수민 | 0.61 |
| W003 | 2 | — | 2026-07-11 | 급수펌프 임펠러 점검 | — | 김현수 | 0.88 |
| W004 | 2 | C-201 | 2026-07-04 | 진동 게이지 교체 | PG-100 | — | 0.93 |
| W005 | 3 | V-311 | 2026-07-20 | 밸브 시트 교체 | VS-31 | 박지훈 | 0.95 |
{"type":"object","properties":{"wo_id":{"type":"string"},"page":{"type":"number"},"equip_no_raw":{"type":["string","null"]},"work_date_raw":{"type":["string","null"]},"action_text":{"type":"string"},"part_replaced":{"type":["string","null"]},"signed_by":{"type":["string","null"]},"ocr_confidence":{"type":"number"}},"required":["wo_id","page","equip_no_raw","work_date_raw","action_text","part_replaced","signed_by","ocr_confidence"]}. 쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라: 숫자 0과 알파벳 O를 뒤바꾼 스캔 오인식과 ocr_confidence 0.7 미만, equip_no_raw 가 비어 설비를 특정할 수 없는 행, 점검 대장에 없는 설비번호, work_date_raw 가 점검 기간을 벗어나거나 존재하지 않는 날짜, signed_by 공백, 같은 설비에 하루 두 건이 겹치는 작업. 형식을 깨뜨리는 행 3건도 별도로 넣어라.{"type":"object","properties":{"wo_id":{"type":"string"},"page":{"type":"number"},"equip_no_raw":{"type":["string","null"]},"work_date_raw":{"type":["string","null"]},"action_text":{"type":"string"},"part_replaced":{"type":["string","null"]},"signed_by":{"type":["string","null"]},"ocr_confidence":{"type":"number"}},"required":["wo_id","page","equip_no_raw","work_date_raw","action_text","part_replaced","signed_by","ocr_confidence"]}| Python | 엑셀·PDF 파싱과 정규화 규칙 엔진, 결함 판정을 전부 맡습니다 |
| LLM | 사람이 자유롭게 적은 비고 칸에서 설비명과 조치 내용을 뽑고 확인 질문 문안을 다듬습니다 |
| RAG | 고객사 설비 명칭 사전에서 표기가 흔들린 항목의 후보를 찾아 질문에 붙입니다 |
| Agentic Workflow | 파싱·정규화·결함 판정·질문 생성 단계를 차례로 돌리고 실패한 단계만 다시 실행합니다 |
✓ pass → 그대로 멈춰도 완성품입니다. 더 키우려면 2주차(결함 규칙 정밀화)로 갑니다.
✓ pass → 여기서 멈춰도 완결입니다. 더 키우려면 3주차(다른 고객사 양식 적용)로 갑니다.
결함 한 건과 담당자에게 그대로 보낼 확인 질문 한 줄입니다
{"type":"object","properties":{"q_no":{"type":"number"},"severity":{"type":"string","enum":["must","should"]},"rule_id":{"type":"string"},"source_ref":{"type":"string"},"finding":{"type":"string"},"question":{"type":"string"},"ask_to":{"type":"string"}},"required":["q_no","severity","rule_id","source_ref","finding","question","ask_to"]}[
{
"q_no": 1,
"severity": "must",
"rule_id": "R-CROSS-01",
"source_ref": "작업지시 p3 W006 / 1공장_7월 대장 전체",
"finding": "작업지시 W006의 설비번호 X-999가 7월 점검 대장에 없습니다",
"question": "X-999는 7월에 새로 이설된 설비인가요, 아니면 대장 등록이 빠진 것인가요?",
"ask_to": "설비관리팀"
},
{
"q_no": 2,
"severity": "should",
"rule_id": "R-DATE-03",
"source_ref": "1공장_7월!C10",
"finding": "점검일 2026-06-31은 달력에 없는 날짜입니다",
"question": "V-310 점검일이 6월 30일과 7월 1일 중 어느 쪽인지 알려주실 수 있을까요?",
"ask_to": "점검자 박지훈"
},
{
"q_no": 3,
"severity": "must",
"rule_id": "R-NULL-02",
"source_ref": "1공장_7월!H8",
"finding": "C-201의 7월 3일 점검 행에 점검자 칸이 비어 있습니다",
"question": "이 점검을 수행한 담당자가 누구인지 확인해 주실 수 있을까요?",
"ask_to": "설비관리팀"
}
]rule_id·source_ref·finding·severity 는 규칙 엔진이 결정론으로 채우므로 원문 셀과 대조해 자동 검증되고, question 문장이 담당자에게 그대로 보낼 만한지만 사람이 봅니다.