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.
| Feld | Warum es wichtig ist |
|---|---|
| Quell-URL | Die Grundlage der Domain-Liste und jeder Löschanfrage |
| Abrufzeit (UTC) | Belegt den Erfassungszeitraum und den Opt-out-Status an diesem Datum |
| Antwortstatus | Trennt echten Inhalt von Sperrseiten und Fehlern |
| Hash des rohen Inhalts | Verbindet jede spätere Kopie mit genau dem, was empfangen wurde |
| Standpunkt | Dieselbe URL kann je nach Land und Netzwerk unterschiedlichen Inhalt liefern |
| Robots.txt-Entscheidung | Zeigt, dass der Crawler die zum Abrufzeitpunkt geltenden Regeln eingehalten hat |
| Beobachteter TDM-Vorbehalt | Das Opt-out, um das sich die EU-Urheberrechtsregeln und die Vorlage kümmern |
| Angegebene Lizenz oder Bedingungen | Was die Seite über Weiterverwendung aussagte, falls überhaupt |
| Crawler-Name und -Version | Die Vorlage fragt nach Crawler-Namen; Versionen erklären Verhaltensänderungen |
| Übergeordnete Datensätze | Verbindet 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
- Verordnung (EU) 2024/1689 (AI Act), Artikel 53, 111 und 113: eur-lex.europa.eu
- Europäische Kommission, Erläuterungen und Vorlage für die öffentliche Zusammenfassung der Trainingsinhalte (Juli 2025): digital-strategy.ec.europa.eu
- Richtlinie (EU) 2019/790, Artikel 4(3): eur-lex.europa.eu
- Longpre et al., The Data Provenance Initiative (2023): arxiv.org/abs/2310.16787
- Longpre et al., Consent in Crisis: The Rapid Decline of the AI Data Commons (2024): arxiv.org/abs/2407.14933
- Gebru et al., Datasheets for Datasets: doi.org/10.1145/3458723
- Data & Trusted AI Alliance, Data Provenance Standards v1.0.0: dtaalliance.org
- C2PA Specification: spec.c2pa.org