티스토리 뷰
파인튜닝을 적용한 서비스를 만들어보고 싶었다
오픈 모델을 파인튜닝해서 실제 서비스 기능으로 써보고 싶었습니다.
저는 알구몬 같은 핫딜 사이트를 자주 이용하는데, 핫딜 글을 보다가 불편한 점이 있어서 여기에 파인튜닝을 붙여볼 수 있겠다는 생각이 들었습니다.
핫딜을 볼 때 가장 궁금했던 건 "이 가격이 진짜 싼가?"였습니다.
커뮤니티 핫딜 글에는 진짜 괜찮은 딜도 있지만, 업자나 바이럴 글이 섞여 있어서 애매한 딜도 꽤 많습니다.
특히 음료수, 생수, 화장지, 물티슈처럼 캔, 팩, 롤, 매수 단위가 붙는 상품은 용량과 수량 조합이 제각각이라, 가격만 봐서는 싼지 아닌지 판단하기 어려웠습니다.
이런 단위 상품들은 파인튜닝한 소형 LLM으로 단위 가격을 뽑아 데이터로 쌓아두면, 그 데이터로 핫딜인지 쉽게 구분하는 서비스를 만들 수 있겠다 싶었습니다.
핫딜 제목에서 어떤 값을 봐야 할까
보통 핫딜 게시글의 제목은 아래와 같은 포맷으로 올라옵니다.
- [네이버] 코카콜라 제로 355ml 24캔 (15,900원/무료)
- [11번가] 크리넥스 3겹 화장지 30m 30롤 (24,900원)
- [쿠팡] LG 그램 16인치 노트북 16Z90S (1,490,000원/무료)
여기서 LLM의 역할은 두 가지입니다.
하나는 단가 계산에 쓸 값을 제목에서 뽑는 일입니다.
어디까지가 상품명인지, 행사 문구는 빼야 하는지, 500ml 20캔 같은 숫자가 단위 수치인지 수량인지를 추출합니다.
다른 하나는 서비스에서 필터링 기능을 위해 카테고리를 분류하는 것입니다.
| 항목 | 예시 | 왜 필요한가 |
|---|---|---|
| 상품명 | 코카콜라 제로 | 같은 상품인지 비교 |
| 상품 유형 | 용량, 무게, 개수, 묶음 | 어떤 방식으로 단가를 계산할지 결정 |
| 단위 수치 | 500 | 500ml, 100g처럼 계산에 쓰는 숫자 |
| 단위 | ml, g, 개, 롤 | 가격을 나눌 기준 |
| 묶음 수량 | 20 | 전체 용량이나 총 개수 계산 |
| 카테고리 | 식품, 생활용품 | 검색 범위 줄이기 |
| 세부 카테고리 | 음료, 화장지 | 비슷한 상품 비교 |
핫딜 정답 데이터셋 만들기
크롤링해서 데이터를 수집하는 과정은 스킵하겠습니다.
수집된 데이터는 클로드코드를 이용해서 일차적으로 파싱하고, 결과를 직접 검수했습니다.
먼저 수집한 핫딜 제목들을 보고, 어떤 형태의 데이터가 많이 나오는지 분포를 정리했습니다.
- 단품형: 노트북, 선풍기 (개당 판매)
- 용량형: 500ml, 1.5L
- 중량형: 100g, 2kg
- 수량형: 24캔, 30롤, 20개입
- 모델명과 숫자가 섞인 상품
- 쿠폰, 무료배송, 행사 문구가 섞인 제목
그 다음 제목을 JSON 필드로 나누는 작업을 진행했습니다.
{
"title": "코카콜라 제로 500ml 24개",
"product_type": "volume",
"product_name": "코카콜라 제로",
"unit_value": 500,
"unit": "ml",
"quantity": 24,
"category": "식품",
"subcategory": "음료"
}모델 정하기
현재 제 파인튜닝 환경은 RTX 5090입니다. 그래서 이 장비에서 무난하게 학습할 수 있는 소형 모델을 후보로 봤습니다.
조건은 아래와 같습니다.
- RTX 5090 32GB에서 QLoRA 학습이 가능할 것
- 한국어 또는 다국어 제목을 어느 정도 처리할 수 있을 것
- Unsloth, PEFT 같은 파인튜닝 도구에서 다루기 어렵지 않을 것
이 기준으로 7B~14B 정도의 모델을 후보로 잡았습니다.
- Solar Mini
- Qwen3 8B
- Qwen3 14B
- SKT A.X
- EXAONE
- EEVE-Korean
하나만 골라 파인튜닝하기보다는, 후보가 다 소형 모델이고 학습 데이터도 적어서 Unsloth 같은 최적화된 라이브러리를 쓰면 금방 학습이 끝나기 때문에, 모든 모델을 전부 학습하고 같은 테스트셋에서 비교했습니다.
파인튜닝 결과
train set: 4,830 rows
test set: 1,188 rows
schema: product_type, product_name, unit_value, unit, quantity, category, subcategory
training: QLoRA
evaluation: temperature=0| 모델 | 모두 맞춘 비율 | 상품명 | 단위 수치 | 단위 | 수량 | 카테고리 | 세부 카테고리 |
|---|---|---|---|---|---|---|---|
| EEVE-Korean LoRA | 70.1% | 90.5 | 96.3 | 96.6 | 93.9 | 93.7 | 82.8 |
| EXAONE LoRA | 65.6% | 83.8 | 96.1 | 96.7 | 94.2 | 96.1 | 85.4 |
| SKT A.X LoRA | 64.6% | 83.6 | 94.4 | 95.2 | 93.9 | 95.8 | 85.8 |
| Qwen3 14B LoRA | 64.4% | 84.7 | 94.5 | 95.2 | 93.3 | 95.9 | 85.1 |
| Solar Mini LoRA | 63.7% | 84.3 | 94.3 | 95.0 | 93.7 | 96.0 | 84.4 |
| Qwen3 8B LoRA | 62.7% | 83.2 | 94.3 | 94.8 | 93.8 | 95.5 | 83.8 |
파인튜닝 결과 각 모델들의 단위, 수량, 카테고리 점수는 다 비슷했고, 상품명만 EEVE-Korean이 유독 높았습니다.
다른 항목이 다 비슷하다 보니, 상품명에서 점수가 높았던 EEVE-Korean이 모두 맞춘 비율도 가장 높게 나온 것 같습니다.
결론
핫딜트레커 서비스에서는 카테고리보다 상품명, 스펙이 중요했고, 그 기준에서 EEVE-Korean을 선택하는 게 가장 적합하다고 생각했습니다.
카테고리 점수가 낮긴 하지만, 이는 학습 데이터가 쌓일수록 어느 정도 보완될 것이라 봤습니다.
다음 글에서는 서비스를 며칠 운영하며 쌓인 데이터로, 모델이 약한 부분과 자주 틀리는 케이스를 찾아 개선해본 과정을 정리해보겠습니다
- Total
- Today
- Yesterday
- 삼성ssd
- ssd비교
- 구글 드라이브
- SDK
- 후지필름
- 샌디스크ssd
- 구글 드라이브 API
- SSD
- ssd성능
- 구글 드라이브 개발
- C
- 리스트 클래스
- 후지필름X100V
- 링크드리스트 클래스
- ssd추천
- C++
- Google Drive SDK
- X100v
- 리스트
- 링크드리스트
- 리스트 소스 코드
- 후지필름 일렉트로닉
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |

