Costruire un Dataset di Fine-Tuning dal Web: da URL a JSONL
Un buon fine-tuning è composto al 90% dal dataset. Questa è la pipeline che va dagli URL grezzi a JSONL puliti — approvvigionamento su larga scala, deduplica, filtri di licenza e il formato chat che i trainer si aspettano realmente.
Un fine-tuning è valido solo quanto i dati che gli fornisci, e la parte più difficile del fine-tuning non è quasi mai l'addestramento — è costruire un dataset pulito. Il web è la fonte più ricca di quei dati, ma le pagine grezze sono disordinate, duplicate, non etichettate e legalmente disomogenee. Questa guida è la pipeline dagli URL a JSONL pronto per l'addestramento: quanti dati ti servono effettivamente, come approvvigionarli su larga scala, come pulirli e deduplicarli, come gestire le licenze e come formattarli nella struttura chat che i trainer si aspettano. Si presume che tu stia costruendo un fine-tuning di istruzioni o chat da contenuti web pubblici.
Quanti dati ti servono effettivamente?
Inizia con obiettivi realistici per non costruire troppo o troppo poco. Il minimo pratico per un fine-tuning che produca risultati ragionevoli è circa 100 record; per prestazioni solide generalmente ne vuoi oltre 1.000. Di solito più aiuta, ma solo se è pulito — mille esempi ben etichettati battono diecimila rumorosi. Per riferimento di scala, il classico dataset Alpaca era composto da 52.000 coppie di istruzioni/risposte, generate stimolando un modello più forte. E se stai usando un grande modello per generare esempi sintetici, avvialo con almeno dieci esempi scritti a mano in modo che apprenda la struttura e il tono esatti che desideri prima di produrne altri.
Approvvigionamento: crawl per ottenere markdown pulito
L'obiettivo nella fase di approvvigionamento è testo pulito, non HTML grezzo. Un record di fine-tuning vuole la sostanza di una pagina — l'articolo, i documenti, il Q&A — senza le barre di navigazione, i banner dei cookie e il markup pubblicitario che inquinano uno scraping ingenuo. Quindi esegui il crawl delle tue pagine target e convertile in markdown durante l'ingestione, che elimina il boilerplate mantenendo la struttura come intestazioni e liste. A qualsiasi volume reale incontrerai limiti di velocità e blocchi IP, quindi instrada il crawl attraverso un pool rotante. Un Scraper API che restituisce direttamente markdown svolge entrambi i compiti — output pulito e resistenza ai blocchi — in una sola chiamata, motivo per cui lo trattiamo nella nostra guida su alimentare LLM con dati web freschi.
# 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

