휴먼코어랩
경력근거: AI 생성 요청의 상태 관리·결과 저장·실패 재시도·비용 추적이 가능한 백엔드 구조 설계
※ 실제 산출물이 아닌 AI 예측 시안입니다.
공고가 주요업무에 'AI 생성 요청의 상태 관리·결과 저장·실패 재시도·비용 추적이 가능한 백엔드 구조 설계' 를 적었고, 바로 아래에 '구독·크레딧·결제 시스템과 사용량 기반 과금 로직 설계' 를 두었습니다. 그 둘이 만나는 자리가 실패와 재시도를 어떻게 셀지이고, 이 포트폴리오는 그 셈법을 에이전트별 규칙표로 옮깁니다. 'Multi-Agent Ecosystem(13개+ AI Agent)의 신규 기능 설계·개발' 이라 에이전트가 늘수록 규칙이 데이터로 있어야 합니다. 이 포트폴리오가 보여주는 것은 과금 규칙을 데이터로 두고 요청 기록과 맞춰 금액을 계산하는 기술이며, 결제 연동이나 이커머스 상세페이지 제작 전문성은 주장하지 않습니다. 모르는 깊이는 면접에서 모른다고 말하는 편이 낫습니다.
'AI 생성 요청의 상태 관리·결과 저장·실패 재시도·비용 추적이 가능한 백엔드 구조 설계'. 그 네 가지가 만나는 자리가 과금입니다.
'구독·크레딧·결제 시스템과 사용량 기반 과금 로직 설계'. 이 편은 그 로직의 계산부만 맡습니다.
'Multi-Agent Ecosystem(13개+ AI Agent)의 신규 기능 설계·개발'. 에이전트가 늘수록 셈법이 갈립니다.
AI 생성 요청 기록을 받아 요청마다 크레딧을 얼마나 물릴지 셉니다. 에이전트별 과금 규칙에 산출 단위당 크레딧과 실패·재시도 과금 여부, 부분 성공 비율을 두고 요청 기록과 맞춰, 물릴 요청은 금액을 계산하고 그렇지 않으면 실패 면제·재시도 면제 중 어느 쪽인지 남깁니다. 산출 수가 안 남은 요청은 셀 수 없다고 표시하고, 규칙에 없는 에이전트는 미선언으로 남겨 단가를 먼저 정하게 합니다. 요청 기록은 실 고객 사용 기록 대신 지원자가 만든 에이전트를 돌려 남긴 것을 가정하며, 결제는 다루지 않고 크레딧 계산까지만 합니다.
에이전트가 여럿 도는 SaaS 를 만들며 과금까지 함께 보는 개발자입니다. 실패한 요청에 크레딧이 빠졌다는 문의를 받을 때마다 로그를 뒤져 어느 단계에서 셈이 어긋났는지 손으로 되짚던 사람입니다.
에이전트마다 단가와 실패·재시도 과금 여부, 부분 성공 비율을 규칙으로 두고 요청 기록과 맞추면, 물릴 금액과 면제할 요청이 규칙으로 갈리고 그 근거가 남는다는 가정입니다. 규칙에 없는 에이전트는 미선언으로 빠지므로 단가를 아직 정하지 않은 기능이 그대로 드러납니다.
요청 기록과 에이전트별 규칙을 받아 요청마다 과금·면제를 판정하고 금액을 계산하며, 면제면 실패·재시도·산출 없음·미선언 중 어느 쪽인지 붙여 작업공간별로 합친 청구 초안을 터미널과 Markdown 파일로 내는 CLI 가 도는 완결품입니다.
작은 에이전트 넷을 만들어 요청 500건을 돌리며 실패와 재시도를 섞어 남기고, 손으로 계산한 정답 크레딧과 대조해 일치율을 냅니다.
부분 성공 비율과 재시도 과금 여부를 바꿔 가며 작업공간별 청구 합계가 어떻게 달라지는지 표로 내고, 크게 흔들리는 에이전트를 짚어 내는 단계입니다.
과금 담당자가 요청 기록과 규칙표를 넣으면 요청마다 물릴 크레딧과 면제 사유가 작업공간별로 합쳐져 나오는 과정을 시연합니다.
직접 돌린 요청 500건과 손으로 계산한 정답 크레딧을 대조해 일치율을 냅니다. 단, 정답과 기록을 모두 작성자가 만든 기준이라 성능 검증이 아니라 데모 조건 동작입니다.
산출 수가 비었거나 에이전트 이름이 흔들리거나 규칙에 없는 에이전트가 섞인 입력 30종을 넣어도 출력 형식이 안 깨지고 사유별로 빠지는 비율을 보여줍니다.
부분 성공 비율과 재시도 과금 여부를 바꿨을 때 옛 계산이 어떻게 달라지는지 회귀로 확인합니다.
진짜 성능 검증은 여기서 멈춥니다. 위 수치는 작성자가 만든 기록의 자가채점이며, 실제 청구 정확도는 휴먼코어랩의 실 사용 기록과 실 요금 정책이 있어야 측정됩니다. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태까지 만듭니다.
수치는 작성자가 만든 기록의 자가채점이라 성능 증명이 아니므로, 면접에서는 데모 동작과 실검증 준비 상태로 솔직히 설명합니다.
정답을 작성자가 붙였으니 잘 맞는 게 당연하므로, 산출 결측과 재시도 사슬, 규칙에 없는 에이전트를 일부러 섞어 쉬운 요청만 푸는 함정을 피합니다.
이 포트폴리오가 보여주는 것은 과금 규칙을 데이터로 두고 요청 기록과 맞춰 금액을 계산하는 기술이며, 결제 연동이나 이커머스 상세페이지 제작 전문성은 주장하지 않습니다. 결제는 다루지 않고 크레딧 계산까지만 하며, 계산은 곱셈과 참·거짓 비교가 하고 LLM 은 담당자가 읽을 사유 문장만 맡습니다.
부분 성공을 어디까지로 볼지는 제품마다 달라서, 비율을 규칙표에 두고 바꿨을 때 청구가 어떻게 흔들리는지 함께 보여줍니다.
실제 도입 때는 에이전트와 요금이 자주 바뀌므로, 규칙표를 이어서 고치는 일을 운영 과제로 둡니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
AI 생성 요청이 남긴 기록입니다. 요청 번호와 작업공간, 에이전트 이름 표기, 상태, 다시 돌린 원래 요청 번호, 모델, 산출 수, 요청 시각, 끝난 시각을 한 행에 둡니다. 에이전트 이름은 화면에 따라 'detail_page'와 'Detail Page'처럼 흔들립니다. 산출 수나 끝난 시각이 빈 행, 실패한 행과 그것을 다시 돌린 행, 절반만 나온 행, 규칙표에 없는 에이전트를 일부러 섞어 두어 사유가 갈리게 둡니다.
| req_no | workspace_no | agent_raw | status_raw | retry_of | model_raw | output_units | requested_at | finished_at |
|---|---|---|---|---|---|---|---|---|
| GR-001 | WS-11 | detail_page | succeeded | — | sonnet | 1 | 2026-08-20T09:00:00 | 2026-08-20T09:02:10 |
| GR-002 | WS-11 | copywriting | succeeded | — | haiku | 6 | 2026-08-20T09:05:00 | 2026-08-20T09:05:40 |
| GR-003 | WS-11 | image_gen | partial | — | image-v3 | 4 | 2026-08-20T09:10:00 | 2026-08-20T09:12:00 |
| GR-004 | WS-12 | image_gen | failed | — | image-v3 | 0 | 2026-08-20T11:00:00 | 2026-08-20T11:00:30 |
| GR-005 | WS-12 | image_gen | succeeded | GR-004 | image-v3 | 6 | 2026-08-20T11:01:00 | 2026-08-20T11:03:00 |
아래 JSON Schema 를 그대로 만족하는 생성 요청 행을 500개 더 만들어 주세요. 작업공간을 스무 곳 두고 에이전트를 예닐곱 종 섞으며, 이름 표기는 몇 행에서 띄어쓰기와 대문자로 흔들리게 둡니다. 상태를 성공·부분·실패로 섞고 실패한 요청 뒤에는 그것을 가리키는 재시도 행을 붙입니다. 2할은 산출 수나 끝난 시각을 비우세요. 규칙표에 없는 에이전트도 몇 행 넣습니다. 크레딧이나 판정은 넣지 마세요.
{"type": "object", "properties": {"req_no": {"type": "string"}, "workspace_no": {"type": "string"}, "agent_raw": {"type": "string"}, "status_raw": {"type": "string"}, "retry_of": {"type": ["string", "null"]}, "model_raw": {"type": ["string", "null"]}, "output_units": {"type": ["integer", "null"]}, "requested_at": {"type": "string"}, "finished_at": {"type": ["string", "null"]}}, "required": ["req_no", "workspace_no", "agent_raw", "status_raw", "retry_of", "model_raw", "output_units", "requested_at", "finished_at"]}{"type": "object", "properties": {"req_no": {"type": "string"}, "workspace_no": {"type": "string"}, "agent_raw": {"type": "string"}, "status_raw": {"type": "string"}, "retry_of": {"type": ["string", "null"]}, "model_raw": {"type": ["string", "null"]}, "output_units": {"type": ["integer", "null"]}, "requested_at": {"type": "string"}, "finished_at": {"type": ["string", "null"]}}, "required": ["req_no", "workspace_no", "agent_raw", "status_raw", "retry_of", "model_raw", "output_units", "requested_at", "finished_at"]}에이전트별 과금 규칙표입니다. 규칙 번호와 에이전트, 산출 단위당 크레딧, 실패 시 과금 여부, 재시도 과금 여부, 부분 성공 비율, 담당을 한 행에 둡니다. 원가가 드는 에이전트는 재시도에도 물리고 그렇지 않은 에이전트는 면제해, 같은 재시도라도 결과가 갈립니다. 기록에 나오는 에이전트 중 일부는 일부러 넣지 않아 미선언이 도출되게 둡니다.
| policy_no | agent_raw | credit_per_unit | charge_on_fail | charge_on_retry | partial_rate | owner_name |
|---|---|---|---|---|---|---|
| CP-01 | detail_page | 40 | false | false | 0.5 | 과금 |
| CP-02 | copywriting | 3 | false | false | 0.5 | 과금 |
| CP-03 | image_gen | 8 | false | true | 0.5 | 과금 |
| CP-04 | gif_maker | 12 | false | true | 0.5 | 과금 |
| CP-05 | review_insight | 5 | false | false | 0.5 | 과금 |
아래 JSON Schema 를 그대로 만족하는 과금 규칙 행을 20개 더 만들어 주세요. 에이전트마다 단가를 2 에서 40 사이로 다르게 두고, 이미지나 영상처럼 원가가 드는 종류만 재시도 과금을 참으로 둡니다. 실패 과금은 모두 거짓으로 두고 부분 성공 비율은 0.3 에서 0.7 사이로 둡니다. 기록에 나오는 에이전트 중 일부는 일부러 넣지 마세요 — 미선언이 있어야 규칙표의 구멍이 드러납니다. 판정 결과는 넣지 마세요.
{"type": "object", "properties": {"policy_no": {"type": "string"}, "agent_raw": {"type": "string"}, "credit_per_unit": {"type": "number"}, "charge_on_fail": {"type": "boolean"}, "charge_on_retry": {"type": "boolean"}, "partial_rate": {"type": "number"}, "owner_name": {"type": "string"}}, "required": ["policy_no", "agent_raw", "credit_per_unit", "charge_on_fail", "charge_on_retry", "partial_rate", "owner_name"]}{"type": "object", "properties": {"policy_no": {"type": "string"}, "agent_raw": {"type": "string"}, "credit_per_unit": {"type": "number"}, "charge_on_fail": {"type": "boolean"}, "charge_on_retry": {"type": "boolean"}, "partial_rate": {"type": "number"}, "owner_name": {"type": "string"}}, "required": ["policy_no", "agent_raw", "credit_per_unit", "charge_on_fail", "charge_on_retry", "partial_rate", "owner_name"]}| TypeScript | 요청 기록과 과금 규칙을 맞춰 크레딧을 계산하는 셈기를 맡습니다. |
| Node.js | CLI 실행기와 기록 읽기를 맡습니다. |
| PostgreSQL | 요청 기록과 규칙, 판정 결과를 담습니다. |
| Markdown | 작업공간별 청구 초안과 규칙 비교 표를 파일로 냅니다. |
✗ fail → 미선언이 절반을 넘으면 규칙표를 먼저 채웁니다.
✓ pass → 2주차 직접 기록 수집으로 넘어갑니다.
✗ fail → 어긋난 에이전트를 모아 부분 성공 정의를 다시 봅니다.
✓ pass → 3주차 규칙 비교로 넘어갑니다.
요청 하나와 과금 규칙이 만나는 자리마다 물릴 크레딧을 정합니다. 물리지 않으면 실패 면제·재시도 면제·산출 없음·미선언 중 어느 쪽인지 싣습니다. 청구 초안은 이 사유 코드로 묶습니다.
{"type": "object", "properties": {"verdict_no": {"type": "string"}, "req_no": {"type": "string"}, "workspace_no": {"type": "string"}, "agent_raw": {"type": "string"}, "policy_no": {"type": ["string", "null"]}, "charge_code": {"type": "string", "enum": ["charged", "partial_charged", "waived_failure", "waived_retry", "units_missing", "agent_undeclared"]}, "credit_amount": {"type": ["number", "null"], "description": "output_units 에 그 에이전트의 credit_per_unit 을 곱한 값이며, 부분 성공이면 거기에 partial_rate 를 한 번 더 곱합니다."}, "credit_per_unit": {"type": ["number", "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", "req_no", "workspace_no", "agent_raw", "charge_code", "evidence", "summary"]}[
{
"verdict_no": "CH-001",
"req_no": "GR-001",
"workspace_no": "WS-11",
"agent_raw": "detail_page",
"policy_no": "CP-01",
"charge_code": "charged",
"credit_amount": 40,
"credit_per_unit": 40,
"owner_name": "과금",
"evidence": [
{
"field": "output_units",
"agg": null,
"value": 1
},
{
"field": "credit_per_unit",
"agg": null,
"value": 40
}
],
"summary": "한 장을 끝까지 만들어 정해진 크레딧을 그대로 물립니다.",
"hedge": null
},
{
"verdict_no": "CH-002",
"req_no": "GR-007",
"workspace_no": "WS-13",
"agent_raw": "Detail Page",
"policy_no": "CP-01",
"charge_code": "charged",
"credit_amount": 80,
"credit_per_unit": 40,
"owner_name": "과금",
"evidence": [
{
"field": "agent_raw",
"agg": null,
"value": "Detail Page"
},
{
"field": "output_units",
"agg": null,
"value": 2
}
],
"summary": "에이전트 이름을 띄어쓰기로 적어 왔으나 접으면 같은 값이라 같은 규칙을 씁니다.",
"hedge": null
},
{
"verdict_no": "CH-003",
"req_no": "GR-003",
"workspace_no": "WS-11",
"agent_raw": "image_gen",
"policy_no": "CP-03",
"charge_code": "partial_charged",
"credit_amount": 16,
"credit_per_unit": 8,
"owner_name": "과금",
"evidence": [
{
"field": "output_units",
"agg": null,
"value": 4
},
{
"field": "partial_rate",
"agg": null,
"value": 0.5
}
],
"summary": "넉 장 중 일부만 나와 절반만 물립니다.",
"hedge": null
},
{
"verdict_no": "CH-004",
"req_no": "GR-004",
"workspace_no": "WS-12",
"agent_raw": "image_gen",
"policy_no": "CP-03",
"charge_code": "waived_failure",
"credit_amount": null,
"credit_per_unit": 8,
"owner_name": "과금",
"evidence": [
{
"field": "status_raw",
"agg": null,
"value": "failed"
},
{
"field": "charge_on_fail",
"agg": null,
"value": false
}
],
"summary": "실패한 요청이라 크레딧을 물리지 않습니다.",
"hedge": null
},
{
"verdict_no": "CH-005",
"req_no": "GR-011",
"workspace_no": "WS-14",
"agent_raw": "copywriting",
"policy_no": "CP-02",
"charge_code": "waived_retry",
"credit_amount": null,
"credit_per_unit": 3,
"owner_name": "과금",
"evidence": [
{
"field": "retry_of",
"agg": null,
"value": "GR-010"
},
{
"field": "charge_on_retry",
"agg": null,
"value": false
}
],
"summary": "앞 실패를 다시 돌린 요청이라 이 에이전트는 다시 물리지 않습니다.",
"hedge": null
},
{
"verdict_no": "CH-006",
"req_no": "GR-005",
"workspace_no": "WS-12",
"agent_raw": "image_gen",
"policy_no": "CP-03",
"charge_code": "charged",
"credit_amount": 48,
"credit_per_unit": 8,
"owner_name": "과금",
"evidence": [
{
"field": "retry_of",
"agg": null,
"value": "GR-004"
},
{
"field": "charge_on_retry",
"agg": null,
"value": true
}
],
"summary": "이미지 생성은 다시 돌려도 원가가 드는 종류라 재시도에도 물립니다.",
"hedge": "고객이 같은 실패를 반복하면 문의가 들어올 수 있어 담당자가 봅니다."
},
{
"verdict_no": "CH-007",
"req_no": "GR-006",
"workspace_no": "WS-12",
"agent_raw": "review_insight",
"policy_no": "CP-05",
"charge_code": "units_missing",
"credit_amount": null,
"credit_per_unit": 5,
"owner_name": "과금",
"evidence": [
{
"field": "output_units",
"agg": null,
"value": null
},
{
"field": "status_raw",
"agg": null,
"value": "succeeded"
}
],
"summary": "성공으로 끝났는데 산출 수가 안 남아 얼마를 물릴지 셀 수 없습니다.",
"hedge": null
},
{
"verdict_no": "CH-008",
"req_no": "GR-009",
"workspace_no": "WS-13",
"agent_raw": "translation",
"policy_no": "CP-06",
"charge_code": "charged",
"credit_amount": 16,
"credit_per_unit": 2,
"owner_name": "과금",
"evidence": [
{
"field": "output_units",
"agg": null,
"value": 8
},
{
"field": "credit_per_unit",
"agg": null,
"value": 2
}
],
"summary": "여덟 문단을 옮겨 단가만큼 물립니다.",
"hedge": null
}
][자동 검증 · 코드가 판정합니다] 1. charge_code 가 enum 여섯 값 중 하나인지 확인합니다. 2. verdict_no·req_no·workspace_no·agent_raw·charge_code·evidence·summary 가 모두 채워졌는지 확인합니다. 3. req_no 가 요청 기록에 실재하는 번호인지 대조합니다. 4. policy_no 가 있으면 규칙표에 실재하는 행 번호인지 대조합니다. 5. policy_no 가 있으면 credit_per_unit·owner_name 이 그 규칙 행의 값과 같은지 대조합니다. 6. agent_raw 를 대소문자와 띄어쓰기를 접어 규칙표와 맞추고, 맞는 행이 없으면 charge_code 가 agent_undeclared 인지 확인합니다. 7. credit_amount 를 output_units 에 credit_per_unit 을 곱해 다시 계산하고, 부분 성공이면 partial_rate 를 한 번 더 곱해 견줍니다. 8. status_raw 가 실패이고 charge_on_fail 이 거짓이면 charge_code 가 waived_failure 인지 확인합니다. 9. retry_of 가 채워졌고 charge_on_retry 가 거짓이면 charge_code 가 waived_retry 인지 확인합니다. 10. retry_of 가 가리키는 요청 번호가 기록에 실재하는지 대조합니다. 11. output_units 가 비어 있으면 charge_code 가 units_missing 인지 확인합니다. 12. status_raw 가 부분이면 charge_code 가 partial_charged 인지 확인합니다. 13. evidence 의 field 이름이 요청 기록과 규칙표에 실재하는 컬럼인지 대조합니다. 14. agg 가 없는 evidence 의 value 가 그 컬럼에 수록된 행 값과 같은지 확인합니다. 15. summary 가 존댓말로 끝나는지 확인합니다. [평가 러너 · 2주차] 직접 돌린 요청 500건에 손으로 계산한 정답 크레딧과 대조해 일치율과 사유 코드별 분포를 내고, 미선언이 몰리는 에이전트를 목록으로 냅니다. [수동 검증 · 사람이 봅니다] 1. 새 에이전트의 단가와 재시도 과금 여부를 과금 담당이 정합니다. 2. 부분 성공을 어디까지로 볼지 제품 담당이 정합니다.