윤회
경력근거: 시험성적서, 제품 인증서, 검증 문서 등 제품 신뢰도와 관련된 외부 데이터
※ 실제 산출물이 아닌 AI 예측 시안입니다.
윤회(CARE ID)는 시험성적서·인증서 등 외부 문서를 DPP 에 연결하고 LLM·RAG 로 정보 추출·누락 안내를 구현하는 게 핵심 업무입니다. 문서를 여권 항목으로 옮기고 만료·누락을 검증하는 이 도구는 그 업무를 그대로 MVP 로 만든 것입니다. 풀스택 PE 가 기획부터 운영까지 책임지는 자리라 등록 콘솔(React·Next)·여권 API(NestJS)·저장(PostgreSQL·MySQL)·문서 처리 큐(Redis)·배포(AWS)까지 한 사람이 끝까지 구현하는 데 적합합니다.
시험성적서·제품 인증서·검증 문서를 DPP 에 연결하고 문서 데이터 구조화·오류 검증을 합니다. 문서에서 여권 항목을 뽑아 등록하는 도구가 정렬됩니다.
LLM·RAG·문서 분석으로 제품 데이터 자동 검토·누락 정보 안내·인증서 기반 정보 추출을 구현합니다. 추출·누락 점검 로직과 직접 닿습니다.
신규 기능을 기획 구조화부터 프론트·백엔드 구현·배포·운영까지 책임지는 Full-stack Product Engineer 입니다. 등록 기능을 한 사람이 끝까지 만드는 흐름과 맞습니다.
시험성적서·제품 인증서 같은 비정형 문서를 받아 제품 여권 항목(소재·인증 번호·발급기관·유효기간·공급망 정보)을 추출해 등록 초안을 만들고, 필수 항목 누락·인증서 만료·발급기관 미등록을 검증해 공급망 데이터 등록 콘솔에 모읍니다. 여권 항목·인증기관 마스터를 붙여 정규화합니다.
윤회(CARE ID) Product Engineer. 시험성적서·인증서를 제품 여권에 손으로 옮기다 항목이 빠지거나 만료된 인증서를 놓치던 상황을, 등록 콘솔 한 곳에서 추출 초안과 누락·만료 점검을 함께 보고 추출이 맞았는지까지 확인하고 싶은 사람입니다.
비정형 문서와 여권 항목·인증기관 마스터를 한 표준 표로 묶으면, (a) 문서에서 여권 항목을 추출해 등록 초안을 만들고, (b) 필수 누락·인증서 만료·미등록 기관을 규칙으로 검증하며, (c) 추출이 원문 실제 값과 맞았는지 검토자 라벨로 확인합니다.
시험성적서·인증서 문서를 받아 여권 항목 추출 초안을 만들고 필수 누락·인증서 만료를 검증하는 동작하는 콘솔입니다. 입력은 공급사 제출 문서를 가정한 더미로 시작하고, 1주차 기본 기능은 Next 프론트를 Vercel 로 배포해 바로 도는 데모로 만듭니다.
추출한 여권 항목을 운영 검토자 2명이 원문 실제 값과 맞는지 라벨링해 추출 정확도와 일치도를 보여주는 화면입니다. 이 단계부터 NestJS API·PostgreSQL·Redis 큐를 AWS 클라우드 환경(ECS·RDS·ElastiCache)에 배포·운영하고, 클라우드 비용을 대략 산정해 효율을 점검합니다.
제품군마다 다른 여권 필수 항목·인증 종류를 공통 템플릿으로 묶어 새 제품군 문서를 빠르게 등록·검증하는 단계입니다.
시험성적서·인증서 문서 12종을 넣으면, 여권 항목 추출 초안과 누락·만료 안내가 몇 초 안에 나오는 걸 시연합니다
일부러 만든 악성·결측 입력 30종(항목 누락·단위 혼재·만료 인증서·미등록 기관)을 넣어도 출력 형식(스키마)이 한 번도 안 깨집니다
문서가 들어오면 여권 등록 초안이 자동으로 채워지는 걸 시연으로 보여줍니다
내가 만든 정답 40건 중 추출 항목이 원문 실제 값과 일치한 게 34건(약 85%)입니다. 추출 정답은 원문에 심은 값이라 인용 매칭으로 객관 채점되고 필수 누락·인증서 만료는 규칙으로 결정됩니다. 단, 정답과 데이터를 모두 작성자가 만든 합성 기준이라 '성능 검증'이 아니라 '데모 조건에서의 동작'임을 명시합니다
진짜 성능 검증은 여기서 멈춥니다. 위 수치는 전부 작성자가 만든 더미데이터 자가채점이며, 실제 추출 정확도·일치도는 윤회 실 공급사 문서와 실 운영 검토자가 있어야 측정 가능합니다. 이 도구는 그 검증을 바로 돌릴 수 있는 상태까지 만듭니다
수치는 합성 데이터 자가채점이라 성능 증명이 아닙니다. 면접에서는 데모 동작과 실검증 준비 상태로 솔직히 설명합니다
정답을 작성자가 만들었으니 잘 맞는 것이 당연합니다. 항목 누락·단위 혼재·만료 인증서 같은 경계 케이스를 더미에 일부러 섞어, 쉬운 문제만 푸는 게 아님을 보여줍니다
추출 오판은 원문에 없는 값을 만들거나 있는 값을 놓칩니다. 추출 값은 원문 인용을 강제하고 누락·만료는 규칙으로 결정하며 모호한 건 단정 대신 '검토 권고'로 표시합니다
항목·기관 표기가 문서마다 제각각입니다. 정규화로 같은 항목으로 묶고, 못 묶은 건 추측하지 말고 '미정의 항목'으로 알립니다
실제 도입 시 달라지는 점을 명시합니다. 실 공급사 문서 형식·인증 종류는 더미와 다르므로 항목 마스터·검증 규칙을 다시 맞추고 검토자도 실제 운영 인력으로 교체해야 합니다(도입 단계 과제로 분리)
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
공급사가 보낸 시험성적서·제품 인증서 비정형 문서. 추출 LLM 이 가장 먼저 읽는 입력입니다. 항목 누락·단위 혼재·발급기관 별칭 표기·만료 인증서를 일부러 섞어, 쉬운 데이터만 푸는 게 아님을 보여줍니다.
제품: 에코자켓 / 소재: 재생폴리에스터 65% / 인증: OEKO-TEX / 인증번호: OT-2025-101 / 발급기관: 한국의류시험연구원 / 유효기간: 2027-03-01 / 탄소: 12.4 kgCO2
에코백 GRS 인증. 번호 GRS-88. 발급기관 KOTITI. 유효기간 정보는 추후 전달드립니다. 소재 재생 폴리에스터.
아래 JSON Schema({"type":"object","properties":{"title":{"type":"string"},"body":{"type":"string"}},"required":["title","body"]})에 맞는 공급사 시험성적서·인증서 문서 40건 JSON 배열로 생성합니다. 제품 6~8개, 인증 OEKO-TEX/GRS 등. 모두 가상 더미.
쉬운 데이터만 만들지 말 것. 추출 정답을 원문에 명확히 심되 다음 하드 케이스를 의도적으로 섞어라(쉬운 문제만 푸는 함정 회피): (1) 필수 항목 누락(인증번호·유효기간 '추후 전달'·'누락') 4건, (2) 만료된 인증서(유효기간 과거) 3건, (3) 발급기관 별칭 표기('KOTITI'/'코티티', '한국의류시험연구원') 3건, (4) 미등록/미상 발급기관 2건, (5) 같은 제품 정보가 여러 문서에 분산(보강·재인증) 2세트, (6) 단위 혼재(무게 'g'/'그램'). JSON 배열만(각 원소 {title, body}).{"type":"object","properties":{"title":{"type":"string"},"body":{"type":"string"}},"required":["title","body"]}제품군별 여권 필수 항목·인증기관 마스터. 필수 누락·미등록 기관 검증이 대조하는 기준입니다. 항목 결측·미등록 기관·표기 흔들림을 일부러 섞어, 쉬운 데이터만 푸는 게 아님을 보여줍니다.
| row_id | product_group | field_key | required | cert_issuer_raw | issuer_id |
|---|---|---|---|---|---|
| f_001 | apparel | material | true | — | — |
| f_002 | apparel | cert_number | true | 한국의류시험연구원 | iss_kati |
| f_003 | apparel | valid_until | true | 한국의류시험연구원 | iss_kati |
| f_004 | apparel | co2_kg | false | — | — |
| f_005 | footwear | material | true | — | — |
아래 JSON Schema에 맞는 제품군별 여권 필수 항목·인증기관 마스터 40행 JSON 배열로 생성합니다. 제품군 apparel/footwear/bag.
{"type":"object","properties":{"row_id":{"type":"string"},"product_group":{"enum":["apparel","footwear","bag"]},"field_key":{"type":"string"},"required":{"type":"boolean"},"cert_issuer_raw":{"type":["string","null"]},"issuer_id":{"type":["string","null"]}},"required":["row_id","product_group","field_key","required","cert_issuer_raw","issuer_id"]}
쉬운 데이터만 만들지 말 것. 다음 하드 케이스를 의도적으로 섞어라: (1) 미등록 발급기관(issuer_id=null, cert_issuer_raw 채움) 2건, (2) 발급기관 표기 흔들림('KOTITI'/'코티티', '한국의류시험연구원'/'한국의류시험연구원 ') 3건, (3) 필수 항목과 선택 항목 섞기, (4) cert_issuer_raw null 인 일반 항목 다수. JSON 배열만.{"type":"object","properties":{"row_id":{"type":"string"},"product_group":{"enum":["apparel","footwear","bag"]},"field_key":{"type":"string"},"required":{"type":"boolean"},"cert_issuer_raw":{"type":["string","null"]},"issuer_id":{"type":["string","null"]}},"required":["row_id","product_group","field_key","required","cert_issuer_raw","issuer_id"]}| TypeScript | 추출 파이프라인·검증 규칙·Zod 스키마의 구현 언어 |
| JavaScript | 여권 카드 렌더·문서 하이라이트 글루 코드 |
| React | 공급망 데이터 등록 콘솔(문서 업로드·추출 초안 검토·여권 폼)의 화면 구현 |
| Next.js | 콘솔 라우팅·서버 컴포넌트 호스팅 + 1주차 기본 기능 Vercel 배포 |
| NestJS | 여권 등록·조회 API + 문서 추출·검증 봇 서버 |
| PostgreSQL | 제품 여권·인증서 메타·항목 마스터·검토자 라벨의 주 저장소 |
| MySQL | 일부 공급망 마스터(제조사·협력사) 연동 저장소 가정 |
| Redis | 문서 처리 큐(업로드→추출)·추출 결과 캐싱·세션 관리 |
| AWS | 2주차부터 NestJS API·PostgreSQL·Redis 를 AWS(ECS·RDS·ElastiCache)로 배포·운영 |
| LLM | 비정형 문서에서 여권 항목 추출·등록 초안 생성 |
| RAG | 인증 규정·문서 템플릿 검색으로 추출 항목의 근거 확인 |
| ChatGPT | 추출 프롬프트 보조·검증 룰 초안 작성 도구로 활용 |
✓ pass → 그대로 멈춰도 완결입니다. 더 키우려면 2주차(추출이 맞았는지 확인 + AWS 배포)로 진행합니다.
✓ pass → 여기서 멈춰도 완결입니다. 더 키우면 3주차(제품군별 여권·인증 템플릿 표준화)로 진행합니다.
문서 1건의 여권 등록 초안 카드. 추출한 항목(값·원문 인용·확신도)과 검증(필수 누락·인증서 만료·미등록 기관)을 한 스키마로 담아 등록 콘솔에 씁니다.
{"type":"object","properties":{"product":{"type":"string"},"extracted_fields":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"value":{"type":["string","null"]},"source_quote":{"type":["string","null"]},"confidence":{"enum":["low","mid","high"]}},"required":["key","value","source_quote","confidence"]}},"checks":{"type":"object","properties":{"missing_required":{"type":"array","items":{"type":"string"}},"cert_expired":{"type":"boolean"},"unknown_issuer":{"type":"boolean"},"note":{"type":["string","null"]}},"required":["missing_required","cert_expired","unknown_issuer","note"]},"hedge":{"type":["string","null"]}},"required":["product","extracted_fields","checks","hedge"]}[
{
"input_ref": "에코자켓 시험성적서(소재·인증번호·유효기간·발급기관 모두 있음)",
"output": {
"product": "에코자켓",
"extracted_fields": [
{
"key": "material",
"value": "재생폴리에스터 65%",
"source_quote": "소재: 재생폴리에스터 65%",
"confidence": "high"
},
{
"key": "cert_number",
"value": "OT-2025-101",
"source_quote": "인증번호: OT-2025-101",
"confidence": "high"
},
{
"key": "issuer",
"value": "한국의류시험연구원",
"source_quote": "발급기관: 한국의류시험연구원",
"confidence": "high"
},
{
"key": "valid_until",
"value": "2027-03-01",
"source_quote": "유효기간: 2027-03-01",
"confidence": "high"
}
],
"checks": {
"missing_required": [],
"cert_expired": false,
"unknown_issuer": false,
"note": null
},
"hedge": null
}
},
{
"input_ref": "런닝화A 성적서(유효기간 2025-06-30 만료)",
"output": {
"product": "런닝화A",
"extracted_fields": [
{
"key": "cert_number",
"value": "OT-2024-077",
"source_quote": "번호 OT-2024-077",
"confidence": "high"
},
{
"key": "valid_until",
"value": "2025-06-30",
"source_quote": "만료 2025-06-30",
"confidence": "high"
},
{
"key": "issuer",
"value": "한국의류시험연구원",
"source_quote": "발급 한국의류시험연구원",
"confidence": "high"
}
],
"checks": {
"missing_required": [],
"cert_expired": true,
"unknown_issuer": false,
"note": "유효기간이 지난 인증서라 재인증 필요"
},
"hedge": null
}
},
{
"input_ref": "백팩B 성적서(발급기관 미등록)",
"output": {
"product": "백팩B",
"extracted_fields": [
{
"key": "cert_number",
"value": "KT-2026-114",
"source_quote": "번호 KT-2026-114",
"confidence": "high"
},
{
"key": "issuer",
"value": "미등록시험소",
"source_quote": "발급 미등록시험소",
"confidence": "mid"
}
],
"checks": {
"missing_required": [
"co2_kg",
"material"
],
"cert_expired": false,
"unknown_issuer": true,
"unit_mismatch": false
},
"hedge": "발급기관이 목록에 없어 성적서 자체의 유효성은 판단하지 않았습니다."
}
}
][자동 검증 — 코드가 매 출력마다 자동으로 거릅니다] 1) JSON Schema 형식 통과: 출력이 정한 필드·타입을 지키는지 검사하고, 어기면 거부합니다. 2) 각 extracted_fields.value 가 source_quote(원문 인용) 안에 실제로 있는지 토큰 매칭합니다 — 원문에 없는 값을 지어내지 못하게 합니다. 3) checks.cert_expired 는 valid_until 과 기준일을 비교해, unknown_issuer 는 발급기관 마스터와 대조해 코드가 자동 판정합니다. 4) value 가 null(빈 값)이면 confidence=high 를 금지합니다(빈 값에 높은 확신 방지). [수동 검증 — 사람이 일부만 확인합니다] 1) 운영 검토자 2명이 같은 모호 케이스를 따로 라벨링해, 두 사람 판단이 우연 이상으로 일치하는지 봅니다(Cohen's κ ≥ 0.6 — 0~1, 높을수록 일치). 2) 전체 출력의 5%는 사람이 직접 다시 확인합니다(spot check). [전제] 추출 정답은 원문에 심어둔 값이라, 추출 정밀도·재현율을 객관적으로 채점할 수 있습니다.
포트폴리오가 “무엇을 만들지”라면, 시나리오 테스트는 “현장에서 어떻게 판단·소통할지” 입니다. 실제 이 채용공고 맥락의 대본을 읽고 무엇을 물어야 할지 직접 써봅니다.
근거: 시험성적서, 제품 인증서, 검증 문서 등 제품 신뢰도와 관련된 외부 데이터