Mit Stand 7. Oktober 2026 verfügt Shifter über den größten Pool an aktiven US-IPs, mehr als Oxylabs und Bright Data, und das zu einem Bruchteil der Kosten.Shifter hat jetzt den größten Pool aktiver US-IPs

Benchmarks ansehen

Herkunft in der KI-Trainingspipeline: Nachweisen, woher Ihr Datensatz stammt

Was Herkunftsnachweise für KI-Trainingsdaten in der Praxis bedeuten: welche Aufzeichnungen für jedes Dokument zu führen sind, was die Zusammenfassung des EU AI Act verlangt, und wie Sie dies konsequent umsetzen.

Data Science · Aktualisiert am 24. Oktober 2026 · 9 Min. Lesezeit
AbrufExtraktionDedupTrainingsha256 · url · fetched_atausgeschlossen: 2
Jede Trainingskopie verweist zurück auf ihren Abruf. Amber Datensätze blieben außen vor und werden protokolliert.
Wissen
Auf dieser Seite
  1. Warum Provenienz zur Pflicht wurde
  2. Was für jedes Dokument festzuhalten ist
  3. Ein Provenienzdatensatz im Code
  4. Provenienz durch die Pipeline tragen
  5. Standards, die sich zum Ausleihen eignen
  6. Wo Provenienz üblicherweise scheitert
  7. Fazit
  8. Quellen und Verweise

Fragt man ein KI-Team, woher ein bestimmtes Trainingsdokument stammt, lautet die Antwort oft ein Datensatzname, keine Quelle. Regulierungsbehörden, Kunden und Gerichte wollen heute die zweite Antwort: welche Seite, abgerufen wann, unter welchen Bedingungen, und was damit vor dem Training geschah. Für Teams, die Modelle aus Webdaten erstellen, ist Provenienz von guter Praxis zu etwas geworden, das man nachweisen können muss.

Der schwierige Teil ist das Timing. Das meiste, was ein Provenienzdatensatz benötigt, existiert nur im Moment der Erfassung. Dieser Leitfaden erklärt, warum die Frage dringlich wurde, welcher Datensatz für jedes Dokument lohnt, und wie man ihn durch Extraktion, Filterung und Deduplizierung trägt, ohne den Faden zu verlieren.

Warum Provenienz zur Pflicht wurde

Drei Entwicklungen haben Provenienz von einem Forschungsthema zu einer Compliance-Aufgabe gemacht.

Der EU AI Act verlangt eine öffentliche Zusammenfassung. Artikel 53(1)(d) verpflichtet Anbieter von KI-Modellen mit allgemeinem Verwendungszweck, “eine hinreichend detaillierte Zusammenfassung über die für das Training verwendeten Inhalte” zu veröffentlichen, unter Verwendung einer Vorlage des AI Office. Die Pflichten gelten ab dem 2. August 2025, und Modelle, die schon vor diesem Datum auf dem Markt sind, haben bis zum 2. August 2027 Zeit. Die Kommission stellte die Vorlage im Juli 2025 vor und erklärt deren Verwendung für verpflichtend.

Die Vorlage fragt nach Konkretem. Für gescrapte Daten fragt sie nach den Namen der verwendeten Crawler, dem Erfassungszeitraum und einer Liste der relevantesten Domainnamen: die Top 10% aller Domains nach Umfang des gescrapten Inhalts, oder für kleine und mittlere Unternehmen die Top 5% oder 1.000 Domains, je nachdem, was niedriger ist. Sie fragt zudem danach, wie Text- und Data-Mining-Opt-outs “vor und während der Datenerfassung” respektiert wurden. Artikel 53(1)(c) verlangt separat eine Urheberrechtspolitik, die diese Vorbehalte identifiziert und einhält.

Die Commons schrumpft, und die Aufzeichnungen waren schlecht. Die Data Provenance Initiative prüfte 2023 mehr als 1.800 Textdatensätze und fand Lizenzauslassungsraten über 70% und Fehlerraten über 50% auf weit verbreiteten Hosting-Seiten. Eine Folgeprüfung von 14.000 Web-Domains ergab, dass innerhalb eines einzigen Jahres etwa 5% aller Tokens in C4 und 28% seiner aktivsten gepflegten Quellen durch robots.txt vollständig eingeschränkt wurden. Ein Datensatz, der beim Crawlen akzeptabel war, mag heute nicht mehr akzeptabel zum Crawlen sein, und man kann den Unterschied nur zeigen, wenn man den Zustand zum damaligen Zeitpunkt festgehalten hat.

