팀리부뜨
경력근거: 이메일·엑셀·PDF·DOCX·ERP 데이터·주문서·정산서·생산계획 같은 업무 흐름을 AI가 이해하고 실행하는 제품
※ 실제 산출물이 아닌 AI 예측 시안입니다.
'이메일·엑셀·PDF·DOCX·ERP 데이터·주문서·정산서·생산계획 같은 업무 흐름을 AI가 이해하고 실행하는 제품' 이라는 공고 문장과 askyour.trade 라는 제품명이 이 콘솔의 도메인을 그대로 지정합니다. 현장에서 검증한 솔루션을 재사용 레시피로 정리한다는 FDE 정의에 맞춰 추출 코어와 무역 스키마를 분리해 두었습니다. 이 포트폴리오가 보여주는 것은 문서 구조화 파이프라인과 검증·검수 흐름 설계이며, 무역 실무(인코텀즈·관세·선적 서류 심사) 전문성은 주장하지 않습니다. 도메인 어휘는 테마로만 쓰고 모르는 깊이는 면접에서 모른다고 말하는 편이 낫습니다.
공고가 실무자가 매일 처리하는 이메일·엑셀·PDF·주문서·정산서 업무 흐름을 AI 가 이해하고 실행하는 제품을 만든다고 밝힙니다. 이 콘솔이 그 흐름의 주문 처리 구간을 실물로 보여줍니다.
공고가 고객사마다 일회성 커스텀을 반복하지 않고 재사용 프로토타입·레시피로 정리한다고 강조합니다. 추출 코어와 도메인 스키마를 분리한 이 구조가 그 레시피화의 근거입니다.
TypeScript/React 와 Python 으로 프런트부터 백엔드까지 직접 구현하고 AWS·Docker 로 배포하는 요구가 이 콘솔의 검수 화면·추출 API·배포 구성과 그대로 겹칩니다.
무역 거래처가 보낸 주문 이메일(본문+첨부 텍스트)을 넣으면, 품목·수량·단가·통화·납기를 뽑아 품목 마스터에 매핑한 ERP 등록용 주문 기록을 만들어주는 관리자 페이지입니다. 모든 값에 원문 인용이 붙고, 수량×단가 합계 검증과 미등록 품목 분리는 규칙이 결정합니다. 통과 못 한 주문은 자동 등록 대신 사람 검수 대기열로 갑니다.
아침마다 거래처 이메일 수십 통을 열어 첨부 주문서의 품목과 수량을 ERP 에 옮겨 적고, 합계가 안 맞으면 메일을 다시 뒤지던 무역회사 영업관리 담당자입니다. 옮겨 적기는 시스템이 하고 자기는 이상한 주문만 골라 확인하고 싶은 사람입니다.
추출값마다 원문 인용을 강제하고 합계·품목 매핑을 규칙으로 검증하면, LLM 문서 처리의 신뢰 문제를 검수 대기열 설계로 흡수해 실무자가 안심하고 쓰는 자동화가 됩니다.
PDF·엑셀 파싱은 이미 텍스트로 변환됐다고 가정하고 시작합니다(파서 고도화는 뒤로). 더미 주문 이메일 12건이 추출·품목 매핑·합계 검증을 거쳐 통과분은 레코드로, 실패분은 검수 대기열로 갈리는 React 콘솔까지 도는 완결품입니다.
Docker 이미지로 AWS 에 배포해 운영하고, 주문 30건 정답표 대비 필드 추출 일치율과 하드 케이스 20종(합계 불일치·미등록 품목·통화 혼재) 처리 결과 리포트가 남은 상태입니다.
같은 추출 코어에 정산서 스키마를 끼워 주문·정산 금액 대사(차이 탐지)까지 처리해, 문서 유형 추가가 스키마 교체로 끝나는 재사용 구조를 보여주는 상태입니다.
주문 이메일을 넣으면 원문 근거가 달린 ERP 등록용 레코드가 나오고, 문제 주문은 검수 대기열로 갈리는 흐름을 시연합니다(더미 이메일 12건 기준).
레코드의 모든 추출값 인용이 원문의 실제 문장 조각인지, 합계 검증(수량×단가=금액)과 미등록 품목 분리가 규칙 재계산과 일치하는지 자동 검사로 100% 통과를 보여줍니다(표본: 레코드 전수).
합계 불일치·미등록 품목·통화 혼재·단위 표기 흔들림 같은 하드 케이스 20종에서 자동 등록이 아니라 검수 대기로 빠집니다.
위 수치는 문서와 정답을 작성자가 만든 더미 자가채점이라 성능 증명이 아닙니다. 실제 추출 정확도와 검수 감소 효과는 팀리부뜨 고객사의 실제 문서와 실무자 피드백이 있어야 측정됩니다. 이 포트폴리오는 그 검증을 바로 돌릴 수 있는 상태로 만듭니다.
수치는 합성 데이터 자가채점이라 성능 증명이 아닙니다. 면접에서는 데모 동작과 실검증 준비 상태로 솔직하게 설명합니다.
정답을 내가 만들었으니 잘 맞는 게 당연해지는 함정이 있어, 합계가 안 맞는 주문·마스터에 없는 품목·통화와 단위 표기 흔들림·주문이 아닌 잡담 메일을 더미에 일부러 섞습니다.
실제 첨부는 PDF·엑셀·HWP 원본이라 텍스트 변환 품질이 관건입니다. Document AI 파서 선정·고도화는 도입 단계 과제로 분리합니다.
이 포트폴리오는 문서 구조화와 검증 흐름 설계를 보여줄 뿐, 무역 실무(인코텀즈 해석·관세·선적 심사) 전문성은 주장하지 않습니다. 도메인 규칙은 고객사 실무자와 함께 채워야 한다고 면접에서 밝힙니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
거래처가 보낸 주문 이메일 본문과 첨부(텍스트 변환본)입니다. 추출·검증·검수 분기의 입력입니다.
안녕하세요. 아래와 같이 주문합니다. 품목: 스테인리스 볼트 M8 (SKU: SB-M8), 수량 5,000 EA, 단가 USD 0.12, 합계 USD 600. 납기 7/15 부산항 도착 기준. 첨부 주문서 PO-2026-0612 참조.
긴급 건입니다. 알루미늄 브라켓 AB-200 을 300개 부탁드립니다. 단가는 지난번과 동일하게 개당 4,500원, 총 1,350,000원. 이번 주 금요일까지 입고 가능할까요?
다음 JSON Schema 를 그대로 만족하는 주문 이메일 문서를 20건 더 만들어 주세요: {"type":"object","properties":{"title":{"type":"string"},"body":{"type":"string"}},"required":["title","body"]} title 은 'EML-## · 거래처명 요지' 형식, body 는 무역 주문 이메일 본문 또는 첨부 텍스트로 쓸 것. 쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라: (1) 수량×단가와 표기 합계가 안 맞는 이메일 3건, (2) 품목 마스터에 없을 신규 SKU 주문 2건, (3) 같은 품목의 표기 흔들림(RG-77/RG77, 스테인리스/스테인레스) 3건, (4) KRW·USD 통화 혼재와 EA·pcs·BOX 단위 혼재, (5) 주문이 아닌 메일(회식 안내·정산 문의) 2건, (6) 수량 0 취소·20,000 이상 대량 경계값 2건, (7) 참조번호 누락 1건.{"type":"object","properties":{"title":{"type":"string"},"body":{"type":"string"}},"required":["title","body"]}품목 마스터입니다. SKU 매핑과 단위 환산·합계 검증의 기준이며 여기 없는 품목은 미등록으로 분리됩니다.
| sku | name_std | aliases | base_unit | units_per_box | ref_price | currency |
|---|---|---|---|---|---|---|
| SB-M8 | 스테인리스 볼트 M8 | ["스테인레스 볼트 M8","SUS BOLT M8"] | EA | 1,000 | 0.12 | USD |
| AB-200 | 알루미늄 브라켓 200 | ["AL 브라켓 200"] | EA | 50 | 4,500 | KRW |
| RG-77 | 고무 개스킷 77 | ["RG77","RUBBER GASKET RG-77"] | EA | 400 | — | — |
| TW-05 | 티타늄 와셔 05 | [] | BOX | 500 | 95 | USD |
| CB-12 | 커넥터 블록 12핀 | ["CONNECTOR BLOCK 12P"] | EA | 200 | 1,800 | KRW |
다음 JSON Schema 를 그대로 만족하는 품목 마스터 행을 20개 더 만들어 주세요: {"type":"object","properties":{"sku":{"type":"string"},"name_std":{"type":"string"},"aliases":{"type":"array","items":{"type":"string"}},"base_unit":{"type":"string","enum":["EA","BOX","SET"]},"units_per_box":{"type":["integer","null"]},"ref_price":{"type":["number","null"]},"currency":{"type":["string","null"],"enum":["KRW","USD",null]}},"required":["sku","name_std","aliases","base_unit"]} 쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라: (1) ref_price 나 currency 가 null 인 단가 미확정 품목 4건, (2) units_per_box 가 null 인 SET 품목 3건, (3) 한글·영문·하이픈 유무가 섞인 별칭 3건 이상, (4) aliases 빈 배열 품목 2건, (5) 이메일 더미에 등장하지만 마스터에는 없어야 할 품목(CI-330 류)은 추가하지 말 것(미등록 탐지용).{"type":"object","properties":{"sku":{"type":"string"},"name_std":{"type":"string"},"aliases":{"type":"array","items":{"type":"string"}},"base_unit":{"type":"string","enum":["EA","BOX","SET"]},"units_per_box":{"type":["integer","null"]},"ref_price":{"type":["number","null"]},"currency":{"type":["string","null"],"enum":["KRW","USD",null]}},"required":["sku","name_std","aliases","base_unit"]}| Python | 추출 파이프라인·규칙 검증·자가채점 스크립트 구현 언어입니다 |
| TypeScript | 검수 콘솔 프런트와 주문 레코드 타입 정의를 한 몸으로 관리합니다 |
| React | 추출값을 클릭하면 원문 근거가 하이라이트되는 검수 대기열 화면을 만듭니다 |
| AWS | 2주차부터 Docker 이미지를 AWS 에 배포해 운영합니다 |
| Docker | 추출 API 와 콘솔을 이미지로 묶어 로컬과 배포 환경을 맞춥니다 |
| LLM | 이메일·첨부 텍스트에서 품목·수량·금액 후보를 뽑습니다. 합계 검증과 품목 매핑 확정은 규칙이 맡습니다 |
| RAG | 품목 마스터와 과거 주문 표기를 검색해 별칭 매핑 후보를 찾는 축으로 씁니다 |
| OpenAI | 골든셋 이메일의 표현 변형(구어체·오타)을 만들어 추출 강건성을 시험합니다 |
| Claude | 주 추출 모델로 Claude Sonnet 을 쓰고 출력 스키마를 강제합니다 |
| Gemini | 같은 문서의 교차 추출 표본을 받아 필드 누락 점검에 씁니다 |
✓ pass → 여기서 멈춰도 완결입니다. 더 키우려면 AWS 배포와 정답표 채점으로 넘어갑니다.
✓ pass → 정산서 스키마를 끼워 대사 기능으로 확장합니다.
이메일 한 건에서 추출한 ERP 등록용 주문 레코드입니다. 값마다 원문 인용이 붙고 합계·매핑 검증은 규칙이 결정합니다.
{"type":"object","properties":{"email_id":{"type":"string"},"status":{"type":"string","enum":["auto_approved","needs_review","not_an_order"]},"po_ref":{"type":["string","null"]},"lines":{"type":"array","items":{"type":"object","properties":{"sku":{"type":["string","null"]},"name_raw":{"type":"string"},"qty":{"type":["number","null"]},"unit_raw":{"type":["string","null"]},"unit_price":{"type":["number","null"]},"currency":{"type":["string","null"]},"amount_stated":{"type":["number","null"]},"amount_check":{"type":"string","enum":["일치","불일치","검증불가"]},"quote":{"type":"string"}},"required":["name_raw","amount_check","quote"]}},"review_reasons":{"type":"array","items":{"type":"string"}},"hedge":{"type":"string"}},"required":["email_id","status","lines","review_reasons","hedge"]}[
{
"email_id": "EML-01",
"status": "auto_approved",
"po_ref": "PO-2026-0612",
"lines": [
{
"sku": "SB-M8",
"name_raw": "스테인리스 볼트 M8",
"qty": 5000,
"unit_raw": "EA",
"unit_price": 0.12,
"currency": "USD",
"amount_stated": 600,
"amount_check": "일치",
"quote": "수량 5,000 EA, 단가 USD 0.12, 합계 USD 600"
}
],
"review_reasons": [],
"hedge": "합성 더미 이메일 기준 처리 결과입니다."
},
{
"email_id": "EML-06",
"status": "needs_review",
"po_ref": null,
"lines": [
{
"sku": null,
"name_raw": "세라믹 인슐레이터 CI-330",
"qty": 500,
"unit_raw": null,
"unit_price": 2900,
"currency": "KRW",
"amount_stated": 1450000,
"amount_check": "일치",
"quote": "세라믹 인슐레이터 CI-330 이 귀사 취급 품목인지 모르겠으나 500개 주문"
}
],
"review_reasons": [
"품목 마스터 미등록(CI-330)",
"참조번호 없음"
],
"hedge": "미등록 품목은 자동 등록하지 않고 검수 대기로 분리했습니다. 합성 더미 기준입니다."
},
{
"email_id": "EML-08",
"status": "needs_review",
"po_ref": "PO-PC-3391",
"lines": [
{
"sku": "RG-77",
"name_raw": "RG-77",
"qty": 900,
"unit_raw": "pcs",
"unit_price": 0.85,
"currency": "USD",
"amount_stated": 800,
"amount_check": "불일치",
"quote": "수량을 1,200 에서 900 pcs 로 줄입니다. 단가 동일 USD 0.85, total USD 800.00"
}
],
"review_reasons": [
"합계 불일치: 900×0.85=765.00, 표기 합계 800.00"
],
"hedge": "표기 합계와 계산값 차이를 그대로 노출해 검수자가 판단하게 합니다. 합성 더미 기준입니다."
}
][자동 검증 · 스크립트가 전수 수행] 1. 출력이 JSON Schema 형식을 통과하는지 확인합니다(형식 깨진 레코드의 ERP 유입 차단). 2. 모든 lines.quote 가 이메일 원문의 실제 문장 조각(공백 정규화 후 substring)인지 확인합니다(값 환각 차단). 3. amount_check 가 수량×단가 재계산 결과와 100% 일치하는지 확인합니다(합계 판정은 LLM 이 아니라 규칙이 결정). 4. sku 가 품목 마스터에 실재하는지, 미등록이면 sku null 과 review_reasons 에 사유가 있는지 확인합니다(추측 매핑 차단). 5. status 규칙 위반 조합(needs_review 인데 review_reasons 빈 배열 등)을 차단합니다. [수동 검증 · 사람이 표본 확인] 1. not_an_order 분류(회식 안내 류)가 과하게 공격적이지 않은지 10건을 표본 검토합니다. 2. BOX·SET 단위 환산이 마스터 기준과 맞는지 확인합니다.
근거: 이메일·엑셀·PDF·DOCX·ERP 데이터·주문서·정산서·생산계획 같은 업무 흐름을 AI가 이해하고 실행하는 제품