모두의포트폴리오
PE · FDE 직군을 위한 포트폴리오 밀키트
예전 판입니다 (1판)이 문서는 2026-08-02 에 새 판으로 개정됐습니다. 결과를 표시하기만 하던 추출 콘솔을, 운영자가 후보를 고르거나 고쳐야 카탈로그에 반영되고 그 선택이 다음 상품의 자동 확정 규칙이 되는 검수 화면으로 다시 세웠습니다.최신 판 보기 →
경력레브잇 · [쇼포트] Product Engineer (Vision)

상품 원문을 넣으면 제품 속성과 체감 속성을 근거 문장까지 뽑아 표준 카탈로그로 만드는 도구

레브잇 공고에서 뽑은 세 가지 시그널.

레브잇 PMF팀은 10~20년 쌓인 전통 가격비교를 넘어 LLM 으로 상품의 제품 속성·체감 속성을 추출·체계화하는 카탈로그를 만듭니다. 원문에서 체감 속성까지 근거와 함께 뽑는 이 사슬은 레브잇처럼 패션·뷰티·건강식품 여러 카테고리 상품 원문이 있어야 의미가 있습니다. 이 포트폴리오가 입증하는 것은 LLM 속성 추출·스키마 강제·프롬프트 설계 역량이며, 특정 카테고리 상품 전문성은 주장하지 않습니다. 모르는 깊이는 면접에서 모른다고 말하는 편이 낫습니다.

01

차세대 커머스 카탈로그가 미션

레브잇 PMF팀은 LLM 으로 상품의 모든 속성(제품 속성·체감 속성)을 추출·체계화하는 카탈로그 시스템을 초기부터 만듭니다. 원문에서 속성을 뽑아 구조화하는 게 제품의 핵심입니다.

차세대 커머스 카탈로그제품 속성 및 체감 속성LLM체계화
02

Business First · LLM 파이프라인 경험

LLM 라이브러리로 서비스·파이프라인을 구축하고 프롬프트 엔지니어링·성능 개선을 해본 사람을 찾습니다. 속성 추출 파이프라인이 JD 요구와 정확히 맞습니다.

LLM 관련 라이브러리파이프라인 구축Prompt engineering커머스 데이터
03

AI 실험을 직접 설계하는 제너럴리스트

초기 스타트업에서 핵심 제품을 주도하고 AI 제품 실험을 직접 설계해본 경험을 우대합니다. 추출 정확도를 스스로 채점·개선하는 루프가 그 실험 역량입니다.

AI 제품의 실험직접 설계제너럴리스트빠른 실행/실험

포트폴리오 요약

상품 제목·상세 설명·리뷰 원문을 입력하면, 제품 속성(소재·용량·성분)과 체감 속성(입는 느낌·향 지속력·발색)을 LLM 이 뽑아 표준 카탈로그 행으로 만들고, 각 속성값이 원문 어느 문장에서 나왔는지 근거를 함께 붙이는 카탈로그 구축 콘솔입니다. 근거는 채용공고 정렬이고, 데이터는 작성자가 만든 더미입니다.

고객 정의

패션·뷰티 상품 수천 건의 속성을 사람이 일일이 표에 옮겨 적던 상황을, 원문을 넣으면 근거까지 붙은 표준 카탈로그 행으로 받고 싶은 레브잇 PMF팀 Product Engineer 인턴입니다.

고민 지점

상품 원문을 한 스키마로 받고 카테고리별 속성 사전을 주면, LLM 이 (a) 제품 속성과 체감 속성을 구조화된 카탈로그 행으로 뽑고, (b) 각 값의 근거 문장을 원문에서 인용하며, (c) 사람 검토자가 매긴 정답과 얼마나 일치하는지로 신뢰도를 확인합니다.

주차별 일정

1주차여기까지로 완성

상품 원문 → 속성 카탈로그 행 + 근거 인용

상품 원문을 넣으면 제품 속성·체감 속성을 표준 카탈로그 행으로 뽑고, 각 값의 근거 문장을 원문에서 인용해 반환하는 동작하는 콘솔.

  1. 1일 · 상품 원문과 카탈로그를 한 표로 묶기products_raw·catalog_rows 스키마 설계 + 카테고리별 속성 축 정의
  2. 2-3일 · 원문에서 속성을 LLM 이 뽑게 하기프롬프트 v1(제품 속성 + 체감 속성 + 근거 문장 인용) + 출력 스키마 검증
  3. 4-5일 · 근거 없는 값 차단뽑힌 값이 원문에 실재하는지 매칭 + 환각 값 격리
  4. 6일 · 카탈로그 콘솔 화면원문 입력 → 속성 행 + 근거 문장 하이라이트 렌더
  5. 7일 · 30개 상품 시연 + 직접 만든 정답과 비교한 기준선여기까지가 1주차 완성품