Was für jedes Dokument festzuhalten ist

Ein Provenienzdatensatz wird einmal geschrieben, vom Crawler, zum Zeitpunkt des Abrufs. Alles Nachgelagerte ergänzt ihn, anstatt ihn zu ersetzen.

FeldWarum es wichtig ist
Quell-URLDie Grundlage der Domain-Liste und jeder Löschanfrage
Abrufzeit (UTC)Belegt den Erfassungszeitraum und den Opt-out-Status an diesem Datum
AntwortstatusTrennt echten Inhalt von Sperrseiten und Fehlern
Hash des rohen InhaltsVerbindet jede spätere Kopie mit genau dem, was empfangen wurde
StandpunktDieselbe URL kann je nach Land und Netzwerk unterschiedlichen Inhalt liefern
Robots.txt-EntscheidungZeigt, dass der Crawler die zum Abrufzeitpunkt geltenden Regeln eingehalten hat
Beobachteter TDM-VorbehaltDas Opt-out, um das sich die EU-Urheberrechtsregeln und die Vorlage kümmern
Angegebene Lizenz oder BedingungenWas die Seite über Weiterverwendung aussagte, falls überhaupt
Crawler-Name und -VersionDie Vorlage fragt nach Crawler-Namen; Versionen erklären Verhaltensänderungen
Übergeordnete DatensätzeVerbindet eine bereinigte oder deduplizierte Kopie mit ihrer Quelle

Zwei Felder werden oft übersehen. Das erste ist der Standpunkt: Eine Seite, die aus einem Land oder Netzwerk beobachtet wird, kann sich von derselben URL unterscheiden, die anderswo gesehen wird, was das Argument unseres Beitrags über das Festhalten, woher Webdaten beobachtet wurden, ist. Das zweite ist der rohe Inhalt selbst. Ein Hash beweist, welche Bytes man empfangen hat, aber das Aufbewahren der Antwort, zum Beispiel durch Archivieren von Seiten in WARC-Dateien, erlaubt es, dies zu zeigen.

Ein Provenienzdatensatz im Code

Das folgende Beispiel schreibt einen Datensatz pro abgerufenem Dokument, behält nur Dokumente, die zum Abrufzeitpunkt erlaubt und nicht vorbehalten waren, und verknüpft jede extrahierte Kopie über einen Hash mit ihrer Quelle. Es erzeugt zudem das Domain-Ranking, das die Zusammenfassungsvorlage verlangt. Es läuft auf Python 3.9 und neuer, nur mit der Standardbibliothek.

from __future__ import annotations

import hashlib
import json
from collections import Counter
from dataclasses import asdict, dataclass, field
from datetime import datetime, timezone
from urllib.parse import urlsplit


def sha256(data: bytes) -> str:
    return hashlib.sha256(data).hexdigest()


@dataclass
class Provenance:
    """One record per fetched document, written at collection time."""
    url: str
    fetched_at: str            # ISO 8601, UTC
    status: int
    content_sha256: str        # hash of the raw response body
    vantage: str               # where it was observed from, e.g. "residential:de"
    robots_allowed: bool       # robots.txt decision for our crawler, at fetch time
    tdm_reserved: bool         # machine-readable TDM opt-out seen, at fetch time
    license: str | None        # licence or terms as stated on the page, if any
    collector: str             # crawler name and version
    parents: list[str] = field(default_factory=list)  # hashes this record derives from
    step: str = "fetch"        # fetch, extract, filter, dedup ...


def fetched(url, body, status, vantage, robots_allowed, tdm_reserved, license=None,
            collector="corpus-crawler/1.4"):
    return Provenance(
        url=url,
        fetched_at=datetime.now(timezone.utc).isoformat(timespec="seconds"),
        status=status,
        content_sha256=sha256(body),
        vantage=vantage,
        robots_allowed=robots_allowed,
        tdm_reserved=tdm_reserved,
        license=license,
        collector=collector,
    )


def derived(parent: Provenance, new_body: bytes, step: str) -> Provenance:
    """A transformed copy keeps the source fields and points back at its parent."""
    rec = Provenance(**{**asdict(parent), "parents": [parent.content_sha256], "step": step})
    rec.content_sha256 = sha256(new_body)
    return rec


def eligible(rec: Provenance) -> bool:
    """Only documents that were allowed and not reserved at fetch time go further."""
    return rec.status == 200 and rec.robots_allowed and not rec.tdm_reserved


