아이엔소프트
경력근거: 고객의 비즈니스 문제를 기술 요구사항으로 전환하고, 도입부터 안정화까지 전 과정 리딩
공고는 플랫폼 연구개발 갈래 셋 중 하나로 비용 최적화 솔루션을 올려 두고, 같은 사람에게 고객사 구축 Delivery 와 도입부터 안정화까지의 리딩을 함께 맡깁니다. 비용을 줄이는 연구와 고객 앞에서 확산을 설득하는 일이 한 자리에 있으니, 유형별 원가를 대는 산출물이 그 자리의 첫 주 결과물로 맞습니다. 아이엔소프트는 2002년부터 클라우드 통합 관리와 통합 관제를 팔아 온 회사라 고객사에 알람 대응 표준이 이미 문서로 있고, 그 문서의 표준처리분과 시간단가가 이 판정의 한쪽 축입니다. 다만 이 포트폴리오는 실행 기록에서 원가를 계산하는 규칙 설계와 CLI 구현을 보여줍니다. 공고가 적은 플랫폼의 내부 구조나 관제 운영의 깊은 도메인 전문성은 주장하지 않습니다. 모르는 깊이는 면접에서 모른다고 말하는 편이 낫습니다.
공고는 플랫폼 아키텍처 설계와 핵심 기능 연구개발을 이끄는 일과, FDE 로 고객사에 직접 적용·구축하는 Delivery 를 이끄는 일을 한 자리에 묶습니다. 연구실에서 끝나는 결과물이 아니라 고객사 현장에서 값을 대야 하는 자리입니다.
연구개발 갈래 셋 중 하나가 비용 최적화 솔루션입니다. 에이전트를 만드는 일과 그 에이전트가 얼마에 도는지를 재는 일이 같은 조직의 과제로 적혀 있습니다.
자격요건은 연구개발과 고객 대면 Delivery 를 모두 아우르는 실행력을 묻고, 주요역할은 도입부터 안정화까지 전 과정을 이끌라고 적습니다. 고객 앞에서 무엇을 계속 맡길지 정하는 판단이 업무의 한복판에 있습니다.
고객사 관제 현장에 붙여 둔 에이전트의 실행 기록과 그 회사 알람 대응 표준을 함께 넣고 명령 한 번을 치면, 알람유형마다 에이전트 한 건 값과 사람 한 건 값을 같은 단위로 맞춰 이관 판정을 답니다. 판정 네 값은 비용과 해결률을 세는 규칙이 정하고, 모델은 그 유형의 값이 어디서 커졌는지를 운영자가 읽을 문장으로 적습니다.
고객사 운영·관제 현장에 에이전트를 붙여 온 FDE 엔지니어 — 확산 회의에서 어느 업무가 값을 했고 어느 업무를 사람에게 되돌릴지 고객 앞에 대야 한다
확산이 멈추는 자리는 에이전트가 못 돌아서가 아니라 유형마다 값이 얼마나 드는지를 아무도 세어 두지 않아서입니다. 실행 기록에 남은 호출 비용을 알람 대응 표준의 표준처리분·시간단가와 같은 단위로 맞춰 두면, 계속 맡길 유형과 되돌릴 유형이 회의 전에 갈라집니다.
FDE 가 쓰는 CLI 하나가 돕니다. 관제 도구에서 내려받은 실행 기록 파일과 알람 대응 표준 표를 넣으면 유형마다 판정과 근거 숫자가 터미널에 뜨고, 같은 내용이 마크다운 리포트 파일로 떨어집니다. 실행 기록은 파일로 받는 것으로 시작하고 관제 시스템 연동은 3주차로 미룹니다.
정답을 붙인 알람유형 40건으로 판정 일치율을 자동으로 내고 어긋난 유형을 사유별로 리포트에 답니다. 고객사가 표 대신 운영 표준 문서를 주는 경우를 위해, 문서에서 표준처리분과 시간단가 절을 찾아 표로 옮기는 단계를 붙입니다.
고객사 여러 곳의 실행 기록을 한 번에 돌려 테넌트별 비교표를 내고, 사람에게 되돌린 유형이 다음 달에 어떻게 바뀌었는지 추이를 함께 냅니다. 판정 결과를 오케스트레이터가 읽을 라우팅 설정 파일로도 내보냅니다.
FDE 가 실행 기록 파일과 대응 표준 표를 넣고 명령 한 번을 치면, 유형마다 이관 판정과 근거 숫자가 터미널에 뜨고 같은 내용의 리포트 파일이 함께 떨어집니다.
컬럼 이름이 빠지거나 비용 칸이 비거나 모델 호출 전에 끊긴 실행이 섞인 파일 12종을 넣어도 CLI 가 죽지 않고, 어느 실행이 왜 빠졌는지 그 자리에서 읽힙니다.
표준에 없는 유형, 해결률이 목표와 똑같이 맞는 유형, 토큰이 0으로 극단에 닿은 실행을 섞은 입력 30종을 넣어도 출력 형식이 흔들리지 않고 판정이 하나씩 붙습니다.
정답을 붙인 알람유형 40건으로 판정 일치율을 냅니다. 단, 정답과 실행 기록을 모두 작성자가 만든 합성 기준이라 성능 검증이 아니라 데모 조건 동작입니다.
위 수치는 더미데이터 자가채점이며 실제 원가 판정이 맞는지는 아이엔소프트 고객사의 실 실행 기록과 그 회사 운영 표준이 있어야 측정됩니다. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태로 만듭니다.
수치는 합성 데이터 자가채점이라 성능 증명이 아닙니다. 면접에서는 데모 동작과 실검증 준비 상태로 솔직히 설명합니다.
정답을 작성자가 만들었으니 잘 맞는 것이 당연합니다. 비용이 비어 있는 실행, 토큰이 0으로 극단에 닿은 실행, 표준에 없는 유형, 결측·악성·경계 케이스를 더미에 일부러 섞어 쉬운 문제만 푸는 함정을 피합니다.
공고가 적은 플랫폼 이름은 공개 자료로 확인되지 않았습니다. 그래서 그 플랫폼의 기능을 전제하지 않고, 공고가 밝힌 역할과 비용 최적화 축만 근거로 삼았습니다. 실제 제품 구조는 면접에서 듣고 맞춰야 할 부분입니다.
한 건 값이 싸다는 사실이 곧 그 유형을 계속 맡겨도 된다는 뜻은 아닙니다. 에이전트가 닫았다고 표시한 건을 사람이 뒤이어 다시 만지는 경우가 있어, 판정을 결론으로 읽지 않게 근거 숫자를 항상 같이 냅니다.
실제 도입에서는 고객사마다 알람 이름과 표준 문서의 모양이 다르고 시간단가가 등급별로 갈립니다. 이름표와 단가표가 늘어나면 규칙을 코드에서 빼 설정으로 옮겨야 하며, 그것은 도입 단계 과제로 분리합니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
고객사에 붙인 에이전트가 알람 하나를 처리할 때마다 남기는 실행 기록입니다. 판정의 한쪽 축이며, 사용량이 붙지 않아 호출비용원이 비어 있는 실행과 모델을 부르기 전에 끊겨 총토큰이 0으로 극단에 닿은 실행을 일부러 섞었습니다.
| 실행ID | 알람유형 | 모델명 | 총토큰 | 호출비용원 | 처리초 | 해결여부 |
|---|---|---|---|---|---|---|
| RUN-2026-0801 | 디스크 임계 알람 | claude-haiku-4.5 | 4,120 | 36 | 11.4 | true |
| RUN-2026-0802 | 디스크 임계 알람 | claude-haiku-4.5 | 3,980 | 34 | 9.8 | true |
| RUN-2026-0803 | 디스크 임계 알람 | claude-haiku-4.5 | 4,610 | 41 | 12.7 | true |
| RUN-2026-0804 | 디스크 임계 알람 | claude-haiku-4.5 | 4,450 | 39 | 10.9 | true |
| RUN-2026-0805 | 디스크 임계 알람 | claude-haiku-4.5 | 0 | — | 0.6 | false |
아래 JSON Schema 에 맞는 에이전트 실행 기록 행을 더 만들어 주세요. {"type":"object","properties":{"실행ID":{"type":"string"},"알람유형":{"type":"string"},"모델명":{"type":"string"},"총토큰":{"type":"integer","minimum":0},"호출비용원":{"type":["integer","null"],"minimum":0},"처리초":{"type":"number","minimum":0},"해결여부":{"type":"boolean"}},"required":["실행ID","알람유형","모델명","총토큰","처리초","해결여부"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) 호출비용원이 null 인 실행(사용량이 아직 안 붙은 건), (2) 총토큰이 0이고 처리초가 1초 미만인 실행(모델을 부르기 전에 끊긴 건), (3) 해결여부가 false 인 실행을 유형마다 다른 비율로, (4) ops_runbook 에 없는 알람유형 한 가지. 생성한 행은 반드시 위 스키마를 통과해야 하며, 인코딩이 깨지거나 헤더가 빠진 형식 깨뜨리기 시도는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"실행ID":{"type":"string"},"알람유형":{"type":"string"},"모델명":{"type":"string"},"총토큰":{"type":"integer","minimum":0},"호출비용원":{"type":["integer","null"],"minimum":0},"처리초":{"type":"number","minimum":0},"해결여부":{"type":"boolean"}},"required":["실행ID","알람유형","모델명","총토큰","처리초","해결여부"]}고객사 운영팀이 쓰는 알람 대응 표준입니다. 알람유형마다 사람이 처리할 때 걸리는 표준처리분과 그 시간의 시간단가원, 운영팀이 약속한 목표해결률이 들어 있습니다. 실행 기록에 있는 알람유형 하나가 이 표에 올라 있지 않아 기준 없는 유형 판정이 나옵니다.
| 알람유형 | 표준처리분 | 시간단가원 | 목표해결률 |
|---|---|---|---|
| 디스크 임계 알람 | 12 | 20,000 | 0.8 |
| 로그 용량 경고 | 10 | 19,000 | 0.7 |
| 배포 실패 분석 | 15 | 20,000 | 0.75 |
| 인증서 만료 대응 | 25 | 22,000 | 0.9 |
| 메모리 임계 알람 | 14 | 20,000 | 0.8 |
아래 JSON Schema 에 맞는 알람 대응 표준 행을 더 만들어 주세요. {"type":"object","properties":{"알람유형":{"type":"string"},"표준처리분":{"type":"integer","minimum":1},"시간단가원":{"type":"integer","minimum":1},"목표해결률":{"type":"number","minimum":0,"maximum":1}},"required":["알람유형","표준처리분","시간단가원","목표해결률"]} 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) 표준처리분이 5분 이하로 짧은 유형과 40분을 넘는 유형, (2) 시간단가원이 등급에 따라 18,000원부터 30,000원까지 갈리는 유형, (3) 목표해결률이 0.95 처럼 높게 잡힌 유형, (4) agent_runs 에 한 번도 나오지 않는 유형. 생성한 행은 반드시 위 스키마를 통과해야 하며, 형식 깨뜨리기 시도는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"알람유형":{"type":"string"},"표준처리분":{"type":"integer","minimum":1},"시간단가원":{"type":"integer","minimum":1},"목표해결률":{"type":"number","minimum":0,"maximum":1}},"required":["알람유형","표준처리분","시간단가원","목표해결률"]}| Python | CLI 본체입니다. 실행 기록을 유형별로 묶고 사람 값을 분 단위에서 건 단위로 환산해 판정을 정합니다. |
| pandas | 유형별 평균·건수·해결률을 세는 집계 계층입니다. 비어 있는 호출 비용을 평균에서만 빼고 건수에는 남기는 처리가 여기 있습니다. |
| LLM | 판정이 정해진 뒤 그 유형의 값이 어디서 커졌는지를 운영자가 읽을 문장으로 적습니다. 판정 네 값에는 손대지 못합니다. |
| RAG | 고객사가 표 대신 운영 표준 문서를 줄 때 씁니다. 문서에서 알람유형별 표준처리분·시간단가 절을 찾아 표로 옮기는 2주차 단계에서 검색이 필요해집니다. |
| 멀티 에이전트 오케스트레이션 | 판정을 되돌려 주는 자리입니다. 사람보다 비싼 유형은 작은 모델로 내리거나 사람 큐로 보내도록 라우팅 설정을 3주차에 함께 냅니다. |
| pytest | 판정 네 값이 갈라지는 경계마다 시험을 답니다. 표준이 없는 유형과 해결률이 목표에 딱 맞는 유형이 그 경계입니다. |
✓ pass → 그대로 멈춰도 완결입니다. 더 키우려면 판정이 실제로 맞았는지 정답 40건과 맞춰 보는 단계로 넘어갑니다.
✓ pass → 여기까지도 완결입니다. 더 키우려면 고객사 여러 곳을 한 번에 돌리고 되돌린 유형의 추이를 붙이는 단계로 확장합니다.
알람유형 하나에 대한 이관 판정과 그 판정을 만든 숫자를 남기는 형식입니다. 판정 네 값은 계산 규칙이 정하고 요약 문장만 모델이 씁니다.
{"type":"object","properties":{"alarm_type":{"type":"string"},"verdict":{"type":"string","enum":["절감 구간","사람보다 비쌈","목표 해결률 미달","기준 없는 유형"]},"run_count":{"type":"integer","minimum":1},"agent_cost_per_case":{"type":["number","null"],"minimum":0,"description":"호출비용원이 채워진 실행만 평균낸 값입니다"},"human_cost_per_case":{"type":["number","null"],"minimum":0,"description":"ops_runbook.표준처리분 ÷ 60 × 시간단가원 으로 계산한 값입니다"},"resolve_rate":{"type":["number","null"],"minimum":0,"maximum":1},"cited_runs":{"type":"array","items":{"type":"string"}},"evidence":{"type":"array","items":{"type":"object","properties":{"dataset":{"type":"string"},"field":{"type":"string"},"agg":{"type":["string","null"]},"value":{"type":["string","number","boolean","null"]}},"required":["dataset","field","value"]}},"summary":{"type":"string"},"hedge":{"type":["string","null"]}},"required":["alarm_type","verdict","run_count","cited_runs","evidence","summary"]}[
{
"alarm_type": "디스크 임계 알람",
"verdict": "절감 구간",
"run_count": 5,
"agent_cost_per_case": 37.5,
"human_cost_per_case": 4000,
"resolve_rate": 0.8,
"cited_runs": [
"RUN-2026-0801",
"RUN-2026-0805"
],
"evidence": [
{
"dataset": "agent_runs",
"field": "실행ID",
"agg": "count",
"value": 5
},
{
"dataset": "agent_runs",
"field": "호출비용원",
"agg": "avg",
"value": 37.5
},
{
"dataset": "agent_runs",
"field": "호출비용원",
"value": null
},
{
"dataset": "agent_runs",
"field": "총토큰",
"value": 0
},
{
"dataset": "agent_runs",
"field": "해결여부",
"agg": "count",
"value": 4
},
{
"dataset": "ops_runbook",
"field": "표준처리분",
"value": 12
},
{
"dataset": "ops_runbook",
"field": "시간단가원",
"value": 20000
},
{
"dataset": "ops_runbook",
"field": "목표해결률",
"value": 0.8
}
],
"summary": "에이전트가 한 건에 37.5원을 써서 사람 한 건 값 4,000원의 백분의 일에 그칩니다. 다섯 건 중 하나는 모델을 부르기 전에 끊겨 비용이 비어 있고, 그 건은 평균에서 빼고 건수에만 남겼습니다.",
"hedge": null
},
{
"alarm_type": "로그 용량 경고",
"verdict": "절감 구간",
"run_count": 4,
"agent_cost_per_case": 48.75,
"human_cost_per_case": 3166.67,
"resolve_rate": 0.75,
"cited_runs": [
"RUN-2026-0811",
"RUN-2026-0814"
],
"evidence": [
{
"dataset": "agent_runs",
"field": "실행ID",
"agg": "count",
"value": 4
},
{
"dataset": "agent_runs",
"field": "호출비용원",
"agg": "avg",
"value": 48.75
},
{
"dataset": "agent_runs",
"field": "해결여부",
"agg": "count",
"value": 3
},
{
"dataset": "ops_runbook",
"field": "표준처리분",
"value": 10
},
{
"dataset": "ops_runbook",
"field": "시간단가원",
"value": 19000
},
{
"dataset": "ops_runbook",
"field": "목표해결률",
"value": 0.7
}
],
"summary": "네 건 중 셋을 스스로 닫아 목표 70%를 넘겼고, 한 건 값은 48.75원이라 사람 3,166.67원과 견줄 자리가 아닙니다.",
"hedge": null
},
{
"alarm_type": "배포 실패 분석",
"verdict": "사람보다 비쌈",
"run_count": 4,
"agent_cost_per_case": 5120,
"human_cost_per_case": 5000,
"resolve_rate": 0.75,
"cited_runs": [
"RUN-2026-0823",
"RUN-2026-0824"
],
"evidence": [
{
"dataset": "agent_runs",
"field": "실행ID",
"agg": "count",
"value": 4
},
{
"dataset": "agent_runs",
"field": "호출비용원",
"agg": "avg",
"value": 5120
},
{
"dataset": "agent_runs",
"field": "호출비용원",
"value": 5970
},
{
"dataset": "agent_runs",
"field": "해결여부",
"agg": "count",
"value": 3
},
{
"dataset": "ops_runbook",
"field": "표준처리분",
"value": 15
},
{
"dataset": "ops_runbook",
"field": "시간단가원",
"value": 20000
},
{
"dataset": "ops_runbook",
"field": "목표해결률",
"value": 0.75
}
],
"summary": "한 건 값이 5,120원까지 올라 사람 15분 값 5,000원을 넘었습니다. 가장 비싼 실행은 5,970원을 쓰고도 스스로 닫지 못했습니다.",
"hedge": "합성 실행 기록으로 낸 평균이라 실제 청구 단가와는 다릅니다."
},
{
"alarm_type": "인증서 만료 대응",
"verdict": "목표 해결률 미달",
"run_count": 5,
"agent_cost_per_case": 2206,
"human_cost_per_case": 9166.67,
"resolve_rate": 0.4,
"cited_runs": [
"RUN-2026-0832",
"RUN-2026-0835"
],
"evidence": [
{
"dataset": "agent_runs",
"field": "실행ID",
"agg": "count",
"value": 5
},
{
"dataset": "agent_runs",
"field": "해결여부",
"agg": "count",
"value": 2
},
{
"dataset": "agent_runs",
"field": "호출비용원",
"agg": "avg",
"value": 2206
},
{
"dataset": "ops_runbook",
"field": "목표해결률",
"value": 0.9
},
{
"dataset": "ops_runbook",
"field": "표준처리분",
"value": 25
},
{
"dataset": "ops_runbook",
"field": "시간단가원",
"value": 22000
}
],
"summary": "다섯 건 중 둘만 닫혀 해결률 40%가 운영팀이 약속한 90%에 못 미칩니다. 한 건 값은 사람보다 싸지만 나머지 세 건이 결국 사람에게 넘어갑니다.",
"hedge": null
},
{
"alarm_type": "방화벽 정책 변경",
"verdict": "기준 없는 유형",
"run_count": 2,
"agent_cost_per_case": 2630,
"human_cost_per_case": null,
"resolve_rate": 1,
"cited_runs": [
"RUN-2026-0841",
"RUN-2026-0842"
],
"evidence": [
{
"dataset": "agent_runs",
"field": "알람유형",
"value": "방화벽 정책 변경"
},
{
"dataset": "agent_runs",
"field": "실행ID",
"agg": "count",
"value": 2
},
{
"dataset": "agent_runs",
"field": "호출비용원",
"agg": "avg",
"value": 2630
}
],
"summary": "운영 표준에 이 유형이 올라 있지 않아 사람 한 건 값을 낼 자리가 없습니다. 표준처리분과 시간단가원을 받아야 절감 여부가 정해집니다.",
"hedge": "사람 값을 낼 기준이 없어 절감 여부는 비워 두었습니다."
}
][자동 검증 · 코드가 판정합니다] 1. verdict 가 enum 네 값(절감 구간·사람보다 비쌈·목표 해결률 미달·기준 없는 유형) 중 하나인지 확인합니다. 판정은 계산 규칙이 정하므로 모델이 다른 값을 쓰면 그 응답을 버립니다. 2. alarm_type·verdict·run_count·cited_runs·evidence·summary 여섯 필드가 모두 있는지 확인합니다. 3. resolve_rate 가 0 이상 1 이하인지, run_count 가 1 이상인지 범위를 확인합니다. 4. human_cost_per_case 를 ops_runbook.표준처리분 ÷ 60 × 시간단가원 으로 다시 계산해 값이 같은지 확인합니다. 5. agent_cost_per_case 를 그 유형 실행의 호출비용원 평균으로, resolve_rate 를 해결여부가 참인 개수 ÷ 실행ID 개수로 다시 계산해 값이 같은지 확인합니다. 6. evidence 의 field 가 agent_runs·ops_runbook 에 실재하는 컬럼 이름인지 대조합니다. 없는 이름을 인용하면 요약이 지어낸 문장이라는 뜻이라 규칙이 만든 기본 문장으로 되돌립니다. 7. agg 가 없는 evidence 값이 그 컬럼에 실제로 수록된 값과 같은지 대조합니다. 여러 실행에서 계산한 수치에는 agg 를 함께 적습니다. 8. summary 가 존댓말로 끝나는 한국어 문장인지 확인합니다. 9. 호출비용원이 비어 있으면 그 실행은 agent_cost_per_case 평균에서 빼고 run_count 에는 남깁니다. 디스크 임계 알람 샘플이 조건이 성립한 경우이고, 로그 용량 경고 샘플이 성립하지 않은 경우입니다. 10. 판정 순서는 기준 없는 유형, 목표 해결률 미달, 사람보다 비쌈, 절감 구간 순으로 앞에서 걸리면 뒤를 보지 않습니다. 방화벽 정책 변경처럼 표준이 없는 유형은 비용 비교를 건너뜁니다. [평가 러너 · 2주차] 1. 정답을 붙인 알람유형 40건으로 판정 일치율을 냅니다. 어긋난 유형은 어느 조건에서 갈라졌는지 사유별로 리포트에 답니다. [수동 검증 · 사람이 봅니다] 1. 표준처리분이 실제 대응 시간과 맞는지 고객사 운영팀과 표본 10개를 맞춰 봅니다. 문서 값이 오래되면 사람 값이 통째로 낮게 잡힙니다. 2. 해결여부를 에이전트가 스스로 표시한 건 중 실제로는 사람이 뒤를 이어 처리한 건이 있는지 확인합니다.