레브잇 PMF팀은 10~20년 쌓인 전통 가격비교를 넘어 LLM 으로 상품의 제품 속성·체감 속성을 추출·체계화하는 카탈로그를 만듭니다. 원문에서 체감 속성까지 근거와 함께 뽑는 이 사슬은 레브잇처럼 패션·뷰티·건강식품 여러 카테고리 상품 원문이 있어야 의미가 있습니다. 이 포트폴리오가 입증하는 것은 LLM 속성 추출·스키마 강제·프롬프트 설계 역량이며, 특정 카테고리 상품 전문성은 주장하지 않습니다. 모르는 깊이는 면접에서 모른다고 말하는 편이 낫습니다.
레브잇 PMF팀은 LLM 으로 상품의 모든 속성(제품 속성·체감 속성)을 추출·체계화하는 카탈로그 시스템을 초기부터 만듭니다. 원문에서 속성을 뽑아 구조화하는 게 제품의 핵심입니다.
LLM 라이브러리로 서비스·파이프라인을 구축하고 프롬프트 엔지니어링·성능 개선을 해본 사람을 찾습니다. 속성 추출 파이프라인이 JD 요구와 정확히 맞습니다.
초기 스타트업에서 핵심 제품을 주도하고 AI 제품 실험을 직접 설계해본 경험을 우대합니다. 추출 정확도를 스스로 채점·개선하는 루프가 그 실험 역량입니다.
상품 제목·상세 설명·리뷰 원문을 입력하면, 제품 속성(소재·용량·성분)과 체감 속성(입는 느낌·향 지속력·발색)을 LLM 이 뽑아 표준 카탈로그 행으로 만들고, 각 속성값이 원문 어느 문장에서 나왔는지 근거를 함께 붙이는 카탈로그 구축 콘솔입니다. 근거는 채용공고 정렬이고, 데이터는 작성자가 만든 더미입니다.
패션·뷰티 상품 수천 건의 속성을 사람이 일일이 표에 옮겨 적던 상황을, 원문을 넣으면 근거까지 붙은 표준 카탈로그 행으로 받고 싶은 레브잇 PMF팀 Product Engineer 인턴입니다.
상품 원문을 한 스키마로 받고 카테고리별 속성 사전을 주면, LLM 이 (a) 제품 속성과 체감 속성을 구조화된 카탈로그 행으로 뽑고, (b) 각 값의 근거 문장을 원문에서 인용하며, (c) 사람 검토자가 매긴 정답과 얼마나 일치하는지로 신뢰도를 확인합니다.
상품 원문을 넣으면 제품 속성·체감 속성을 표준 카탈로그 행으로 뽑고, 각 값의 근거 문장을 원문에서 인용해 반환하는 동작하는 콘솔.
가상 검토자 2명이 뽑힌 속성값의 정오를 라벨링해, 근거 인용이 실제 원문에 있는지와 정답 일치도를 보여주는 검증 대시보드.
카테고리마다 다른 속성 축(패션의 핏, 뷰티의 발색)을 사전으로 분리하고, 같은 속성의 표기 흔들림(무향/무취)을 정규화하는 단계.
상품 원문 30종을 넣으면 근거 붙은 속성 카탈로그 행이 몇 초 안에 나오는 걸 시연합니다
일부러 만든 악성·결측 입력 30종(속성 없는 원문·과장 광고문·표기 흔들림)을 넣어도 출력 형식(스키마)이 한 번도 안 깨지고, 원문에 없는 값은 '근거 없음'으로 걸러지는 걸 보여줍니다
내가 만든 정답 40건 중 속성값이 일치한 게 33건(약 82%)입니다. 단, 정답·데이터를 작성자가 만든 합성 기준이라 '성능 검증'이 아니라 '데모 조건에서의 동작'임을 명시합니다
진짜 성능 검증은 여기서 멈춥니다. 위 수치는 전부 작성자가 만든 더미데이터 자가채점이며, 실제 추출 정확도는 레브잇 실 상품 원문과 실 검토자가 있어야 측정 가능합니다. 이 콘솔은 그 검증을 바로 돌릴 수 있는 상태까지 만듭니다.
이건 고객·실데이터 없이 혼자 만든 포트폴리오입니다. 모든 수치는 합성 데이터 자가채점이라 '성능 증명'이 아닙니다. 면접에서 '데모 조건 동작 + 실검증 준비 상태'로 솔직히 설명하는 편이 신뢰를 줍니다
정답을 작성자가 만들었으니 잘 맞는 게 당연합니다. 그래서 속성 없는 원문·과장 광고문·표기 흔들림 같은 경계 케이스를 더미에 일부러 섞어, 쉬운 문제만 푸는 게 아님을 보여줍니다
체감 속성은 리뷰 표현이 주관적이라 값이 흔들릴 수 있습니다. 값마다 근거 문장을 강제 인용하게 하고, 원문에 없으면 '근거 없음'으로 표시합니다
실제 도입 시 달라지는 것을 명시합니다. 실 상품 원문 분포는 더미와 다르므로 카테고리 속성 사전을 다시 맞춰야 하고, 검토자도 실제 카탈로그 운영자로 교체해야 합니다(도입 단계 과제로 분리)
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
상품 원문(제목·상세·리뷰) 문서. 속성 추출의 입력. 속성 없는 원문·과장 광고문·표기 흔들림을 일부러 섞어, 쉬운 데이터만 푸는 게 아님을 보여줍니다.
소재는 면 100%이며 넉넉한 오버핏입니다. 실착 후기: 여름에 입어도 통풍이 잘 되고 두께가 적당해 비침이 없어요.
발색이 선명하고 지속력이 좋습니다. 리뷰: 물 마셔도 잘 안 지워지고 6시간은 유지돼요. 다만 살짝 건조한 느낌.
아래 JSON Schema 에 맞는 상품 원문 문서 30건 JSON 배열로 생성.
{"type":"object","properties":{"product_id":{"type":"string"},"category":{"type":"string"},"title":{"type":"string"},"body":{"type":"string"}},"required":["product_id","category","title","body"]}
쉬운 데이터만 만들지 말 것. 하드 케이스 혼입: (1) 속성 정보 없이 과장 광고만 있는 원문 2건(추출 결과 '근거 없음' 이어야 함), (2) body 가 '상세정보 준비 중'인 빈 원문 1건, (3) 같은 속성의 표기 흔들림(무향/무취/무향료 → 같은 값으로 정규화), (4) 체감 속성이 리뷰 안에 서술형으로만 있는 원문. 카테고리는 패션·뷰티·건강식품·가전 섞어서. JSON 배열만.{"type":"object","properties":{"product_id":{"type":"string"},"category":{"type":"string"},"title":{"type":"string"},"body":{"type":"string"}},"required":["product_id","category","title","body"]}카테고리별 속성 축과 표준 값·별칭 사전. 표기 흔들림을 표준값으로 정규화하는 근거. 미등록 별칭·결측 표준값을 섞어 정규화가 결측을 만났을 때도 안 깨지는지 보여줍니다.
| attr_id | category | attr_name | attr_type | canonical_values | aliases |
|---|---|---|---|---|---|
| a_fit | 패션 | 핏 | perceptual | ["오버핏","레귤러핏","슬림핏"] | ["루즈핏"] |
| a_material | 패션 | 소재 | product | ["면100%","폴리에스터","스판데님"] | ["코튼100","면 100"] |
| a_scent | 뷰티 | 향 | product | ["무향","플로럴","시트러스"] | ["무취","무향료"] |
| a_lasting | 뷰티 | 지속력 | perceptual | ["높음","보통","낮음"] | ["롱래스팅","오래감"] |
| a_finish | 뷰티 | 마무리감 | perceptual | ["매트","글로우","세미매트"] | — |
아래 JSON Schema 에 맞는 카테고리별 속성 사전 30행 JSON 배열로 생성.
{"type":"object","properties":{"attr_id":{"type":"string"},"category":{"type":"string"},"attr_name":{"type":"string"},"attr_type":{"type":"string","enum":["product","perceptual"]},"canonical_values":{"type":"array","items":{"type":"string"}},"aliases":{"type":["array","null"],"items":{"type":"string"}}},"required":["attr_id","category","attr_name","attr_type","canonical_values"]}
쉬운 데이터만 만들지 말 것. 하드 케이스 혼입: (1) aliases=null 인 별칭 미등록 속성 2~3건(원문 표기가 사전에 없을 때 '미매핑' 처리 대상), (2) canonical_values 가 ['표기없음']뿐인 속성(값 없음 처리), (3) attr_type 이 product/perceptual 고르게. enum 은 카테고리별로 갈아끼운다. JSON 배열만.{"type":"object","properties":{"attr_id":{"type":"string"},"category":{"type":"string"},"attr_name":{"type":"string"},"attr_type":{"type":"string","enum":["product","perceptual"]},"canonical_values":{"type":"array","items":{"type":"string"}},"aliases":{"type":["array","null"],"items":{"type":"string"}}},"required":["attr_id","category","attr_name","attr_type","canonical_values"]}| Python | 속성 추출 파이프라인(상품 원문 → LLM 추출 → 카탈로그 upsert), 추출 평가 스크립트(정확도·근거 적중률 계산) |
| TypeScript | Next.js 카탈로그 콘솔(원문 입력 → 속성 행 + 근거 하이라이트 렌더) |
| PostgreSQL | products_raw / catalog_rows / attr_dictionary / review_labels 단일 진실원 |
| LLM | Claude 로 제품·체감 속성 추출, 근거 문장 인용 강제, 카테고리 속성 사전을 few-shot 으로 주입 |
| Prompt Engineering | 카테고리별 속성 스키마 강제 프롬프트 + 근거 없는 값 차단 가드 |
✓ pass → 그대로 멈춰도 완결. 더 키우고 싶으면 2주차(추출이 사람 정답과 맞는지 확인)로 진행.
✓ pass → 여기서 멈춰도 완결. 더 키우면 3주차(카테고리별 속성 사전 확장)로 진행.
상품 1건에서 뽑은 속성 카탈로그 행. 각 속성값 + 표준화 결과 + 근거 문장 인용 + 근거 없음 플래그. 어느 원문 문장에서 값이 나왔는지 추적 가능하게 담습니다.
{"type":"object","properties":{"product_id":{"type":"string"},"attributes":{"type":"array","minItems":1,"items":{"type":"object","properties":{"attr_id":{"type":"string"},"raw_value":{"type":"string"},"canonical_value":{"type":["string","null"]},"evidence_span":{"type":["string","null"]},"no_evidence":{"type":"boolean"}},"required":["attr_id","raw_value","no_evidence"]}}},"required":["product_id","attributes"]}[
{
"product_id": "p_001",
"attributes": [
{
"attr_id": "a_material",
"raw_value": "면 100%",
"canonical_value": "면100%",
"evidence_span": "소재는 면 100%이며",
"no_evidence": false
},
{
"attr_id": "a_fit",
"raw_value": "오버핏",
"canonical_value": "오버핏",
"evidence_span": "넉넉한 오버핏입니다",
"no_evidence": false
},
{
"attr_id": "a_thickness",
"raw_value": "적당",
"canonical_value": "적당",
"evidence_span": "두께가 적당해 비침이 없어요",
"no_evidence": false
}
]
},
{
"product_id": "p_006",
"attributes": [
{
"attr_id": "a_power",
"raw_value": "역대급 흡입력",
"canonical_value": null,
"evidence_span": null,
"no_evidence": true
}
]
},
{
"product_id": "p_007",
"attributes": [
{
"attr_id": "a_scent",
"raw_value": "무취",
"canonical_value": "무향",
"evidence_span": "향이 없는 무취 포뮬러라",
"no_evidence": false
}
]
}
][자동 검증] 1. 출력이 스키마를 통과하는가(필수 필드·타입). 2. evidence_span 이 실제 원문 body 의 부분 문자열인가(근거 조작·환각 차단). 3. canonical_value 가 attr_dictionary 의 표준값/별칭으로 매핑되는가, 안 되면 null + 미매핑 표시. 4. evidence_span 이 null 이면 no_evidence=true 강제. [수동 검증] 1. 검토자 2명이 속성값 정오 라벨 → Cohen's κ(두 사람 판단이 우연 이상 일치하는 정도) 하한 확인. 2. 체감 속성 추출이 리뷰를 과장 해석하지 않는지 spot check 5%.