PullMD Teil 5: Die falsche Engine gemessen – Einfach erklärt
Das Tool nimmt einen Internet-Link und gibt mir den Text dahinter in einem einfachen Format zurück. Ohne Werbung, ohne Menüs, ohne Cookie-Banner. Das Format heißt Markdown: reiner Text mit ein paar Sternchen für Überschriften und Listen. Warum will ich das? Weil ich diesen sauberen Text in einen Chat mit einer KI packen und über den Inhalt reden kann.
Der Service lief und ich benutzte ihn eigentlich täglich. Was dann kam, waren keine großen Schritte mehr: ein Vormittag Kleinkram an der Ausgabe, eine Runde echter Verbesserungen, und am Ende die Erkenntnis, dass mein Vergleich wochenlang die falsche Sache gemessen hatte.
Kleinkram, der trotzdem zählt
Am 20. März schraubte ich einen Vormittag an der Ausgabe. Nichts davon ist spektakulär, es ist halt die Sorte Arbeit, die ein Werkzeug erst benutzbar macht. Im Kopf des Textes stand bei normalen Seiten bis dahin nur die Domain, also “beispiel.de” statt der vollen Adresse. Bei Reddit war die volle Adresse längst drin, bei allem anderen nicht. Also überall die volle Adresse, und zwar als reiner Text, nicht als Link.
Dazu ein kompaktes Zeitformat und ein Zahlenfeld für die Kommentar-Tiefe statt vier fester Stufen. Kommentare stehen seitdem standardmäßig an, denn wer sie nicht will, schaltet sie ja einfach aus.
Vier Kleinigkeiten an einem Vormittag. Zusammen machen sie den Unterschied zwischen “läuft” und “benutze ich gern”.
Die Reifephase
Am 11. April stieß ich auf das GitHub-Repo eines deutlich größeren Werkzeugs in derselben Ecke. Mich interessierte nicht das Produkt selbst, sondern ob die bei der Textumwandlung Dinge besser machen als ich. Also ließ ich mir ein Briefing schreiben, mit dem Claude Code direkt weiterarbeiten konnte. Daraus wurden drei Verbesserungen.
Besserer Umbau. Das Werkzeug, das Webseiten in Markdown umwandelt, konnte vorher mit Tabellen nichts anfangen und lieferte Code-Blöcke ohne Sprach-Etikett. Das ist ungefähr so, als bekäme man ein Zitat, ohne zu wissen, in welcher Sprache es war. Das neue Werkzeug beherrscht beides: Tabellen bleiben Tabellen, und Code-Blöcke wissen, welche Programmiersprache drinsteht.
Zusatz-Informationen. Bis dahin lieferte der Service nur den nackten Text: kein Titel, kein Autor, kein Datum. Wenn eine KI mit dem Text weiterarbeiten soll, fehlt ihr der Kontext. Also bauten wir einen kleinen Helfer ein, der diese Informationen aus jeder Webseite herausholt und als kurzen Block am Anfang mitliefert. Für Programme, die den Text automatisch weiterverarbeiten, gibt es außerdem eine Variante, die alles schön strukturiert als Datensatz ausliefert.
Notfall-Plan. Readability ist der Filter, mit dem der Firefox-Lesemodus arbeitet: er blendet alles außer dem Artikeltext aus. Aber er funktioniert eben nicht überall. Bei Bezahlschranken oder bei Seiten, die nur mit JavaScript laufen, kommt manchmal fast nichts heraus. Statt aufzugeben, nimmt der Service jetzt den gesamten Seiteninhalt, putzt ihn grob durch und liefert das. Eine kleine Markierung im Ergebnis zeigt an, dass der Notfall-Weg genommen wurde.
Bis hierher war alles in kleinen Schritten.
Der Bug
Ich fragte mich: ist Readability wirklich der beste Weg? Ich wollte es messen, bevor ich weiter darauf aufbaue. Also setzten wir einen Vergleich auf: 15 echte Webseiten, drei verschiedene Filter parallel. Einer davon war Trafilatura, ein spezialisiertes Werkzeug, das besonders gut darin ist, auch aus schwierigen Seiten noch ordentlich Text herauszuholen.
Beim Auswerten fiel etwas auf. Die Readability-Ergebnisse sahen anders aus als erwartet. Kürzer. Rauer. Nicht das, was ich vom Firefox-Lesemodus kannte.
Claude verfolgte den Code-Pfad zurück. Das Ergebnis war unangenehm. Für Reddit gibt es einen Schalter: “Kommentare mitnehmen, ja oder nein?” Bei Reddit steht er auf “ja”, weil man die Kommentare unter einem Post dort ja braucht. Aber dieser Schalter war die Voreinstellung für alle Anfragen, auch für normale Webseiten. Und wenn er auf “ja” steht, überspringt das Tool Readability komplett und nimmt den groben Putz-Weg.
Viele Tage lang lief der Service für normale Webseiten also gar nicht durch Readability. Was ich für “Readability-Ergebnisse” gehalten hatte, war nur grob geputzter Roh-Inhalt. Mein Vergleich hatte die falsche Sache gemessen.
Der Fix war eine einzige Zeile: bei normalen Webseiten den Schalter auf “nein” stellen.
Trafilatura als zweiter Filter
Erst nach dem Fix ergab der Vergleich zwischen den Filtern überhaupt Sinn. Und die Ergebnisse waren deutlich: Trafilatura war genau dort stark, wo Readability tatsächlich versagte. Auf einer Blogseite holte Readability gerade mal 107 Zeichen heraus. Trafilatura holte aus derselben Seite 14.755 Zeichen. Faktor 138.
Umgekehrt gewann Readability dort, wo Struktur wichtig ist: Wikipedia-Artikel, Dokumentationsseiten, alles mit Tabellen. Trafilatura holt mehr heraus, verliert dabei aber manchmal die Struktur. Also keine Entweder-Oder-Entscheidung: beide Filter laufen jetzt parallel, und eine einfache Bewertung entscheidet pro Anfrage, welches Ergebnis besser ist. Trafilatura läuft dabei als eigenständiger kleiner Dienst neben dem Hauptprogramm.
Die Bewertung
Fünf Faustregeln, absichtlich simpel:
- Ist der Text lang genug? Punkt.
- Ist das Verhältnis zum Original gesund? Punkt.
- Hat die Seite einen Artikel-Bereich? Punkt.
- Gibt es mindestens eine Überschrift? Punkt.
- Gibt es richtige Absätze? Punkt.
Wer die meisten Punkte sammelt, gewinnt. Reddit-Posts und Cloudflare-Texte bekommen Bonus, weil sie von Natur aus sauber sind. Die Bewertung steht bei jeder Antwort dabei, damit man als Nutzer sehen kann, wie zuverlässig das Ergebnis für eine bestimmte Seite war.
Retrospektive
Was sagt es aus, wenn ein Fehler viele Tage in einem selbst betriebenen Service lebt, ohne dass jemand es bemerkt? Zumindest, dass der Output “gut genug” war. Grob geputzter Roh-Inhalt enthält den meisten relevanten Text, auch ohne Filter.
Wenn der Unterschied zwischen richtig und falsch schwer zu sehen ist, sieht man ihn nicht. Nicht weil man unaufmerksam ist, sondern weil es kein sichtbares Signal gibt.
Die Konsequenz: eine kleine Datenbank, die für jede Anfrage mitschreibt, welcher Weg genommen wurde und wie die Bewertung ausfiel. Dazu ein Abfrage-Punkt: “Zeig mir die letzten sieben Tage.” Wenn das nächste Mal ein Schalter still den falschen Weg wählt, verschiebt sich die Verteilung. Keine Garantie, aber ein Signal.
Für jedes selbst gebaute Werkzeug gilt: entweder du baust dir einen Blick in die Maschine ein, oder du fliegst blind. Der Blick muss nicht aufwendig sein. Eine kleine Datenbank-Tabelle und ein Abfrage-Punkt reichen als erster Schritt.
Was als nächstes kam
Die Textgewinnung war jetzt so gut, wie ich sie hinbekam, und der Service wusste selbst, wie zuverlässig sein Ergebnis gerade ist. Noch am selben Tag bekam er eine Hilfeseite, samt Anleitung für KI-Agenten, und dabei fiel mir auf, dass eine meiner Behauptungen gar nicht stimmte.
→ PullMD Teil 6: Setup für Agenten
Teil 5 von 15 der PullMD Serie.
← PullMD Teil 4: Der Skill, und was er wirklich bringt | PullMD Teil 6: Setup für Agenten →