인핸스
경력근거: 고객과 함께 문제를 정의하고, 이를 Ontology와 Workflow, Agent로 구조화해 현장에 맞는 해결책으로 구현합니다
공고가 FDE팀의 일로 '고객과 함께 문제를 정의하고, 이를 Ontology와 Workflow, Agent로 구조화해 현장에 맞는 해결책으로 구현합니다' 를 적었고, 찾는 사람으로 '재무 또는 SCM, 두 도메인 중 하나에서 업무 프로세스와 데이터를 경험하고' 를 앞세웠습니다. 구매와 납기는 그 SCM 축에서 현장이 매일 손으로 맞추는 자리이고, 이 포트폴리오는 그 맞춤을 등급표와 규칙으로 옮깁니다. '고객사에 깊이 임베딩되어 모호한 비즈니스 문제를 정의부터 솔루션 구현까지 주도' 한다는 대목도 ERP 내려받기를 받아 드는 같은 자리를 가리킵니다. 이 포트폴리오가 보여주는 것은 공급사 기준을 데이터로 두고 원장과 맞춰 납기 이행을 가르는 기술이며, AgentOS 운영 경험이나 재무·SCM 실무 전문성은 주장하지 않습니다. 모르는 깊이는 면접에서 모른다고 말하는 편이 낫습니다.
'재무 또는 SCM, 두 도메인 중 하나에서 업무 프로세스와 데이터를 경험하고'. 구매·납기가 그 SCM 쪽 축입니다.
'고객사에 깊이 임베딩되어 모호한 비즈니스 문제를 정의부터 솔루션 구현까지 주도'. 현장에서 받는 자료가 ERP 내려받기입니다.
'솔루션 설계, 대규모 데이터 처리와 웹 애플리케이션 개발을 End-to-End로 수행해요'. 판정기부터 리포트까지 혼자 답니다.
발주가 약속대로 입고됐는지 가릅니다. 공급사 등급표에 허용 지연일과 분할 입고 허용 여부, 최소 충족률을 두고 발주·입고 원장과 맞춰, 라인마다 정상·지연·수량 미달·무단 분할 중 어느 쪽인지 정합니다. 입고일이 비면 늦었는지 판단하지 않고 원장을 다시 받게 하며, 등급표에 없는 공급사는 미등록으로 남겨 기준을 먼저 정하게 합니다. 원장은 실 고객사 ERP 내려받기 대신 지원자가 공개 조달 발주 내역을 발주·입고 두 표로 다시 적어 만든 것을 가정합니다.
고객사 구매팀에 들어가 발주와 입고를 맞춰 보는 자리에 앉는 FDE 입니다. 어느 라인이 늦었고 어느 라인이 덜 왔는지를 매번 발주 엑셀과 입고 엑셀을 번갈아 보며 눈으로 맞추던 사람입니다.
공급사마다 다른 허용 지연일과 분할 허용 여부를 등급표로 두고 원장과 맞추면, 정상과 이상이 규칙으로 갈리고 이상마다 무엇이 어긋났는지가 근거로 남는다는 가정입니다. 등급표에 없는 공급사는 미등록으로 빠지므로 기준이 아직 없는 거래처가 그대로 드러납니다.
발주·입고 원장과 공급사 등급표를 받아 라인마다 정상·지연·수량 미달·무단 분할을 판정하고, 어긋났으면 지연 일수와 충족률을 붙여 공급사별로 묶은 판정 리포트를 터미널과 Markdown 파일로 내는 CLI 가 도는 완결품입니다.
공개 조달 내역에서 다시 적은 발주 라인 200건에 손으로 붙인 정답 판정과 대조해 일치율을 내고, 미등록이 몰리는 공급사를 모아 등급표에 없는 거래처를 목록으로 냅니다.
공급사별 지연 분포와 충족률 이력을 모아 등급을 올릴지 내릴지 후보를 내고, 조정했을 때 판정이 어떻게 달라지는지 전후로 나란히 보여주는 단계입니다.
FDE 가 발주·입고 원장과 공급사 등급표를 넣으면 라인마다 판정과 지연 일수·충족률이 공급사별로 묶여 나오는 과정을 시연합니다.
공개 조달 내역에서 다시 적은 발주 라인 200건과 손으로 붙인 정답 판정을 대조해 일치율을 냅니다. 단, 정답과 원장을 모두 작성자가 만든 합성 기준이라 성능 검증이 아니라 데모 조건 동작입니다.
입고일이 비었거나 공급사 표기가 흔들리거나 등급표에 없는 공급사가 섞인 입력 30종을 넣어도 출력 형식이 안 깨지고 사유별로 빠지는 비율을 보여줍니다.
등급표의 허용치를 바꿨을 때 옛 판정이 어떻게 뒤집히는지 회귀로 확인합니다.
진짜 성능 검증은 여기서 멈춥니다. 위 수치는 작성자가 만든 원장의 자가채점이며, 실제 납기 점검은 인핸스 고객사의 실 ERP 원장과 실 계약 조건이 있어야 측정됩니다. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태까지 만듭니다.
수치는 합성 데이터 자가채점이라 성능 증명이 아니므로, 면접에서는 데모 동작과 실검증 준비 상태로 솔직히 설명합니다.
정답을 작성자가 붙였으니 잘 맞는 게 당연하므로, 입고일 결측과 분할 입고, 등급표에 없는 공급사를 일부러 섞어 쉬운 라인만 푸는 함정을 피합니다.
이 포트폴리오가 보여주는 것은 공급사 기준을 데이터로 두고 원장과 맞춰 납기 이행을 가르는 기술이며, AgentOS 운영 경험이나 재무·SCM 실무 전문성은 주장하지 않습니다. 판정은 날짜와 수량 비교가 하고 LLM 은 담당자가 읽을 사유 문장만 맡습니다.
등급표의 허용치는 계약마다 다르므로 판정에 쓴 기준 행을 함께 실어 담당자가 확인하게 둡니다.
실제 도입 때는 고객사마다 ERP 양식과 거래처 구성이 다르므로, 등급표를 새로 채우는 일을 도입 단계 과제로 둡니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
고객사 ERP 에서 내려받은 발주·입고 원장입니다. 발주 라인 번호와 공급사 표기 원문, 품목, 발주 수량, 약속납기, 입고 회차와 입고 수량·입고일, 구매 담당을 한 행에 둡니다. 분할 입고는 회차를 늘려 여러 행으로 들어옵니다. 공급사 표기는 담당자가 손으로 적어 '한독소재'와 '한독 소재'처럼 흔들립니다. 입고일이 비어 있는 행, 담당자가 비어 있는 행, 등급표에 없는 공급사를 일부러 섞어 두어 사유가 갈리게 둡니다.
| po_line_no | po_no | supplier_raw | item_code | order_qty | promised_date | receipt_seq | received_qty | received_at | buyer_name |
|---|---|---|---|---|---|---|---|---|---|
| PO-1001 | PO-2608-11 | 대성정밀 | IT-4021 | 500 | 2026-08-10 | 1 | 500 | 2026-08-10 | 김도영 |
| PO-1002 | PO-2608-11 | 대성정밀 | IT-4022 | 300 | 2026-08-10 | 1 | 300 | 2026-08-13 | 김도영 |
| PO-1003 | PO-2608-12 | 한독소재 | IT-5110 | 1,000 | 2026-08-12 | 1 | 600 | 2026-08-12 | 박서진 |
| PO-1003 | PO-2608-12 | 한독소재 | IT-5110 | 1,000 | 2026-08-12 | 2 | 400 | 2026-08-14 | 박서진 |
| PO-1004 | PO-2608-12 | 한독 소재 | IT-5111 | 200 | 2026-08-12 | 1 | 120 | 2026-08-12 | 박서진 |
아래 JSON Schema 를 그대로 만족하는 발주·입고 행을 200개 더 만들어 주세요. 공급사 표기는 '한독소재'와 '한독 소재'처럼 띄어쓰기를 흔들어 적습니다. 분할 입고는 회차를 늘려 여러 행으로 두고, 2할은 입고일이나 담당자를 비우며, 몇 건은 등급표에 없는 공급사를 씁니다. 지연 일수나 충족률, 판정은 넣지 마세요.
{"type": "object", "properties": {"po_line_no": {"type": "string"}, "po_no": {"type": "string"}, "supplier_raw": {"type": "string"}, "item_code": {"type": "string"}, "order_qty": {"type": "integer"}, "promised_date": {"type": "string"}, "receipt_seq": {"type": "integer"}, "received_qty": {"type": ["integer", "null"]}, "received_at": {"type": ["string", "null"]}, "buyer_name": {"type": ["string", "null"]}}, "required": ["po_line_no", "po_no", "supplier_raw", "item_code", "order_qty", "promised_date", "receipt_seq"]}{"type": "object", "properties": {"po_line_no": {"type": "string"}, "po_no": {"type": "string"}, "supplier_raw": {"type": "string"}, "item_code": {"type": "string"}, "order_qty": {"type": "integer"}, "promised_date": {"type": "string"}, "receipt_seq": {"type": "integer"}, "received_qty": {"type": ["integer", "null"]}, "received_at": {"type": ["string", "null"]}, "buyer_name": {"type": ["string", "null"]}}, "required": ["po_line_no", "po_no", "supplier_raw", "item_code", "order_qty", "promised_date", "receipt_seq"]}공급사 등급표입니다. 공급사 표기와 등급, 허용 지연일, 분할 입고 허용 여부, 최소 충족률, 담당 조직을 한 행에 둡니다. 등급마다 허용치가 달라 같은 지연도 공급사에 따라 정상이 되기도 하고 이상이 되기도 합니다. 원장에 나오는 공급사 중 일부는 일부러 넣지 않아 미등록이 도출되게 둡니다.
| rule_no | supplier_raw | grade | allow_delay_days | allow_split | min_fill_rate | owner_name |
|---|---|---|---|---|---|---|
| SR-1001 | 대성정밀 | A | 0 | false | 1 | 구매 1팀 |
| SR-1002 | 한독소재 | B | 3 | true | 0.95 | 구매 1팀 |
| SR-1003 | 신우테크 | C | 5 | false | 0.9 | 구매 2팀 |
| SR-1004 | 영진화학 | B | 3 | true | 0.95 | 구매 2팀 |
| SR-1005 | 세림금속 | A | 0 | false | 1 | 구매 1팀 |
아래 JSON Schema 를 그대로 만족하는 공급사 등급 행을 40개 더 만들어 주세요. 등급을 세 값으로 고루 쓰고 등급마다 허용 지연일·분할 허용·최소 충족률을 다르게 둡니다. 원장에 나오는 공급사 중 일부는 일부러 넣지 마세요 — 미등록이 있어야 등급표의 구멍이 드러납니다.
{"type": "object", "properties": {"rule_no": {"type": "string"}, "supplier_raw": {"type": "string"}, "grade": {"type": "string", "enum": ["A", "B", "C"]}, "allow_delay_days": {"type": "integer"}, "allow_split": {"type": "boolean"}, "min_fill_rate": {"type": "number"}, "owner_name": {"type": "string"}}, "required": ["rule_no", "supplier_raw", "grade", "allow_delay_days", "allow_split", "min_fill_rate"]}{"type": "object", "properties": {"rule_no": {"type": "string"}, "supplier_raw": {"type": "string"}, "grade": {"type": "string", "enum": ["A", "B", "C"]}, "allow_delay_days": {"type": "integer"}, "allow_split": {"type": "boolean"}, "min_fill_rate": {"type": "number"}, "owner_name": {"type": "string"}}, "required": ["rule_no", "supplier_raw", "grade", "allow_delay_days", "allow_split", "min_fill_rate"]}| Python | 원장과 등급표를 맞춰 지연 일수와 충족률을 계산하고 판정하는 규칙 엔진을 맡습니다. |
| Ontology | 공급사·품목·발주 라인을 한 모양으로 묶어 두는 개념 정의로 씁니다. 판정 자체는 규칙이 합니다. |
| Markdown | 공급사별로 묶은 판정 리포트를 파일로 냅니다. |
✗ fail → 미등록이 절반을 넘으면 등급표를 먼저 채웁니다.
✓ pass → 2주차 정답 대조로 넘어갑니다.
✗ fail → 어긋난 유형을 모아 허용치 정의를 다시 봅니다.
✓ pass → 3주차 등급 조정안으로 넘어갑니다.
발주 라인 하나가 공급사 등급표와 만나는 자리마다 약속대로 들어왔는지 정합니다. 어긋났으면 지연 일수와 충족률을 싣고, 입고일이 비면 판단하지 않고 따로 뺍니다. 화면과 리포트는 이 사유 코드로 묶습니다.
{"type": "object", "properties": {"verdict_no": {"type": "string"}, "po_line_no": {"type": "string"}, "supplier_raw": {"type": "string"}, "rule_no": {"type": ["string", "null"]}, "grade": {"type": ["string", "null"]}, "delivery_code": {"type": "string", "enum": ["on_time", "late", "short_qty", "split_unplanned", "receipt_missing", "supplier_unmapped"]}, "delay_days": {"type": ["integer", "null"], "description": "마지막 입고일에서 약속납기를 뺀 일수입니다. 입고가 없으면 비웁니다."}, "fill_rate": {"type": ["number", "null"], "description": "그 발주 라인의 received_qty 합계를 order_qty 로 나눠 소수 둘째 자리로 반올림한 값입니다."}, "receipt_count": {"type": ["integer", "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", "po_line_no", "supplier_raw", "delivery_code", "evidence", "summary"]}[
{
"verdict_no": "DV-001",
"po_line_no": "PO-1001",
"supplier_raw": "대성정밀",
"rule_no": "SR-1001",
"grade": "A",
"delivery_code": "on_time",
"delay_days": 0,
"fill_rate": 1,
"receipt_count": 1,
"owner_name": "구매 1팀",
"evidence": [
{
"field": "promised_date",
"agg": null,
"value": "2026-08-10"
},
{
"field": "received_at",
"agg": null,
"value": "2026-08-10"
},
{
"field": "order_qty",
"agg": null,
"value": 500
}
],
"summary": "약속납기 당일에 500개가 한 번에 들어와 A등급 기준을 지켰습니다.",
"hedge": null
},
{
"verdict_no": "DV-002",
"po_line_no": "PO-1010",
"supplier_raw": "한독소재",
"rule_no": "SR-1002",
"grade": "B",
"delivery_code": "on_time",
"delay_days": 1,
"fill_rate": 1,
"receipt_count": 1,
"owner_name": "구매 1팀",
"evidence": [
{
"field": "allow_delay_days",
"agg": null,
"value": 3
},
{
"field": "received_at",
"agg": null,
"value": "2026-08-21"
},
{
"field": "order_qty",
"agg": null,
"value": 90
}
],
"summary": "하루 늦었지만 B등급 허용 지연 3일 안이라 정상 입고로 봅니다.",
"hedge": null
},
{
"verdict_no": "DV-003",
"po_line_no": "PO-1007",
"supplier_raw": "영진화학",
"rule_no": "SR-1004",
"grade": "B",
"delivery_code": "late",
"delay_days": 7,
"fill_rate": 1,
"receipt_count": 1,
"owner_name": "구매 2팀",
"evidence": [
{
"field": "promised_date",
"agg": null,
"value": "2026-08-17"
},
{
"field": "received_at",
"agg": null,
"value": "2026-08-24"
},
{
"field": "allow_delay_days",
"agg": null,
"value": 3
}
],
"summary": "수량은 다 채웠으나 7일 늦어 허용 지연 3일을 넘겼습니다.",
"hedge": null
},
{
"verdict_no": "DV-004",
"po_line_no": "PO-1004",
"supplier_raw": "한독 소재",
"rule_no": "SR-1002",
"grade": "B",
"delivery_code": "short_qty",
"delay_days": 0,
"fill_rate": 0.6,
"receipt_count": 1,
"owner_name": "구매 1팀",
"evidence": [
{
"field": "order_qty",
"agg": null,
"value": 200
},
{
"field": "received_qty",
"agg": "sum",
"value": 120
},
{
"field": "min_fill_rate",
"agg": null,
"value": 0.95
}
],
"summary": "납기는 지켰지만 200개 중 120개만 들어와 충족률 0.60 이 기준 0.95 에 못 미칩니다.",
"hedge": "공급사 표기가 '한독 소재' 로 띄어 적혀 있어 접어서 맞췄습니다."
},
{
"verdict_no": "DV-005",
"po_line_no": "PO-1005",
"supplier_raw": "신우테크",
"rule_no": "SR-1003",
"grade": "C",
"delivery_code": "split_unplanned",
"delay_days": 4,
"fill_rate": 1,
"receipt_count": 2,
"owner_name": "구매 2팀",
"evidence": [
{
"field": "receipt_seq",
"agg": "count",
"value": 2
},
{
"field": "allow_split",
"agg": null,
"value": false
},
{
"field": "order_qty",
"agg": null,
"value": 80
}
],
"summary": "두 번에 나눠 들어왔는데 이 공급사는 분할 입고가 허용돼 있지 않습니다.",
"hedge": null
},
{
"verdict_no": "DV-006",
"po_line_no": "PO-1009",
"supplier_raw": "대성정밀",
"rule_no": "SR-1001",
"grade": "A",
"delivery_code": "receipt_missing",
"delay_days": null,
"fill_rate": null,
"receipt_count": 1,
"owner_name": "구매 1팀",
"evidence": [
{
"field": "received_at",
"agg": null,
"value": null
},
{
"field": "received_qty",
"agg": null,
"value": 400
}
],
"summary": "수량은 적혀 있는데 입고일이 비어 있어 늦었는지 판단하지 않고 원장을 다시 받습니다.",
"hedge": null
},
{
"verdict_no": "DV-007",
"po_line_no": "PO-1008",
"supplier_raw": "동방머티리얼",
"rule_no": null,
"grade": null,
"delivery_code": "supplier_unmapped",
"delay_days": null,
"fill_rate": null,
"receipt_count": 1,
"owner_name": null,
"evidence": [
{
"field": "supplier_raw",
"agg": null,
"value": "동방머티리얼"
},
{
"field": "rule_no",
"agg": "count",
"value": 12
}
],
"summary": "등급표 열두 행에 이 공급사가 없어 미등록으로 남기고 기준을 먼저 정합니다.",
"hedge": null
}
][자동 검증 · 코드가 판정합니다] 1. delivery_code 가 enum 여섯 값 중 하나인지 확인합니다. 2. verdict_no·po_line_no·supplier_raw·delivery_code·evidence·summary 가 모두 채워졌는지 확인합니다. 3. po_line_no 가 원장에 실재하는 발주 라인인지 대조합니다. 4. rule_no 가 있으면 등급표에 실재하는 행 번호인지 대조합니다. 5. rule_no 가 있으면 grade·owner_name 이 그 등급 행의 값과 같은지 대조합니다. 6. supplier_raw 를 공백을 지워 접은 뒤 등급표의 공급사와 맞고, 맞는 행이 없으면 delivery_code 가 supplier_unmapped 인지 확인합니다. 7. fill_rate 를 그 라인의 received_qty 합계를 order_qty 로 나눠 다시 계산해 소수 둘째 자리에서 같은지 확인합니다. 8. delay_days 를 마지막 received_at 에서 promised_date 를 빼 다시 계산합니다. 9. delivery_code 가 on_time 이면 delay_days 가 allow_delay_days 이하이고 fill_rate 가 min_fill_rate 이상인지 다시 확인합니다. 10. delivery_code 가 late 이면 delay_days 가 allow_delay_days 를 넘는지 다시 확인합니다. 11. delivery_code 가 short_qty 이면 fill_rate 가 min_fill_rate 에 못 미치는지 다시 확인합니다. 12. delivery_code 가 split_unplanned 이면 receipt_count 가 2 이상이고 allow_split 이 거짓인지 확인합니다. 13. received_at 이 비어 있으면 delivery_code 가 receipt_missing 이고 delay_days 가 비었는지 확인합니다. 14. evidence 의 field 이름이 원장과 등급표에 실재하는 컬럼인지 대조합니다. 15. agg 가 없는 evidence 의 value 가 그 컬럼에 수록된 행 값과 같은지 확인합니다. 16. summary 가 존댓말로 끝나는지 확인합니다. [평가 러너 · 2주차] 공개 조달 내역에서 다시 적은 발주 라인 200건에 손으로 붙인 정답 판정과 대조해 일치율과 사유 코드별 분포를 내고, 미등록이 몰리는 공급사를 모아 등급표에 없는 거래처를 목록으로 냅니다. [수동 검증 · 사람이 봅니다] 1. 등급별 허용치를 어디로 정할지 계약 조건에 맞춰 담당자가 정합니다. 2. 분할 입고를 사후 승인할지 담당자가 건별로 정합니다.