The Boston Consulting Group
경력근거: Optimize and enhance computational efficiency of algorithms
※ 실제 산출물이 아닌 AI 예측 시안입니다.
BCG X의 이 자리는 고객사에 AI 솔루션을 설계해 제안하고, 비기술 컨설턴트와 이해관계자를 함께 이끄는 일입니다. 제안 자리에서는 무엇을 만들 수 있는지보다 매달 얼마가 드는지가 먼저 질문으로 나오는데, 그 답을 근거와 함께 못 내면 논의가 진도를 못 나갑니다. 이 요구는 남의 예산으로 도입을 설득해야 하는 컨설팅 자리에서 특히 강하게 걸립니다. 공고 업무는 아키텍처 설계부터 팀 관리까지 걸쳐 있는데 1주 범위에서 고를 수 있는 것은 하나라 비용 산출 축을 골랐습니다. 이 포트폴리오는 단가와 사용량을 데이터로 분리해 계산 근거를 남기는 기술을 보여줍니다. 특정 산업의 업무 지식이나 모델 성능 비교의 전문성은 주장하지 않습니다. 그 깊이는 면접에서 모른다고 말하는 편이 낫습니다.
비기술 팀과 컨설턴트를 이끌고 안내하는 역량을 자격요건으로 요구합니다. 비용이 어디서 나오는지 숫자로 보여 주는 것이 그 설득의 실물입니다.
알고리즘과 소프트웨어 설계의 계산 효율을 최적화하는 일이 자격요건에 있습니다. 어느 업무가 토큰을 많이 먹는지 아는 것이 그 최적화의 출발입니다.
주제를 끌고 가 상업적 임팩트를 만드는 능력을 요구합니다. 제안 단계에서 비용을 먼저 내놓는 것이 그 임팩트를 정하는 자리입니다.
업무별 예상 호출량과 모델 단가표, 업무마다 배정된 월 상한을 받아 각 업무의 월 비용을 계산하고 상한 안에 드는지 판정해 출력하며 고객 제안용 리포트를 남기는 CLI입니다. 상한을 넘는 업무는 같은 tier의 더 싼 모델로 바꿨을 때의 비용을 함께 계산해 대안으로 답니다.
고객사에 AI 도입을 제안하는 컨설팅 팀의 엔지니어입니다. 제안서에 월 운영비를 넣어야 하는데, 업무마다 모델과 호출량이 달라 스프레드시트를 매번 새로 짜다가 단가가 바뀌면 어느 칸을 고쳐야 하는지 헤맵니다.
업무별 호출량과 모델 단가가 표로 분리돼 있으면, 월 비용은 사람이 스프레드시트를 다시 짜지 않아도 곱셈과 덧셈으로 나옵니다.
업무별 사용량 표와 모델 단가표를 인자로 받아 업무별 월 비용을 터미널에 출력하고 제안용 리포트를 떨구는 CLI입니다. 실제 API를 호출하지 않고 예상값만 계산합니다.
같은 사용량에 다른 모델을 대입해 비용을 나란히 계산하는 비교표를 리포트에 넣는 구성입니다.
단가표를 파일로 분리해 고객사 계약 단가와 할인율을 반영하고, 계산 결과를 제안서에 붙일 수 있게 내보냅니다.
담당자가 업무 20건과 단가표를 넣어 업무별 월 비용과 합계, 제안용 리포트가 나오는 것을 시연합니다.
결측·중복·미등록 모델이 섞인 입력 30종을 넣어도 출력 형식이 깨지지 않고, 계산하지 못한 업무는 사유가 붙어 남습니다.
단가를 못 찾은 업무는 0원으로 세지 않고 단가 미등록으로 따로 답니다. 계산하지 못한 것을 공짜로 만들지 않습니다.
계산과 손으로 만든 정답표를 맞춰 사유별로 어긋난 건을 셉니다. 단, 사용량과 단가를 모두 작성자가 만든 합성 기준이라 성능 측정이 아니라 데모 조건 동작입니다.
진짜 성능 검증은 여기서 멈춥니다. 위 수치는 더미데이터 자가채점이며, 실제 비용 정확도는 고객사의 실제 사용량과 실제 계약 단가가 있어야 측정됩니다. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태까지 만듭니다.
수치는 합성 데이터 자가채점이라 성능 증명이 아닙니다. 면접에서는 데모 동작과 실검증 준비 상태로 솔직히 설명합니다.
단가표에 다 있는 모델만 넣으면 계산이 안 될 일이 없습니다. 모델 표기가 자료마다 다른 건과 호출량이 빈 건, 단가표에 없는 모델을 업무 목록에 일부러 심었습니다.
계산이 맞다고 해서 실제 비용이 그대로 나온다고 단정할 수 없습니다. 예상 호출량 자체가 추정이므로, 결과는 그 가정 위에서만 읽어야 합니다.
실제 도입하면 고객사마다 계약 단가와 할인 구조가 다릅니다. 단가표를 구매 담당자와 맞추는 일이 도입 단계의 실제 과제입니다.
어느 모델이 그 업무에 충분한지의 판단은 이 도구의 범위 밖입니다. 비용만 계산하므로, 품질 비교는 따로 시험해 정합니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
제안에 넣을 업무별 예상 사용량과 배정된 월 상한입니다. 모델 표기가 자료마다 대소문자·구분자로 흔들리고, 단가표에 없는 신규 모델과 같은 업무 번호가 두 번 들어온 건, 호출량이 비어 있는 행을 일부러 섞었습니다.
| workload_no | workload_name | model_raw | monthly_calls | avg_input_tokens | avg_output_tokens | monthly_budget_usd |
|---|---|---|---|---|---|---|
| WL-001 | 상담 요약 | claude-haiku | 120,000 | 1,200 | 300 | 400 |
| WL-002 | 문서 분류 | Claude-Haiku | 80,000 | 800 | 50 | 150 |
| WL-003 | 계약서 검토 | CLAUDE-SONNET | 5,000 | 12,000 | 1,500 | 200 |
| WL-004 | 사내 질의응답 | claude-sonnet | 40,000 | 4,000 | 600 | 900 |
| WL-005 | 리포트 초안 | gpt-4o | 3,000 | 6,000 | 2,500 | 300 |
아래 JSON Schema에 맞는 업무별 사용량 행을 더 만들어 주세요. {"type":"object","properties":{"workload_no":{"type":"string"},"workload_name":{"type":"string"},"model_raw":{"type":"string"},"monthly_calls":{"type":["integer","null"]},"avg_input_tokens":{"type":"integer"},"avg_output_tokens":{"type":"integer"},"monthly_budget_usd":{"type":["number","null"]}},"required":["workload_no","workload_name","model_raw","monthly_calls","avg_input_tokens","avg_output_tokens","monthly_budget_usd"]} workload_name은 한글로 적어 주세요. 쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라. 첫째 미매핑으로 model_raw가 단가표에 없어 model_id가 null인 행, 둘째 표기흔들림으로 같은 모델을 claude-haiku와 Claude-Haiku와 CLAUDE-HAIKU처럼 대소문자만 다르게 적은 행, 셋째 중복으로 같은 workload_no가 두 행에 있는 재등록 건, 넷째 결측으로 monthly_calls가 null인 행, 다섯째 경계극단으로 monthly_calls가 1인 거의 안 쓰는 업무와 백만 건이 넘는 업무. 또한 형식 깨뜨리기 시도 3건을 별도 파일로 만들어 avg_input_tokens에 문자열을 넣거나 model_raw를 빼서 스키마 검증이 걸러내는지 확인하게 해 주세요. monthly_budget_usd는 그 업무에 배정된 월 상한이고 열 행에 한 번쯤 null로 비워 주세요.{"type":"object","properties":{"workload_no":{"type":"string"},"workload_name":{"type":"string"},"model_raw":{"type":"string"},"monthly_calls":{"type":["integer","null"]},"avg_input_tokens":{"type":"integer"},"avg_output_tokens":{"type":"integer"},"monthly_budget_usd":{"type":["number","null"]}},"required":["workload_no","workload_name","model_raw","monthly_calls","avg_input_tokens","avg_output_tokens","monthly_budget_usd"]}모델별 백만 토큰당 단가표입니다. 출력 단가가 아직 공개되지 않은 모델을 일부러 섞었습니다.
| model_id | model_label | input_price_per_mtok | output_price_per_mtok | currency | tier |
|---|---|---|---|---|---|
| claude_haiku | 클로드 하이쿠 | 1 | 5 | USD | light |
| claude_sonnet | 클로드 소넷 | 3 | 15 | USD | standard |
| gpt_4o | 지피티 포오 | 2.5 | 10 | USD | standard |
| gpt_4o_mini | 지피티 포오 미니 | 0.15 | 0.6 | USD | light |
| gemini_flash | 제미나이 플래시 | 0.1 | 0.4 | USD | light |
아래 JSON Schema에 맞는 모델 단가 행을 더 만들어 주세요. {"type":"object","properties":{"model_id":{"type":"string"},"model_label":{"type":"string"},"input_price_per_mtok":{"type":"number"},"output_price_per_mtok":{"type":["number","null"]},"currency":{"type":"string"},"tier":{"type":"string","enum":["light","standard","premium"]}},"required":["model_id","model_label","input_price_per_mtok","output_price_per_mtok","currency","tier"]} model_label은 한글로 적어 주세요. 쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라. 첫째 결측으로 output_price_per_mtok이 null인 출력이 없는 모델, 둘째 경계극단으로 단가가 0.01인 매우 싼 모델과 30인 매우 비싼 모델, 셋째 tier가 premium인 모델. 또한 형식 깨뜨리기 시도 3건을 별도 파일로 만들어 tier에 enum 밖 값을 넣거나 input_price_per_mtok에 문자열을 넣어 스키마 검증이 걸러내는지 확인하게 해 주세요.{"type":"object","properties":{"model_id":{"type":"string"},"model_label":{"type":"string"},"input_price_per_mtok":{"type":"number"},"output_price_per_mtok":{"type":["number","null"]},"currency":{"type":"string"},"tier":{"type":"string","enum":["light","standard","premium"]}},"required":["model_id","model_label","input_price_per_mtok","output_price_per_mtok","currency","tier"]}| Python | 사용량과 단가를 읽어 비용을 계산하고 리포트를 만드는 본체입니다. |
| LLM | 비용 계산의 대상이며, 모델별 입력·출력 단가가 계산의 입력입니다. |
| LangChain | 고객사가 이 프레임워크로 설계한 업무 흐름의 단계 수를 사용량 표로 옮기는 입력 어댑터를 둡니다. |
| TypeScript | 계산 결과를 제안 문서 도구가 받아 갈 때 쓰는 타입 정의와 내보내기 스크립트입니다. |
| CI/CD | 단가표를 고칠 때마다 회귀 테스트를 돌려 과거 제안의 숫자가 흔들리지 않게 합니다. |
| 클라우드 | 고객사가 쓰는 클라우드의 모델 단가를 단가표의 한 원천으로 받습니다. |
✓ pass → 여기서 멈춰도 완결입니다. 더 키우려면 모델을 바꿨을 때의 비용을 나란히 계산합니다.
✓ pass → 비교까지가 한 덩어리입니다. 더 키우려면 단가표를 고객사 계약가로 갈아끼웁니다.
업무 하나의 월 비용과 그 비용이 배정된 상한 안에 드는지의 판정입니다. 넘으면 얼마나 넘었는지와 더 싼 모델로 바꿨을 때의 비용을 함께 담습니다.
{"type":"object","properties":{"workload_no":{"type":"string"},"verdict":{"type":"string","enum":["within_budget","over_budget","budget_missing","calls_missing","output_price_missing","model_unmapped","duplicate_workload"]},"monthly_cost_usd":{"type":["number","null"]},"input_cost_usd":{"type":["number","null"]},"output_cost_usd":{"type":["number","null"]},"monthly_budget_usd":{"type":["number","null"]},"cheaper_tier_cost_usd":{"type":["number","null"]},"evidence":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"agg":{"type":["string","null"]},"value":{},"quote":{"type":["string","null"]}},"required":["field","value"]}},"next_action":{"type":"string"}},"required":["workload_no","verdict","monthly_cost_usd","input_cost_usd","output_cost_usd","monthly_budget_usd","cheaper_tier_cost_usd","evidence","next_action"]}[
{
"workload_no": "WL-001",
"verdict": "within_budget",
"monthly_cost_usd": 324,
"input_cost_usd": 144,
"output_cost_usd": 180,
"evidence": [
{
"field": "monthly_calls",
"value": 120000
},
{
"field": "avg_input_tokens",
"value": 1200
},
{
"field": "avg_output_tokens",
"value": 300
},
{
"field": "input_price_per_mtok",
"value": 1
},
{
"field": "output_price_per_mtok",
"value": 5
},
{
"field": "monthly_budget_usd",
"value": 400
}
],
"next_action": "상한 400달러 안에 듭니다. 제안서 합계의 주요 항목으로 올립니다.",
"monthly_budget_usd": 400,
"cheaper_tier_cost_usd": null
},
{
"workload_no": "WL-006",
"verdict": "within_budget",
"monthly_cost_usd": 75,
"input_cost_usd": 15,
"output_cost_usd": 60,
"evidence": [
{
"field": "monthly_calls",
"value": 200000
},
{
"field": "avg_input_tokens",
"value": 500
},
{
"field": "avg_output_tokens",
"value": 500
},
{
"field": "input_price_per_mtok",
"value": 0.15
},
{
"field": "output_price_per_mtok",
"value": 0.6
},
{
"field": "monthly_budget_usd",
"value": 100
}
],
"next_action": "호출은 많지만 경량 모델이라 상한 100달러 안에 듭니다. 그대로 둡니다.",
"monthly_budget_usd": 100,
"cheaper_tier_cost_usd": null
},
{
"workload_no": "WL-003",
"verdict": "over_budget",
"monthly_cost_usd": 292.5,
"input_cost_usd": 180,
"output_cost_usd": 112.5,
"evidence": [
{
"field": "monthly_calls",
"value": 5000
},
{
"field": "avg_input_tokens",
"value": 12000
},
{
"field": "avg_output_tokens",
"value": 1500
},
{
"field": "input_price_per_mtok",
"value": 3
},
{
"field": "output_price_per_mtok",
"value": 15
},
{
"field": "monthly_budget_usd",
"value": 200
},
{
"field": "tier",
"value": "standard"
}
],
"next_action": "상한을 92.5달러 넘습니다. 같은 경량 tier의 클로드 하이쿠로 내리면 97.5달러라 상한 안에 듭니다.",
"monthly_budget_usd": 200,
"cheaper_tier_cost_usd": 97.5
},
{
"workload_no": "WL-008",
"verdict": "calls_missing",
"monthly_cost_usd": null,
"input_cost_usd": null,
"output_cost_usd": null,
"evidence": [
{
"field": "monthly_calls",
"value": null
},
{
"field": "workload_name",
"value": "이미지 설명"
}
],
"next_action": "월 호출량이 비어 있습니다. 0원으로 세지 않고 현업에 예상 건수를 요청합니다.",
"monthly_budget_usd": 250,
"cheaper_tier_cost_usd": null
},
{
"workload_no": "WL-007",
"verdict": "model_unmapped",
"monthly_cost_usd": null,
"input_cost_usd": null,
"output_cost_usd": null,
"evidence": [
{
"field": "model_raw",
"value": "claude-opus",
"quote": "claude-opus"
}
],
"next_action": "단가표에 없는 모델입니다. 단가를 받기 전에는 합계에서 빼 둡니다.",
"monthly_budget_usd": 400,
"cheaper_tier_cost_usd": null
},
{
"workload_no": "WL-003",
"verdict": "duplicate_workload",
"monthly_cost_usd": 292.5,
"input_cost_usd": 180,
"output_cost_usd": 112.5,
"evidence": [
{
"field": "workload_no",
"agg": "count",
"value": 2
}
],
"next_action": "같은 업무 번호가 두 번 등록됐습니다. 앞 건으로만 계산하고 뒤 건을 합계에서 뺍니다.",
"monthly_budget_usd": 200,
"cheaper_tier_cost_usd": null
},
{
"workload_no": "WL-011",
"verdict": "budget_missing",
"monthly_cost_usd": null,
"input_cost_usd": null,
"output_cost_usd": null,
"monthly_budget_usd": null,
"cheaper_tier_cost_usd": null,
"evidence": [
{
"field": "monthly_budget_usd",
"value": null
},
{
"field": "workload_name",
"value": "제품 문의 응답"
}
],
"next_action": "이 업무의 월 상한이 정해져 있지 않습니다. 비용은 계산하되 판정은 상한을 받은 뒤에 합니다."
}
][자동 검증 · 1주차] 1. verdict가 enum 다섯 값 안에 있는지 확인합니다. 2. workload_no·verdict·monthly_cost_usd·input_cost_usd·output_cost_usd·evidence·next_action이 모두 있는지 확인합니다. 3. avg_input_tokens와 avg_output_tokens가 0 이상인지 확인합니다. 4. monthly_calls가 null이면 verdict가 calls_missing인지 확인합니다. 5. evidence의 field가 두 입력 표의 컬럼에 실재하는지 확인합니다. 6. evidence의 quote가 그 행 model_raw의 일부인지 확인합니다. 7. next_action이 존댓말로 끝나는지 확인합니다. [판정 규칙] 1. 모델 표기은 대소문자와 띄어쓰기, 구분자를 없애 소문자로 모은 뒤 model_price_list의 model_id와 맞춥니다. 맞는 것이 없으면 미매핑으로 남기고 그 행은 나머지 판정에서 뺍니다. 2. 같은 행 번호가 두 번 들어오면 앞 건만 남기고 뒤 건은 적재 단계에서 사유와 함께 뺍니다. [판정 규칙] 1. 월 비용은 호출 수와 평균 토큰, 단가를 곱해 입력과 출력을 따로 더합니다. 2. 월 비용을 그 업무의 상한과 견줘 안에 들면 within_budget, 넘으면 over_budget으로 답니다. 상한이 비어 있으면 판정하지 않고 budget_missing으로 남깁니다. 3. over_budget인 업무는 단가표에서 같은 통화의 더 싼 tier 모델로 바꿨을 때의 비용을 함께 계산해 대안으로 적습니다. [수동 검증] 1. 예상 호출량이 현업이 말한 업무 빈도와 맞는지 컨설턴트가 확인합니다. 2. WL-002·WL-003처럼 모델 표기가 흔들렸지만 단가표로 맞춰진 업무는 미매핑 사유를 달지 않는 것이 맞는지 확인합니다. [평가 러너 · 2주차] 1. 같은 사용량에 다른 모델을 대입해 비용 차이를 세고 어느 업무에서 절감이 큰지 나눕니다. 2. 사용량과 단가를 작성자가 만든 합성 기준이라 이 수치는 성능 측정이 아니라 데모 조건 동작입니다.
근거: Optimize and enhance computational efficiency of algorithms