← Blog

Оренда будинку з локальним LLM як фільтром

DEENESRUUK

Шукати квартиру в оренду — це робота неповного дня: оновлювати сайти з оголошеннями, продиратися крізь ті ж глухі оголошення, пропускати хороше через те, що воно з'явилося о 2-й ночі. Тож я створив відстежувач, який робить це сканування за мене. Він знаходиться за адресою home.khanoff.com.

Два джерела, один конвеєр

Він витягує свіжі оголошення біля Києва з двох джерел та нормалізує їх в єдиний потік:

  • OLX.ua — сторінка результатів пошуку парситься за допомогою BeautifulSoup, а повний опис отримується для кожного нового оголошення. Важкі фільтри (ціна, мінімальна площа, радіус) вбудовані в URL-адресу пошуку, тому сайт робить це фільтрування за мене.
  • otodim.com.ua — замість боротьби з крихкими CSS-селекторами, коннектор зчитує оголошення прямо з JSON-блоба __NEXT_DATA__ Next.js, який відправляє сторінка. Це дає чисті, структуровані дані — включаючи точне поселення та район із власного зворотного геокодування сайту — без жодних здогадок зі скрапінгу.

Обидва подають дані в один конвеєр дедуплікації + оцінювання + звіт; кожне оголошення запам'ятовує своє джерело.

LLM робить нечіткий фільтр

Важкі фільтри прості — URL-адреса пошуку обробляє ціну та площу. Складна частина — це м'які критерії, які не можна вказати у рядку запиту: чи тихо там насправді? опалення цілий рік? будинок з власною ділянкою? є якісь червоні прапорці в описі? Вони оцінюються локальною моделлю Ollama, яка читає текст оголошення та повертає структурований вердикт за кожним критерієм. Суворий геофільтр (налаштований на українські назви сіл) відсіює оголошення "технічно поруч, але в неправильному напрямку".

Коли щось проходить цей бар'єр, я отримую повідомлення у Telegram з оцінкою та посиланням — зазвичай значно раніше, ніж я сам оновив би сторінку.

Звіт — це PWA

Окрім сповіщень, є встановлений, зручний для мобільних пристроїв HTML-звіт з кожним оціненим оголошенням, фішками джерел та діапазоном цін, який я можу редагувати прямо на сторінці (зберігається у невеликому JSON-файлі, без перезбірки). Це Progressive Web App, тому він розміщується на головному екрані мого телефону як нативний додаток.

Повторювана тема: тримати модель поза критичним шляхом

Як і вся моя інфраструктура, LLM тут є доповненням, а не залежністю. Введення даних, дедуплікація та звіт завжди працюють; якщо модель недоступна, оголошення просто ще не оцінене, а не втрачене. Скрейпер продовжує працювати, а оцінювання надолужується, коли модель повернеться.

Це маленький інструмент, але він перетворив тривожний щоденний ритуал на "дзвінок" у Telegram, коли з'являється щось справді вартісне для розгляду.

Прозорість: більшість дописів тут створено за допомогою ШІ, а неанглійські версії перекладені локальною LLM і вичитані. Помітили помилку? Напишіть мені.