마키나락스
경력근거: 다양한 AI 모델 및 AI Agent 를 사용자가 쉽게 활용할 수 있도록 하는 AI 애플리케이션의 백엔드를 구현합니다
마키나락스 FDE본부 Frontier팀은 산업 현장에 나가 제조와 물류의 예측·이상탐지·최적화 과제를 정의하고, 시나리오 기반 시뮬레이션을 설계해 운영 최적화 문제를 풉니다. 공고가 커뮤니케이션 역량을 따로 적어 둔 것도 같은 맥락으로 읽힙니다. 시뮬레이션 결과는 현장 담당자가 무슨 조건으로 나온 숫자인지 납득해야 편성이 실제로 바뀌기 때문입니다. 이 도구는 정확히 그 지점에 놓입니다. 담당자가 쓰는 말 그대로 물으면 조건으로 옮겨 보여 주고, 확인을 받은 뒤 고정 시드로 돌려 기준안과 나란히 비교합니다. 다만 이 포트폴리오가 보여주는 것은 자연어를 시뮬레이션 조건으로 옮기고 결정론적으로 실행해 근거를 들어 답하는 기술 역량이며, 양산 제조의 FDC·예지보전 같은 도메인 전문성은 주장하지 않습니다. 모르는 깊이는 면접에서 모른다고 말하는 편이 낫습니다.
시나리오 기반 시뮬레이션을 설계하고 이를 활용해 운영 최적화 문제를 정의하고 해결하는 역할입니다.
제조 및 물류 도메인의 산업 데이터를 분석해 문제를 정의하고 시스템 구조를 설계합니다.
연구개발의 기술 세부사항을 이해관계자가 쉽게 이해하도록 명확하게 전달합니다.
고객사 물류센터에 파견 나가 MES 에서 내려받은 작업장·교대 추출본과 주문 도착 로그를 한 폴더에 두고, 운영팀장이 `simq ask "야간 C라인 피킹 인력을 두 명 줄이면 출하 지연이 얼마나 늘까"` 처럼 한 줄로 물으면 그 문장을 시뮬레이션 조건 JSON 으로 옮깁니다. 조건에 쓸 수 있는 라인·작업장·교대는 추출본에서 뽑은 카탈로그에 있는 것만 허용하고, 도구는 해석한 조건을 먼저 터미널에 보여 확인을 받은 뒤 고정 시드 이산사건 시뮬레이션으로 기준안과 변경안을 각각 돌립니다. 출하 지연과 정시 완료 비율의 차이와 근거로 쓴 추출본 행 번호를 출력하고, 카탈로그에 없는 라인을 가리키거나 몇 명을 뺄지가 빠진 문장은 돌리지 않고 무엇이 모자란지 되묻습니다. 모델이 만드는 것은 조건뿐이고 숫자는 시뮬레이션이 내므로, 정답 조건 JSON 과 대조해 맞았는지 기계로 판정합니다.
계약된 고객사(생활용품 물류센터 겸 소규모 조립 라인)의 운영팀장입니다. 교대 편성을 바꿔도 되는지, 긴급 주문을 먼저 넣으면 일반 주문이 얼마나 밀리는지가 매번 궁금하지만 확인하는 방법이 엑셀에 손으로 값을 바꿔 보는 것뿐이라 반나절이 걸리고 결과도 사람마다 다릅니다. 파견 나온 엔지니어에게 물으면 스프레드시트를 새로 만들어 이틀 뒤에 답을 주는데, 그때는 이미 편성을 결정한 뒤입니다. 숫자만 던져주는 답은 믿지 못하므로 어떤 조건으로 계산한 것인지 같이 보이기를 바라고, 물어본 문장이 애매하면 그럴듯하게 넘겨짚지 말고 되물어 주기를 바라는 사람입니다.
질문에 쓸 수 있는 라인·작업장·교대와 조건 유형을 추출본에서 뽑은 카탈로그로 좁혀 놓고 모델에게 답이 아니라 조건만 만들게 하면, (가) 한 줄로 쓴 '만약에' 질문이 실행 가능한 시뮬레이션 조건으로 옮겨지고, (나) 대상이 빠졌거나 카탈로그 밖을 가리키는 문장은 실행 전에 되묻기로 돌아가며, (다) 맞았는지는 정답 조건 JSON 과 대조해 사람 판단 없이 판정된다는 가설입니다.
고객사 추출본 폴더와 질문 한 줄을 넣으면 해석한 조건을 먼저 보여 확인을 받고, 고정 시드 이산사건 시뮬레이션으로 기준안과 변경안을 돌려 출하 지연 차이와 근거 행 번호를 터미널에 찍는 CLI입니다. 카탈로그에 없는 라인이나 수량이 빠진 문장은 돌리지 않고 되묻습니다.
질문 40건을 정답 조건 JSON 과 대조해 일치율을 재고, 인력과 투입 순서를 여러 값으로 바꿔 돌린 결과를 한 표로 세워 어느 편성이 지연이 적은지 터미널에서 비교하는 구성입니다.
합성 주문 로그를 늘려 질문 묶음을 한 번에 돌리고, 실행마다 조건과 시드와 입력 파일 해시를 이력으로 남겨 같은 입력이 같은 답을 내는지 확인하는 배치 실행기입니다.
고객사 추출본 폴더와 질문 한 줄을 터미널에 넣으면 해석한 조건, 기준안과 변경안의 출하 지연 차이, 근거로 쓴 추출본 행 번호가 함께 찍힙니다.
라인이 지정되지 않았거나 감축 인원이 빠졌거나 추출본에 없는 라인을 가리키는 함정 질문 8개를 넣으면, 시뮬레이션을 돌리지 않고 무엇이 모자라서 못 하는지 되묻습니다.
소계 행·병합 셀 잔재·숫자 서식이 섞인 추출본 30건을 넣어도 카탈로그 생성이 멈추지 않고 무시한 행을 따로 알려줍니다.
질문 40건을 정답 조건 JSON 과 대조해 조건 일치율을 재고, 같은 시드로 두 번 돌린 결과가 완전히 같은지 확인합니다. 다만 질문과 정답 조건 모두 작성자가 만든 합성 기준이라 성능 검증이 아니라 데모 조건에서의 동작입니다.
진짜 성능 검증은 여기서 멈춥니다. 위 수치는 전부 작성자가 만든 더미 추출본과 직접 붙인 정답 조건의 자가채점이며, 실제 해석 정확도와 지연 예측의 쓸모는 마키나락스가 들어간 고객사의 실 MES 추출본과 실제 편성 결과가 있어야 측정 가능합니다. 이 도구는 그 검증을 바로 돌릴 수 있는 상태로 만듭니다.
수치는 합성 추출본과 작성자가 붙인 정답 조건을 자가채점한 결과라 성능 증명이 아니므로, 면접에서는 데모 동작과 실검증 준비 상태로 솔직히 설명합니다.
질문과 정답 조건을 같은 사람이 만들면 잘 맞는 것이 당연하므로, 라인 표기가 흔들리는 문장·수량이 빠진 문장·카탈로그 밖 작업장을 가리키는 문장을 일부러 섞어 되묻기가 도는지 봅니다.
이 포트폴리오가 보여주는 것은 자연어를 시뮬레이션 조건으로 옮기고 결정론적으로 실행해 근거를 들어 답하는 기술이며, 양산 제조와 물류의 FDC·예지보전 도메인 전문성은 주장하지 않습니다. 모르는 깊이는 면접에서 모른다고 말하는 편이 낫습니다.
실제 도입에서는 고객사마다 공정 시간 분포와 교대 규칙이 달라 시뮬레이션 파라미터를 현장 데이터로 다시 맞춰야 하며, 지연 예측의 적중은 편성을 실제로 바꿔 본 뒤에야 확인되는 도입 단계 과제입니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
고객사 MES 에서 내려받은 작업장·교대 추출본입니다. 라인 표기와 공정 시간을 카탈로그로 정규화해 시뮬레이션 입력으로 만드는 원본이 됩니다.
| row_id | line_raw | station_id | station_name | shift | headcount | cycle_time_sec | changeover_min | note |
|---|---|---|---|---|---|---|---|---|
| r-001 | A라인 | ST-A1 | 절단 | 주간 | 3 | 42.5 | 12 | — |
| r-002 | A라인 | ST-A2 | 성형 | 주간 | 2 | 61 | 15 | — |
| r-003 | A 라인 | ST-A1 | 절단 | 야간 | 2 | 44 | 12 | 라인 표기가 앞 행과 다릅니다 |
| r-004 | B라인 | ST-B1 | 조립 | 주간 | 4 | 1,250 | 20 | 엑셀 숫자 서식이 문자열로 내려왔습니다 |
| r-005 | B라인 | — | 검사 | 주간 | 1 | 30 | 5 | 설비 마스터에 없는 작업장입니다 |
다음 JSON Schema 에 맞는 고객사 작업장·교대 추출본 행을 더 생성하세요: {"type":"object","properties":{"row_id":{"type":"string"},"line_raw":{"type":"string"},"station_id":{"type":["string","null"]},"station_name":{"type":"string"},"shift":{"type":"string","enum":["주간","야간"]},"headcount":{"type":["integer","null"]},"cycle_time_sec":{"type":["number","string","null"]},"changeover_min":{"type":["number","null"]},"note":{"type":["string","null"]}},"required":["row_id","line_raw","station_name","shift"]} 쉬운 데이터만 만들지 마세요. 다음 하드 케이스를 의도적으로 섞습니다. (1) 같은 라인의 다른 표기('A라인'·'A 라인'·'1라인'), (2) 엑셀 소계·합계 행, (3) 병합 셀이 풀려 line_raw 가 빈 문자열인 행, (4) 천 단위 쉼표가 붙어 문자열로 내려온 cycle_time_sec, (5) 마스터에 없는 station_id=null, (6) headcount·changeover_min 결측. 카탈로그 정규화가 이 행들을 어떻게 정리하고 무엇을 무시했다고 알리는지 확인하세요.{"type":"object","properties":{"row_id":{"type":"string"},"line_raw":{"type":"string"},"station_id":{"type":["string","null"]},"station_name":{"type":"string"},"shift":{"type":"string","enum":["주간","야간"]},"headcount":{"type":["integer","null"]},"cycle_time_sec":{"type":["number","string","null"]},"changeover_min":{"type":["number","null"]},"note":{"type":["string","null"]}},"required":["row_id","line_raw","station_name","shift"]}교대 동안 들어온 주문 도착 로그입니다. 시뮬레이션이 소비하는 수요 입력이며 출하 지연과 정시 완료 비율을 재는 기준이 됩니다.
| order_id | line_raw | arrived_at | due_at | qty | priority |
|---|---|---|---|---|---|
| O-1001 | A라인 | 2026-07-20T09:12:00 | 2026-07-20T18:00:00 | 120 | 일반 |
| O-1002 | A라인 | 2026-07-20T09:40:00 | 2026-07-20T14:00:00 | 40 | 긴급 |
| O-1003 | B라인 | 2026-07-20T10:05:00 | 2026-07-20T20:00:00 | 300 | 일반 |
| O-1004 | C라인 | 2026-07-20T11:30:00 | — | 80 | 일반 |
| O-1005 | C 라인 | 2026-07-20T13:00:00 | 2026-07-20T23:00:00 | 210 | 일반 |
다음 JSON Schema 에 맞는 주문 도착 로그 행을 더 생성하세요: {"type":"object","properties":{"order_id":{"type":"string"},"line_raw":{"type":"string"},"arrived_at":{"type":"string"},"due_at":{"type":["string","null"]},"qty":{"type":["integer","null"]},"priority":{"type":"string","enum":["일반","긴급"]}},"required":["order_id","line_raw","arrived_at","priority"]} 쉬운 데이터만 만들지 마세요. 다음을 섞습니다. (1) 납기가 도착 시각과 30분밖에 차이 나지 않아 어떤 편성으로도 못 맞추는 주문, (2) due_at 이 비어 있어 지연 계산에서 빠져야 하는 주문, (3) qty 가 0 이거나 결측인 행, (4) 추출본 카탈로그에 없는 line_raw, (5) 교대 경계(오후 10시)를 넘겨 도착한 주문. 기준안과 변경안의 차이가 이 경계 주문에서 갈리는지 확인하세요.{"type":"object","properties":{"order_id":{"type":"string"},"line_raw":{"type":"string"},"arrived_at":{"type":"string"},"due_at":{"type":["string","null"]},"qty":{"type":["integer","null"]},"priority":{"type":"string","enum":["일반","긴급"]}},"required":["order_id","line_raw","arrived_at","priority"]}운영팀장이 실제로 던질 법한 '만약에' 질문과 그 문장이 옮겨져야 할 정답 조건입니다. 조건 파싱을 사람 판단 없이 채점하는 기준이 됩니다.
| question_id | question_ko | expected_status | expected_conditions | expected_missing |
|---|---|---|---|---|
| q-01 | 야간 C라인 피킹 인력을 두 명 줄이면 출하 지연이 얼마나 늘까요? | answered | [{"target":"C라인/ST-C2/야간","field":"headcount","op":"sub","value":2}] | — |
| q-02 | A라인 절단에 주간 한 명 더 붙이면 어떻게 되나요? | answered | [{"target":"A라인/ST-A1/주간","field":"headcount","op":"add","value":1}] | — |
| q-03 | B라인 조립 교체시간을 10분으로 줄이면 정시 출하가 늘어나나요? | answered | [{"target":"B라인/ST-B1/주간","field":"changeover_min","op":"set","value":10}] | — |
| q-04 | 긴급 주문을 먼저 투입하면 일반 주문 지연이 얼마나 늘까요? | answered | [{"target":"전체","field":"dispatch_rule","op":"reorder","value":"긴급 우선"}] | — |
| q-05 | 라인 하나 세우면 어떻게 되나요? | asked_back | [] | 어느 라인을 세울지가 문장에 없습니다 |
다음 JSON Schema 에 맞는 '만약에' 질문과 정답 조건을 더 생성하세요: {"type":"object","properties":{"question_id":{"type":"string"},"question_ko":{"type":"string"},"expected_status":{"type":"string","enum":["answered","asked_back"]},"expected_conditions":{"type":"array","items":{"type":"object","properties":{"target":{"type":"string"},"field":{"type":"string"},"op":{"type":"string","enum":["set","add","sub","reorder","stop"]},"value":{"type":["number","string","null"]}}}},"expected_missing":{"type":["string","null"]}},"required":["question_id","question_ko","expected_status"]} 쉬운 질문만 만들지 마세요. 되물어야 하는 문장을 최소 3할 섞습니다. (1) 대상 라인이나 작업장이 빠진 문장, (2) 몇 명·몇 분인지 수량이 빠진 문장, (3) 카탈로그에 없는 라인을 가리키는 문장, (4) 조건이 아니라 원인을 묻는 문장. 또 조건이 둘 이상 겹친 문장, 퍼센트로 말해 숫자로 환산해야 하는 문장, 교대를 말하지 않아 주간·야간 어느 쪽인지 되물어야 하는 문장을 넣어 파서가 넘겨짚지 않는지 확인하세요.{"type":"object","properties":{"question_id":{"type":"string"},"question_ko":{"type":"string"},"expected_status":{"type":"string","enum":["answered","asked_back"]},"expected_conditions":{"type":"array","items":{"type":"object","properties":{"target":{"type":"string"},"field":{"type":"string"},"op":{"type":"string","enum":["set","add","sub","reorder","stop"]},"value":{"type":["number","string","null"]}}}},"expected_missing":{"type":["string","null"]}},"required":["question_id","question_ko","expected_status"]}| Python | 추출본 적재, 조건 파싱, 시뮬레이션 실행, 채점을 한 CLI로 구현합니다. |
| 시나리오 기반 시뮬레이션 | 작업장·교대·주문 도착을 이산사건으로 모사하고 고정 시드로 같은 결과를 재현합니다. |
| 산업 데이터 분석 | MES 추출본의 라인 표기와 공정 시간을 카탈로그로 정규화해 시뮬레이션 입력으로 만듭니다. |
| 운영 최적화 | 인력·교대·투입 순서를 바꿔 돌린 결과를 기준안과 비교해 지연이 적은 편성을 고릅니다. |
| 데이터 파이프라인 | 추출본 적재부터 조건 실행과 결과 이력 적재까지 배치로 이어 붙입니다. |
| LLM API | 질문 문장을 조건 JSON 으로 옮기고 모자란 항목을 되묻는 문구를 만드는 데만 씁니다. |
✓ pass → 그대로 멈춰도 시뮬레이터 데모로 완결됩니다. 더 키우려면 정답 조건과 대조해 해석 정확도를 잽니다.
✓ pass → 정확도를 확인했다면 주문 로그를 늘려 질문 묶음을 배치로 돌리고 실행 이력으로 재현성을 확인합니다.
질문 한 건을 실행한 결과입니다. 해석한 조건, 기준안과 변경안의 지표, 근거로 쓴 추출본 행, 재현에 필요한 시드를 함께 담습니다.
{"type":"object","properties":{"question_id":{"type":"string"},"status":{"type":"string","enum":["answered","asked_back"]},"parsed_conditions":{"type":"array","items":{"type":"object","properties":{"target":{"type":"string"},"field":{"type":"string"},"op":{"type":"string"},"value":{"type":["number","string","null"]}}}},"missing":{"type":["string","null"]},"baseline":{"type":["object","null"],"properties":{"on_time_rate":{"type":"number"},"avg_delay_min":{"type":"number"}}},"scenario":{"type":["object","null"],"properties":{"on_time_rate":{"type":"number"},"avg_delay_min":{"type":"number"}}},"delta_avg_delay_min":{"type":["number","null"]},"evidence_rows":{"type":"array","items":{"type":"string"}},"seed":{"type":["integer","null"]},"answer_text":{"type":"string"}},"required":["question_id","status","parsed_conditions","evidence_rows","answer_text"]}[
{
"question_id": "q-01",
"status": "answered",
"parsed_conditions": [
{
"target": "C라인/ST-C2/야간",
"field": "headcount",
"op": "sub",
"value": 2
}
],
"missing": null,
"baseline": {
"on_time_rate": 0.86,
"avg_delay_min": 24
},
"scenario": {
"on_time_rate": 0.61,
"avg_delay_min": 71.5
},
"delta_avg_delay_min": 47.5,
"evidence_rows": [
"r-010",
"r-012",
"O-1010",
"O-1011"
],
"seed": 20260720,
"answer_text": "야간 C라인 피킹을 3명에서 1명으로 줄이면 평균 출하 지연이 24분에서 71.5분으로 47.5분 늘고 정시 완료 비율은 86퍼센트에서 61퍼센트로 떨어집니다. 새벽에 몰린 긴급 주문 두 건이 피킹에서 대기하며 벌어진 차이이며, 이 값은 합성 추출본과 합성 주문 로그 기준입니다."
},
{
"question_id": "q-04",
"status": "answered",
"parsed_conditions": [
{
"target": "전체",
"field": "dispatch_rule",
"op": "reorder",
"value": "긴급 우선"
}
],
"missing": null,
"baseline": {
"on_time_rate": 0.86,
"avg_delay_min": 24
},
"scenario": {
"on_time_rate": 0.88,
"avg_delay_min": 26.3
},
"delta_avg_delay_min": 2.3,
"evidence_rows": [
"O-1002",
"O-1007",
"O-1010",
"O-1011"
],
"seed": 20260720,
"answer_text": "긴급 주문을 먼저 투입하면 긴급 4건은 모두 납기 안에 나가지만 일반 주문 평균 지연이 2.3분 늘어납니다. 정시 완료 비율은 88퍼센트로 조금 올라가며, 이 값은 합성 주문 로그 기준이라 실제 주문 분포에서는 달라집니다."
},
{
"question_id": "q-07",
"status": "asked_back",
"parsed_conditions": [],
"missing": "추출본 카탈로그에 D라인이 없습니다",
"baseline": null,
"scenario": null,
"delta_avg_delay_min": null,
"evidence_rows": [],
"seed": null,
"answer_text": "받은 추출본에는 A라인, B라인, C라인만 있어 D라인 검사 작업장을 찾지 못했습니다. 시뮬레이션을 돌리지 않았습니다. D라인 추출본을 함께 주시거나 다른 라인 이름으로 다시 물어봐 주십시오."
}
][자동 검증: 규칙으로 채점] 1. parsed_conditions 를 정답 조건 JSON 과 필드 단위로 비교해 target·field·op·value 가 모두 같을 때만 일치로 셉니다. 2. status 가 asked_back 이면 baseline·scenario·seed 가 전부 null 이고 시뮬레이션이 돌지 않았는지 확인합니다. 3. evidence_rows 의 값이 추출본 row_id 또는 주문 order_id 에 실제로 있는지 대조해 지어낸 근거를 걸러냅니다. 4. 같은 seed 로 두 번 실행해 baseline·scenario·delta_avg_delay_min 이 완전히 같은지 확인합니다. 5. delta_avg_delay_min 은 합성 입력 기준 추정값이므로 answer_text 에 그 사실이 드러났는지 확인합니다. [수동 검증: 사람이 확인] 1. 되묻는 문구가 무엇이 모자란지 한 번에 알아들을 만한지 읽어 확인합니다. 2. 조건이 둘 이상 겹친 질문에서 하나를 빠뜨리고 답하지 않았는지 표본으로 점검합니다.