Jak zbierać dane treningowe do uczenia maszynowego z sieci

Model to łatwa część. To pozyskanie czystego, zdeduplikowanego, prawnie bezpiecznego i odnawialnego zestawu treningowego z otwartej sieci jest miejscem, gdzie projekty faktycznie się zatrzymują. Oto pipeline zbierania danych, od początku do końca.

Trenowanie modelu to często łatwa część. Krok, który zatrzymuje projekty uczenia maszynowego, jest na początku: złożenie czystego, zdeduplikowanego, prawnie bezpiecznego i odnawialnego zestawu treningowego z otwartej sieci. Pozyskiwanie surowych stron jest tanie — robi to crawler — ale przekształcenie ich w użyteczne wiersze to prawdziwa praca, i to jest to, co obejmuje ten przewodnik: pozyskiwanie, czyszczenie do strukturalnego tekstu, deduplikacja, próbkowanie, licencjonowanie i pipeline odświeżania, który zapobiega starzeniu się modelu.

Zacznij od sygnału, nie od scraper'a

Zanim napiszesz jakikolwiek kod zbierania, zdefiniuj dokładnie, czego model musi się nauczyć i które źródła niosą ten sygnał. Dane występują w trzech formach i każda ma różne koszty zbierania: strukturalne (tabele, kanały produktowe — łatwe do parsowania), półstrukturalne (JSON, CSV, XML endpoints — często najczystsza rzecz, jaką strona ujawnia), i niestrukturalne (tekst artykułów, recenzje, wątki na forach). Niestrukturalne treści stanowią 80-90% wszystkich danych i podobno tylko około 0,5% z nich jest kiedykolwiek używane, co jest dokładnie luką, którą zamyka dobrze zbudowany zestaw danych z sieci. Zdecyduj, którą formę chcesz uzyskać, zanim cokolwiek skalujesz.

Crawl do czystego tekstu, nie surowego HTML

Podawanie surowego HTML do pipeline'u treningowego oznacza podawanie nawigacji, reklam, banerów cookie i tagów skryptów — szumu, który pogarsza zestaw danych. Trwałym ruchem jest crawl bezpośrednio do czystego, strukturalnego tekstu. Scraper API, który zwraca markdown, wykonuje za ciebie usuwanie boilerplate'u, więc crawl tysięcy stron ląduje jako czytelna treść zamiast zupy tagów:

import requests

def fetch_clean(url):
    r = requests.get(
        "https://api.quantumproxies.io/scrape",
        params={"url": url, "format": "markdown"},
        headers={"Authorization": "Bearer YOUR_API_KEY"},
        timeout=60,
    )
    return r.json()["content"]  # boilerplate-stripped markdown

corpus = [fetch_clean(u) for u in seed_urls]

Markdown to dobry cel, ponieważ zachowuje strukturę (nagłówki, listy, tabele), jednocześnie usuwając warstwę prezentacji — z tego samego powodu jest preferowanym wejściem dla RAG pipelines i treningu LLM. Przekieruj crawl przez rotacyjne IP rezydencjalne, aby duży bieg zbierania nie został zablokowany w połowie.

Pipeline od końca do końca z otwartej sieci do zestawu treningowego uczenia maszynowego: źródło, crawl do markdown, deduplikacja i próbkowanie, licencjonowanie i odświeżanie
Połowa zbierania w pipeline'ie ML: modelowanie przychodzi po tym i całkowicie zależy od zrobienia tego dobrze.

Deduplikuj, zanim zatruje model

Dokumenty prawie identyczne to cichy zabójca zestawów danych z sieci — ten sam artykuł syndykowany na dziesięciu stronach, boilerplate stopki, ponownie opublikowane treści. Trenuj na nich, a nadmiernie ważysz to, co się powtarza. Hashuj znormalizowaną treść każdego dokumentu i usuwaj kolizje; dla prawie identycznych, podejście shingle lub MinHash wychwytuje te, które pomija dokładny hash:

import hashlib

def content_hash(text):
    norm = " ".join(text.lower().split())  # normalise whitespace/case
    return hashlib.sha256(norm.encode()).hexdigest()

seen, unique = set(), []
for doc in corpus:
    h = content_hash(doc)
    if h not in seen:
        seen.add(h)
        unique.append(doc)
print(f"kept {len(unique)} of {len(corpus)} after dedup")

Hash treści, który tutaj obliczasz, pełni podwójną funkcję — to także sposób, w jaki wykrywasz zmiany przy następnym crawl'u, więc zachowaj go.

Próbkuj celowo, licencjonuj uczciwie

Więcej danych nie oznacza automatycznie lepszych danych. Reprezentatywna próbka bije jednostronny stos — jeśli 90% twojego crawl'u to jedna strona lub jeden język, model uczy się tego przekrzywienia. Próbkuj stratyfikowane wśród swoich źródeł i klas, aby zestaw odzwierciedlał rozkład, który faktycznie chcesz modelować. Jeśli chodzi o licencjonowanie: dane z sieci nie są automatycznie darmowe do trenowania. Filtruj według warunków źródła, honoruj dyrektywy robots tam, gdzie mają zastosowanie, i zachowuj pochodzenie (URL źródła i datę pobrania) obok każdego wiersza, aby móc udowodnić, skąd pochodzi każdy przykład. Nasza uwaga na temat legalności scrapingu w 2026 obejmuje linie dotyczące danych osobowych i licencjonowania (informacyjne, nie porady prawne).

