위시켓
경력근거: 중소·중견 기업의 AX 조직을 직접 대체·수행
위시켓 AIDP 는 중소·중견 기업의 AX 조직을 대체·수행하며, 공고가 자격요건 첫 줄로 SQL 능숙도와 데이터베이스 이해를, 우대사항으로 ERP·CRM·BI 영역의 문제 해결과 엑셀로 실제 업무 변화를 만들어 본 경험을 적었습니다. 공고는 또 기업이 데이터화되어 있지 않으면 AI 통합 비용이 열 배로 폭증한다고 진단하는데, 그 데이터화의 첫 삽은 새 체계를 세우는 일이 아니라 이미 굴러가는 두 원장이 서로 맞는지 확인하는 일입니다. 이 도구는 고객사가 매달 손으로 하던 수주와 매출 대조를 한 줄 명령과 리포트 파일로 바꿔, 현장에 들어가 비개발 직군의 파일을 그대로 받아 자동화가 되는지 검증하는 FDE 의 일을 그대로 보여 줍니다. 다만 이 포트폴리오가 보여주는 것은 서로 다른 시스템의 표를 정규화해 맞추고 차이를 규칙으로 나눠 문서로 내는 데이터 기술이며, 회계·세무 실무나 ERP 패키지 구축 같은 도메인 전문성은 주장하지 않습니다. 그 깊이는 면접에서 모르면 모른다고 말하는 편이 낫습니다.
자격요건이 SQL 능숙도와 데이터베이스 이해를 앞세웁니다. 두 원장을 로컬 데이터베이스에 올려 조인·정규화·차이 계산을 전부 SQL 로 쓰는 이 도구가 그 요건에 그대로 정렬됩니다.
우대사항이 ERP·CRM·BI 영역에서 문제를 정의하고 해결한 경험을 지목합니다. 입력이 ERP 매출 마감 추출본과 영업 수주 관리 엑셀이라 두 시스템 사이에서 생기는 실제 불일치를 다룹니다.
공고가 기업이 데이터화되어 있지 않으면 AI 통합 비용이 폭증한다고 적습니다. 온톨로지 체계를 세우는 일은 조직이 합의해야 나오는 결과물이라, 그 한 단계 앞인 기존 두 원장의 정합성을 수치로 드러내는 데서 시작합니다.
고객사 재경팀이 월마감 때 쓰는 두 파일, 곧 영업팀이 관리하는 수주 엑셀과 ERP 에서 내려받은 매출 마감 추출본을 인자로 받아 로컬 데이터베이스에 올리고, 수주번호가 있으면 번호로 없으면 거래처 표기를 정규화해 금액·귀속월로 맞춘 뒤, 어긋난 건만 원인별로 나눠 월마감 점검 리포트 파일과 터미널 요약으로 냅니다. 매칭과 판정은 전부 SQL 과 산술로 정하고 LLM 은 고객사마다 다른 항목 이름을 표준 필드 후보로 제안하는 일만 맡습니다.
고객사 재경팀의 월마감 담당자입니다. 매달 마감 때 영업팀 수주 엑셀과 ERP 매출 자료를 나란히 띄워 놓고 눈으로 맞춰 보느라 이틀을 쓰고, 거래처 이름이 파일마다 달라 같은 건인지도 확신하지 못합니다. 어긋난 건만 원인과 물어볼 담당자가 붙은 채로 한 장에 받아 그대로 영업팀에 회람하고 싶어 합니다.
수주 엑셀과 ERP 매출 추출본을 같은 키로 정규화해 맞춰 보면, (a) 사람이 눈으로 훑을 때 놓치는 금액 차이와 귀속월 어긋남을 산술로 전부 집어내고, (b) 수주번호가 비어 있는 건도 거래처 표기 정규화와 금액·월 조합으로 후보를 찾아 붙이며, (c) 어긋난 건마다 어느 파일 몇 행을 보고 그렇게 판단했는지 근거를 달아 담당자가 바로 확인에 들어갑니다.
수주 엑셀과 ERP 매출 추출본 경로를 인자로 주면 두 표를 로컬 데이터베이스에 적재하고, 건별 매칭과 차이 판정을 거쳐 recon-2026-06.md 를 쓰고 터미널에 원인별 건수와 금액 합계를 찍는 CLI입니다. 결과물은 문서 파일과 터미널 출력이며 화면은 만들지 않습니다.
더미 파일에 심어 둔 불일치 정답과 도구가 뽑은 항목을 원인별로 대조해, 놓친 건과 잘못 잡은 건을 센 결과를 CSV 와 터미널 표로 냅니다.
컬럼 이름과 거래처 표기 규칙이 다른 두 번째 고객사 파일을 매핑 프로파일 하나만 추가해 돌리고, 매달 되풀이되는 불일치 원인을 월별로 집계한 요약 리포트를 함께 냅니다.
수주 320행과 ERP 매출 305행을 한 줄 명령으로 넣으면 어긋난 건만 원인별로 갈린 리포트 파일이 몇 초 안에 떨어지고, 항목마다 원본 파일과 행 번호가 붙는 걸 시연합니다
일부러 만든 지저분한 입력 30종(소계 행·머리글 반복·금액 칸의 문자열·거래처 법인 접미사 흔들림·수주번호 대소문자와 공백)을 넣어도 적재가 멈추지 않고 걸러진 행이 목록으로 남습니다
2주차에 더미 파일에 심어 둔 불일치 정답 62건 중 도구가 잡은 게 59건이고, 어긋나지 않았는데 잘못 잡은 게 4건입니다. 단, 두 파일과 정답을 모두 작성자가 만든 합성 기준이라 성능 검증이 아니라 데모 조건에서의 동작임을 명시합니다
진짜 성능 검증은 여기서 멈춥니다. 위 수치는 전부 작성자가 만든 더미 추출본 자가채점이며, 실제로 마감 시간이 줄었는지와 영업팀이 확인 요청에 답했는지는 위시켓 AIDP 가 들어가는 실제 고객사의 원장과 실제 마감이 있어야 측정 가능합니다. 이 도구는 그 측정을 바로 돌릴 수 있는 상태로 만듭니다
이건 고객·실데이터 없이 혼자 만든 포트폴리오입니다. 모든 수치는 합성 추출본 자가채점이라 성능 증명이 아닙니다. 면접에서는 데모 동작과 실검증 준비 상태로 솔직히 설명합니다
이 포트폴리오가 보여주는 것은 서로 다른 시스템에서 나온 두 표를 정규화해 맞추고 차이를 규칙으로 나눠 문서로 내는 데이터 기술입니다. 회계·세무 실무나 ERP 패키지 구축 같은 도메인 전문성은 포트폴리오로 증명되지 않으므로 주장하지 않으며, 그 깊이는 면접에서 모르면 모른다고 말하는 편이 낫습니다. 세무 판단이 필요한 항목은 리포트가 결론을 내지 않고 확인 대상으로만 남깁니다
정답을 작성자가 심었으니 잘 맞는 게 당연합니다. 거래처 표기 흔들림·수주번호 결측·소계 행·중복 계상·취소분 계상을 더미에 일부러 섞어, 쉬운 파일만 통과시키는 게 아님을 보여줍니다
LLM 이 제안한 컬럼 매핑이 틀리면 엉뚱한 칸끼리 비교됩니다. 제안은 mapping.yml 초안으로만 쓰고 사람이 확정한 뒤에야 적재하며, 확정 파일에 없는 컬럼이 나타나면 적재를 멈추고 목록으로 남깁니다
실제 도입 시에는 금액 허용 오차와 귀속월 인정 범위가 고객사 마감 관행에 맞게 다시 정해져야 하고, 원장을 파일이 아니라 데이터베이스에서 직접 읽는 경로가 필요합니다(도입 단계 과제로 분리)
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
고객사 영업팀이 관리하는 수주 엑셀을 그대로 내려받은 표입니다. 매칭 규칙이 왼쪽에서 읽는 입력이며, 소계 행·머리글 반복·금액 칸의 문자열·거래처 표기 흔들림을 일부러 섞고 expected_issue 로 정답을 심어 자가채점합니다.
| row_no | order_no | customer_raw | close_month | amount_raw | amount_krw | owner | order_status | row_kind | memo | expected_doc_no | expected_issue |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | SO-2606-001 | (주)한빛제조 | 2026-06 | 12,500,000 | 12,500,000 | 영업1팀 김성우 | confirmed | data | RV-26060012 | ok | |
| 2 | SO-2606-002 | 한빛제조㈜ | 2026-06 | 8,400,000 | 8,400,000 | 영업1팀 김성우 | confirmed | data | 6월 초 추가분 | RV-26060018 | duplicate |
| 3 | so-2606-003 | 우리케어 | 2026-06 | 5,300,000 | 5,300,000 | 영업2팀 박지민 | confirmed | data | RV-26060027 | amount_diff | |
| 4 | SO-2606-004 | 그린물류 | 2026-06 | 2,200,000 | 2,200,000 | 영업2팀 박지민 | confirmed | data | 검수 지연 | RV-26070005 | month_diff |
| 5 | SO-2606-005 | 대성전자 | 2026-06 | 15,800,000 | 15,800,000 | 영업1팀 이한솔 | confirmed | data | — | missing_in_erp |
아래 Zod 스키마에 맞는 고객사 수주 관리 엑셀 추출본 160행을 JSON 배열로 생성합니다. 거래처 8~10곳, 마감월은 2026-05 와 2026-06 을 섞고, 대부분은 정상 행이되 아래 하드 케이스를 반드시 넣습니다.
{"type":"object","properties":{"row_no":{"type":"number"},"order_no":{"type":"string"},"customer_raw":{"type":"string"},"close_month":{"type":"string"},"amount_raw":{"type":"string"},"amount_krw":{"type":["number","null"]},"owner":{"type":"string"},"order_status":{"type":"string","enum":["confirmed","canceled"]},"row_kind":{"type":"string","enum":["data","subtotal","header_repeat"]},"memo":{"type":"string"},"expected_doc_no":{"type":["string","null"]},"expected_issue":{"type":"string","enum":["ok","amount_diff","month_diff","missing_in_erp","canceled_but_posted","duplicate","ignored"]}},"required":["row_no","order_no","customer_raw","close_month","amount_raw","amount_krw","owner","order_status","row_kind","memo","expected_doc_no","expected_issue"]}
쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라: (1) 같은 거래처의 법인 접미사 표기 흔들림('(주)한빛제조'·'한빛제조㈜'·'한빛 제조') 12건 이상, (2) 수주번호에 앞뒤 공백이나 소문자가 섞인 행 6건 이상, (3) amount_raw 가 '협의중'·'-'·'12,500,000원' 처럼 숫자가 아니어서 amount_krw 가 null 이 되는 행 5건 이상, (4) row_kind 가 subtotal 인 소계 행 6건과 header_repeat 인 머리글 반복 행 4건, (5) 금액과 거래처가 같은 중복 입력 3쌍, (6) order_status 가 canceled 인 취소 수주 4건. expected_issue 는 심은 사실 그대로 정직하게 매기고, row_kind 가 data 가 아니면 ignored 로 둡니다. JSON 배열만 냅니다.{"type":"object","properties":{"row_no":{"type":"number"},"order_no":{"type":"string"},"customer_raw":{"type":"string"},"close_month":{"type":"string"},"amount_raw":{"type":"string"},"amount_krw":{"type":["number","null"]},"owner":{"type":"string"},"order_status":{"type":"string","enum":["confirmed","canceled"]},"row_kind":{"type":"string","enum":["data","subtotal","header_repeat"]},"memo":{"type":"string"},"expected_doc_no":{"type":["string","null"]},"expected_issue":{"type":"string","enum":["ok","amount_diff","month_diff","missing_in_erp","canceled_but_posted","duplicate","ignored"]}},"required":["row_no","order_no","customer_raw","close_month","amount_raw","amount_krw","owner","order_status","row_kind","memo","expected_doc_no","expected_issue"]}고객사 ERP 에서 내려받은 매출 마감 추출본입니다. 매칭 규칙이 오른쪽에서 읽는 입력이며, 수주번호 참조가 비어 있는 전표·취소 전표·수주 원장에 없는 매출을 섞어 양방향 대조가 필요하게 만듭니다.
| doc_no | ref_order_no | customer_code | customer_name | posted_month | amount_krw | tax_type | doc_status |
|---|---|---|---|---|---|---|---|
| RV-26060012 | SO-2606-001 | C0142 | 한빛제조 주식회사 | 2026-06 | 12,500,000 | taxable | posted |
| RV-26060018 | SO-2606-002 | C0142 | 한빛제조 주식회사 | 2026-06 | 8,400,000 | taxable | posted |
| RV-26060027 | — | C0311 | 우리케어 | 2026-06 | 5,030,000 | taxable | posted |
| RV-26070005 | SO-2606-004 | C0208 | 그린물류(주) | 2026-07 | 2,200,000 | taxable | posted |
| RV-26060031 | SO-2605-018 | C0142 | 한빛제조 주식회사 | 2026-06 | 4,100,000 | taxable | posted |
아래 Zod 스키마에 맞는 ERP 매출 마감 추출본 150행을 JSON 배열로 생성합니다. 거래처코드는 수주 원장의 거래처와 대응하되 customer_name 은 ERP 등록명이라 표기가 다르게 하고, posted_month 는 2026-06 을 중심으로 2026-05 와 2026-07 을 소수 섞습니다.
{"type":"object","properties":{"doc_no":{"type":"string"},"ref_order_no":{"type":["string","null"]},"customer_code":{"type":"string"},"customer_name":{"type":"string"},"posted_month":{"type":"string"},"amount_krw":{"type":"number"},"tax_type":{"type":"string","enum":["taxable","zero","exempt"]},"doc_status":{"type":"string","enum":["posted","canceled"]}},"required":["doc_no","ref_order_no","customer_code","customer_name","posted_month","amount_krw","tax_type","doc_status"]}
쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라: (1) ref_order_no 가 null 이어서 거래처·귀속월·금액으로만 맞춰야 하는 전표 30건 이상, (2) 같은 ref_order_no 를 가리키는 매출 전표가 둘인 중복 계상 3쌍, (3) 수주 원장에 대응이 없는 매출 전표 8건 이상, (4) 수주 금액과 1만원에서 30만원 사이로 어긋난 전표 10건 이상, (5) doc_status 가 canceled 인 취소 전표 6건, (6) ref_order_no 대소문자가 수주 원장과 다른 전표 5건, (7) tax_type 이 zero 또는 exempt 인 전표 10건 이상. JSON 배열만 냅니다.{"type":"object","properties":{"doc_no":{"type":"string"},"ref_order_no":{"type":["string","null"]},"customer_code":{"type":"string"},"customer_name":{"type":"string"},"posted_month":{"type":"string"},"amount_krw":{"type":"number"},"tax_type":{"type":"string","enum":["taxable","zero","exempt"]},"doc_status":{"type":"string","enum":["posted","canceled"]}},"required":["doc_no","ref_order_no","customer_code","customer_name","posted_month","amount_krw","tax_type","doc_status"]}| SQL | 적재한 두 표를 맞추는 조인, 거래처 표기 정규화, 금액·귀속월 차이 계산, 중복 계상 탐지를 전부 SQL 질의로 씁니다 |
| 데이터베이스 | DuckDB 파일 한 개를 단일 진실원으로 두고 원본 행 번호를 그대로 보존해, 리포트의 모든 항목이 원본 몇 행에서 나왔는지 되짚어집니다 |
| BI 구축 | 월마감 점검 항목과 금액 합계 정의를 리포트 규격으로 고정해, 매달 같은 기준으로 같은 자리를 비교합니다 |
| ERP | 입력 한쪽이 ERP 매출 마감 추출본이며 전표번호·거래처코드·귀속월·세금 구분을 그대로 받습니다 |
| CRM | 다른 한쪽이 영업팀이 관리하는 수주 기록이며 수주번호·거래처 표기·담당자·수주 상태를 받습니다 |
| 엑셀 | 머리글 반복 행, 소계 행, 금액 칸에 섞인 문자열, 병합된 거래처 칸 같은 실제 추출본의 지저분함을 규칙으로 걸러 냅니다 |
| Tableau | 차이 수치를 시각화 대시보드로 옮기지 않고 회람용 문서 파일로 끝냅니다. 마감 담당자가 그대로 붙여 넣어야 하는 산출물이기 때문입니다 |
| Slack | 영업 담당자별 확인 요청 문안을 리포트 끝에 블록으로 함께 써 두어 사람이 복사해 보냅니다 |
| Python | 엑셀 파싱과 CLI 인터페이스, 리포트 렌더링의 구현 언어입니다 |
| Claude | 고객사마다 다른 컬럼 이름을 표준 필드 후보로 제안하는 매핑 보조이며, 매칭과 판정에는 관여하지 않습니다 |
✓ pass → 그대로 멈춰도 완결입니다. 더 키우려면 2주차(심어 둔 불일치 검출 측정)로 진행합니다.
✓ pass → 여기서 멈춰도 완결입니다. 더 키우면 3주차(고객사별 매핑 프로파일 확장과 월별 원인 집계)로 진행합니다.
월마감 점검 리포트의 항목 하나입니다. 어긋난 건 하나에 대해 원인·금액 차이·판단 근거·물어볼 담당자·요청 문장을 담고, 리포트 파일의 원인별 절에 그대로 실립니다.
{"type":"object","properties":{"issue":{"type":"string","enum":["amount_diff","month_diff","missing_in_erp","missing_in_crm","canceled_but_posted","duplicate"]},"order_no":{"type":["string","null"]},"doc_no":{"type":["string","null"]},"customer":{"type":"string"},"crm_amount_krw":{"type":["number","null"]},"erp_amount_krw":{"type":["number","null"]},"diff_krw":{"type":"number"},"match_basis":{"type":"string","enum":["order_no","customer_month_amount","none"]},"evidence":{"type":"string","minLength":20},"ask_to":{"type":"string"},"action":{"type":"string","minLength":15}},"required":["issue","order_no","doc_no","customer","crm_amount_krw","erp_amount_krw","diff_krw","match_basis","evidence","ask_to","action"]}[
{
"input_ref": "수주 3행(so-2606-003) · 매출 RV-26060027 (수주번호 참조 없는 전표)",
"output": {
"issue": "amount_diff",
"order_no": "SO-2606-003",
"doc_no": "RV-26060027",
"customer": "우리케어",
"crm_amount_krw": 5300000,
"erp_amount_krw": 5030000,
"diff_krw": 270000,
"match_basis": "customer_month_amount",
"evidence": "수주 엑셀 3행과 매출 추출본 RV-26060027 은 거래처와 귀속월이 같고 금액이 270,000원 차이입니다. 전표에 수주번호 참조가 비어 있어 거래처 표기를 정규화한 뒤 금액 근사와 귀속월로 맞췄습니다.",
"ask_to": "영업2팀 박지민",
"action": "할인이나 부분 취소가 반영된 금액인지 확인하고, 수주 엑셀과 ERP 중 어느 쪽을 고칠지 회신받습니다."
}
},
{
"input_ref": "수주 4행(SO-2606-004) · 매출 RV-26070005 (7월 계상)",
"output": {
"issue": "month_diff",
"order_no": "SO-2606-004",
"doc_no": "RV-26070005",
"customer": "그린물류",
"crm_amount_krw": 2200000,
"erp_amount_krw": 2200000,
"diff_krw": 0,
"match_basis": "order_no",
"evidence": "수주 엑셀 4행은 마감월이 2026-06 인데 매출 전표 RV-26070005 의 귀속월은 2026-07 입니다. 금액은 같고 수주번호로 맞았습니다.",
"ask_to": "영업2팀 박지민",
"action": "검수 완료일을 확인해 6월 마감에 넣을 건인지 7월로 넘길 건인지 정하고 그 결과를 재경팀에 알립니다."
}
},
{
"input_ref": "수주 5행·6행(SO-2606-005, SO-2606-006) · 대응 전표 없음",
"output": {
"issue": "duplicate",
"order_no": "SO-2606-006",
"doc_no": null,
"customer": "대성전자",
"crm_amount_krw": 15800000,
"erp_amount_krw": null,
"diff_krw": 15800000,
"match_basis": "none",
"evidence": "수주 엑셀 5행과 6행이 거래처·마감월·금액이 모두 같고 대응하는 매출 전표가 없습니다. 6행 비고에 재입력이라고 적혀 있어 중복 입력으로 봅니다.",
"ask_to": "영업1팀 이한솔",
"action": "둘 중 하나를 수주 엑셀에서 지울지 확인하고, 남는 건은 매출 미계상 목록으로 넘겨 따로 처리합니다."
}
},
{
"input_ref": "수주 10행(SO-2605-018, 취소) · 매출 RV-26060031",
"output": {
"issue": "canceled_but_posted",
"order_no": "SO-2605-018",
"doc_no": "RV-26060031",
"customer": "한빛제조",
"crm_amount_krw": 4100000,
"erp_amount_krw": 4100000,
"diff_krw": 0,
"match_basis": "order_no",
"evidence": "수주 엑셀 10행은 상태가 취소인데 매출 전표 RV-26060031 이 2026-06 에 계상되어 있습니다. 거래처 표기가 '한빛 제조'와 '한빛제조 주식회사'로 달라 정규화 후 같은 거래처로 묶였습니다.",
"ask_to": "영업1팀 김성우",
"action": "취소가 맞는지 확인하고 맞으면 재경팀이 해당 전표를 반제 처리하도록 요청 근거로 회신받습니다."
}
}
][자동 검증] 1. Zod parse 로 항목 형식(필드·enum)이 스키마를 통과하는지 확인합니다. 2. diff_krw 가 crm_amount_krw 와 erp_amount_krw 의 차이와 정확히 맞는지 재계산해 대조합니다. 한쪽이 null 이면 남은 쪽 금액과 같아야 합니다. 3. issue 가 판정 규칙(금액 차이 임계 초과·귀속월 불일치·한쪽 미존재·취소 상태와 계상 공존·같은 키 다중 매칭)과 일치하는지 재판정해 확인합니다. 4. order_no 와 doc_no 가 실제 입력 행에 존재하는 값인지, evidence 에 적힌 행 번호가 원본 행과 맞는지 대조합니다. 5. 뽑힌 항목 집합을 더미에 심은 expected_issue 정답과 맞춰 놓친 건과 잘못 잡은 건을 원인별로 셉니다. [수동 검증] 1. 검토자 2명이 항목 20건을 읽고 '영업 담당자에게 그대로 보낼 수 있는가'를 예와 아니오로 매겨 판단이 갈린 건을 따로 봅니다. 2. 전체 항목의 5% 를 사람이 원본 두 파일과 직접 대조해 점검합니다.