웹에서 파인튜닝 데이터셋 구축하기: URL을 JSONL로
좋은 파인튜닝은 90%가 데이터셋입니다. 이는 원시 URL에서 깨끗한 JSONL로 가는 파이프라인입니다 — 대규모 소싱, 중복 제거, 라이선스 필터링, 그리고 트레이너가 실제로 기대하는 채팅 형식.
파인튜닝은 제공하는 데이터만큼만 좋으며, 파인튜닝의 가장 어려운 부분은 거의 항상 훈련 실행이 아니라 깨끗한 데이터셋을 구축하는 것입니다. 웹은 그 데이터의 가장 풍부한 출처이지만, 원시 페이지는 지저분하고, 중복되며, 라벨이 없고 법적으로 불균형합니다. 이 가이드는 URL에서 훈련 준비가 된 JSONL로 가는 파이프라인입니다: 실제로 필요한 데이터 양, 대규모로 소싱하는 방법, 정리하고 중복 제거하는 방법, 라이선스를 처리하는 방법, 그리고 트레이너가 기대하는 채팅 구조로 포맷하는 방법을 다룹니다. 이는 공공 웹 콘텐츠에서 지시 또는 채팅 파인튜닝을 구축한다고 가정합니다.
실제로 얼마나 많은 데이터가 필요합니까?
과도하거나 부족하게 구축하지 않도록 현실적인 목표로 시작하세요. 합리적인 결과를 내는 파인튜닝의 실질적인 최소치는 약 100행이며, 견고한 성능을 위해서는 일반적으로 1,000행 이상이 필요합니다. 더 많은 데이터는 보통 도움이 되지만, 깨끗할 때만 그렇습니다 — 잘 라벨링된 천 개의 예제가 시끄러운 만 개의 예제를 능가합니다. 규모의 참고로, 고전적인 Alpaca 데이터셋은 더 강한 모델을 프롬프트하여 생성된 52,000개의 지시/출력 쌍이었습니다. 그리고 만약 큰 모델을 사용하여 합성 예제를 생성한다면, 최소한 열 개의 손으로 작성한 예제로 시드를 하여 모델이 더 많은 예제를 생성하기 전에 원하는 정확한 구조와 톤을 배우도록 하세요.
소싱: 크롤링하여 깨끗한 markdown으로
소싱 단계의 목표는 원시 HTML이 아닌 깨끗한 텍스트입니다. 파인튜닝 행은 페이지의 실질적인 내용 — 기사, 문서, Q&A — 를 원하며, 네비게이션 바, 쿠키 배너 및 광고 마크업과 같은 순진한 스크랩을 오염시키는 요소는 원하지 않습니다. 따라서 대상 페이지를 크롤링하고, 수집 시 markdown으로 변환하여 구조를 유지하면서도 보일러플레이트를 제거하세요. 실제 볼륨에서는 속도 제한 및 IP 차단에 부딪히게 되므로, 회전 풀을 통해 크롤링을 라우팅하세요. Scraper API는 한 번의 호출로 깨끗한 출력과 차단 저항을 동시에 제공하므로, LLM에 신선한 웹 데이터를 공급하는 방법 가이드에서 다루는 이유입니다.
# Sketch: crawl target URLs to clean markdown, ready for shaping into rows.
import requests
API = "https://api.quantumproxies.io/scrape" # returns markdown, handles rotation
def fetch_markdown(url):
r = requests.get(API, params={"url": url, "format": "markdown"},
headers={"Authorization": "Bearer YOUR_KEY"}, timeout=60)
return r.json()["markdown"]
docs = [fetch_markdown(u) for u in seed_urls] # clean text, no boilerplate

