Gemini가 만든 라벨 $9로 자기 대체 모델 GLiNER 학습시키기
I had Gemini train its own replacement for $9
TL;DR Highlight
Gemini 라벨 $9로 GLiNER를 튜닝해 로컬에서 F1 0.83 달성
Who Should Read
LLM API로 건건이 텍스트 개체 추출(NER)을 돌려 호출 비용이 불어나는 백엔드 개발자
Core Mechanics
- Gemini 라벨로 작은 모델을 가르쳤다
- Gemini 3.1 Pro가 댓글 4,290개에 라벨을 한 번 달았고 비용은 $9였다.
- 이 라벨로 GLiNER large v2.5(459M)를 파인튜닝해 로컬에서 돌린다.
- 제로샷 GLiNER는 Gemini 답 대비 F1 약 0.65였고, 튜닝 후 0.83이 됐다.
- 오프셋은 LLM이 아니라 코드가 계산한다
- 프롬프트는 정확한 문자열과 라벨만 요구한다.
- 글자 위치(오프셋)는 TypeScript가 찾고, 댓글에 없는 문자열은 버리고 로그를 남긴다.
- 제품이 없는 댓글도 음성 예제로 넣었다
- 학습 데이터의 약 30%는 gyuto, carbon, handle, patina 같은 오탐 유발어가 있지만 제품은 없는 댓글이다.
- 이런 댓글은 빈 라벨로 달았다.
- 적대적 음성을 51개에서 510개로 늘리니 F1이 0.799로 떨어져 51개로 되돌렸다.
- 10번 중 5번은 words_mask 때문에 망했다
- words_mask는 어텐션 마스크가 아니라 단어 인덱스다(특수 토큰은 0, 실제 단어 첫 서브토큰은 1, 2, 3…).
- 1로 채웠더니 에러 없이 loss가 70~130에서 평평했고 eval F1은 0 근처였다.
- 인덱스로 고치자 6번째 런에서 바로 학습됐다.
Community Reactions
- 동어 사전이면 충분하지 않냐는 의견
- 칼 세계 단어를 클래스에 매핑하는 것뿐이면 단순 사전으로도 된다는 댓글이 있었다.
- 처음 보는 브랜드도 찾는지 보려면 개체 단위로 train/val을 나눠 검증하라는 제안이었다.
- 학습 데이터가 작고 신제품이 걱정된다는 의견
- GLiNER 후속 학습 데이터셋이 꽤 작다는 지적이 있었다.
- 새 브랜드가 나오면 어떻게 하느냐는 질문도 나왔다.
- T4 $2.50이 말이 되느냐는 의문
- 24분 T4 학습에 $2.50이면 시간당 $6.25라서 비싸다는 댓글이 있었다.
- 글의 $2.50은 열 번의 런 전체 GPU 시간이라 이 계산과 맞지 않는다는 반응이다.
- 봇 광고 댓글이 데이터를 오염시킬 수 있다는 의견
- 광고 봇이 Reddit에 자기 제품을 칭찬하는 댓글을 달면 가장 좋은 칼이 아니라 광고비가 많은 칼이 뽑힐 수 있다는 우려였다.
- LLM으로 반복 작업용 전용 도구를 만드는 접근에 공감한다는 의견
- 흐름이 정리된 뒤엔 각 단계를 싸고 전용인 도구로 바꾼다는 방향이 맞다는 댓글이 있었다.
How to Apply
- 오늘 LLM 추출 호출 로그에서 라벨 후보 뽑기
- 오늘 30분 안에 NER·태깅 호출 중 반복 패턴 하나를 골라 입력과 출력 수천 건을 내보내라.
- 출력은 문자열+라벨 JSON으로 바꾸고 코드에서 오프셋을 계산해 원문에 없는 항목은 버려라.
- 검증셋을 먼저 고정하고 사람이 일부 확인하기
- 학습 전에 200개 안팎을 따로 빼고 다시 건드리지 마라.
- 그중 일부는 직접 라벨을 확인해 LLM 오류를 따라 한 건 아닌지 점검하라.
- 직접 만든 텐서마다 assert 걸기
- words_mask처럼 이름만 보고 짐작해 채운 입력은 라이브러리 학습 루프 코드를 읽고 값 범위·형태를 assert로 검사하라.
- loss가 평평하면 데이터를 탓하기 전에 입력 텐서부터 출력해 확인하라.
- 클래스별 임계값과 음성 예제 튜닝하기
- 검증셋에서 클래스별로 임계값을 따로 훑어라.
- 오탐 유발어가 들어간 무제품 댓글을 전체의 30% 정도 넣고, 늘릴 땐 점수 변화를 확인하라.
Try It
# Claude/ChatGPT에 붙여넣기 — 논문 방법의 간이 버전: LLM 라벨링 프롬프트(문자열만 반환, 오프셋은 코드가 계산)
당신은 NER 라벨러입니다. 아래 댓글에서 {{라벨 종류 예: 브랜드, 모델, 소재}}에 해당하는 항목만 추출하세요.
규칙:
- 글자 위치(오프셋)는 절대 세지 말고, 댓글에 나온 그대로의 정확한 부분 문자열(text)과 label만 반환하세요.
- 제품이 아닌 일반 단어({{오탐 유발어 예: carbon, handle}})는 제외하세요.
- 해당 항목이 없으면 {"entities": []}를 반환하세요.
- JSON만 출력하세요: {"entities":[{"text":"...","label":"..."}]}
댓글: {{댓글}}
이어서 해 볼 것: 반환된 text를 댓글에서 검색해 위치를 계산하고, 없으면 버리는 코드를 작성해 달라고 요청해 보세요.Terminology
관련 논문
AI 글쓰기 버릇을 학습으로 뺀 Qwen3-4B (qwen3-4b-deslop)
Qwen3-4B를 LoRA로 증류했더니 AI 문체 점수가 121에서 12.5로 떨어졌다
Dust: 역전파 없이 Transformer를 사전학습하는 방법
활성값에 토큰별 노이즈를 줬더니 역전파 없이 Transformer 사전학습이 됐다
TurboGPT: 22KiB 트랜스포머를 13초 만에 학습시키는 CUDA 프로젝트
CUDA C++로 바이트 단위 tiny GPT를 1분 안에 학습하는 오픈소스
절대 포기하지 않기(Never Give Up): LLM RL에서 어려운 문제를 풀게 만드는 방법
쉬운 문제에 쓰는 연산을 줄이고 어려운 문제를 재시도했더니 어려운 문제 성능이 올랐다
3.8B LLM을 $998로 학습해 CORE 0.384 달성하기
B200 8장으로 43시간, $998를 들여 3.8B 모델이 CORE 0.384를 기록했다
Paul Graham: "17살이면 LLM을 밑바닥부터 만들어 보겠다"
PG는 17살이면 창업 말고 LLM 밑바닥 구현부터 배우겠다고 했다
DeepSeek을 GPT-OSS에 증류해도 검열은 따라오지 않았다
DeepSeek V4 Flash로 금융 추론을 증류했더니 성능은 올랐고 검열은 안 따라왔다