Bouw een Fine-Tuning Dataset van het Web: URLs naar JSONL

Een goede fine-tune is 90% dataset. Dit is de pijplijn van ruwe URLs naar schone JSONL — grootschalige bronverzameling, deduplicatie, licentiefilters en het chatformaat dat trainers daadwerkelijk verwachten.

Een fine-tune is alleen zo goed als de data die je erin stopt, en het moeilijkste deel van fine-tuning is bijna nooit de trainingsrun — het is het bouwen van een schone dataset. Het web is de rijkste bron van die data, maar ruwe pagina's zijn rommelig, gedupliceerd, niet gelabeld en juridisch ongelijk. Deze gids is de pijplijn van URLs naar trainingsklare JSONL: hoeveel data je daadwerkelijk nodig hebt, hoe je het op grote schaal verzamelt, hoe je het schoonmaakt en dedupliceert, hoe je omgaat met licenties en hoe je het formatteert in de chatstructuur die trainers verwachten. Het gaat ervan uit dat je een instructie- of chat-fine-tune bouwt van openbare webinhoud.

Hoeveel data heb je eigenlijk nodig?

Begin met realistische doelen zodat je niet te veel of te weinig bouwt. De praktische ondergrens voor een fine-tune die redelijke resultaten oplevert is ongeveer 100 rijen; voor solide prestaties wil je over het algemeen meer dan 1.000. Meer helpt meestal, maar alleen als het schoon is — duizend goed gelabelde voorbeelden verslaan tienduizend rommelige. Ter referentie, de klassieke Alpaca dataset bestond uit 52.000 instructie/output paren, gegenereerd door een sterker model te vragen. En als je een groot model gebruikt om synthetische voorbeelden te genereren, zaai het dan met ten minste tien handgeschreven voorbeelden zodat het de exacte structuur en toon leert die je wilt voordat het meer produceert.

Bronverzameling: crawl naar schone markdown

Het doel in de bronverzamelingsfase is schone tekst, niet ruwe HTML. Een fine-tuning rij wil de essentie van een pagina — het artikel, de documentatie, de Q&A — zonder de navigatiebalken, cookie-banners en advertentie-opmaak die een naïeve scrape vervuilen. Dus crawlen je doelpagina's en zet ze om naar markdown bij het inlezen, wat boilerplate verwijdert terwijl het structuren zoals koppen en lijsten behoudt. Bij enig echt volume zul je tegen snelheidslimieten en IP-blokkeringen aanlopen, dus routeer de crawl door een roterende pool. Een Scraper API die direct markdown retourneert doet beide taken — schone output en blokweerstand — in één oproep, daarom behandelen we het in onze gids voor het voeden van LLMs met verse webdata.

# 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
Pijplijndiagram van URLs naar een fine-tuning dataset: bron naar schone markdown, schoonmaken en dedupliceren, formatteren als JSONL berichten, dan datasetkaart en train/eval splitsing
Het model ziet alleen jouw dataset, dus elke stap die rommel verwijdert verbetert direct de fine-tune.

Het JSONL-formaat dat trainers verwachten

De meeste moderne fine-tuning tools standaardiseren naar een conversatie-JSONL-formaat: één JSON-object per regel, elk met een messages array van rol/inhoud paren, waarbij rollen system, user en assistant zijn en de user/assistant beurten elkaar afwisselen. Dat is het chatformaat dat Hugging Face en OpenAI-stijl trainers inlezen. Oudere instructiedatasets gebruiken een drie-velden structuur (instruction, input, output) — prima voor enkelvoudige supervisie-tuning — en multi-turn conversatieformaten bestaan ook, maar ze kunnen gemakkelijk worden omgezet naar het messages-formaat. Kies één doelformaat en standaardiseer alles daarop.

// 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"}
]}

Stem het formaat af op het trainingsdoel: ruwe tekst voor voortgezette pretraining, instructie-plus-uitvoer of multi-turn chat voor gesuperviseerde fine-tuning, gerangschikte antwoorden voor voorkeur-gebaseerde methoden. Als je een redeneer-fine-tune bouwt, behoud de vraag en het antwoord maar herschrijf het antwoord om de gedachtegangstappen op te nemen die je wilt dat het model leert.

Schoonmaken: waar kwaliteit wordt gewonnen

Dit is de fase die je resultaat bepaalt, en het is meestal onopvallend filteren. Ga er nooit van uit dat web-gebaseerde of modelgegenereerde rijen correct zijn — inspecteer ze. De terugkerende faalmodi zijn specifiek en het is de moeite waard om ze bij naam te controleren:

Een goede gewoonte is om zowel de pre-schoon als de schoongemaakte JSONL te bewaren zodat je kunt meten wat je hebt verwijderd. En balanceer de set over categorieën — een oververtegenwoordigde klasse leert het model om het te overvoorspellen.