트레이너가 기대하는 JSONL 형식
대부분의 현대 파인튜닝 도구는 대화형 JSONL 형식을 기본으로 사용합니다: 각 줄에 하나의 JSON 객체, 각 객체에는 역할/내용 쌍의 messages 배열이 있으며, 역할은 system, user, assistant이고 사용자/어시스턴트 턴이 교대로 나타납니다. 이것이 Hugging Face와 OpenAI 스타일 트레이너가 수집하는 채팅 형식입니다. 이전의 지시 데이터셋은 세 필드 형태(instruction, input, output)를 사용합니다 — 단일 턴 감독 튜닝에는 적합하며, 다중 턴 대화 형식도 존재하지만, 메시지 형태로 쉽게 변환됩니다. 하나의 목표 형식을 선택하고 모든 것을 표준화하세요.
// One training example per line (.jsonl). Chat / messages format:
{"messages":[
{"role":"system","content":"You classify support tickets by urgency."},
{"role":"user","content":"My payment failed three times and the event is tomorrow."},
{"role":"assistant","content":"high"}
]}
{"messages":[
{"role":"system","content":"You classify support tickets by urgency."},
{"role":"user","content":"How do I change my avatar?"},
{"role":"assistant","content":"low"}
]}
훈련 목표에 형식을 맞추세요: 지속적인 사전 훈련을 위한 원시 텍스트, 감독된 파인튜닝을 위한 지시-출력 또는 다중 턴 채팅, 선호 기반 방법을 위한 순위 응답. 추론 파인튜닝을 구축 중이라면, 질문과 답변을 유지하되, 모델이 배우기를 원하는 사고 과정 단계를 포함하도록 답변을 다시 작성하세요.
정리: 품질이 결정되는 곳
이 단계가 결과를 결정하며, 대부분은 매력적이지 않은 필터링입니다. 웹에서 소싱되거나 모델이 생성한 행이 정확하다고 가정하지 마세요 — 검사하세요. 반복되는 실패 모드는 구체적이며 이름으로 확인할 가치가 있습니다:
- 라벨 불일치: 한 행에서는 "Positive"로, 다른 행에서는 "positive"로 작성된 동일한 카테고리 — 대소문자와 철자를 표준화하세요.
- 목표에서 벗어난 답변: 어시스턴트가 훈련 중인 정확한 라벨이나 형식 대신 문장이나 후속 질문을 반환합니다.
- 잘못 라벨링된 행: 모호한 입력에 잘못된 출력을 할당 — 가장 해로운 종류의 잡음입니다.
- 보일러플레이트 잔여물: markdown 변환을 통과한 네비게이션 텍스트, 쿠키 공지 또는 "더 읽기" 조각.
- 중복: 행 수를 부풀리고 모델을 반복된 콘텐츠로 편향시키는 동일하거나 거의 동일한 예제.
좋은 습관은 정리 전과 정리 후 JSONL을 모두 보관하여 제거한 내용을 측정할 수 있도록 하는 것입니다. 그리고 카테고리 간 균형을 맞추세요 — 과대 대표된 클래스는 모델이 과대 예측하도록 가르칩니다.
중복 제거 및 라이선스
웹 데이터는 반복으로 가득 차 있습니다 — 신디케이트된 기사, 미러링된 문서, 보일러플레이트 단락 — 그리고 중복은 조용히 파인튜닝을 해치며 반복된 내용을 과대 평가합니다. 두 번의 패스를 수행하세요: 동일한 행을 잡기 위해 정규화된 텍스트를 해싱하여 정확한 일치 중복 제거, 그런 다음 정확한 해시가 놓치는 재작성된 복사본을 잡기 위한 유사성 또는 shingling 기법과 같은 근사 중복 탐지. 라이선스에 대해서는 신중하게 접근하세요: 모든 공개 콘텐츠가 자유롭게 재사용 가능한 것은 아닙니다. 각 문서의 출처와 라이선스를 추적하고, 훈련 사용을 금지하는 조건의 콘텐츠를 필터링하며, 명확한 재사용 권한이 있는 출처를 선호하세요. 크롤링하면서 출처를 기록하는 것이 모든 것을 혼합한 후에 재구성하는 것보다 훨씬 저렴합니다.
결합, 카드 작성 및 분할
여러 출처에서 데이터를 가져올 때, 모든 데이터를 하나의 형식으로 표준화하고 훈련 전에 단일 통합 데이터셋으로 병합하세요 — 결합된 세트에서의 하나의 깨끗한 파인튜닝이 각 출처에서 순차적으로 파인튜닝하는 것보다 더 나은 결과를 냅니다, 이는 모델이 이전에 배운 것을 침식하는 경향이 있습니다. 그런 다음 데이터셋 카드를 작성하세요: 데이터가 어디에서 왔는지, 어떻게 정리되었는지, 크기와 라벨 분포, 라이선스, 그리고 알려진 제한 사항에 대한 짧은 기록입니다. 이는 데이터셋을 몇 달 후에도 재현 가능하고 감사 가능하게 만듭니다. 마지막으로, 훈련에 사용하지 않는 평가 분할을 남겨두어, 모델이 암기한 데이터로 점수를 매기는 대신 파인튜닝을 정직하게 측정할 수 있습니다. 파인튜닝이 아닌 검색 시스템에 데이터를 공급하는 경우, 우리의 RAG 파이프라인 가이드가 동일한 문제의 새로 고침 측면을 다룹니다.

