이루비
경력근거: 고객사 담당자와 직접 커뮤니케이션하며 실증 및 KPI 검증
※ 실제 산출물이 아닌 AI 예측 시안입니다.
공고는 FDE 를 '이루비의 AI를 제조 현장에 직접 배포하고, 고객의 문제가 실제로 해결될 때까지 책임지는' 역할로 소개하고, 주요 업무에 '고객사 담당자와 직접 커뮤니케이션하며 실증 및 KPI 검증' 과 '고객사 네트워크, PLC/MES 및 기존 설비와의 연동' 을 함께 적었습니다. 이루비의 핵심 AI 모델과 엣지 시스템은 이미 구현돼 있다고 밝힌 만큼, 현장 하나를 맡은 FDE 가 매일 고객사에 내놓을 것은 모델이 아니라 그 모델이 이 공장의 이 라인에서 목표를 채웠는지에 대한 숫자이고, 이 CLI 는 엣지 추론과 PLC 수량, 검사원 재검을 맞춰 그 숫자를 냅니다. '문제 정의 → 설치 → 운영 → 개선 → 성과 검증 → 확장까지 직접 책임지는 역할' 에서 성과 검증 칸을 맡고, 촬영 누락 판정은 설치·운영 칸으로 되돌아가는 신호가 됩니다. 이 포트폴리오는 현장 데이터 세 갈래를 짝지어 실증 지표를 계산하는 기술을 보여줍니다. 비전 검사 모델이나 고객 공정에 대한 전문성은 주장하지 않습니다.
주요 업무에 '고객사 담당자와 직접 커뮤니케이션하며 실증 및 KPI 검증' 이 있습니다. 라인·교대마다 놓친 불량률과 과검출률을 합의된 목표와 견주는 판정이 그 검증을 매일 하는 형태입니다.
'고객사 네트워크, PLC/MES 및 기존 설비와의 연동' 과 '카메라, 센서, NVIDIA Jetson 등 엣지 디바이스 설치 및 설정' 이 함께 적혀 있습니다. PLC 생산 수량과 Jetson 추론 기록을 맞대어 촬영 누락을 세는 판정이 두 줄을 한 계산으로 잇습니다.
'Linux/Python 기반 현장 시스템 배포·운영·디버깅' 과 '현장에서 반복적으로 발생하는 문제를 제품 기능 및 표준 설치 프로세스로 전환' 이 있습니다. Python CLI 를 리눅스 장비에서 교대마다 돌리고, 반복해 걸린 판정을 설치 점검 항목 후보로 모으는 3주차가 이 두 업무를 받습니다.
고객 공장에 이루비 AI 를 배포한 FDE 엔지니어가 교대가 끝날 때마다 현장 노트북에서 돌려, 라인·교대마다 실증 목표를 채웠는지 다섯 판정 중 하나로 알려주는 Python CLI 입니다. 엣지 장치의 추론 기록, 고객사 검사원의 재검 결과, PLC 생산 수량, 고객사와 합의한 라인별 실증 KPI 네 파일을 받아, 자정을 넘는 C조 촬영을 교대 시작일로 돌리고, 날짜에 맞는 KPI 단계를 고른 뒤, 부품 번호로 AI 판정과 사람 판정을 짝지어 놓친 불량과 과검출 비율을 계산합니다. 결과는 터미널에 라인별로 찍히고, 다음 날 손볼 라인과 할 일이 고객사 품질 담당자 보고용 마크다운으로 남습니다.
고객 공장 한 곳을 맡아 카메라·Jetson 엣지 장치를 설치하고 실증 KPI 를 고객사 품질 담당자에게 보고하는 이루비 FDE 엔지니어 — 교대 근무가 끝날 때마다 현장 노트북 터미널에서 돌려 다음 날 모델·설치 손볼 라인을 정한다
실증 기간에 FDE 가 매일 고객사에 내놓아야 하는 숫자는 AI 가 불량을 얼마나 놓쳤고 양품을 얼마나 걸렀는지인데, 그 숫자를 만드는 재료가 엣지 장치, 검사원 엑셀, PLC 카운터에 흩어져 있습니다. 세 곳을 부품 번호와 교대로 맞추는 일은 매번 손으로 하면 자정을 넘긴 C조 촬영이나 추론이 끝나지 않은 부품에서 어긋나고, 그 어긋남이 그대로 KPI 보고에 실립니다. 짝짓기와 교대 귀속, KPI 단계 선택을 규칙으로 고정해 두면, 교대가 끝난 직후 어느 라인이 어떤 이유로 목표를 못 채웠는지 정해지고 FDE 는 다음 날 손볼 라인부터 고를 수 있습니다.
FDE 엔지니어가 추론 기록·재검 결과·PLC 생산 수량·실증 KPI 네 파일에 날짜와 교대를 넣어 iruvy-pilot report 를 치면, 라인마다 다섯 판정과 촬영 누락률·놓친 불량률·과검출률을 찍고 같은 내용을 마크다운 보고서로 남기는 Python CLI 입니다. 네 파일은 엣지 장치와 MES 에서 CSV 로 내려받았다고 두고, PLC 에서 직접 읽는 일은 2주차로 미룹니다.
pymodbus 로 PLC 생산 카운터를 흉내 낸 Modbus TCP 서버를 띄워 produced_qty 를 레지스터에서 직접 읽고, 손으로 판정을 단 라인·교대 70개와 CLI 판정을 견주는 평가 러너를 더합니다. 두 비율에 윌슨 구간(재검 수가 적을 때 비율이 어디서 어디까지 흔들릴 수 있는지 보여주는 범위)을 붙여 재검 수가 적은 라인에서 판정이 얼마나 흔들리는지 보고서에 적습니다.
CLI 를 arm64 Docker 이미지로 묶어 리눅스 현장 장비에서 systemd 타이머로 교대 종료 10분 뒤 돌게 하고, 7일치 판정을 쌓아 라인별 추세를 냅니다. 클로드가 그 추세로 고객사 품질 담당자에게 보낼 주간 실증 보고 초안을 쓰고, 반복해 걸린 판정을 표준 설치 점검 항목으로 옮길 후보로 정리합니다.
FDE 엔지니어가 B조 종료 뒤 `iruvy-pilot report --site 세진정밀 --date 2026-10-02 --shift B` 를 치면 L1 하우징 조립이 놓친 불량 7/52 = 13.5% · 목표 5% 로, L3 라벨 부착이 추론 1,612 / PLC 1,702 로 촬영 누락에 찍히고, 다음 날 할 일 메모가 붙은 보고서가 남습니다. FDE 는 그 보고서를 열어 L3 장치 트리거부터 보러 갑니다.
합성 공장 기록에 작성자가 판정을 손으로 단 라인·교대 70개와 CLI 판정이 일치하는 수를 셉니다. 70개 가운데 자정 넘김·추론 없음·짝 없는 재검이 섞인 교대를 따로 표시해 두어, 어긋남이 나오면 짝짓기 단계와 판정 순서 단계 가운데 어디서 났는지 바로 갈립니다.
자정 뒤 찍힌 C조 부품, 추론이 시간 초과로 끝나지 않은 부품, 추론 기록이 없는데 재검된 부품, 촬영 누락과 놓친 불량이 기준과 정확히 같은 라인, 재검이 최소 수에 못 미친 라인을 pytest 고정 입력으로 묶어, 비교 부등호나 반올림 위치를 바꾼 커밋은 L1 C 가 실증 목표 충족에서 벗어나는 순간 실패하게 합니다.
진짜 성능 검증은 여기서 멈춥니다. 위 수치는 작성자가 지은 공장 기록으로 잰 자가채점이라, 이 CLI 의 판정이 고객 공장의 실증 판단과 맞는지는 이루비가 배포한 공장의 실제 추론 기록과 검사원 재검이 있어야 잴 수 있습니다. 첫 고객 공장의 교대 파일이 들어오면 FDE 가 손으로 낸 KPI 보고와 CLI 판정을 일주일 나란히 내어 어긋난 라인부터 봅니다.
라인·교대 70개 일치 수는 제가 지은 공장 기록에서 나온 값이라, 고객 공장의 실증 판단을 대신할 수 없습니다. 지금 보여줄 수 있는 것은 자정을 넘긴 C조 부품이 어느 교대로 들어가는지, 기준과 꼭 같은 L1 C 가 어느 쪽에 서는지까지이고, 실제 파일을 받으면 재검 표본을 어떻게 뽑았는지가 숫자보다 먼저 확인할 일입니다.
짝짓기 규칙과 공장 기록을 한 사람이 지으면 부품 번호가 늘 깔끔하게 맞아 떨어지기 쉬워, 짝이 어긋나는 부품을 먼저 정하고 나머지를 채웠습니다. 자정 뒤 찍힌 C조 부품 SJ-L1-1002-1688, 추론이 끝나지 않은 SJ-L2-1002-1530, 추론 기록 없이 재검된 SJ-L2-1002-1597, 누락률·놓친 불량이 기준과 정확히 같은 L1 C 가 그 자리입니다.
놓친 불량률은 재검 표본 안에서 센 비율이라, 고객사가 AI 불량 판정만 골라 재검하면 놓친 불량이 거의 0으로 나옵니다. 표본을 무작위로 뽑았는지 확인하기 전에는 이 비율을 실증 결과로 보고하지 않습니다.
C조처럼 교대가 바뀌는 시각에 PLC 카운터가 초기화되는 시각과 카메라 시각이 몇 분 어긋나면, 촬영 누락 2% 기준이 그 시각 앞뒤 부품 몇 개로 뒤집힙니다. 실제 도입에서는 PLC 와 엣지 장치의 시계를 맞추는 일이 첫 설치 점검 항목입니다.
추론 기록에는 부품 이미지가 따로 저장됩니다. 이 CLI 와 클로드 메모는 이미지 없이 판정과 숫자만 다루고, 이미지는 고객 공장 밖으로 꺼내지 않습니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
라인마다 설치한 Jetson 엣지 장치가 부품을 찍고 AI 로 양품·불량을 판정한 기록입니다. 교대 하나에 라인마다 1,500줄 안팎이 쌓이며, 여기 실은 줄은 그 파일에서 판정 설명에 쓰는 부품 몇 개를 뽑은 것입니다. C조는 자정을 넘겨 다음 날짜로 찍히고, 추론이 시간 초과로 끝나지 않은 부품은 판정이 비어 있습니다.
| part_id | line_id | shift | captured_at | ai_verdict | device_id |
|---|---|---|---|---|---|
| SJ-L1-1002-0417 | L1 | B | 2026-10-02 15:42 | 양품 | JTS-L1-01 |
| SJ-L1-1002-0533 | L1 | B | 2026-10-02 16:05 | 불량 | JTS-L1-01 |
| SJ-L2-1002-0388 | L2 | B | 2026-10-02 15:11 | 불량 | JTS-L2-01 |
| SJ-L2-1002-0391 | L2 | B | 2026-10-02 15:12 | 양품 | JTS-L2-01 |
| SJ-L3-1002-0902 | L3 | B | 2026-10-02 18:30 | 양품 | JTS-L3-01 |
아래 JSON Schema 를 그대로 만족하는 엣지 추론 기록을 한 라인·한 교대 몫으로 1,500줄 만들어 주세요. part_id 는 'SJ-' 뒤에 라인, 월일 네 자리, 네 자리 순번을 하이픈으로 잇고, captured_at 은 교대 시간 안에서 1~2분 간격으로 씁니다. ai_verdict 는 불량이 3~5% 안팎이 되게 둡니다. 쉬운 데이터만 만들지 말고 다음을 섞으세요: C조에서 자정 뒤 날짜로 찍힌 줄, ai_verdict 가 null 인 추론 시간 초과 줄 10건 안팎, 몇 분씩 촬영이 빠진 구간(PLC 수량보다 줄이 적어지게). 판정 결과나 재검 결과는 넣지 마세요. 형식 깨뜨리기 시도로 captured_at 을 '2026/10/02 15:42:07'·'15:42' 처럼 적은 줄 5건을 따로 만듭니다.
{"type":"object","properties":{"part_id":{"type":"string","description":"부품 바코드 일련번호입니다"},"line_id":{"type":"string"},"shift":{"type":"string","enum":["A","B","C"],"description":"A 06~14시, B 14~22시, C 22~다음날 06시 교대입니다"},"captured_at":{"type":"string","description":"카메라 촬영 시각, YYYY-MM-DD HH:MM"},"ai_verdict":{"type":["string","null"],"enum":["양품","불량",null],"description":"엣지 장치의 AI 판정입니다. 추론이 시간 초과로 끝나지 않았으면 null 입니다"},"device_id":{"type":"string","description":"촬영·추론한 Jetson 장치입니다"}},"required":["part_id","line_id","shift","captured_at","ai_verdict","device_id"]}{"type":"object","properties":{"part_id":{"type":"string","description":"부품 바코드 일련번호입니다"},"line_id":{"type":"string"},"shift":{"type":"string","enum":["A","B","C"],"description":"A 06~14시, B 14~22시, C 22~다음날 06시 교대입니다"},"captured_at":{"type":"string","description":"카메라 촬영 시각, YYYY-MM-DD HH:MM"},"ai_verdict":{"type":["string","null"],"enum":["양품","불량",null],"description":"엣지 장치의 AI 판정입니다. 추론이 시간 초과로 끝나지 않았으면 null 입니다"},"device_id":{"type":"string","description":"촬영·추론한 Jetson 장치입니다"}},"required":["part_id","line_id","shift","captured_at","ai_verdict","device_id"]}고객사 품질 검사원이 교대 중 부품을 다시 보고 양품·불량을 적은 재검 기록입니다. 부품 번호, 사람 판정, 검사원, 재검 시각을 둡니다. 촬영이 빠진 부품이 재검되면 같은 부품 번호의 추론 기록이 없습니다.
| part_id | human_verdict | inspector | rechecked_at |
|---|---|---|---|
| SJ-L1-1002-0417 | 불량 | 품질1팀 박OO | 2026-10-02 17:10 |
| SJ-L1-1002-0533 | 불량 | 품질1팀 박OO | 2026-10-02 17:12 |
| SJ-L2-1002-0388 | 양품 | 품질1팀 이OO | 2026-10-02 16:40 |
| SJ-L2-1002-0391 | 양품 | 품질1팀 이OO | 2026-10-02 16:41 |
| SJ-L4-1002-0120 | 불량 | 품질1팀 박OO | 2026-10-02 15:30 |
아래 JSON Schema 를 그대로 만족하는 재검 기록을 라인·교대마다 40~350줄씩 만들어 주세요. part_id 는 같은 교대 엣지 추론 기록의 부품 번호에서 고르고, 사람 판정은 AI 판정과 대부분 같게 두되 라인마다 놓친 불량(AI 양품·사람 불량)과 과검출(AI 불량·사람 양품)을 몇 개씩 섞습니다. 쉬운 데이터만 만들지 말고 다음을 섞으세요: 추론 기록에 없는 부품 번호를 재검한 줄, AI 판정이 null 인 부품을 재검한 줄, 재검 수가 최소 기준에 못 미치는 라인. 판정 결과는 넣지 마세요. 검사원 이름은 '품질1팀 박OO' 처럼 성만 씁니다.
{"type":"object","properties":{"part_id":{"type":"string"},"human_verdict":{"type":"string","enum":["양품","불량"],"description":"고객사 품질 검사원이 재검한 결과입니다"},"inspector":{"type":"string"},"rechecked_at":{"type":"string","description":"YYYY-MM-DD HH:MM"}},"required":["part_id","human_verdict","inspector","rechecked_at"]}{"type":"object","properties":{"part_id":{"type":"string"},"human_verdict":{"type":"string","enum":["양품","불량"],"description":"고객사 품질 검사원이 재검한 결과입니다"},"inspector":{"type":"string"},"rechecked_at":{"type":"string","description":"YYYY-MM-DD HH:MM"}},"required":["part_id","human_verdict","inspector","rechecked_at"]}MES 에서 내려받은 교대별 PLC 생산 카운터 값입니다. 교대 시작일, 라인, 교대, 생산 수량을 둡니다. C조는 자정을 넘겨도 시작한 날로 적혀 있어, 촬영 기록과 맞추려면 촬영 시각을 교대 시작일로 돌려야 합니다.
| work_date | line_id | shift | produced_qty |
|---|---|---|---|
| 2026-10-02 | L1 | B | 1,710 |
| 2026-10-02 | L2 | B | 1,720 |
| 2026-10-02 | L3 | B | 1,702 |
| 2026-10-02 | L4 | B | 1,708 |
| 2026-10-02 | L5 | B | 1,690 |
아래 JSON Schema 를 그대로 만족하는 교대별 생산 수량을 2026-09-01 부터 2026-10-02 까지 다섯 라인·세 교대 몫으로 만들어 주세요. 한 교대 생산은 1,400~1,800개 범위에서 고르고, 설비 정지로 몇 백 개 적은 교대를 몇 개 섞습니다. 판정 결과는 넣지 마세요.
{"type":"object","properties":{"work_date":{"type":"string","description":"교대가 시작한 날, YYYY-MM-DD 입니다. C 교대는 자정을 넘겨도 시작한 날로 적습니다"},"line_id":{"type":"string"},"shift":{"type":"string","enum":["A","B","C"]},"produced_qty":{"type":"integer","minimum":0,"description":"그 교대에 PLC 생산 카운터가 센 수량입니다"}},"required":["work_date","line_id","shift","produced_qty"]}{"type":"object","properties":{"work_date":{"type":"string","description":"교대가 시작한 날, YYYY-MM-DD 입니다. C 교대는 자정을 넘겨도 시작한 날로 적습니다"},"line_id":{"type":"string"},"shift":{"type":"string","enum":["A","B","C"]},"produced_qty":{"type":"integer","minimum":0,"description":"그 교대에 PLC 생산 카운터가 센 수량입니다"}},"required":["work_date","line_id","shift","produced_qty"]}FDE 가 고객사 품질 담당자와 합의한 라인별 실증 목표입니다. 1차·2차 단계마다 적용 시작일과 놓친 불량 비율 상한, 과검출 비율 상한, 교대당 최소 재검 수를 둡니다. 최종 외관 라인은 2차에서 목표가 더 엄격합니다. 이 CLI 는 이 표를 받아 쓰기만 하고 목표를 새로 정하지 않습니다.
| line_id | line_name | stage | effective_from | max_miss_rate | max_overkill_rate | min_recheck |
|---|---|---|---|---|---|---|
| L1 | 하우징 조립 | 1차 | 2026-09-01 | 8 | 12 | 30 |
| L2 | 커넥터 체결 | 1차 | 2026-09-01 | 8 | 12 | 30 |
| L3 | 라벨 부착 | 1차 | 2026-09-01 | 8 | 12 | 30 |
| L4 | 최종 외관 | 1차 | 2026-09-01 | 8 | 12 | 30 |
| L5 | 포장 전 검사 | 1차 | 2026-09-01 | 8 | 12 | 30 |
아래 JSON Schema 를 그대로 만족하는 실증 목표표를 다른 고객 공장 두 곳 몫으로 20줄 더 만들어 주세요. 공장마다 라인 네다섯 개에 1차·2차 단계를 두고, 2차는 1차보다 상한을 낮추고 최소 재검 수를 늘립니다. 외관 검사처럼 놓치면 고객 불만이 큰 라인은 더 엄격한 목표를 둡니다. 판정 결과는 넣지 마세요.
{"type":"object","properties":{"line_id":{"type":"string"},"line_name":{"type":"string"},"stage":{"type":"string","enum":["1차","2차"]},"effective_from":{"type":"string","description":"이 목표가 적용되기 시작한 날, YYYY-MM-DD"},"max_miss_rate":{"type":"number","minimum":0,"maximum":100,"description":"놓친 불량 비율 상한(%)입니다"},"max_overkill_rate":{"type":"number","minimum":0,"maximum":100,"description":"양품을 불량으로 걸러낸 비율 상한(%)입니다"},"min_recheck":{"type":"integer","minimum":1,"description":"교대마다 AI 판정과 짝지어야 하는 최소 재검 수입니다"}},"required":["line_id","line_name","stage","effective_from","max_miss_rate","max_overkill_rate","min_recheck"]}{"type":"object","properties":{"line_id":{"type":"string"},"line_name":{"type":"string"},"stage":{"type":"string","enum":["1차","2차"]},"effective_from":{"type":"string","description":"이 목표가 적용되기 시작한 날, YYYY-MM-DD"},"max_miss_rate":{"type":"number","minimum":0,"maximum":100,"description":"놓친 불량 비율 상한(%)입니다"},"max_overkill_rate":{"type":"number","minimum":0,"maximum":100,"description":"양품을 불량으로 걸러낸 비율 상한(%)입니다"},"min_recheck":{"type":"integer","minimum":1,"description":"교대마다 AI 판정과 짝지어야 하는 최소 재검 수입니다"}},"required":["line_id","line_name","stage","effective_from","max_miss_rate","max_overkill_rate","min_recheck"]}| Python | 네 CSV 읽기, C조 교대 귀속일 계산, KPI 단계 고르기, 부품 번호 짝짓기와 비율 계산, CLI 와 마크다운 보고서를 맡습니다. |
| Linux | 3주차에 현장 리눅스 장비에서 systemd 타이머로 교대 종료 뒤 자동 실행하고 로그를 journald 에 남깁니다. |
| NVIDIA Jetson | 추론 기록의 device_id 별로 촬영 누락을 나눠 어느 장치의 트리거를 볼지 정하고, 3주차에 같은 CLI 를 arm64 이미지로 빌드해 Jetson 계열 장비에서도 돌게 합니다. |
| PLC/MES 연동 | 1주차에는 MES 에서 내려받은 교대별 생산 수량 CSV 를, 2주차에는 pymodbus 시뮬레이터의 Modbus TCP 레지스터를 읽어 produced_qty 를 얻습니다. |
| 카메라·센서 | 촬영 시각과 PLC 수량의 차이로 카메라 트리거가 빠진 라인을 찾아 설치 점검 대상으로 올립니다. |
| AI 모델 업데이트·테스트 | 모델을 바꾸기 전후 같은 라인·교대의 놓친 불량률과 과검출률을 견줘 업데이트가 목표를 지키는지 확인하는 데 같은 판정을 씁니다. |
| Docker | 3주차에 CLI 와 KPI 파일 형식을 arm64·amd64 이미지로 묶어 현장 노트북과 엣지 장비에서 같은 결과가 나오게 합니다. |
| LLM API | 목표를 못 채운 라인의 다음 날 할 일 메모와 3주차 주간 실증 보고 초안을 클로드로 씁니다. |
✗ fail → L1 C 가 걸리면 반올림을 비교 뒤로 옮기고 부등호부터 고칩니다.
✓ pass → 2주차 Modbus TCP 읽기와 평가 러너, 윌슨 구간으로 넘어갑니다.
✗ fail → 짝짓기에서 어긋나면 부품 번호 규칙과 교대 시간표를 고객사와 다시 맞추고 자동 실행은 미룹니다.
✓ pass → 3주차 자동 실행과 7일치 추세, 주간 실증 보고 초안으로 넘어갑니다.
라인·교대마다 한 줄로 내는 라인·교대별 실증 판정입니다. 집계형 출력이라 건수 근거는 교대 전체 파일에서 센 값이고, 인라인 샘플은 그 파일의 일부 줄이라 example_part_ids 로 판정을 설명하는 부품을 가리킵니다. 판정과 함께 KPI 단계, 촬영 누락률, 짝지은 재검 수, 두 비율과 그 분자·분모, 짝짓지 못한 재검 부품, 다음 날 할 일 메모를 실어 터미널 출력과 보고서가 같은 행을 읽습니다.
{"type":"object","properties":{"site":{"type":"string"},"work_date":{"type":"string","description":"교대 시작일입니다. C 교대에서 자정 뒤 촬영된 부품도 시작일로 셉니다"},"line_id":{"type":"string"},"shift":{"type":"string","enum":["A","B","C"]},"verdict":{"type":"string","enum":["실증 목표 충족","놓친 불량이 목표를 넘음","양품을 너무 많이 걸러냄","촬영 누락","재검 표본 부족"],"description":"걸린 판정이 여럿이면 촬영 누락, 재검 표본 부족, 놓친 불량이 목표를 넘음, 양품을 너무 많이 걸러냄 순으로 앞선 하나입니다"},"also_found":{"type":"array","items":{"type":"string","enum":["놓친 불량이 목표를 넘음","양품을 너무 많이 걸러냄","촬영 누락","재검 표본 부족"]}},"kpi_stage":{"type":"string","description":"work_date 에 적용되는 pilot_kpi 행의 stage 입니다. effective_from 이 work_date 이하인 행 가운데 가장 늦은 행을 씁니다"},"produced_qty":{"type":"integer","minimum":0},"inferred_qty":{"type":"integer","minimum":0,"description":"그 라인·교대의 edge_inferences 줄 수입니다. ai_verdict 가 null 인 줄도 촬영은 됐으므로 셉니다"},"capture_missing_pct":{"type":"number","description":"(produced_qty - inferred_qty) / produced_qty × 100 을 소수 첫째 자리로 반올림한 값입니다. 비교는 반올림 전 값으로 합니다"},"no_verdict_qty":{"type":"integer","minimum":0,"description":"ai_verdict 가 null 인 줄 수입니다. 짝짓기에서 뺍니다"},"matched_recheck":{"type":"integer","minimum":0,"description":"ai_verdict 가 있는 edge_inferences 와 part_id 로 짝지어진 recheck_results 수입니다"},"human_defect":{"type":"integer","minimum":0},"missed_defect":{"type":"integer","minimum":0,"description":"짝 가운데 AI 양품·사람 불량 수입니다"},"miss_rate_pct":{"type":["number","null"],"minimum":0,"maximum":100,"description":"missed_defect / human_defect × 100 입니다. human_defect 가 0 이면 null 입니다"},"human_good":{"type":"integer","minimum":0},"overkill":{"type":"integer","minimum":0,"description":"짝 가운데 AI 불량·사람 양품 수입니다"},"overkill_rate_pct":{"type":["number","null"],"minimum":0,"maximum":100,"description":"overkill / human_good × 100 입니다. human_good 이 0 이면 null 입니다"},"unmatched_recheck_part_ids":{"type":"array","items":{"type":"string"},"description":"재검했지만 edge_inferences 에 같은 part_id 가 없어 짝짓지 못한 부품입니다"},"example_part_ids":{"type":"array","items":{"type":"string"},"description":"판정을 설명하는 부품 예시로, 인라인 수록 행의 part_id 입니다"},"evidence":{"type":"array","items":{"type":"object","properties":{"table":{"type":"string","enum":["edge_inferences","recheck_results","plc_counts","pilot_kpi"]},"field":{"type":"string"},"agg":{"type":["string","null"],"enum":["count","sum","avg","min","max",null]},"value":{}},"required":["table","field","value"]}},"summary":{"type":"string"},"next_action_note":{"type":["string","null"],"description":"클로드가 판정 행을 받아 쓴 다음 날 할 일 메모입니다. 실증 목표 충족이면 null 입니다"}},"required":["site","work_date","line_id","shift","verdict","also_found","kpi_stage","produced_qty","inferred_qty","capture_missing_pct","no_verdict_qty","matched_recheck","human_defect","missed_defect","miss_rate_pct","human_good","overkill","overkill_rate_pct","unmatched_recheck_part_ids","example_part_ids","evidence","summary","next_action_note"]}[
{
"site": "세진정밀",
"work_date": "2026-10-02",
"line_id": "L1",
"shift": "B",
"verdict": "놓친 불량이 목표를 넘음",
"also_found": [],
"kpi_stage": "2차",
"produced_qty": 1710,
"inferred_qty": 1698,
"capture_missing_pct": 0.7,
"no_verdict_qty": 0,
"matched_recheck": 260,
"human_defect": 52,
"missed_defect": 7,
"miss_rate_pct": 13.5,
"human_good": 208,
"overkill": 10,
"overkill_rate_pct": 4.8,
"unmatched_recheck_part_ids": [],
"example_part_ids": [
"SJ-L1-1002-0417"
],
"evidence": [
{
"table": "recheck_results",
"field": "human_verdict",
"agg": "count",
"value": 52
},
{
"table": "edge_inferences",
"field": "ai_verdict",
"agg": "count",
"value": 7
},
{
"table": "pilot_kpi",
"field": "max_miss_rate",
"agg": null,
"value": 5
},
{
"table": "edge_inferences",
"field": "part_id",
"agg": null,
"value": "SJ-L1-1002-0417"
}
],
"summary": "재검에서 불량으로 나온 52개 가운데 7개를 AI 가 양품으로 넘겨 놓친 불량이 13.5% 이고, 2차 목표 5% 를 넘었습니다.",
"next_action_note": "L1 하우징 조립은 내일 첫 교대 전에 놓친 불량 7개 이미지를 모아 촬영 각도와 판정 임계값을 AI 팀과 함께 봅니다."
},
{
"site": "세진정밀",
"work_date": "2026-10-02",
"line_id": "L2",
"shift": "B",
"verdict": "양품을 너무 많이 걸러냄",
"also_found": [],
"kpi_stage": "2차",
"produced_qty": 1720,
"inferred_qty": 1709,
"capture_missing_pct": 0.6,
"no_verdict_qty": 0,
"matched_recheck": 340,
"human_defect": 42,
"missed_defect": 1,
"miss_rate_pct": 2.4,
"human_good": 298,
"overkill": 41,
"overkill_rate_pct": 13.8,
"unmatched_recheck_part_ids": [],
"example_part_ids": [
"SJ-L2-1002-0388"
],
"evidence": [
{
"table": "recheck_results",
"field": "human_verdict",
"agg": "count",
"value": 298
},
{
"table": "edge_inferences",
"field": "ai_verdict",
"agg": "count",
"value": 41
},
{
"table": "pilot_kpi",
"field": "max_overkill_rate",
"agg": null,
"value": 8
},
{
"table": "edge_inferences",
"field": "part_id",
"agg": null,
"value": "SJ-L2-1002-0388"
}
],
"summary": "재검에서 양품으로 나온 298개 가운데 41개를 AI 가 불량으로 걸러 과검출이 13.8% 이고, 목표 8% 를 넘었습니다. 놓친 불량은 2.4% 로 목표 안입니다.",
"next_action_note": "L2 커넥터 체결은 과검출 41개의 이미지에서 반사광이 겹친 것이 몇 개인지 먼저 세고, 조명 각도를 바꿀지 판정 기준을 바꿀지 고객사 품질 담당자와 정합니다."
},
{
"site": "세진정밀",
"work_date": "2026-10-02",
"line_id": "L3",
"shift": "B",
"verdict": "촬영 누락",
"also_found": [],
"kpi_stage": "2차",
"produced_qty": 1702,
"inferred_qty": 1612,
"capture_missing_pct": 5.3,
"no_verdict_qty": 0,
"matched_recheck": 210,
"human_defect": 30,
"missed_defect": 1,
"miss_rate_pct": 3.3,
"human_good": 180,
"overkill": 9,
"overkill_rate_pct": 5,
"unmatched_recheck_part_ids": [],
"example_part_ids": [
"SJ-L3-1002-0902"
],
"evidence": [
{
"table": "plc_counts",
"field": "produced_qty",
"agg": null,
"value": 1702
},
{
"table": "edge_inferences",
"field": "part_id",
"agg": "count",
"value": 1612
},
{
"table": "edge_inferences",
"field": "device_id",
"agg": null,
"value": "JTS-L3-01"
}
],
"summary": "PLC 는 1,702개를 셌는데 AI 추론 기록은 1,612개라 90개(5.3%)가 찍히지 않았고, 허용치 2% 를 넘었습니다. 찍힌 부품의 놓친 불량과 과검출은 목표 안입니다.",
"next_action_note": "L3 라벨 부착은 내일 교대 전에 JTS-L3-01 의 촬영 트리거 지연과 컨베이어 속도 변경 여부부터 확인합니다."
},
{
"site": "세진정밀",
"work_date": "2026-10-02",
"line_id": "L4",
"shift": "B",
"verdict": "실증 목표 충족",
"also_found": [],
"kpi_stage": "2차",
"produced_qty": 1708,
"inferred_qty": 1700,
"capture_missing_pct": 0.5,
"no_verdict_qty": 0,
"matched_recheck": 310,
"human_defect": 54,
"missed_defect": 1,
"miss_rate_pct": 1.9,
"human_good": 256,
"overkill": 11,
"overkill_rate_pct": 4.3,
"unmatched_recheck_part_ids": [],
"example_part_ids": [
"SJ-L4-1002-0120"
],
"evidence": [
{
"table": "recheck_results",
"field": "part_id",
"agg": "count",
"value": 310
},
{
"table": "pilot_kpi",
"field": "min_recheck",
"agg": null,
"value": 80
},
{
"table": "pilot_kpi",
"field": "max_miss_rate",
"agg": null,
"value": 3
},
{
"table": "pilot_kpi",
"field": "max_overkill_rate",
"agg": null,
"value": 6
}
],
"summary": "놓친 불량 1.9%, 과검출 4.3% 로 L4 의 엄격한 2차 목표 3%·6% 안이고, 재검 310개도 최소 80개를 넘었습니다.",
"next_action_note": null
},
{
"site": "세진정밀",
"work_date": "2026-10-02",
"line_id": "L5",
"shift": "B",
"verdict": "재검 표본 부족",
"also_found": [],
"kpi_stage": "2차",
"produced_qty": 1690,
"inferred_qty": 1684,
"capture_missing_pct": 0.4,
"no_verdict_qty": 0,
"matched_recheck": 41,
"human_defect": 6,
"missed_defect": 0,
"miss_rate_pct": 0,
"human_good": 35,
"overkill": 2,
"overkill_rate_pct": 5.7,
"unmatched_recheck_part_ids": [],
"example_part_ids": [
"SJ-L5-1002-0077"
],
"evidence": [
{
"table": "recheck_results",
"field": "part_id",
"agg": "count",
"value": 41
},
{
"table": "pilot_kpi",
"field": "min_recheck",
"agg": null,
"value": 50
},
{
"table": "edge_inferences",
"field": "part_id",
"agg": null,
"value": "SJ-L5-1002-0077"
}
],
"summary": "AI 판정과 짝지어진 재검이 41개라 2차 최소 50개에 못 미쳐, 놓친 불량 0.0% 와 과검출 5.7% 를 목표와 견주지 않았습니다.",
"next_action_note": "L5 포장 전 검사는 B조 재검 담당자가 다른 라인 지원으로 빠졌는지 확인하고, 내일은 재검 표본을 교대 초반에 먼저 채우도록 고객사 품질 담당자에게 요청합니다."
},
{
"site": "세진정밀",
"work_date": "2026-10-02",
"line_id": "L1",
"shift": "C",
"verdict": "실증 목표 충족",
"also_found": [],
"kpi_stage": "2차",
"produced_qty": 1500,
"inferred_qty": 1470,
"capture_missing_pct": 2,
"no_verdict_qty": 0,
"matched_recheck": 120,
"human_defect": 60,
"missed_defect": 3,
"miss_rate_pct": 5,
"human_good": 60,
"overkill": 2,
"overkill_rate_pct": 3.3,
"unmatched_recheck_part_ids": [],
"example_part_ids": [
"SJ-L1-1002-1688"
],
"evidence": [
{
"table": "plc_counts",
"field": "produced_qty",
"agg": null,
"value": 1500
},
{
"table": "edge_inferences",
"field": "part_id",
"agg": "count",
"value": 1470
},
{
"table": "edge_inferences",
"field": "captured_at",
"agg": null,
"value": "2026-10-03 02:14"
},
{
"table": "pilot_kpi",
"field": "max_miss_rate",
"agg": null,
"value": 5
}
],
"summary": "촬영 누락이 30/1,500 으로 정확히 2.0%, 놓친 불량이 3/60 으로 정확히 5.0% 라 둘 다 기준과 같아 넘지 않은 것으로 둡니다. 10월 3일 02:14 에 찍힌 SJ-L1-1002-1688 도 C조 시작일인 10월 2일로 셉니다.",
"next_action_note": null
},
{
"site": "세진정밀",
"work_date": "2026-10-02",
"line_id": "L2",
"shift": "C",
"verdict": "실증 목표 충족",
"also_found": [],
"kpi_stage": "2차",
"produced_qty": 1495,
"inferred_qty": 1480,
"capture_missing_pct": 1,
"no_verdict_qty": 12,
"matched_recheck": 150,
"human_defect": 20,
"missed_defect": 0,
"miss_rate_pct": 0,
"human_good": 130,
"overkill": 6,
"overkill_rate_pct": 4.6,
"unmatched_recheck_part_ids": [
"SJ-L2-1002-1597"
],
"example_part_ids": [
"SJ-L2-1002-1530",
"SJ-L2-1002-1544"
],
"evidence": [
{
"table": "edge_inferences",
"field": "ai_verdict",
"agg": null,
"value": null
},
{
"table": "edge_inferences",
"field": "ai_verdict",
"agg": "count",
"value": 12
},
{
"table": "recheck_results",
"field": "part_id",
"agg": null,
"value": "SJ-L2-1002-1597"
},
{
"table": "plc_counts",
"field": "produced_qty",
"agg": null,
"value": 1495
},
{
"table": "edge_inferences",
"field": "part_id",
"agg": "count",
"value": 1480
}
],
"summary": "추론이 끝나지 않은 12개는 촬영 수에는 넣고 짝짓기에서는 뺐습니다. 재검했지만 추론 기록이 없는 SJ-L2-1002-1597 은 따로 적었고, 남은 짝으로 본 놓친 불량 0.0%·과검출 4.6% 는 목표 안입니다.",
"next_action_note": null
}
][자동 검증 · 코드가 판정합니다] 1. verdict 가 실증 목표 충족·놓친 불량이 목표를 넘음·양품을 너무 많이 걸러냄·촬영 누락·재검 표본 부족 다섯 값 중 하나인지 확인합니다. 2. 필수 필드 site·work_date·line_id·shift·verdict·also_found·kpi_stage·produced_qty·inferred_qty·capture_missing_pct·no_verdict_qty·matched_recheck·human_defect·missed_defect·miss_rate_pct·human_good·overkill·overkill_rate_pct·unmatched_recheck_part_ids·example_part_ids·evidence·summary·next_action_note 가 모두 존재하는지 확인합니다. 3. work_date 를 다시 계산합니다. shift 가 C 이고 captured_at 이 06:00 전이면 captured_at 날짜의 하루 전을 교대 시작일로 봅니다. SJ-L1-1002-1688 은 2026-10-03 02:14 촬영이라 2026-10-02 입니다. 4. kpi_stage 를 다시 계산합니다. 같은 line_id 의 pilot_kpi 가운데 effective_from 이 work_date 이하인 행 중 가장 늦은 행의 stage 와 같은지 봅니다. 2026-10-02 는 2차입니다. 5. capture_missing_pct 가 (produced_qty - inferred_qty) / produced_qty × 100 과 같은지 다시 계산합니다. L3 B 는 (1702 - 1612) / 1702 로 5.3 입니다. 6. miss_rate_pct 가 missed_defect / human_defect × 100, overkill_rate_pct 가 overkill / human_good × 100 과 같은지 다시 계산합니다. human_defect 나 human_good 이 0 이면 그 값은 null 입니다. 7. 반올림 전 capture_missing_pct 가 2 보다 크면 verdict 는 촬영 누락입니다. 2 와 같은 L1 C 는 걸리지 않습니다. 8. 7에 걸리지 않고 matched_recheck 가 pilot_kpi.min_recheck 보다 작으면 verdict 는 재검 표본 부족이고, 이때는 두 비율을 목표와 견주지 않습니다. 9. 7·8에 걸리지 않고 반올림 전 miss_rate_pct 가 pilot_kpi.max_miss_rate 보다 크면 verdict 는 놓친 불량이 목표를 넘음입니다. 5.0 과 같은 L1 C 는 걸리지 않습니다. 10. 7~9에 걸리지 않고 반올림 전 overkill_rate_pct 가 pilot_kpi.max_overkill_rate 보다 크면 verdict 는 양품을 너무 많이 걸러냄입니다. 9와 10이 함께 걸리면 10은 also_found 에 들어갑니다. 11. 7~10 어디에도 걸리지 않으면 verdict 는 실증 목표 충족이고 next_action_note 는 null 입니다. 12. ai_verdict 가 null 인 줄은 inferred_qty 에 들어가고 matched_recheck 에는 들어가지 않는지, recheck_results.part_id 가 edge_inferences 에 없으면 unmatched_recheck_part_ids 에 들어가는지 봅니다(SJ-L2-1002-1597). 13. 두 비율이 채워졌으면 0~100 범위인지 봅니다. 14. evidence 의 table·field 가 edge_inferences·recheck_results·plc_counts·pilot_kpi 에 실재하는 컬럼인지 대조합니다. 15. agg 가 없는 evidence 의 value 가 그 컬럼에 수록된 행의 값 원문과 같은지 확인합니다. agg 가 count 인 값은 교대 전체 파일에서 센 수입니다. 16. summary 와 next_action_note 가 존댓말로 끝나는지 확인합니다. [수동 검증 · 사람이 봅니다] 1. 놓친 불량과 과검출 이미지의 원인이 촬영 조건인지 모델인지는 FDE 엔지니어가 이미지를 열어 AI 팀과 함께 정합니다. 2. 재검 표본을 어떻게 뽑았는지(무작위인지, AI 불량 판정만 골랐는지)는 고객사 품질 담당자에게 확인합니다. [평가 러너 · 2주차] 1. 손으로 판정을 단 라인·교대 70개에서 CLI 판정과 일치하는 수를 셉니다. 2. 놓친 불량 비율과 과검출 비율에 윌슨 구간(표본이 작을 때 비율이 어디서 어디까지 흔들릴 수 있는지 보여주는 범위)을 붙여, 구간이 목표를 걸치는 라인을 따로 셉니다.