Il formato JSONL che i trainer si aspettano
La maggior parte degli strumenti di fine-tuning moderni predefinisce un formato JSONL conversazionale: un oggetto JSON per riga, ciascuno con un array messages di coppie ruolo/contenuto, dove i ruoli sono system, user e assistant e i turni user/assistant si alternano. Questo è il formato chat che i trainer in stile Hugging Face e OpenAI ingeriscono. I dataset di istruzioni più vecchi utilizzano una struttura a tre campi (instruction, input, output) — adatta per il tuning supervisionato a turno singolo — e esistono anche formati di conversazione a più turni, ma si convertono facilmente nella forma dei messaggi. Scegli un formato target e standardizza tutto su di esso.
// 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"}
]}
Abbina il formato all'obiettivo di addestramento: testo grezzo per il pretraining continuo, istruzione più output o chat a più turni per il fine-tuning supervisionato, risposte classificate per metodi basati sulle preferenze. Se stai costruendo un fine-tuning di ragionamento, mantieni la domanda e la risposta ma riscrivi la risposta per includere i passaggi del ragionamento che vuoi che il modello apprenda.
Pulizia: dove si vince la qualità
Questa è la fase che decide il tuo risultato, ed è principalmente un filtraggio poco glamour. Non dare mai per scontato che i record provenienti dal web o generati dal modello siano corretti — ispezionali. I modelli di fallimento ricorrenti sono specifici e vale la pena controllarli per nome:
- Incoerenza delle etichette: la stessa categoria scritta come "Positive" in un record e "positive" in un altro — normalizza maiuscole e ortografia.
- Risposte fuori bersaglio: l'assistente restituisce una frase o una domanda di follow-up invece dell'etichetta esatta o del formato per cui stai addestrando.
- Record etichettati erroneamente: un input ambiguo assegnato all'output sbagliato — il tipo di rumore più dannoso.
- Residui di boilerplate: testo di navigazione, avvisi sui cookie o frammenti di "leggi di più" che sono sopravvissuti alla conversione in markdown.
- Duplicati: esempi identici o quasi identici che gonfiano il conteggio dei record e inclinano il modello verso contenuti ripetuti.
Una buona abitudine è mantenere sia il JSONL pre-pulito che quello pulito in modo da poter misurare ciò che hai rimosso. E bilancia il set tra le categorie — una classe sovra-rappresentata insegna al modello a sovra-predire.
Deduplicazione e licenze
I dati web sono pieni di ripetizioni — articoli sindacati, documenti specchiati, paragrafi boilerplate — e i duplicati danneggiano silenziosamente un fine-tuning sovrappesando ciò che è ripetuto. Fai due passaggi: deduplica esatta tramite hashing del testo normalizzato per catturare i record identici, quindi rilevamento di quasi-duplicati (una tecnica di similarità o shingling come MinHash) per catturare copie riformulate che un hash esatto manca. Sulle licenze, sii deliberato: non tutto ciò che è pubblico è liberamente riutilizzabile. Traccia la fonte e la licenza di ogni documento, filtra i contenuti i cui termini vietano l'uso per l'addestramento e preferisci fonti con permessi di riutilizzo chiari. È molto più economico registrare la provenienza mentre esegui il crawl piuttosto che ricostruirla dopo aver mescolato tutto insieme.
Approvvigionare dati web puliti per LLM
Combina, scheda e dividi
Quando attingi da diverse fonti, standardizzale tutte in un unico formato e uniscile in un unico dataset unificato prima dell'addestramento — un fine-tuning pulito sul set combinato batte il fine-tuning sequenziale su ciascuna fonte, che tende a erodere ciò che il modello ha appreso in precedenza. Poi scrivi una scheda del dataset: un breve resoconto di dove provengono i dati, come sono stati puliti, la loro dimensione e distribuzione delle etichette, le loro licenze e eventuali limitazioni note. È ciò che rende il dataset riproducibile e verificabile mesi dopo. Infine, tieni da parte una divisione di valutazione su cui non addestri mai, in modo da poter misurare il fine-tuning onestamente invece di valutarlo su dati che ha memorizzato. Se stai alimentando un sistema di recupero piuttosto che un fine-tuning, la nostra guida alla pipeline RAG copre il lato di aggiornamento dello stesso problema.

Domande frequenti
Quanti record mi servono per fare il fine-tuning di un LLM?
Circa 100 record è il minimo pratico per risultati ragionevoli, e oltre 1.000 è un buon obiettivo per prestazioni solide. In generale più aiuta, ma solo se i dati rimangono puliti — un set più piccolo e ben etichettato batte uno grande e rumoroso. Per la generazione sintetica, avvia il generatore con almeno dieci esempi scritti a mano in modo che apprenda prima il tuo formato esatto.
In che formato devono essere i dati di fine-tuning?
JSONL — un oggetto JSON per riga. La maggior parte dei trainer moderni predefinisce un formato conversazionale con un array messages di coppie ruolo-contenuto system/user/assistant. I dataset di istruzioni più vecchi usano campi instruction/input/output. Scegli un formato target basato sul tuo obiettivo di addestramento e standardizza ogni fonte su di esso prima dell'addestramento.
Come pulisco un dataset estratto per il fine-tuning?
Converti le pagine in markdown per eliminare il boilerplate, quindi filtra manualmente per i fallimenti comuni: etichette incoerenti, risposte fuori bersaglio, record etichettati erroneamente e testo di navigazione o cookie residuo. Deduplica con un hash esatto e un passaggio di quasi-duplicati, bilancia le categorie e mantieni sia le versioni grezze che quelle pulite in modo da poter misurare ciò che hai rimosso.
Posso usare qualsiasi contenuto web per addestrare un modello?
Non automaticamente — pubblico non significa liberamente riutilizzabile. Alcuni contenuti hanno termini che vietano l'uso per l'addestramento, e i dati personali portano le proprie regole. Traccia la fonte e la licenza di ogni documento mentre lo raccogli, filtra tutto ciò i cui termini vietano l'addestramento e preferisci fonti con permessi chiaramente definiti. Queste sono informazioni generali, non consigli legali; consulta un legale per dataset commerciali.
Costruire un dataset di fine-tuning dal web è una pipeline di filtraggio: approvvigiona markdown pulito, modellalo nel formato di messaggi che il tuo trainer si aspetta, deduplica e controlla le etichette senza pietà, filtra per licenza e scheda il risultato. Ottieni circa un migliaio di record puliti e tieni da parte una divisione di valutazione onesta, e spenderai il tuo budget di addestramento su segnale invece che su rumore.