def domain_summary(records, top_share=0.1):
    """Domains by document count, and the top share of them, for a training-data summary."""
    counts = Counter(urlsplit(r.url).hostname for r in records)
    ranked = [d for d, _ in counts.most_common()]
    keep = max(1, round(len(ranked) * top_share))
    return counts, ranked[:keep]


if __name__ == "__main__":
    raw = [
        fetched("https://news.example/a", b"<html>a</html>", 200, "residential:de", True, False),
        fetched("https://news.example/b", b"<html>b</html>", 200, "residential:de", True, False),
        fetched("https://shop.example/p/1", b"<html>p1</html>", 200, "residential:fr", True, True),
        fetched("https://blog.example/x", b"<html>x</html>", 403, "residential:us", True, False),
        fetched("https://forum.example/t/9", b"<html>t9</html>", 200, "residential:us", False, False),
    ]
    kept = [r for r in raw if eligible(r)]
    texts = [derived(r, r.url.encode() + b" text", "extract") for r in kept]

    with open("manifest.jsonl", "w") as f:
        for rec in raw + texts:
            f.write(json.dumps(asdict(rec)) + "\n")

    counts, top = domain_summary(raw)
    print(f"fetched {len(raw)}, eligible {len(kept)}, extracted {len(texts)}")
    print("domains:", dict(counts))
    print("top domains:", top)
    child = texts[0]
    print("lineage ok:", child.parents == [kept[0].content_sha256], child.step, child.url)

Ausgabe:

fetched 5, eligible 2, extracted 2
domains: {'news.example': 2, 'shop.example': 1, 'blog.example': 1, 'forum.example': 1}
top domains: ['news.example']
lineage ok: True extract https://news.example/a

Die vorbehaltene Seite, die gesperrte Seite und die durch robots.txt untersagte Seite sind alle noch im Manifest. Das ist wichtig: Die Aufzeichnung dessen, was man sich entschieden hat nicht zu verwenden, ist Teil des Nachweises. Die Vorlage rangiert Domains nach dem Umfang des gescrapten Inhalts, also sollte man in der Produktion Bytes oder Tokens zählen, nicht Dokumente.

Provenienz durch die Pipeline tragen

Ein zum Abrufzeitpunkt geschriebener Datensatz ist nur nützlich, wenn jeder spätere Schritt die Verbindung behält.

  • Extraktion. Der Text, auf dem trainiert wird, ist nicht das HTML, das abgerufen wurde. Geben Sie dem extrahierten Text einen eigenen Hash und verweisen Sie auf den rohen Datensatz, wie es derived() oben tut.
  • Filterung. Protokollieren Sie, warum ein Dokument verworfen wurde, nicht nur, dass es verworfen wurde. “Unter Qualitätsschwelle” und “TDM-Vorbehalt” sind unterschiedliche Antworten für eine Regulierungsbehörde.
  • Deduplizierung. Wenn Near-Duplikate zusammengeführt werden, behalten Sie die Liste jeder Quelle, für die die überlebende Kopie steht. Andernfalls kann eine Löschanfrage für eine URL das Dokument nicht finden, in dem sie landete.
  • Mischung und Stichprobenziehung. Halten Sie fest, welche Manifestversion jeder Trainingslauf verwendet hat, damit die Zusammenfassung die Daten beschreibt, die ein Modell tatsächlich gesehen hat.
  • Entfernung. Führen Sie eine Drop-Liste, indiziert nach URL und Hash. Wenn eine Seite später ihre Rechte vorbehält oder ein Rechteinhaber eine Entfernung verlangt, finden dieselben Schlüssel das Dokument in jedem abgeleiteten Datensatz.

Der Opt-out-Status verdient besondere Sorgfalt. Eine robots.txt-Datei oder ein Text- und Data-Mining-Vorbehalt kann sich nach dem Crawlen in beide Richtungen ändern. Halten Sie die Entscheidung fest, die Sie zum Abrufzeitpunkt getroffen haben, und prüfen Sie vor jeder neuen Erfassung erneut, anstatt anzunehmen, dass die Antwort vom letzten Jahr noch gilt.

Standards, die sich zum Ausleihen eignen