자주 묻는 질문
LLM을 파인튜닝하려면 몇 개의 행이 필요합니까?
약 100행이 합리적인 결과를 위한 실질적인 최소치이며, 1,000개 이상이 견고한 성능을 위한 좋은 목표입니다. 더 많은 데이터는 일반적으로 도움이 되지만, 데이터가 깨끗할 때만 그렇습니다 — 작은 잘 라벨링된 세트가 큰 시끄러운 세트를 능가합니다. 합성 생성을 위해서는, 생성기를 최소한 열 개의 손으로 작성한 예제로 시드하여 먼저 정확한 형식을 배우도록 하세요.
파인튜닝 데이터는 어떤 형식이어야 합니까?
JSONL — 각 줄에 하나의 JSON 객체. 대부분의 현대 트레이너는 시스템/사용자/어시스턴트 역할-내용 쌍의 messages 배열이 있는 대화형 형식을 기본으로 사용합니다. 이전의 지시 데이터셋은 지시/입력/출력 필드를 사용합니다. 훈련 목표에 따라 하나의 목표 형식을 선택하고 훈련 전에 모든 출처를 표준화하세요.
파인튜닝을 위한 스크랩된 데이터셋을 어떻게 정리합니까?
페이지를 markdown으로 변환하여 보일러플레이트를 제거한 다음, 일반적인 실패를 위해 수작업으로 필터링하세요: 불일치한 라벨, 목표에서 벗어난 답변, 잘못 라벨링된 행, 남은 네비게이션 또는 쿠키 텍스트. 정확한 해시와 근사 중복 패스로 중복 제거하고, 카테고리를 균형 있게 유지하며, 제거한 내용을 측정할 수 있도록 원시 및 정리된 버전을 모두 보관하세요.
모델을 훈련하기 위해 웹 콘텐츠를 사용할 수 있습니까?
자동으로는 아닙니다 — 공개된 것이 자유롭게 재사용 가능하다는 것을 의미하지 않습니다. 일부 콘텐츠는 훈련 사용을 금지하는 조건을 가지고 있으며, 개인 데이터는 자체 규칙을 가져옵니다. 수집할 때 각 문서의 출처와 라이선스를 추적하고, 훈련을 금지하는 조건의 콘텐츠를 필터링하며, 명확히 허가된 출처를 선호하세요. 이는 일반 정보이며, 상업적 데이터셋에 대한 법적 조언이 아닙니다; 상업적 데이터셋에 대해서는 법률 자문을 받으세요.
웹에서 파인튜닝 데이터셋을 구축하는 것은 필터링 파이프라인입니다: 깨끗한 markdown을 소싱하고, 트레이너가 기대하는 메시지 형식으로 형성하며, 무자비하게 중복 제거하고 라벨을 확인하며, 라이선스를 필터링하고 결과를 카드화하세요. 대략 천 개의 깨끗한 행을 얻고 정직한 평가 분할을 남겨두면, 훈련 예산을 잡음이 아닌 신호에 사용할 수 있습니다.