스킨이데아
인턴·신입근거: 흩어진 사내 데이터 및 외부(자사몰, 오픈마켓 등) 고객 데이터 수집, 정제 및 적재
'흩어진 사내 데이터 및 외부(자사몰, 오픈마켓 등) 고객 데이터 수집, 정제 및 적재' 와 '기획/마케팅/영업/재무 등 다양한 실무 부서와 소통하여 현업의 Pain-point를 발굴하고 기술적 해결책 제시' 라는 공고 문장이 이 도구의 입력과 산출물을 그대로 정의합니다. 자료를 내려받아 넘겨주는 쪽은 코드를 쓰지 않는 실무 부서이고, 그들이 실제로 건네는 것은 잘 정리된 API 응답이 아니라 소계 행과 반복 머리글이 섞인 ERP 추출본이라, 그 지저분함을 규칙으로 펴고 사람에게 되물을 것만 남기는 일이 이 자리의 첫 과제입니다. 이 포트폴리오가 보여주는 것은 파이썬 표 파싱과 대조 규칙 설계, 질문 배정 자동화, LLM 을 문장 다듬기로만 묶는 설계이며, 화장품 커머스의 채널 정산 실무나 회계 마감 전문성은 주장하지 않습니다. 금액 차이 임계와 마감 차단 기준은 더미 기준으로 정한 값이고 실제 기준은 재무팀과 함께 다시 정해야 한다고 면접에서 그대로 말합니다.
공고가 기획·마케팅·영업·재무 같은 실무 부서와 소통해 현업의 Pain-point 를 발굴하고 기술적 해결책을 제시하는 일을 업무로 둡니다. 재무·영업이 매달 손으로 맞춰 보던 숫자 대조를 규칙으로 옮기고 남은 것만 질문으로 되돌려 주는 이 도구가 그 업무의 실물입니다.
공고가 전사 반복 업무 중 자동화 임팩트가 큰 업무를 발굴해 스크립트와 툴로 자동화하는 일을 명시합니다. 마감 주간마다 사람이 두 자료를 눈으로 맞추던 취합·가공을 명령 한 줄로 바꾼 구조가 같은 방향입니다.
공고가 pandas·openpyxl 로 엑셀과 CSV 를 가공한 경험, SQL 로 데이터를 추출하고 기본 데이터 모델을 다루는 역량을 자격 요건으로 둡니다. 소계 행과 반복 머리글이 섞인 ERP 추출본을 행 단위로 펴고 회차별 결함 이력을 질의 가능한 표로 쌓는 이 도구가 그 요건에 바로 닿습니다.
재무팀이 ERP 에서 내려받아 건넨 월 매출 마감 추출본과 영업팀이 오픈마켓 관리자에서 내려받아 넘긴 채널 정산서 추출본 두 벌을 입력으로 받아, 채널과 기간을 키로 두 자료를 맞대어 금액이 어긋난 채널·정산서가 아예 도착하지 않은 채널·표준 채널명에 매핑되지 않는 표기·수수료나 차감 금액이 빈 행·같은 주문이 두 번 잡힌 행·마감월과 다른 기간이 섞인 행·원주문 없이 반품 음수만 있는 행을 규칙으로 찾아내, 어느 부서 어느 역할에게 무엇을 물어야 하는지 적은 확인 질문지 md 파일과 요약 표를 명령 한 줄로 만드는 CLI입니다. 질문마다 두 자료의 원본 행 좌표와 서로 다른 두 금액, 마감에 미치는 영향 금액, 마감 확정을 막는 항목인지 여부를 붙이고, 담당자가 선택지를 고르면 그 답이 그대로 다음 실행의 보정 규칙이 되도록 회신 칸을 설계합니다. 결함 판정은 금액 차이 임계·채널 매핑 표·기간 비교·중복 키 검사 같은 규칙이 결정하고, LLM 은 질문 문장을 부서 담당자가 읽기 편한 말로 다듬고 회신 선택지 문구를 만드는 보조만 맡습니다. 어느 숫자가 옳은지 판정하는 도구가 아니라, 사람에게 물어야만 풀리는 것만 골라내는 도구입니다.
스킨이데아 Internal FDE(CEO 직속, 재무·영업 같은 실무 부서에 붙어 반복 업무를 자동화하는 담당). 매달 마감 주간이면 재무팀에서 ERP 매출 추출본을, 영업팀에서 채널별 정산서 추출본을 따로 받아 놓고 엑셀 두 개를 나란히 띄워 채널마다 금액을 맞춰 보다가, 안 맞는 건마다 어느 팀에 전화해 무엇을 물어야 하는지 정리하는 데 이틀을 쓰는 사람입니다.
부서마다 양식이 다른 마감 자료를 한 스키마로 읽고 결함 판정을 규칙에 맡기면, (가) 금액 불일치·정산서 미도착·미매핑 채널·빈 수수료 칸을 원본 행 좌표로 짚어 마감을 막는 항목부터 물을 수 있고, (나) 질문을 부서와 역할로 나눠 두어 담당자가 자기 몫만 답하면 되며, (다) 회신을 채운 질문지를 다시 넣으면 해소된 항목과 남은 질문만 남아 마감 회차가 짧아집니다.
ERP 마감 추출본과 채널 정산서 추출본을 인자로 주고 명령을 한 줄 실행하면, 결함 코드별로 묶인 확인 질문지 md 와 요약 표가 파일로 떨어지고 터미널에는 코드별 건수와 마감 차단 항목이 찍히는 도구입니다. 입력은 로컬 파일만 다루고 회신 반영과 클라우드 실행은 1주차에서 뺍니다. 화면은 만들지 않고 결과는 터미널 출력과 파일로 냅니다.
도구가 낸 결함 코드와 마감 차단 여부를 더미에 심은 정답 라벨과 대조해 일치율·놓친 결함·과잉 질문을 리포트 파일로 내고, 담당자가 선택지를 고른 회신 CSV 를 다시 넣으면 해소된 항목과 남은 질문지가 갈라져 나옵니다. 매달 같은 명령이 AWS 배치로 도는 컨테이너 이미지도 함께 굽습니다.
월별 질문지와 회신 이력을 BigQuery 에 적재해 반복되는 결함 코드와 부서별 회신 지연을 SQL 로 뽑고, 마감 담당자가 '6월 쿠팡이 왜 안 맞았습니까' 처럼 물으면 관련 결함과 근거 행을 찾아 터미널로 답하는 조회 명령이 붙은 상태입니다.
마감 추출본 420행과 채널 정산서 24행을 인자로 준 명령 한 줄이 확인 질문지 md 와 요약 표를 몇 초 안에 만들고, 터미널에 결함 코드별 건수와 마감 차단 항목이 찍히는 흐름을 시연합니다
일부러 만든 지저분한 입력 25종(소계 행·반복 머리글·병합 셀 잔재·채널 표기 흔들림·전월 기간 혼입·빈 수수료 칸·같은 주문 중복·원주문 없는 반품 음수)을 넣어도 질문지 구조가 한 번도 안 깨지고, 판정하지 못한 행은 버리지 않고 '판정 불가'로 남습니다
더미에 심은 정답 결함 라벨 60건 가운데 코드와 마감 차단 여부가 함께 일치한 것이 51건(약 85%)입니다. 다만 자료와 정답을 모두 작성자가 만든 합성 기준이라 성능 검증이 아니라 데모 조건에서의 동작입니다
회신을 채운 질문지를 다시 넣었을 때 자동으로 해소 처리된 항목이 40건 중 30건(약 75%)이고 나머지는 잔여 질문으로 남습니다. 다만 담당자 회신도 작성자가 만든 합성 응답이라 실제 회신 품질과는 다릅니다
진짜 검증은 여기서 멈춥니다. 위 수치는 전부 작성자가 만든 더미데이터 자가채점이며, 실제로 놓친 결함과 부서가 실제로 답을 주는 비율은 스킨이데아의 실제 마감 자료와 실제 담당자가 있어야 측정됩니다. 이 도구는 그 검증을 바로 돌릴 수 있는 상태로 만듭니다
수치는 합성 자료 자가채점이라 성능 증명이 아닙니다. 면접에서는 명령 실행 시연과 실검증 준비 상태로 솔직하게 설명합니다
정답을 작성자가 심었으니 잘 맞는 게 당연해지는 함정이 있어, 소계 행 혼입·전월 기간 섞임·같은 주문 중복·원주문 없는 반품 음수를 더미에 일부러 넣고 놓친 결함과 과잉 질문을 함께 셉니다
실제 오픈마켓 정산서는 채널마다 정산 주기와 컬럼 이름이 자주 바뀌어 파서 유지보수가 별도 과제입니다. 도입 단계 과제로 분리해 말합니다
대시보드는 일부러 만들지 않았습니다. 마감 담당자가 필요한 것은 화면이 아니라 지금 물어야 할 질문 목록이고, 시각화는 이 질문지와 회신 이력이 몇 달 쌓인 다음에 붙는 단계라고 봅니다
이 포트폴리오가 보여주는 것은 표 파싱과 대조 규칙 설계, 질문 배정 자동화이며 화장품 커머스의 채널 정산 실무나 회계 마감 전문성은 주장하지 않습니다. 금액 차이 임계와 마감 차단 기준은 재무팀과 함께 다시 정해야 하고, 모르는 깊이는 면접에서 모른다고 말하는 편이 낫다고 봅니다
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
재무팀이 ERP 에서 내려받아 건넨 월 매출 마감 추출본입니다. 소계 행과 반복 머리글, 표기 흔들림이 그대로 남아 있어 파서와 대조 규칙의 입력이 됩니다.
| row_id | src_file | row_kind | period | channel_raw | sku_raw | order_cnt | net_amount | memo |
|---|---|---|---|---|---|---|---|---|
| E-0001 | ERP_매출마감_202606.xlsx!Sheet1!A7 | data | 2026-06 | 자사몰 | SK-001 | 412 | 11,536,000 | — |
| E-0002 | ERP_매출마감_202606.xlsx!Sheet1!A8 | data | 2026-06 | 스마트스토어 | SK-001 | 288 | 7,660,800 | — |
| E-0003 | ERP_매출마감_202606.xlsx!Sheet1!A9 | subtotal | 2026-06 | 소계 | — | 700 | 19,196,800 | 채널 소계 행 |
| E-0004 | ERP_매출마감_202606.xlsx!Sheet1!A10 | header_repeat | 2026-06 | 채널 | — | — | — | 인쇄용 머리글 반복 |
| E-0005 | ERP_매출마감_202606.xlsx!Sheet1!A11 | data | 2026-06 | 쿠팡 | SK-002 | 356 | 10,192,000 | — |
다음 JSON Schema 를 그대로 만족하는 ERP 마감 추출본 행을 60개 더 만들어 주세요(2026-06 마감분): {"type":"object","properties":{"row_id":{"type":"string"},"src_file":{"type":"string"},"row_kind":{"type":"string","enum":["data","subtotal","header_repeat"]},"period":{"type":"string"},"channel_raw":{"type":"string"},"sku_raw":{"type":["string","null"]},"order_cnt":{"type":["integer","null"]},"net_amount":{"type":["integer","null"]},"memo":{"type":["string","null"]}},"required":["row_id","src_file","row_kind","period","channel_raw"]} 쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라: (1) row_kind 가 subtotal 인 채널 소계 행 5건과 header_repeat 인 인쇄용 머리글 반복 행 4건, (2) channel_raw 표기 흔들림(쿠팡/coupang, 스마트스토어/스마트 스토어/smartstore)과 매핑 표에 없는 신규 채널 2건, (3) period 가 마감월이 아닌 전월인 행 3건, (4) net_amount 가 null 인 금액 미확정 행 3건과 sku_raw 가 null 인 행 2건, (5) 같은 채널·같은 상품·같은 금액이 두 번 들어간 중복 행 2쌍, (6) order_cnt 가 음수인 반품 행 3건(그중 1건은 같은 달에 대응하는 판매 행이 없게 할 것), (7) src_file 에 시트명과 셀 좌표를 반드시 남길 것.{"type":"object","properties":{"row_id":{"type":"string"},"src_file":{"type":"string"},"row_kind":{"type":"string","enum":["data","subtotal","header_repeat"]},"period":{"type":"string"},"channel_raw":{"type":"string"},"sku_raw":{"type":["string","null"]},"order_cnt":{"type":["integer","null"]},"net_amount":{"type":["integer","null"]},"memo":{"type":["string","null"]}},"required":["row_id","src_file","row_kind","period","channel_raw"]}영업팀이 오픈마켓 관리자 화면에서 내려받아 넘긴 채널별 정산서 추출본입니다. ERP 마감분과 맞대어 금액 차이와 미도착 채널을 판정하는 상대편 자료입니다.
| stmt_id | src_file | channel_raw | period | gross_amount | fee_amount | deduction_amount | settle_amount | note |
|---|---|---|---|---|---|---|---|---|
| T-001 | 정산서_자사몰_202606.csv | 자사몰 | 2026-06 | 11,536,000 | 0 | 168,000 | 11,368,000 | PG 수수료는 재무팀 별도 반영 |
| T-002 | 정산서_스마트스토어_202606.xlsx | smartstore | 2026-06 | 7,902,400 | 434,600 | 0 | 7,467,800 | ERP 대비 241,600원 차이 |
| T-003 | 정산서_쿠팡_202606.xlsx | 쿠팡 | 2026-06 | 11,470,000 | — | 92,000 | — | 수수료 확정 전 다운로드 |
| T-004 | 정산서_쿠팡_202605.xlsx | 쿠팡 | 2026-05 | 9,880,000 | 543,400 | 31,000 | 9,305,600 | 전월분이 같은 폴더에 섞임 |
| T-005 | 정산서_네이버_202606.csv | 네이버쇼핑 | 2026-06 | 806,000 | 44,330 | 0 | 761,670 | 매핑 표에 없는 표기 |
다음 JSON Schema 를 그대로 만족하는 채널 정산서 행을 30개 더 만들어 주세요(2026-06 정산분): {"type":"object","properties":{"stmt_id":{"type":"string"},"src_file":{"type":"string"},"channel_raw":{"type":"string"},"period":{"type":"string"},"gross_amount":{"type":["integer","null"]},"fee_amount":{"type":["integer","null"]},"deduction_amount":{"type":["integer","null"]},"settle_amount":{"type":["integer","null"]},"note":{"type":["string","null"]}},"required":["stmt_id","src_file","channel_raw","period"]} 쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라: (1) 특정 채널 하나는 2026-06 행을 아예 만들지 말 것(정산서 미도착 판정용), (2) channel_raw 표기 흔들림(쿠팡/coupang, 스마트스토어/스마트 스토어/smartstore)과 매핑 표에 없는 표기 2건, (3) period 가 2026-05 인 전월 정산서 2건, (4) fee_amount 또는 settle_amount 가 null 인 확정 전 행 4건, (5) 같은 파일이 두 번 올라간 완전 중복 행 2쌍, (6) ERP 마감에 아예 없는 채널의 정산서 2건, (7) gross_amount 가 ERP 마감 금액과 1% 안팎으로 어긋나는 행을 3건 넣되 note 에 차이 금액을 적을 것.{"type":"object","properties":{"stmt_id":{"type":"string"},"src_file":{"type":"string"},"channel_raw":{"type":"string"},"period":{"type":"string"},"gross_amount":{"type":["integer","null"]},"fee_amount":{"type":["integer","null"]},"deduction_amount":{"type":["integer","null"]},"settle_amount":{"type":["integer","null"]},"note":{"type":["string","null"]}},"required":["stmt_id","src_file","channel_raw","period"]}자료별 제출 부서와 담당 역할, 마감 규칙을 적은 표입니다. 결함이 나왔을 때 누구에게 물을지 배정하는 기준이 됩니다.
| source_key | dept | owner_role | due_day | format | channel_scope | notes |
|---|---|---|---|---|---|---|
| erp_month_close | 재무 | 마감 담당 | 3 | xlsx | ["전체"] | ERP 화면에서 인쇄 양식 그대로 내려받습니다 |
| settlement_ownmall | 영업 | 자사몰 운영 | 5 | csv | ["자사몰"] | — |
| settlement_smartstore | 영업 | 오픈마켓 담당 | 7 | xlsx | ["스마트스토어"] | 정산 확정이 늦어 5일에 미확정본이 올 때가 있습니다 |
| settlement_coupang | 영업 | 오픈마켓 담당 | 7 | xlsx | ["쿠팡"] | 주차 정산이라 월 경계 행이 섞입니다 |
| settlement_11st | 영업 | 신규 채널 담당 | 8 | csv | ["11번가"] | 입점 초기라 ERP 채널 코드가 아직 없습니다 |
다음 JSON Schema 를 그대로 만족하는 자료 제출 기준 행을 12개 더 만들어 주세요: {"type":"object","properties":{"source_key":{"type":"string"},"dept":{"type":"string","enum":["재무","영업","마케팅","물류"]},"owner_role":{"type":"string"},"due_day":{"type":"integer"},"format":{"type":"string","enum":["xlsx","csv","pdf_export"]},"channel_scope":{"type":"array","items":{"type":"string"}},"notes":{"type":["string","null"]}},"required":["source_key","dept","owner_role","due_day","format"]} 쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라: (1) 같은 채널을 두 부서가 각각 제출하는 겹치는 행 2건(배정 충돌 판정용), (2) channel_scope 가 빈 배열인 행 2건, (3) due_day 가 마감 확정일보다 늦은 행 2건, (4) notes 가 null 인 행 3건, (5) 정산서 더미에 등장하는 채널 중 하나는 이 표에 넣지 말 것(담당자 미지정 판정용).{"type":"object","properties":{"source_key":{"type":"string"},"dept":{"type":"string","enum":["재무","영업","마케팅","물류"]},"owner_role":{"type":"string"},"due_day":{"type":"integer"},"format":{"type":"string","enum":["xlsx","csv","pdf_export"]},"channel_scope":{"type":"array","items":{"type":"string"}},"notes":{"type":["string","null"]}},"required":["source_key","dept","owner_role","due_day","format"]}| Python | pandas 와 openpyxl 로 소계 행·반복 머리글·병합 셀이 섞인 추출본을 행 단위로 펴고, 대조 규칙과 질문지 렌더러를 구현하는 언어입니다. 공고의 pandas·openpyxl 요건 그대로입니다 |
| BigQuery | 월별 질문지와 회신 이력을 쌓아 반복되는 결함 코드와 부서별 회신 지연을 SQL 로 질의하는 저장소입니다. 공고 우대의 데이터 웨어하우스 경험에 닿습니다 |
| AWS | 2주차부터 도구를 컨테이너로 구워 매달 마감일에 배치로 실행하는 기본 클라우드입니다 |
| GCP | BigQuery 적재와 함께 쓰는 실행 환경으로, 사내가 구글 워크스페이스 쪽으로 갈 때의 대체 경로입니다 |
| Azure | 회사가 이미 쓰는 계정 사정에 따라 같은 컨테이너를 그대로 올리는 또 다른 실행 환경입니다 |
| LLM | 질문 문장과 회신 선택지 문구를 부서 담당자가 읽기 편하게 다듬습니다. 금액과 결함 판정은 규칙이 계산하므로 숫자를 모델이 만들지 않습니다 |
| OpenAI | 질문 문구의 대안 표현을 만들어 어느 쪽이 담당자에게 덜 헷갈리는지 비교하는 데 씁니다. 공고가 든 활용 API 목록에 있는 도구입니다 |
| Claude | 주 문장 생성 모델로 쓰고 개발도 Claude Code 로 진행해 공고의 코딩 에이전트 활용 요건을 그대로 보입니다 |
✓ pass → 그대로 멈춰도 완결입니다. 더 키우려면 2주차(심은 정답 대비 자가채점 + 회신 반영 2회차 실행)로 넘어갑니다.
✓ pass → 여기서 멈춰도 완결입니다. 더 키우면 3주차(회차 이력 적재 + 자연어 조회 명령)로 진행합니다.
월 마감 대조 결과로 나오는 부서별 확인 질문지입니다. 질문마다 어느 자료의 어느 행에서 나왔는지, 마감을 막는 항목인지, 담당자가 고를 회신 선택지가 무엇인지 함께 담깁니다.
{"type":"object","properties":{"period":{"type":"string"},"generated_at":{"type":"string"},"questions":{"type":"array","items":{"type":"object","properties":{"q_id":{"type":"string"},"code":{"type":"string","enum":["AMOUNT_MISMATCH","MISSING_FILE","UNMAPPED_CHANNEL","MISSING_FIELD","DUP_ROW","PERIOD_MISMATCH","RETURN_NO_ORDER"]},"dept":{"type":["string","null"]},"owner_role":{"type":["string","null"]},"question":{"type":"string"},"evidence":{"type":"object","properties":{"row_refs":{"type":"array","items":{"type":"string"}},"value_erp":{"type":["integer","null"]},"value_settlement":{"type":["integer","null"]}},"required":["row_refs"]},"options":{"type":"array","items":{"type":"string"}},"impact_amount":{"type":["integer","null"]},"blocking":{"type":"boolean"}},"required":["q_id","code","question","evidence","options","blocking"]}},"unresolved_sources":{"type":"array","items":{"type":"string"}},"hedge":{"type":"string"}},"required":["period","generated_at","questions","unresolved_sources","hedge"]}[
{
"period": "2026-06",
"generated_at": "2026-07-06T09:12:00+09:00",
"questions": [
{
"q_id": "Q-001",
"code": "AMOUNT_MISMATCH",
"dept": "영업",
"owner_role": "오픈마켓 담당",
"question": "스마트스토어 6월 매출이 ERP 마감과 정산서에서 241,600원 어긋납니다. 어느 쪽 금액으로 마감할지 알려 주시겠습니까.",
"evidence": {
"row_refs": [
"ERP_매출마감_202606.xlsx!Sheet1!A8",
"정산서_스마트스토어_202606.xlsx!T-002"
],
"value_erp": 7660800,
"value_settlement": 7902400
},
"options": [
"정산서 금액이 맞습니다(추가 정산분이 ERP 에 아직 없습니다)",
"ERP 금액이 맞습니다(정산서에 타월 건이 섞였습니다)",
"둘 다 아니며 재확인이 필요합니다"
],
"impact_amount": 241600,
"blocking": true
},
{
"q_id": "Q-002",
"code": "MISSING_FILE",
"dept": "영업",
"owner_role": "자사몰 운영",
"question": "자사몰 6월 정산서가 도착하지 않아 대조를 못 했습니다. 언제 올려 주실 수 있습니까.",
"evidence": {
"row_refs": [
"dept_sources!settlement_ownmall"
],
"value_erp": 11536000,
"value_settlement": null
},
"options": [
"오늘 중 올리겠습니다",
"이번 달은 PG 명세로 대체합니다",
"담당이 바뀌어 확인이 필요합니다"
],
"impact_amount": 11536000,
"blocking": true
},
{
"q_id": "Q-003",
"code": "UNMAPPED_CHANNEL",
"dept": "재무",
"owner_role": "마감 담당",
"question": "'네이버쇼핑' 표기가 표준 채널명 매핑 표에 없습니다. 어느 표준 채널로 붙일지 정해 주시겠습니까.",
"evidence": {
"row_refs": [
"정산서_네이버_202606.csv!T-005",
"ERP_매출마감_202606.xlsx!Sheet1!A14"
],
"value_erp": 806000,
"value_settlement": 806000
},
"options": [
"신규 표준 채널 '네이버쇼핑' 으로 추가합니다",
"기존 '스마트스토어' 에 합칩니다",
"이번 달은 미분류로 두고 다음 달에 정합니다"
],
"impact_amount": 806000,
"blocking": false
}
],
"unresolved_sources": [
"settlement_ownmall"
],
"hedge": "합성 더미 자료를 대조한 결과이며 실제 마감 수치가 아닙니다."
},
{
"period": "2026-06",
"generated_at": "2026-07-06T09:12:00+09:00",
"questions": [
{
"q_id": "Q-004",
"code": "MISSING_FIELD",
"dept": "영업",
"owner_role": "오픈마켓 담당",
"question": "쿠팡 6월 정산서의 수수료 금액 칸이 비어 있어 정산액을 계산하지 못했습니다. 확정본을 다시 받을 수 있습니까.",
"evidence": {
"row_refs": [
"정산서_쿠팡_202606.xlsx!T-003"
],
"value_erp": 10192000,
"value_settlement": null
},
"options": [
"확정본을 다시 올리겠습니다",
"수수료율 기준으로 임시 계산해도 됩니다",
"이번 달은 수수료 제외로 마감합니다"
],
"impact_amount": null,
"blocking": true
},
{
"q_id": "Q-005",
"code": "DUP_ROW",
"dept": "재무",
"owner_role": "마감 담당",
"question": "쿠팡 6월 매출 10,192,000원이 ERP 마감에 두 번 들어가 있습니다. 재전송분 재입력이 맞는지 확인해 주시겠습니까.",
"evidence": {
"row_refs": [
"ERP_매출마감_202606.xlsx!Sheet1!A11",
"ERP_매출마감_202606.xlsx!Sheet1!A15"
],
"value_erp": 10192000,
"value_settlement": 11470000
},
"options": [
"중복이 맞으니 한 행을 삭제합니다",
"서로 다른 건이라 둘 다 남깁니다",
"ERP 담당에게 원장 확인을 요청합니다"
],
"impact_amount": 10192000,
"blocking": true
},
{
"q_id": "Q-006",
"code": "PERIOD_MISMATCH",
"dept": "영업",
"owner_role": "오픈마켓 담당",
"question": "6월 폴더에 쿠팡 5월 정산서가 함께 들어 있습니다. 이번 마감에서 빼도 되는지 알려 주시겠습니까.",
"evidence": {
"row_refs": [
"정산서_쿠팡_202605.xlsx!T-004"
],
"value_erp": null,
"value_settlement": 9880000
},
"options": [
"5월분이니 빼 주십시오",
"5월 미반영분이라 6월에 넣어야 합니다",
"재무팀 확인이 필요합니다"
],
"impact_amount": 9880000,
"blocking": false
}
],
"unresolved_sources": [],
"hedge": "합성 더미 자료를 대조한 결과이며 실제 마감 수치가 아닙니다."
},
{
"period": "2026-06",
"generated_at": "2026-07-08T18:40:00+09:00",
"questions": [
{
"q_id": "Q-007",
"code": "RETURN_NO_ORDER",
"dept": "물류",
"owner_role": "반품 담당",
"question": "자사몰 SK-005 반품 8건에 대응하는 원주문이 6월 마감에 없습니다. 전월 주문의 반품인지 확인해 주시겠습니까.",
"evidence": {
"row_refs": [
"ERP_매출마감_202606.xlsx!Sheet1!A17"
],
"value_erp": -168000,
"value_settlement": -168000
},
"options": [
"5월 주문의 반품이 맞습니다",
"주문 데이터가 누락된 것 같습니다",
"취소 건이 반품으로 잘못 잡혔습니다"
],
"impact_amount": 168000,
"blocking": false
},
{
"q_id": "Q-008",
"code": "UNMAPPED_CHANNEL",
"dept": null,
"owner_role": null,
"question": "11번가 6월 정산서가 있는데 담당 부서가 자료 제출 기준 표에 없습니다. 이 채널의 담당을 누구로 둘지 정해 주시겠습니까.",
"evidence": {
"row_refs": [
"정산서_11번가_202606.csv!T-010"
],
"value_erp": null,
"value_settlement": 2140000
},
"options": [
"신규 채널 담당으로 배정합니다",
"오픈마켓 담당이 함께 맡습니다",
"아직 시범 입점이라 마감 대상이 아닙니다"
],
"impact_amount": 2140000,
"blocking": true
}
],
"unresolved_sources": [
"settlement_11st"
],
"hedge": "담당자 미지정 항목은 부서를 비운 채 남겨 사람이 정하도록 두었습니다. 합성 더미 기준입니다."
}
][자동 검증 · 스크립트가 전수 수행] 1. 출력이 JSON Schema 형식을 통과하는지 확인합니다(형식 깨진 질문지 배포 차단). 2. 모든 질문의 evidence.row_refs 가 입력 자료에 실재하는 행 좌표인지 확인합니다(없는 근거를 든 질문 차단). 3. value_erp·value_settlement·impact_amount 가 파서 결과 재계산과 100% 일치하는지 확인합니다(금액은 LLM 이 아니라 규칙이 결정). 4. code 가 enum 7종 안에 있고, 코드별 판정 조건과 실제 근거 행이 맞아떨어지는지 확인합니다. 5. 정산서가 도착하지 않은 자료가 있으면 unresolved_sources 가 비어 있지 않은지 확인합니다(미도착 은폐 차단). 6. 담당 부서가 배정되지 않은 질문은 dept·owner_role 이 null 로 남고 임의 부서가 채워지지 않았는지 확인합니다. [수동 검증 · 사람이 표본 확인] 1. 질문 문장이 근거 범위를 넘어 원인을 단정하지 않는지 질문 20건을 표본 검토합니다. 2. 회신 선택지가 담당자가 실제로 고를 만한 갈래인지, 빠진 갈래가 없는지 부서별로 확인합니다. 3. 마감 차단 기준(blocking)이 재무팀 감각과 맞는지 확인합니다.
포트폴리오가 “무엇을 만들지”라면, 시나리오 테스트는 “현장에서 어떻게 판단·소통할지” 입니다. 실제 이 채용공고 맥락의 대본을 읽고 무엇을 물어야 할지 직접 써봅니다.