Man muss nicht von Grund auf ein Schema erfinden.

  • Datasheets for Datasets (Gebru et al., Communications of the ACM, 2021) schlägt vor, dass jeder Datensatz seine Motivation, Zusammensetzung, den Erfassungsprozess und empfohlene Verwendungszwecke dokumentiert. Es ist die richtige Form für die Zusammenfassung auf Datensatzebene.
  • The Data Provenance Standards der Data & Trusted AI Alliance definieren 22 Metadatenfelder in drei Gruppen (Quelle, Provenienz und Verwendung), einschließlich des Datumsbereichs der Datengenerierung, der Methode, der Nutzungslizenz und wo die Einwilligung dokumentiert ist. Version 1.0.0 wurde im Juli 2024 veröffentlicht.
  • C2PA Content Credentials hängen ein signiertes Provenienzmanifest an ein einzelnes Medien-Asset an. Sie sind am nützlichsten für Bilder, Audio und Video, wo das Asset selbst seinen Datensatz tragen kann.

Wo Provenienz üblicherweise scheitert

  • Sie wird nachträglich hinzugefügt. Ein Crawl ohne Datensätze pro Dokument kann später nicht geprüft werden, egal wie gut die Dataset-Card ist.
  • Die Lizenz wird von der Dataset-Card kopiert. Die oben genannte Prüfung fand, dass sich hier Fehler konzentrieren. Halten Sie fest, was die Quelle tatsächlich sagte, und behandeln Sie aggregierte Labels als zu prüfende Behauptungen.
  • Sperrseiten werden als Inhalt gezählt. Eine 200-Antwort kann immer noch eine Challenge-Seite sein. Statuscodes und Inhaltsprüfungen gehören in den Datensatz.
  • Der Standpunkt ist unbekannt. Das Erfassen jedes Markts über eine lokale residenzielle Verbindung hilft der Provenienz nur, wenn der Datensatz festhält, welches Land und Netzwerk jeder Abruf verwendete.

Fazit

Provenienz ist günstig zu schreiben zum Zeitpunkt der Erfassung und nahezu unmöglich im Nachhinein wiederherzustellen. Schreiben Sie einen Datensatz pro Dokument zum Abrufzeitpunkt, tragen Sie den Hash durch jede Transformation, behalten Sie, was Sie ausgeschlossen haben, ebenso wie, was Sie behalten haben, und die Zusammenfassung, die der AI Act verlangt, wird zu einer Abfrage statt zu einer Untersuchung.

Quellen und Verweise

Häufig gestellte Fragen

Was ist Datenherkunft (Data Provenance) für KI-Trainingsdaten?

Es ist die Aufzeichnung darüber, woher jedes einzelne Trainingsdatum stammt und was damit geschehen ist: die Quell-URL oder der Datensatz, wann und von wo es erfasst wurde, der Opt-out- und Lizenzstatus zu diesem Zeitpunkt sowie jeder Schritt, der es auf dem Weg in den Trainingsmix verändert hat.

Verlangt der EU AI Act eine Herkunftsangabe pro URL?

Nein. Anbieter von KI-Modellen mit allgemeinem Verwendungszweck müssen eine Zusammenfassung der Trainingsinhalte anhand der Vorlage der Kommission veröffentlichen, die nach den wichtigsten Datensätzen, den relevantesten gecrawlten Domains, den Namen der Crawler, dem Erfassungszeitraum und der Einhaltung von Opt-outs fragt. Das Auflisten einzelner URLs ist freiwillig, aber ohne Aufzeichnungen pro Dokument lässt sich die erforderliche Zusammenfassung nicht zuverlässig erstellen.

Lässt sich die Herkunft nachträglich rekonstruieren, nachdem ein Datensatz erstellt wurde?

Nur teilweise. Quell-URLs lassen sich manchmal wiederherstellen, aber der Opt-out-Status, die tatsächlich erhaltene Antwort und der Beobachtungsstandort zum Zeitpunkt des Abrufs sind verloren, sobald der Moment vorüber ist. Deshalb muss die Herkunft vom Crawler festgehalten werden und nicht nachträglich ergänzt.

Was ist der minimale Herkunftsnachweis pro Dokument?

Quell-URL, Abrufzeitpunkt in UTC, Antwortstatus, ein Hash des Rohinhalts, der Beobachtungsstandort, die robots.txt- sowie Text- und Data-Mining-Opt-out-Entscheidung zum Abrufzeitpunkt, jede angegebene Lizenz, Name und Version des Crawlers sowie Verweise auf die Aufzeichnungen, aus denen es abgeleitet wurde.

Bereit, loszulegen?

Testen Sie Shifters Residential-Proxys, 205M+ IPs, 195+ Länder, ab 0,75 $/GB.

Jetzt starten