2주차선택 성장

추출이 사람 정답과 맞는지 확인

가상 검토자 2명이 뽑힌 속성값의 정오를 라벨링해, 근거 인용이 실제 원문에 있는지와 정답 일치도를 보여주는 검증 대시보드.

  1. 8-10일 · 검토자 2명이 속성값 정오 라벨링라벨 가이드 + 정답 일치도 측정(Cohen's κ: 두 사람 판단이 우연 이상 일치하는 정도, 0~1)
  2. 11-12일 · 근거 적중률 대시보드뽑힌 값 중 근거가 원문에 실재한 비율 + 오추출 유형 분류
3주차선택 성장

카테고리별 속성 사전 확장과 표기 정규화

카테고리마다 다른 속성 축(패션의 핏, 뷰티의 발색)을 사전으로 분리하고, 같은 속성의 표기 흔들림(무향/무취)을 정규화하는 단계.

  1. 15-17일 · 카테고리별 속성 사전 분리패션 핏·뷰티 발색 등 카테고리마다 다른 축을 사전으로 갈아끼우기
  2. 18-20일 · 표기 정규화(무향/무취) + 3주 통합 시연 + 실제 도입 계획

데모 · 측정 지표

01

상품 원문 30종을 넣으면 근거 붙은 속성 카탈로그 행이 몇 초 안에 나오는 걸 시연합니다

02

일부러 만든 악성·결측 입력 30종(속성 없는 원문·과장 광고문·표기 흔들림)을 넣어도 출력 형식(스키마)이 한 번도 안 깨지고, 원문에 없는 값은 '근거 없음'으로 걸러지는 걸 보여줍니다

03

내가 만든 정답 40건 중 속성값이 일치한 게 33건(약 82%)입니다. 단, 정답·데이터를 작성자가 만든 합성 기준이라 '성능 검증'이 아니라 '데모 조건에서의 동작'임을 명시합니다

정직 경계선

진짜 성능 검증은 여기서 멈춥니다. 위 수치는 전부 작성자가 만든 더미데이터 자가채점이며, 실제 추출 정확도는 레브잇 실 상품 원문과 실 검토자가 있어야 측정 가능합니다. 이 콘솔은 그 검증을 바로 돌릴 수 있는 상태까지 만듭니다.

미리 알아둬야 할 것들

이건 고객·실데이터 없이 혼자 만든 포트폴리오입니다. 모든 수치는 합성 데이터 자가채점이라 '성능 증명'이 아닙니다. 면접에서 '데모 조건 동작 + 실검증 준비 상태'로 솔직히 설명하는 편이 신뢰를 줍니다

정답을 작성자가 만들었으니 잘 맞는 게 당연합니다. 그래서 속성 없는 원문·과장 광고문·표기 흔들림 같은 경계 케이스를 더미에 일부러 섞어, 쉬운 문제만 푸는 게 아님을 보여줍니다

체감 속성은 리뷰 표현이 주관적이라 값이 흔들릴 수 있습니다. 값마다 근거 문장을 강제 인용하게 하고, 원문에 없으면 '근거 없음'으로 표시합니다

실제 도입 시 달라지는 것을 명시합니다. 실 상품 원문 분포는 더미와 다르므로 카테고리 속성 사전을 다시 맞춰야 하고, 검토자도 실제 카탈로그 운영자로 교체해야 합니다(도입 단계 과제로 분리)

더미 데이터

① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.

products_rawDOCS· 12 docs

상품 원문(제목·상세·리뷰) 문서. 속성 추출의 입력. 속성 없는 원문·과장 광고문·표기 흔들림을 일부러 섞어, 쉬운 데이터만 푸는 게 아님을 보여줍니다.

② products_raw.seed.json 다운로드
① 인라인 샘플 (프리뷰 2 / 12)
코튼 오버핏 티셔츠
소재는 면 100%이며 넉넉한 오버핏입니다. 실착 후기: 여름에 입어도 통풍이 잘 되고 두께가 적당해 비침이 없어요.
롱래스팅 립틴트 로즈
발색이 선명하고 지속력이 좋습니다. 리뷰: 물 마셔도 잘 안 지워지고 6시간은 유지돼요. 다만 살짝 건조한 느낌.
③ 증강 프롬프트 (본인 LLM 에 붙여서 N 배 늘리기)
아래 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 배열만.
schema (3 층의 단일 출처)
{"type":"object","properties":{"product_id":{"type":"string"},"category":{"type":"string"},"title":{"type":"string"},"body":{"type":"string"}},"required":["product_id","category","title","body"]}
attr_dictionaryTABLE· 12 rows

카테고리별 속성 축과 표준 값·별칭 사전. 표기 흔들림을 표준값으로 정규화하는 근거. 미등록 별칭·결측 표준값을 섞어 정규화가 결측을 만났을 때도 안 깨지는지 보여줍니다.

② attr_dictionary.seed.json 다운로드
① 인라인 샘플 (프리뷰 5 / 12)
attr_idcategoryattr_nameattr_typecanonical_valuesaliases
a_fit패션핏perceptual["오버핏","레귤러핏","슬림핏"]["루즈핏"]
a_material패션소재product["면100%","폴리에스터","스판데님"]["코튼100","면 100"]
a_scent뷰티향product["무향","플로럴","시트러스"]["무취","무향료"]
a_lasting뷰티지속력perceptual["높음","보통","낮음"]["롱래스팅","오래감"]
a_finish뷰티마무리감perceptual["매트","글로우","세미매트"]—
③ 증강 프롬프트 (본인 LLM 에 붙여서 N 배 늘리기)
아래 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 배열만.
schema (3 층의 단일 출처)
{"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), 추출 평가 스크립트(정확도·근거 적중률 계산)
TypeScriptNext.js 카탈로그 콘솔(원문 입력 → 속성 행 + 근거 하이라이트 렌더)
PostgreSQLproducts_raw / catalog_rows / attr_dictionary / review_labels 단일 진실원
LLMClaude 로 제품·체감 속성 추출, 근거 문장 인용 강제, 카테고리 속성 사전을 few-shot 으로 주입
Prompt Engineering카테고리별 속성 스키마 강제 프롬프트 + 근거 없는 값 차단 가드
LLM 선택
model
Claude Sonnet (속성 추출) + GPT-4o-mini (LLM-as-judge 근거 적중 평가)
prompt
카테고리별 속성 스키마 강제 + few-shot 3 예시 + 근거 문장 원문 인용 필수 + 원문에 없는 값 환각 차단
rationale
체감 속성 추출은 뉘앙스가 중요해 Sonnet, judge 는 근거 문장이 원문에 실제로 있는지만 확인하므로 mini 로 충분. 상품 1건이 컨텍스트에 들어가 RAG 불필요.
결정 게이트
1주차 끝상품 원문을 넣으면 근거 붙은 속성 카탈로그 행이 몇 초 안에 나오는가. 여기까지가 그 자체로 제출 가능한 완성품.

✓ pass → 그대로 멈춰도 완결. 더 키우고 싶으면 2주차(추출이 사람 정답과 맞는지 확인)로 진행.

2주차 끝근거 인용이 실제 원문에 있고 정답 일치도가 붙는가.

✓ pass → 여기서 멈춰도 완결. 더 키우면 3주차(카테고리별 속성 사전 확장)로 진행.

재사용 레이어 · 코어 70% / 도메인 30%
core (재사용 가능)
  • 속성 스키마 강제 + parse 검증 파이프라인
  • 근거 문장 원문 인용 검증기(값이 원문에 실재하는지 매칭)
  • LLM-as-judge 근거 적중 평가 가드
  • 정확도·근거 적중률·Cohen's κ 계산기
  • 카탈로그 행 + 근거 하이라이트 대시보드(Next.js)
  • 표기 흔들림 정규화 리포터
domain (교체 대상)
  • products_raw / catalog_rows / attr_dictionary 3 테이블
  • 카테고리별 속성 사전(패션 핏·뷰티 발색 등, 도메인별로 갈아끼움)
  • 체감 속성 라벨 가이드
출력 스키마 · catalog_extraction

상품 1건에서 뽑은 속성 카탈로그 행. 각 속성값 + 표준화 결과 + 근거 문장 인용 + 근거 없음 플래그. 어느 원문 문장에서 값이 나왔는지 추적 가능하게 담습니다.

schema (JSON Schema)
{"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"]}
모범 출력 (3)
[
  {
    "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
      }
    ]
  }
]
검증 노트 (자동 vs 수동)

[자동 검증] 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%.