마키나락스
경력근거: LLM 실적용 성공 사례를 지속적으로 늘려나가고 전체 수행 과정 효율을 개선할 수 있는 체계를 함께 고민하여 반영합니다.
마키나락스 창원 AI Engineering Team 의 이 자리는 제조 현장의 요구사항을 실행 가능한 AI/ML 문제로 구체화하고, 제안부터 검증까지 SI 전 과정에서 일정·범위·기술 리스크를 관리하는 리드 역할입니다. 고객사에서 받은 Historian·MES 추출본을 규칙으로 판정해 착수를 막는 결함과 그 일정 영향을 킥오프 전에 질문으로 내는 이 도구는 그 첫 단추(무엇이 되고 무엇이 안 되는지 데이터로 가르기)를 정면으로 보여주고, 규칙팩 분리는 반복 문제를 재사용 자산으로 만드는 방식과 같습니다. 다만 이 포트폴리오가 보여주는 것은 지저분한 추출본을 규칙으로 판정해 질문으로 바꾸는 데이터 엔지니어링 기술이며, 제조 공정 도메인(FDC·설비 물리) 전문성과 10년 경력의 조직 구축·리더십은 주장하지 않습니다. 결함을 등급과 일정 영향까지 이어 붙이는 사슬은 단순 데이터 검수 맥락으로는 그대로 만들 수 없습니다.
제조 현장의 비즈니스 문제와 고객 요구사항을 실행 가능한 AI/ML 문제로 바꾸는 일이 첫 업무입니다. 받은 데이터로 무엇이 되고 무엇이 안 되는지 가르는 착수 점검 도구가 그 앞단에 놓입니다.
제안부터 설계·검증·배포까지 SI 전 과정을 리딩하며 일정·범위·품질·기술 리스크를 함께 관리합니다. 데이터 결함을 착수 전에 등급과 일정 영향으로 드러내는 질문지가 그 리스크 관리와 맞닿습니다.
MES·ERP·Historian·설비 데이터베이스 연계 경험을 우대하고, 반복되는 문제와 해결 방식을 재사용 가능한 자산으로 만드는 일을 주요 업무로 둡니다. 규칙팩으로 고객사를 갈아끼우는 이 도구가 그 자산화 방식과 같습니다.
고객사에서 받은 Historian 태그 추출 CSV 와 MES 설비·정비 이력 엑셀을 읽어, 규칙 여덟 종(태그와 설비코드 미매칭·고장 라벨 부족·수집 공백·시각 중복과 역행·단위 혼재·상수 태그·관측 기간 부족·타임존 누락)으로 AI 과제 착수를 막는 결함을 blocker·limit·note 로 가릅니다. 결함마다 근거 수치와 담당자에게 물어볼 질문 한 개, 답을 못 받았을 때 생기는 일정 영향을 붙여 킥오프 확인 질문지 마크다운 파일 하나로 씁니다. 판정과 수치는 규칙이 정하고 LLM 은 질문 문장을 담당자가 읽을 말로 다듬는 일만 맡습니다. 결과는 터미널 요약과 파일이며 화면은 만들지 않습니다.
이 도구를 돌리는 사람은 마키나락스 창원 팀에서 고객사에 나가 있는 파견 엔지니어 본인이고, 질문지를 받아 답하는 사람은 고객사의 설비 데이터 담당자입니다. 킥오프 전날 밤 고객사가 보내온 CSV 열두 개와 엑셀 한 개를 하나씩 열어 결측과 태그 이름을 눈으로 세다가, 정작 회의에서 무엇을 물어야 하는지 정리하지 못한 채 들어가던 사람입니다.
고객사 추출본 두 종을 한 입력 규격으로 읽으면, (a) 착수를 막는 결함을 규칙으로 등급별로 가르고, (b) 결함마다 근거 수치를 인용한 확인 질문 한 개와 미회신 시 일정 영향을 붙이며, (c) 회신을 다시 넣어 남은 결함만 재계산합니다.
Historian CSV 와 MES 엑셀을 넣으면 명령 한 번으로 결함을 등급별로 가르고 kickoff_questions.md 를 써 주는 동작하는 CLI입니다. 데이터는 고객사 추출본을 가정한 더미로 시작합니다.
고객사가 질문지에 적어 보낸 답을 answers.yml 로 다시 넣으면 해소된 결함과 남은 결함을 다시 계산해 2차 질문지를 내고, 태그와 설비코드를 문자열 유사도로 짝지어 사람이 고를 후보를 제시하는 왕복 실행기입니다.
규칙 임계값과 질문 문구를 고객사별 규칙팩 YAML 로 분리해 두 번째 고객사 세트에 그대로 돌리고, 인터넷이 막힌 현장에 반입할 오프라인 Docker 이미지 하나로 묶어 실행 이력을 MLflow 에 남깁니다.
태그 CSV 12개(약 8만 행)와 설비 정비 이력 엑셀 1개를 넣으면 명령 한 번에 확인 질문지 파일이 나오는 걸 시연합니다
일부러 망가뜨린 입력 30종(빈 시트·머리글 없는 CSV·숫자로 저장된 날짜·인코딩 깨진 태그명)을 넣어도 도구가 죽지 않고 결함 항목으로 떨어집니다
2주차에 더미에 심은 결함 45건 중 42건(약 93%)을 규칙이 잡고, 결함이 아닌데 잡은 오탐이 4건입니다. 다만 결함도 정답도 작성자가 심은 합성 기준이라 '성능 검증'이 아니라 '데모 조건에서의 동작'입니다
진짜 검증은 여기서 멈춥니다. 위 수치는 전부 작성자가 만든 더미데이터 자가채점이며, 실제 검출률은 마키나락스가 고객사에서 받는 실제 추출본과 담당자 회신이 있어야 측정됩니다. 이 도구는 그 검증을 첫 킥오프에서 바로 돌릴 수 있는 상태로 만듭니다
수치는 합성 데이터 자가채점이라 성능 증명이 아닙니다. 면접에서는 데모 동작과 실검증 준비 상태로 솔직히 설명합니다
이 포트폴리오가 보여주는 것은 지저분한 현장 추출본을 규칙으로 판정해 사람이 답할 질문으로 바꾸는 데이터 엔지니어링 기술이며, 제조 공정 도메인 전문성(FDC·설비 물리·공정 지식)과 10년 경력의 조직 구축·SI 리딩은 주장하지 않습니다. 제조는 테마로만 닿게 했고, 모르는 깊이는 면접에서 모른다고 말하는 편이 낫습니다
정답을 작성자가 심었으니 잘 맞는 게 당연합니다. 중복 시각·역행 시각·단위 혼재·소계 행·숫자로 저장된 날짜 같은 실제 추출본의 지저분함을 더미에 일부러 섞어, 쉬운 결함만 잡는 게 아님을 보여줍니다
이 도구는 데이터가 쓸 만한지 판정할 뿐 모델을 만들지 않습니다. 착수 가능 판정이 과제 성공을 뜻하지 않고, 질문지는 결정문이 아니라 담당자 확인을 받는 초안이며 최종 판단은 사람이 합니다
규칙 임계값(결측 허용률·최소 고장 라벨 건수·최소 관측 기간)은 작성자가 정한 기본값이라 고객사 공정마다 다릅니다. 실제 도입 때는 규칙팩으로 임계값을 다시 맞추고 사람 회신도 실제 담당자로 교체해야 합니다(도입 단계 과제로 분리)
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
고객사 Historian 에서 내려받은 태그 추출 CSV 행. 수집 공백·중복 시각·역행 시각·단위 혼재·상수 태그·타임존 누락 규칙이 가장 먼저 읽는 표입니다. 실제 추출본의 지저분함을 그대로 섞고, 어떤 결함을 심었는지는 별도 정답 파일로 관리해 자가채점합니다.
| row_id | source_file | tag_raw | equip_code_guess | ts_raw | value | unit_raw | quality |
|---|---|---|---|---|---|---|---|
| h_001 | PRESS_LINE1_202603.csv | PRESS1.TEMP | EQ-P1 | 2026-03-04 09:00:00 | 62.4 | degC | good |
| h_002 | PRESS_LINE1_202603.csv | PRESS1.TEMP | EQ-P1 | 2026-03-04 09:00:00 | 62.9 | degC | good |
| h_003 | PRESS_LINE1_202603.csv | PRESS1.TEMP | EQ-P1 | 2026-03-04 08:55:00 | 61.8 | degC | good |
| h_004 | PRESS_LINE1_202603.csv | PRESS_1_TEMP | — | 2026-03-04 09:10:00 | 63.1 | degC | good |
| h_005 | WELD_LINE2_202603.csv | WELD2.VIB | EQ-W2 | 2026-03-04 10:00:00 | — | mm/s | bad |
아래 스키마에 맞는 Historian 태그 추출 행 80개를 JSON 배열로 생성합니다. 설비 4~6대, 태그 8~12종, 수집 주기는 원칙적으로 5분 간격이며 대부분은 정상 행입니다.
{"type":"object","properties":{"row_id":{"type":"string"},"source_file":{"type":"string"},"tag_raw":{"type":"string"},"equip_code_guess":{"type":["string","null"]},"ts_raw":{"type":"string"},"value":{"type":["number","null"]},"unit_raw":{"type":["string","null"]},"quality":{"type":"string","enum":["good","bad","stale"]}},"required":["row_id","source_file","tag_raw","equip_code_guess","ts_raw","value","unit_raw","quality"]}
쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라(쉬운 결함만 잡는 함정 회피): (1) 같은 태그·같은 ts_raw 가 값만 다르게 두 번 오는 중복 3건, (2) 파일 순서상 앞 행보다 시각이 뒤로 가는 역행 2건, (3) 태그 표기 흔들림('PRESS1.TEMP'/'PRESS_1_TEMP')과 equip_code_guess=null 인 미매칭 태그 3건, (4) 6시간 이상 행이 아예 없는 수집 공백 구간 2곳과 value=null·quality='bad' 행 3건, (5) 같은 태그가 파일에 따라 kPa 와 단위 미기재 원값(1000배 차이)으로 오는 단위 혼재 1쌍, (6) 값이 처음부터 끝까지 같은 상수 태그 1종, (7) ts_raw 형식이 'MM/DD/YYYY HH:mm' 로 섞이거나 타임존 표기가 전혀 없는 행. 값은 온도 40~95, 진동 0~6, 전류 5~20, 압력 95~110 범위로 현실적으로 채웁니다. JSON 배열만.{"type":"object","properties":{"row_id":{"type":"string"},"source_file":{"type":"string"},"tag_raw":{"type":"string"},"equip_code_guess":{"type":["string","null"]},"ts_raw":{"type":"string"},"value":{"type":["number","null"]},"unit_raw":{"type":["string","null"]},"quality":{"type":"string","enum":["good","bad","stale"]}},"required":["row_id","source_file","tag_raw","equip_code_guess","ts_raw","value","unit_raw","quality"]}고객사 MES 에서 뽑아 준 설비·정비 이력 엑셀 시트 행. 태그와 설비코드 매칭, 고장 라벨 건수, 관측 기간 규칙이 읽는 표입니다. 병합 셀 때문에 빈 라인 값, 소계 행, 제각각인 날짜 표기 같은 엑셀 특유의 지저분함을 그대로 둡니다.
| sheet_row | equip_code | equip_name_raw | line_raw | event_date_raw | event_type | downtime_min | note |
|---|---|---|---|---|---|---|---|
| 4 | EQ-P1 | 프레스 1호기 | 1라인 | 2026.01.05 | 정기점검 | 45 | — |
| 5 | EQ-P1 | 프레스1호기 | — | 26/1/22 | 고장 | 180 | 유압 계통 이상 |
| 6 | EQ-P1 | 프레스 1호기 | — | 45678 | 부품교체 | — | 날짜 셀이 숫자로 저장됨 |
| 7 | — | 소계 | — | — | 미기재 | 225 | 소계 행 |
| 9 | EQ-W2 | 용접 2호기 | 2라인 | 2026-02-03 | 정기점검 | 30 | — |
아래 스키마에 맞는 MES 설비·정비 이력 엑셀 행 60개를 JSON 배열로 생성합니다. 설비 5~7대, 기간은 2026년 1월~3월, 정기점검이 다수이고 고장은 소수입니다.
{"type":"object","properties":{"sheet_row":{"type":"integer"},"equip_code":{"type":["string","null"]},"equip_name_raw":{"type":"string"},"line_raw":{"type":["string","null"]},"event_date_raw":{"type":["string","null"]},"event_type":{"type":"string","enum":["고장","정기점검","부품교체","미기재"]},"downtime_min":{"type":["number","null"]},"note":{"type":["string","null"]}},"required":["sheet_row","equip_code","equip_name_raw","line_raw","event_date_raw","event_type","downtime_min","note"]}
쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라: (1) 병합 셀 때문에 첫 행에만 값이 있고 이어지는 행은 line_raw=null 인 묶음 3개 이상, (2) equip_name_raw 가 '소계'·'합계'인 집계 행 2건(equip_code=null), (3) 날짜 표기가 '2026.01.05', '26/1/22', 엑셀 일련번호 문자열('45678'), null 로 제각각인 행을 각 2건 이상, (4) 같은 설비의 코드 표기 흔들림('EQ-W2'/'EQ-W02')과 이름 표기 흔들림('용접 2호기'/'용접2호기') 각 2건, (5) event_type='미기재' 이거나 downtime_min=null 인 행 4건, (6) Historian 추출본에는 태그가 없는 설비 1대, (7) 설비 전체를 통틀어 event_type='고장' 인 행이 5건 이하가 되게 유지해 라벨 부족이 드러나게 합니다. JSON 배열만.{"type":"object","properties":{"sheet_row":{"type":"integer"},"equip_code":{"type":["string","null"]},"equip_name_raw":{"type":"string"},"line_raw":{"type":["string","null"]},"event_date_raw":{"type":["string","null"]},"event_type":{"type":"string","enum":["고장","정기점검","부품교체","미기재"]},"downtime_min":{"type":["number","null"]},"note":{"type":["string","null"]}},"required":["sheet_row","equip_code","equip_name_raw","line_raw","event_date_raw","event_type","downtime_min","note"]}| Python | 추출본 파서와 결함 규칙 엔진, 질문지 생성기의 구현 언어입니다 |
| pandas | Historian 시계열과 MES 엑셀 시트를 읽어 수집 공백·중복 시각·값 분포를 계산합니다 |
| Pydantic | 입력 행과 LLM 이 다듬은 질문 문장의 형식을 실행 시점에 검증합니다 |
| Docker | 인터넷이 막힌 고객사 현장에 그대로 반입하는 오프라인 실행 이미지로 묶습니다 |
| MLflow | 언제 어떤 규칙 버전으로 어떤 파일을 점검했는지 실행 이력과 입력 파일 지문을 남깁니다 |
| MES·Historian 연계 | 태그 추출 CSV 와 설비·정비 이력 엑셀을 입력 규격으로 삼아 두 시스템의 식별자를 맞춥니다 |
| Claude | 규칙이 잡은 결함을 담당자가 읽을 질문 문장으로 다듬는 LLM 입니다 |
✓ pass → 그대로 멈춰도 완결입니다. 더 키우려면 2주차(회신 반영 재실행·태그 짝짓기 후보)로 진행합니다.
✓ pass → 여기서 멈춰도 완결입니다. 더 키우면 3주차(규칙팩 자산화·폐쇄망 반입 패키징)로 진행합니다.
착수를 막는 결함 1건. 어떤 규칙이 무엇을 근거로 잡았고 담당자에게 무엇을 물어야 하며 답이 없으면 무슨 일이 생기는지를 한 스키마로 담아, 킥오프 확인 질문지 마크다운의 한 항목으로 렌더합니다.
{"type":"object","properties":{"finding_id":{"type":"string"},"rule":{"type":"string","enum":["tag_master_unmatched","label_shortage","sampling_gap","timestamp_disorder","unit_mixed","constant_tag","period_short","timezone_missing"]},"severity":{"type":"string","enum":["blocker","limit","note"]},"scope":{"type":"string"},"evidence":{"type":"string"},"question":{"type":"string"},"impact_if_unanswered":{"type":"string"},"owner_hint":{"type":"string","enum":["설비보전팀","MES담당","IT인프라","미지정"]}},"required":["finding_id","rule","severity","scope","evidence","question","impact_if_unanswered","owner_hint"]}[
{
"input_ref": "MES 시트 전체 (event_type='고장' 5건) + 지도학습 과제 요청",
"output": {
"finding_id": "f_001",
"rule": "label_shortage",
"severity": "blocker",
"scope": "설비 5대 전체 · 2026-01-01~2026-03-31",
"evidence": "고장 이벤트 5건(EQ-P1 1건, EQ-W2 1건, EQ-A3 1건, 기타 2건), 설비당 평균 1건",
"question": "지난 24개월치 고장 이력을 더 받을 수 있는지, 없다면 설비별 고장을 어떤 시스템에 기록해 두시는지 알려주시면 감사하겠습니다.",
"impact_if_unanswered": "고장 예측 같은 지도학습 과제는 착수할 수 없고 비지도 이상탐지로 범위를 줄여야 합니다",
"owner_hint": "설비보전팀"
}
},
{
"input_ref": "h_004, h_012 (태그 PRESS_1_TEMP·NEWLINE.X01) + MES 설비코드 목록",
"output": {
"finding_id": "f_002",
"rule": "tag_master_unmatched",
"severity": "blocker",
"scope": "태그 3종 · 전체 12종의 25%",
"evidence": "PRESS_1_TEMP·NEWLINE.X01 등 3종이 MES 설비코드와 매칭 실패, EQ-C5 는 반대로 태그가 없음",
"question": "PRESS_1_TEMP 와 NEWLINE.X01 이 어느 설비의 태그인지, 도장 5호기(EQ-C5)의 태그는 다른 서버에 있는지 확인 부탁드립니다.",
"impact_if_unanswered": "해당 설비는 분석 대상에서 빠지고 라인 단위 집계가 실제보다 작게 나옵니다",
"owner_hint": "IT인프라"
}
},
{
"input_ref": "h_007, h_008 (WELD2.PRS 값이 101.3 과 101300.0)",
"output": {
"finding_id": "f_003",
"rule": "unit_mixed",
"severity": "limit",
"scope": "태그 WELD2.PRS · 3월 파일과 4월 파일",
"evidence": "3월 파일 값 범위 95~110(kPa), 4월 파일 값 범위 95000~110000(단위 칸 비어 있음)으로 약 1000배 차이",
"question": "4월부터 압력 태그의 단위가 Pa 로 바뀐 것인지, 아니면 수집 설정이 변경된 것인지 알려주시면 변환해서 쓰겠습니다.",
"impact_if_unanswered": "단위를 임의 변환하면 임계값이 어긋나므로 4월 이후 데이터를 통째로 제외해야 합니다",
"owner_hint": "IT인프라"
}
},
{
"input_ref": "h_005, h_006 (WELD2.VIB 10:00 이후 18:00 까지 행 없음)",
"output": {
"finding_id": "f_004",
"rule": "sampling_gap",
"severity": "note",
"scope": "태그 WELD2.VIB · 2026-03-04 10:00~18:00",
"evidence": "5분 주기 기준 96행이 와야 하는 구간에 0행, 직전 행 quality='bad'",
"question": "3월 4일 오전 이후 용접 2호기 진동 수집이 멈춘 이유가 설비 정지였는지 수집기 장애였는지 확인 부탁드립니다.",
"impact_if_unanswered": "정지 구간을 이상으로 오인할 수 있어 해당 구간을 학습에서 빼고 진행합니다",
"owner_hint": "설비보전팀"
}
}
][자동 검증] 1. Pydantic 으로 출력 형식(필드·Literal 값)이 스키마를 통과하는지 확인합니다. 2. severity 와 rule 이 규칙 재계산 결과와 일치하는지 봅니다(등급은 임계값 비교로 결정되는 규칙 산출물이라 LLM 이 바꿀 수 없습니다). 3. question 과 evidence 에 실제 계산된 수치·태그명이 그대로 인용됐는지 문자열 매칭으로 확인하고, 원본에 없는 숫자가 들어오면 반려합니다. 4. 더미에 심어 둔 결함 정답 목록과 대조해 검출 건수와 오탐 건수를 셉니다. [수동 검증] 1. 현장 데이터를 다뤄 본 검토자 2명이 질문 문장이 담당자에게 그대로 보낼 만한지 비동기로 판정하고 일치도를 봅니다. 2. 생성된 질문 전체의 5% 를 사람이 직접 읽고 근거와 맞는지 점검합니다.