← Blog

Ein Haus mieten mit einem lokalen LLM als Filter

DEENESRUUK

Nach einem Haus zu suchen ist ein Teilzeitjob: Die Inseratsseiten aktualisieren, durch dieselben Sackgassenanzeigen blättern, das Gute verpassen, weil es um 2 Uhr morgens erschienen ist. Also habe ich einen Watcher gebaut, der das Durchblättern für mich übernimmt. Er befindet sich unter home.khanoff.com.

Zwei Quellen, ein Pipeline

Er zieht frische Inserate aus der Nähe von Kiew aus zwei Quellen und normalisiert sie in einen einzigen Stream:

  • OLX.ua — Die Suchergebnisseite wird mit BeautifulSoup geparst und die vollständige Beschreibung für jedes neue Inserat wird abgerufen. Die harten Filter (Preis, Mindestfläche, Radius) sind in die Such-URL eingebettet, sodass die Seite diese Filter für mich durchführt.
  • otodim.com.ua — Anstatt mit zerbrechlichen CSS-Selektoren zu kämpfen, liest der Connector die Inserate direkt aus dem Next.js __NEXT_DATA__ JSON-Blob, das die Seite mitliefert. Das liefert saubere, strukturierte Daten – einschließlich des genauen Ortes und Bezirks aus dem eigenen Reverse-Geocoding der Seite – ohne Rate-Scraping-Rate.

Beide speisen dieselbe dedup + Scoring + Report Pipeline; jedes Inserat behält seine Quelle bei.

Das LLM übernimmt das fuzzy Filtern

Harte Filter sind einfach – eine Such-URL kümmert sich um Preis und Fläche. Der schwierige Teil sind die weichen Kriterien, die man nicht in einen Query String packen kann: Ist es wirklich ruhig? Ganzjährig beheizt? Ein freistehendes Haus mit Grundstück? Gibt es irgendwelche Warnsignale in der Beschreibung? Diese werden von einem lokalen Ollama-Modell bewertet, das den Inseratstext liest und ein strukturiertes Urteil pro Kriterium zurückgibt. Ein strenger Geo-Filter (abgestimmt auf ukrainische Dorfnamen) filtert die „technisch nahe, aber in falscher Richtung“ liegenden Inserate heraus.

Wenn etwas den Maßstab erfüllt, erhalte ich eine Telegram-Nachricht mit dem Score und einem Link – meistens lange bevor ich selbst die Seite aktualisiert hätte.

Der Report ist eine PWA

Über die Benachrichtigungen hinaus gibt es einen installierbaren, mobilfreundlichen HTML-Report mit jedem bewerteten Inserat, Quellen-Chips und einem Preisbereich, den ich direkt auf der Seite bearbeiten kann (gespeichert in einer kleinen JSON-Datei, kein Neukompilieren nötig). Es ist eine Progressive Web App, daher befindet sie sich auf meinem Homescreen wie eine native App.

Das wiederkehrende Thema: das Modell vom kritischen Pfad fernhalten

Wie der Rest meiner Infrastruktur ist das LLM hier eine Verbesserung, keine Abhängigkeit. Die Ingestion, Dedup und der Report funktionieren immer; wenn das Modell nicht verfügbar ist, wird ein Inserat einfach noch nicht bewertet, nicht verloren. Der Scraper läuft weiter, und die Bewertung holt auf, wenn das Modell wieder online ist.

Es ist ein kleines Werkzeug, aber es hat aus einem ängstlichen täglichen Ritual einen Telegram-Ping gemacht, wenn etwas wirklich Interessantes auftaucht.

Transparenz: Die meisten Beiträge werden mit KI-Unterstützung verfasst, und die nicht-englischen Versionen werden von einem lokalen LLM maschinell übersetzt und anschließend geprüft. Fehler entdeckt? Bitte gib mir Bescheid.