Prawda gruntowa: część, której sieć ci nie da

Do uczenia nadzorowanego potrzebujesz etykiet, a otwarta sieć rzadko je przekazuje. Niektóre zestawy danych są z natury etykietowane (ocena obok recenzji, następne słowo w zdaniu), dlatego są tanie do zbierania na dużą skalę. Wszystko inne wymaga kroku prawdy gruntowej: etykietowania przez ekspertów dziedzinowych lub crowdsourcingu przez rynek. Jeśli korzystasz z crowdsourcingu, chroń jakość, wprowadzając zadania z znanymi odpowiedziami i odrzucając pracowników, którzy ich nie zaliczą — to dobrze zbadany tryb awarii. Tam, gdzie to możliwe, preferuj naturalnie etykietowane dane z sieci; to różnica między zestawem danych, który możesz zbudować w tydzień, a takim, który potrzebuje budżetu na etykietowanie.

Odświeżaj, ponieważ dane się starzeją

Zbieranie nigdy nie jest jednorazowe. Ceny się zmieniają, strony są przepisywane, pojawiają się nowe treści — model trenowany na zamrożonym zrzucie oddala się od świata, który ma przewidywać. Zbuduj odświeżanie od pierwszego dnia: ponownie crawl według harmonogramu, porównuj hash treści każdej strony z ostatnim uruchomieniem i przetwarzaj ponownie tylko to, co faktycznie się zmieniło. To utrzymuje koszt odświeżania proporcjonalny do rzeczywistej zmiany, a nie do ponownego pobierania wszystkiego:

def refresh(url, last_hash):
    text = fetch_clean(url)
    h = content_hash(text)
    if h == last_hash:
        return None          # unchanged, skip re-processing
    return {"url": url, "text": text, "hash": h, "fetched": now()}

Dla szybko zmieniających się domen lub gdy wolisz konsumować zarządzany kanał niż samodzielnie prowadzić crawl, dane z sieci zbudowane dla LLM dają ci czyste, odświeżone treści bez konieczności utrzymywania pipeline'u.

Statystyki dotyczące zbierania danych: 80-90 procent danych jest niestrukturalnych, tylko 0,5 procent jest używane, i podział 70/30 na trening i testy
Korpus jest niemal nieskończony; wartość, jaką dodaje dobry pipeline, polega na czyszczeniu, deduplikacji i odświeżaniu go.

Crawl sieci do czystego markdown na dużą skalę

Często zadawane pytania

Skąd bierzesz dane treningowe do uczenia maszynowego?

Trzy główne źródła: istniejące publiczne zestawy danych (Kaggle, Google Dataset Search, korpusy akademickie), wewnętrzne dane pierwszej strony i otwarta sieć poprzez crawl. Sieć jest największym i najświeższym źródłem, ale wymaga najwięcej pracy — czyszczenia, deduplikacji, próbkowania i licencjonowania. Dla wielu nowoczesnych modeli crawl odpowiednich stron do czystego markdown jest najszybszą drogą do zestawu danych specyficznego dla domeny, który jeszcze nie istnieje.

Ile danych treningowych potrzebuję?

To zależy od zadania i modelu, a uczciwa odpowiedź brzmi: zacznij od małej ilości i skaluj, aż wydajność się ustabilizuje. Trenuj na reprezentatywnej próbce, mierz dokładność na wydzielonym zestawie testowym (podział 70/30 to powszechny punkt wyjścia), następnie dodaj więcej danych i obserwuj, czy metryka nadal się poprawia. Jakość i reprezentatywność zazwyczaj mają większe znaczenie niż surowa ilość.

Czy legalne jest scrapowanie danych z sieci do treningu ML?

Zbieranie danych publicznych jest ogólnie defensywne, ale użycie do treningu podnosi kwestie licencjonowania i, gdzie w grę wchodzą dane osobowe, prywatności. Filtruj według warunków źródła, unikaj danych osobowych, których nie potrzebujesz, zachowuj pochodzenie dla każdego przykładu i respektuj dyrektywy robots tam, gdzie mają zastosowanie. To ogólne informacje, nie porady prawne — uzyskaj poradę prawną dla komercyjnego zestawu danych na dużą skalę.

Jak utrzymać świeżość zestawu danych treningowych?

Zaplanuj ponowne crawl i użyj hash treści do wykrywania zmian, przetwarzając ponownie tylko strony, które faktycznie się zmieniły. Wersjonuj swój zestaw danych, aby móc odtworzyć, który zrzut trenował który model, i zachowuj daty pobrania na każdym wierszu. Inkrementalne, wykrywane zmiany odświeżanie utrzymuje koszt proporcjonalny do rzeczywistej zmiany zamiast ponownego pobierania całego korpusu przy każdym cyklu.

Model zdobywa nagłówki, ale to zestaw danych decyduje o wyniku. Pozyskaj właściwy sygnał, crawl do czystego markdown, deduplikuj mocno, próbkuj uczciwie, zachowuj pochodzenie i zbuduj odświeżanie od początku. Zrób dobrze pipeline zbierania, a wszystko, co następuje, staje się łatwiejsze. Jeśli zmierzasz w kierunku fine-tuningu, nasz przewodnik na temat budowania zestawu danych do fine-tuningu z sieci podejmuje temat tam, gdzie ten się kończy.

Uzyskaj odświeżone dane z sieci dla swoich modeli