웨이스
경력근거: 공장마다 설비 세대도, 통신 규약도, 데이터 구조도 다릅니다
※ 실제 산출물이 아닌 AI 예측 시안입니다.
공고가 이 자리를 두고 '공장마다 설비 세대도, 통신 규약도, 데이터 구조도 다릅니다. 원격으로는 풀리지 않고 현장에 들어가야 합니다' 라고 적었고, 그래서 '진단부터 구축, 현장 검증까지 한 사람이 끝까지 끌고 가는 방식' 으로 일한다고 밝혔습니다. 태그가 표준 항목에 붙는지 가르는 일이 그 진단의 첫 단계이고, 이 포트폴리오는 그 판단을 항목표와 규칙으로 만듭니다. 공고가 보는 기준으로 '그 숫자는 어떻게 나왔는가' 를 앞세운 것도, 판정마다 표본 값과 기준을 함께 싣는 이 설계와 맞습니다. 이 포트폴리오가 보여주는 것은 표준 항목을 데이터로 두고 설비 태그와 맞춰 붙는지 가르는 기술이며, 프레스·자율이동로봇 운영 실무나 디지털트윈 전문성은 주장하지 않습니다. 모르는 깊이는 면접에서 모른다고 말하는 편이 낫습니다.
'공장마다 설비 세대도, 통신 규약도, 데이터 구조도 다릅니다'. 그 다름이 이 편의 입력입니다.
'진단부터 구축, 현장 검증까지 한 사람이 끝까지 끌고 가는 방식'. 붙는지 가르는 일이 진단의 첫 단계입니다.
'그 숫자는 어떻게 나왔는가'. 판정마다 표본 값과 기준을 함께 실어 답합니다.
설비에서 내려받은 태그가 MES 표준 항목에 붙는지 가릅니다. 표준 항목표에 기대 자료형과 단위, 값 범위를 두고 태그 목록과 맞춰, 단위와 자료형이 맞으면 환산해 붙이고 그렇지 않으면 단위 불일치·자료형 불일치·범위 밖 중 어느 쪽인지 사유로 남깁니다. 표본 값이 비면 무엇이 올라오는지 확인할 수 없다고 표시하고, 표준 항목에 없는 태그는 미매핑으로 남겨 항목을 먼저 정하게 합니다. 태그 목록은 실 고객사 설비 대신 지원자가 공개 PLC 태그 규격으로 만든 것을 가정합니다.
공장에 들어가 설비와 MES 를 잇는 자리에 앉는 현장배치 엔지니어입니다. 설비마다 태그 이름과 단위가 달라, 어떤 태그를 어느 항목에 붙일지를 매번 현장에서 목록 두 장을 번갈아 보며 맞추던 사람입니다.
표준 항목마다 기대 자료형과 단위, 값 범위를 표로 두고 설비 태그와 맞추면, 붙는 태그와 못 붙는 태그가 규칙으로 갈리고 못 붙는 이유가 근거로 남는다는 가정입니다. 표준 항목에 없는 태그는 미매핑으로 빠지므로 항목이 아직 없는 자리가 그대로 드러납니다.
설비 태그 목록과 MES 표준 항목표를 받아 태그마다 매핑·불가를 판정하고, 못 붙으면 단위 불일치·자료형 불일치·범위 밖·표본 없음·미매핑 중 어느 쪽인지 붙여 라인별로 묶은 판정 리포트를 터미널과 Markdown 파일로 내는 CLI 가 도는 완결품입니다.
공개 규격으로 만든 태그 목록 300건에 손으로 붙인 정답 매핑과 대조해 일치율을 내고, 미매핑이 몰리는 태그를 모아 표준 항목이 없는 자리를 목록으로 냅니다.
매핑이 정해진 태그만 모아 환산 계수를 반영한 연동 설정 초안을 조립하고, 못 붙은 태그는 현장 확인 목록으로 갈라 내는 단계입니다.
현장배치 엔지니어가 태그 목록과 표준 항목표를 넣으면 태그마다 매핑 여부와 못 붙은 사유가 라인별로 묶여 나오는 과정을 시연합니다.
공개 규격으로 만든 태그 300건과 손으로 붙인 정답 매핑을 대조해 일치율을 냅니다. 단, 정답과 태그 목록을 모두 작성자가 만든 합성 기준이라 성능 검증이 아니라 데모 조건 동작입니다.
표본이 비었거나 라인 표기가 흔들리거나 항목표에 없는 태그가 섞인 입력 30종을 넣어도 출력 형식이 안 깨지고 사유별로 빠지는 비율을 보여줍니다.
항목표의 단위와 범위를 바꿨을 때 옛 판정이 어떻게 뒤집히는지 회귀로 확인합니다.
진짜 성능 검증은 여기서 멈춥니다. 위 수치는 작성자가 만든 태그 목록의 자가채점이며, 실제 연동 정합은 웨이스 고객사의 실 설비와 실 MES 규격이 있어야 측정됩니다. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태까지 만듭니다.
수치는 합성 데이터 자가채점이라 성능 증명이 아니므로, 면접에서는 데모 동작과 실검증 준비 상태로 솔직히 설명합니다.
정답을 작성자가 붙였으니 잘 맞는 게 당연하므로, 단위 불일치와 범위 밖 값, 항목표에 없는 태그를 일부러 섞어 쉬운 태그만 푸는 함정을 피합니다.
이 포트폴리오가 보여주는 것은 표준 항목을 데이터로 두고 설비 태그와 맞춰 붙는지 가르는 기술이며, 프레스·자율이동로봇 운영 실무나 디지털트윈 전문성은 주장하지 않습니다. 판정은 단위 환산과 범위 비교가 하고 LLM 은 담당자가 읽을 사유 문장만 맡습니다.
태그 이름이 비슷하다고 같은 항목이라는 보장이 없어서, 이름만으로 붙이지 않고 표본 값을 함께 실어 현장이 확인하게 둡니다.
실제 도입 때는 공장마다 설비 세대와 통신 규약이 다르므로, 항목표와 환산 계수를 새로 채우는 일을 도입 단계 과제로 둡니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
설비에서 내려받은 태그 목록입니다. 태그 번호와 라인 표기, 태그 이름, 자료형, 단위 표기, 표본 값, 수집일, 설비사를 한 행에 둡니다. 라인 표기는 설비마다 손으로 적어 'PRESS-2'와 'press 2'처럼 흔들립니다. 표본 값과 설비사가 비어 있는 행, 상한을 넘는 값, 표준 항목에 없는 한글 태그를 일부러 섞어 두어 사유가 갈리게 둡니다.
| tag_no | line_raw | tag_raw | data_type | unit_raw | sample_value | scanned_at | vendor_name |
|---|---|---|---|---|---|---|---|
| TG-1001 | PRESS-1 | press_force | float | kN | 820 | 2026-08-20 | 미쓰비시 |
| TG-1002 | PRESS-1 | stroke_count | int | 회 | 13,820 | 2026-08-20 | 미쓰비시 |
| TG-1003 | PRESS-2 | press_force | float | tonf | 83.6 | 2026-08-20 | LS일렉트릭 |
| TG-1004 | press 2 | motor_temp | float | ℃ | 62.4 | 2026-08-20 | LS일렉트릭 |
| TG-1005 | PRESS-3 | motor_temp | float | ℉ | 149 | 2026-08-21 | 지멘스 |
아래 JSON Schema 를 그대로 만족하는 설비 태그 행을 300개 더 만들어 주세요. 라인을 프레스와 자율이동로봇으로 나누고 라인 표기는 몇 행에서 'press 2'처럼 흔들리게 둡니다. 단위는 kN·tonf·℃·℉처럼 같은 물리량을 다르게 적고, 2할은 표본 값이나 설비사를 비우며, 몇 행은 상한을 넘는 값과 한글 태그 이름을 넣으세요. 매핑 결과나 환산값은 넣지 마세요.
{"type": "object", "properties": {"tag_no": {"type": "string"}, "line_raw": {"type": "string"}, "tag_raw": {"type": "string"}, "data_type": {"type": "string"}, "unit_raw": {"type": ["string", "null"]}, "sample_value": {"type": ["number", "null"]}, "scanned_at": {"type": "string"}, "vendor_name": {"type": ["string", "null"]}}, "required": ["tag_no", "line_raw", "tag_raw", "data_type", "unit_raw", "sample_value", "scanned_at"]}{"type": "object", "properties": {"tag_no": {"type": "string"}, "line_raw": {"type": "string"}, "tag_raw": {"type": "string"}, "data_type": {"type": "string"}, "unit_raw": {"type": ["string", "null"]}, "sample_value": {"type": ["number", "null"]}, "scanned_at": {"type": "string"}, "vendor_name": {"type": ["string", "null"]}}, "required": ["tag_no", "line_raw", "tag_raw", "data_type", "unit_raw", "sample_value", "scanned_at"]}MES 표준 항목표입니다. 항목 번호와 이름, 기대 자료형과 단위, 최소·최대, 필수 여부, 담당을 한 행에 둡니다. 항목마다 기대 단위가 정해져 있어 설비가 다른 단위로 올리면 환산이 필요합니다. 태그 목록에 나오는 이름 중 일부는 일부러 넣지 않아 미매핑이 도출되게 둡니다.
| field_no | field_raw | expected_type | expected_unit | min_value | max_value | required_flag | owner_name |
|---|---|---|---|---|---|---|---|
| MF-1001 | press_force | float | kN | 100 | 2,000 | true | 생산기술 |
| MF-1002 | stroke_count | int | 회 | 0 | 999,999 | true | 생산기술 |
| MF-1003 | motor_temp | float | ℃ | -10 | 120 | true | 설비보전 |
| MF-1004 | run_flag | bool | — | — | — | true | 생산기술 |
| MF-1005 | battery_pct | float | % | 0 | 100 | true | 물류자동화 |
아래 JSON Schema 를 그대로 만족하는 MES 표준 항목 행을 40개 더 만들어 주세요. 자료형을 세 값으로 고루 쓰고 항목마다 기대 단위와 범위를 물리량에 맞게 정합니다. 태그 목록에 나오는 이름 중 일부는 일부러 넣지 마세요 — 미매핑이 있어야 항목표의 구멍이 드러납니다. 판정 결과는 넣지 마세요.
{"type": "object", "properties": {"field_no": {"type": "string"}, "field_raw": {"type": "string"}, "expected_type": {"type": "string", "enum": ["int", "float", "bool"]}, "expected_unit": {"type": ["string", "null"]}, "min_value": {"type": ["number", "null"]}, "max_value": {"type": ["number", "null"]}, "required_flag": {"type": "boolean"}, "owner_name": {"type": "string"}}, "required": ["field_no", "field_raw", "expected_type", "required_flag", "owner_name"]}{"type": "object", "properties": {"field_no": {"type": "string"}, "field_raw": {"type": "string"}, "expected_type": {"type": "string", "enum": ["int", "float", "bool"]}, "expected_unit": {"type": ["string", "null"]}, "min_value": {"type": ["number", "null"]}, "max_value": {"type": ["number", "null"]}, "required_flag": {"type": "boolean"}, "owner_name": {"type": "string"}}, "required": ["field_no", "field_raw", "expected_type", "required_flag", "owner_name"]}| Python | 태그 목록과 표준 항목표를 맞춰 단위를 환산하고 범위를 견주는 판정기를 맡습니다. |
| Docker | 공장마다 다른 환경에서 같은 결과가 나오도록 CLI 를 컨테이너로 싸 둡니다. |
| Markdown | 라인별로 묶은 판정 리포트와 현장 확인 목록을 파일로 냅니다. |
✗ fail → 미매핑이 절반을 넘으면 항목표를 먼저 채웁니다.
✓ pass → 2주차 정답 대조로 넘어갑니다.
✗ fail → 어긋난 유형을 모아 단위와 범위 정의를 다시 봅니다.
✓ pass → 3주차 연동 설정 초안으로 넘어갑니다.
태그 하나와 표준 항목이 만나는 자리마다 붙는지 정합니다. 붙으면 기대 단위로 환산한 값을 싣고, 못 붙으면 단위 불일치·자료형 불일치·범위 밖·표본 없음·미매핑 중 어느 쪽인지 싣습니다. 화면과 리포트는 이 사유 코드로 묶습니다.
{"type": "object", "properties": {"verdict_no": {"type": "string"}, "tag_no": {"type": "string"}, "line_raw": {"type": "string"}, "tag_raw": {"type": "string"}, "field_no": {"type": ["string", "null"]}, "map_code": {"type": "string", "enum": ["mapped", "unit_mismatch", "type_mismatch", "value_out_of_range", "sample_missing", "tag_unmapped"]}, "converted_value": {"type": ["number", "null"], "description": "sample_value 에 단위 환산 계수를 곱해 MES 기대 단위로 바꾼 값입니다. mapped 일 때만 채웁니다."}, "expected_unit": {"type": ["string", "null"]}, "owner_name": {"type": ["string", "null"]}, "evidence": {"type": "array", "items": {"type": "object", "properties": {"field": {"type": "string"}, "agg": {"type": ["string", "null"]}, "value": {}}, "required": ["field", "value"]}}, "summary": {"type": "string"}, "hedge": {"type": ["string", "null"]}}, "required": ["verdict_no", "tag_no", "line_raw", "tag_raw", "map_code", "evidence", "summary"]}[
{
"verdict_no": "TV-001",
"tag_no": "TG-1001",
"line_raw": "PRESS-1",
"tag_raw": "press_force",
"field_no": "MF-1001",
"map_code": "mapped",
"converted_value": 820,
"expected_unit": "kN",
"owner_name": "생산기술",
"evidence": [
{
"field": "sample_value",
"agg": null,
"value": 820
},
{
"field": "expected_unit",
"agg": null,
"value": "kN"
}
],
"summary": "단위가 kN 그대로이고 범위 안이라 환산 없이 그대로 올립니다.",
"hedge": null
},
{
"verdict_no": "TV-002",
"tag_no": "TG-1004",
"line_raw": "press 2",
"tag_raw": "motor_temp",
"field_no": "MF-1003",
"map_code": "mapped",
"converted_value": 62.4,
"expected_unit": "℃",
"owner_name": "설비보전",
"evidence": [
{
"field": "line_raw",
"agg": null,
"value": "press 2"
},
{
"field": "sample_value",
"agg": null,
"value": 62.4
}
],
"summary": "라인 표기가 'press 2'로 달리 적혀 있으나 접으면 PRESS-2 와 같아 그대로 올립니다.",
"hedge": null
},
{
"verdict_no": "TV-003",
"tag_no": "TG-1003",
"line_raw": "PRESS-2",
"tag_raw": "press_force",
"field_no": "MF-1001",
"map_code": "unit_mismatch",
"converted_value": null,
"expected_unit": "kN",
"owner_name": "생산기술",
"evidence": [
{
"field": "unit_raw",
"agg": null,
"value": "tonf"
},
{
"field": "expected_unit",
"agg": null,
"value": "kN"
}
],
"summary": "tonf 로 올라오는데 MES 는 kN 을 기대해 환산 계수를 먼저 정해야 합니다.",
"hedge": "1 tonf 를 9.807 kN 으로 볼지 설비사와 확인이 필요합니다."
},
{
"verdict_no": "TV-004",
"tag_no": "TG-1006",
"line_raw": "PRESS-3",
"tag_raw": "run_flag",
"field_no": "MF-1004",
"map_code": "type_mismatch",
"converted_value": null,
"expected_unit": null,
"owner_name": "생산기술",
"evidence": [
{
"field": "data_type",
"agg": null,
"value": "int"
},
{
"field": "expected_type",
"agg": null,
"value": "bool"
}
],
"summary": "가동 신호가 정수로 올라오는데 MES 는 참·거짓을 기대해 변환 규칙이 필요합니다.",
"hedge": null
},
{
"verdict_no": "TV-005",
"tag_no": "TG-1009",
"line_raw": "AMR-2",
"tag_raw": "battery_pct",
"field_no": "MF-1005",
"map_code": "value_out_of_range",
"converted_value": null,
"expected_unit": "%",
"owner_name": "물류자동화",
"evidence": [
{
"field": "sample_value",
"agg": null,
"value": 137
},
{
"field": "max_value",
"agg": null,
"value": 100
}
],
"summary": "배터리가 137% 로 읽혀 상한 100 을 넘습니다. 스케일 설정을 먼저 봅니다.",
"hedge": null
},
{
"verdict_no": "TV-006",
"tag_no": "TG-1010",
"line_raw": "PRESS-3",
"tag_raw": "cycle_time",
"field_no": "MF-1008",
"map_code": "sample_missing",
"converted_value": null,
"expected_unit": "s",
"owner_name": "생산기술",
"evidence": [
{
"field": "sample_value",
"agg": null,
"value": null
},
{
"field": "vendor_name",
"agg": null,
"value": null
}
],
"summary": "표본 값과 설비사가 모두 비어 무엇이 올라오는지 확인할 수 없습니다.",
"hedge": null
},
{
"verdict_no": "TV-007",
"tag_no": "TG-1012",
"line_raw": "PRESS-2",
"tag_raw": "오일압",
"field_no": null,
"map_code": "tag_unmapped",
"converted_value": null,
"expected_unit": null,
"owner_name": null,
"evidence": [
{
"field": "tag_raw",
"agg": null,
"value": "오일압"
},
{
"field": "field_no",
"agg": "count",
"value": 12
}
],
"summary": "태그가 한글로 적혀 있어 표준 항목 열두 개 어디에도 붙지 않습니다.",
"hedge": "oil_pressure 로 보이나 이름만으로 단정하지 않고 현장에 확인합니다."
}
][자동 검증 · 코드가 판정합니다] 1. map_code 가 enum 여섯 값 중 하나인지 확인합니다. 2. verdict_no·tag_no·line_raw·tag_raw·map_code·evidence·summary 가 모두 채워졌는지 확인합니다. 3. tag_no 가 태그 목록에 실재하는 번호인지 대조합니다. 4. field_no 가 있으면 표준 항목표에 실재하는 행 번호인지 대조합니다. 5. field_no 가 있으면 expected_unit·owner_name 이 그 항목 행의 값과 같은지 대조합니다. 6. line_raw·tag_raw 를 공백과 기호를 지워 접은 뒤 표준 항목과 맞고, 맞는 행이 없으면 map_code 가 tag_unmapped 인지 확인합니다. 7. map_code 가 mapped 이면 converted_value 를 sample_value 에 환산 계수를 곱해 다시 계산해 같은지 확인합니다. 8. map_code 가 mapped 이면 converted_value 가 min_value 이상 max_value 이하인지 다시 확인합니다. 9. map_code 가 unit_mismatch 이면 unit_raw 가 expected_unit 과 다르고 환산 계수가 선언돼 있지 않은지 확인합니다. 10. map_code 가 type_mismatch 이면 data_type 이 expected_type 과 다른지 확인합니다. 11. map_code 가 value_out_of_range 이면 sample_value 가 선언 범위를 벗어나는지 다시 계산합니다. 12. sample_value 가 비어 있으면 map_code 가 sample_missing 인지 확인합니다. 13. evidence 의 field 이름이 태그 목록과 항목표에 실재하는 컬럼인지 대조합니다. 14. agg 가 없는 evidence 의 value 가 그 컬럼에 수록된 행 값과 같은지 확인합니다. 15. summary 가 존댓말로 끝나는지 확인합니다. [평가 러너 · 2주차] 공개 규격으로 만든 태그 300건에 손으로 붙인 정답 매핑과 대조해 일치율과 사유 코드별 분포를 내고, 미매핑이 몰리는 태그를 모아 표준 항목이 없는 자리를 목록으로 냅니다. [수동 검증 · 사람이 봅니다] 1. 단위 환산 계수를 어느 값으로 쓸지 설비사와 확인해 담당자가 정합니다. 2. 이름이 비슷한 미매핑 태그를 어느 항목에 붙일지 현장에서 확인합니다.
근거: 공장마다 설비 세대도, 통신 규약도, 데이터 구조도 다릅니다