Deduplicatie en licenties

Webdata zit vol herhalingen — gesyndiceerde artikelen, gespiegelde documenten, boilerplate paragrafen — en duplicaten schaden stilletjes een fine-tune door overgewicht te geven aan wat herhaald wordt. Doe twee passes: exacte-match deduplicatie door de genormaliseerde tekst te hashen om identieke rijen te vangen, en dan near-duplicate detectie (een gelijkenis- of shingling-techniek zoals MinHash) om herschreven kopieën te vangen die een exacte hash mist. Wees op het gebied van licenties doelbewust: niet alles wat openbaar is, is vrij herbruikbaar. Houd de bron en licentie van elk document bij, filter inhoud uit waarvan de voorwaarden training gebruik verbieden, en geef de voorkeur aan bronnen met duidelijke hergebruiktoestemmingen. Het is veel goedkoper om herkomst te registreren terwijl je crawlt dan om het te reconstrueren nadat je alles hebt gemengd.

Bron schone webdata voor LLMs

Combineren, kaart en splitsen

Wanneer je uit verschillende bronnen haalt, standaardiseer ze allemaal naar één formaat en voeg ze samen in een enkele uniforme dataset voordat je gaat trainen — één schone fine-tune op de gecombineerde set verslaat sequentieel fine-tunen op elke bron, wat de neiging heeft om te eroderen wat het model eerder heeft geleerd. Schrijf dan een datasetkaart: een kort verslag van waar de data vandaan kwam, hoe het is schoongemaakt, de grootte en labelverdeling, de licenties en eventuele bekende beperkingen. Het is wat de dataset reproduceerbaar en controleerbaar maakt maanden later. Houd ten slotte een evaluatiesplitsing achter die je nooit traint, zodat je de fine-tune eerlijk kunt meten in plaats van het te scoren op data die het heeft gememoriseerd. Als je een retrieval systeem voedt in plaats van een fine-tune, behandelt onze RAG pijplijngids de verfrissingskant van hetzelfde probleem.

Statistiekenpaneel dat de grootte van fine-tuning datasets toont: minimaal 100 rijen, 1000-plus voor optimaal, 10 zaadvoorbeelden voor synthetische generatie, 52000 Alpaca rijen
Onder ongeveer 100 rijen leert een fine-tune nauwelijks; voorbij 1.000 schone rijen, verslaat kwaliteit kwantiteit.

Veelgestelde vragen

Hoeveel rijen heb ik nodig om een LLM te fine-tunen?

Ongeveer 100 rijen is het praktische minimum voor redelijke resultaten, en meer dan 1.000 is een goed doel voor solide prestaties. Meer helpt over het algemeen, maar alleen als de data schoon blijft — een kleinere, goed gelabelde set verslaat een grote rommelige. Voor synthetische generatie, zaai de generator met ten minste tien handgeschreven voorbeelden zodat het eerst jouw exacte formaat leert.

In welk formaat moet fine-tuning data zijn?

JSONL — één JSON-object per regel. De meeste moderne trainers standaardiseren naar een conversatieformaat met een messages array van systeem/user/assistant rol-inhoud paren. Oudere instructiedatasets gebruiken instructie/input/output velden. Kies één doelformaat op basis van je trainingsdoel en standaardiseer elke bron daarop voordat je gaat trainen.

Hoe maak ik een gescrapete dataset schoon voor fine-tuning?

Zet pagina's om naar markdown om boilerplate te strippen, filter dan handmatig voor de veelvoorkomende fouten: inconsistente labels, off-target antwoorden, verkeerd gelabelde rijen en overgebleven navigatie- of cookietekst. Deduplicateer met een exacte hash en een near-duplicate pass, balanceer de categorieën, en bewaar zowel de ruwe als schoongemaakte versies zodat je kunt meten wat je hebt verwijderd.

Kan ik elke webinhoud gebruiken om een model te trainen?

Niet automatisch — openbaar betekent niet vrij herbruikbaar. Sommige inhoud heeft voorwaarden die training gebruik verbieden, en persoonlijke data brengt zijn eigen regels mee. Houd de bron en licentie van elk document bij terwijl je het verzamelt, filter alles uit waarvan de voorwaarden training verbieden, en geef de voorkeur aan bronnen met duidelijke toestemmingen. Dit is algemene informatie, geen juridisch advies; raadpleeg een advocaat voor commerciële datasets.

Het bouwen van een fine-tuning dataset van het web is een filterpijplijn: bron schone markdown, vorm het naar het messages-formaat dat je trainer verwacht, dedupliceer en label-check meedogenloos, filter op licentie, en kaart het resultaat. Krijg ongeveer duizend schone rijen en houd een eerlijke evaluatiesplitsing achter, en je besteedt je trainingsbudget aan signaal in plaats van ruis.

Bouw je dataset met QuantumProxies webdata