← Blog

Аренда дома с локальной LLM в качестве фильтра

DEENESRUUK

Поиск дома в аренду — это работа неполный дня: обновляешь сайты с объявлениями, просматриваешь одни и те же тупиковые объявления, пропускаешь хорошее, потому что оно появилось в 2 часа ночи. Поэтому я создал наблюдателя, который делает эту "просеивающую" работу за меня. Он находится по адресу home.khanoff.com.

Два источника, один конвейер

Он получает свежие объявления возле Киева из двух источников и нормализует их в единый поток:

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

Оба подают данные в один конвейер дедупликации + оценки + отчета; каждое объявление запоминает свой источник.

LLM выполняет нечеткую фильтрацию

Жесткие фильтры просты — URL поиска справляется с ценой и площадью. Сложная часть — это мягкие критерии, которые нельзя включить в строку запроса: действительно ли тихо? отопление круглый год? отдельно стоящий дом с участком? есть ли какие-либо тревожные знаки в описании? Они оцениваются локальной моделью Ollama, которая читает текст объявления и возвращает структурированный вердикт по каждому критерию. Строгий геофильтр (настроенный на названия украинских деревень) отсеивает объявления, которые "технически рядом, но в неправильном направлении".

Когда что-то проходит проверку, я получаю сообщение в Telegram со счетом и ссылкой — обычно задолго до того, как я сам обновил бы страницу.

Отчет — это PWA

Помимо оповещений, есть устанавливаемый, удобный для мобильных устройств HTML-отчет с каждым оцененным объявлением, чипами источников и диапазоном цен, который я могу редактировать прямо на странице (хранится в небольшом JSON-файле, без пересборки). Это Progressive Web App, поэтому он находится на главном экране моего телефона как нативное приложение.

Повторяющаяся тема: не выносить модель из критического пути

Как и вся моя инфраструктура, LLM здесь — это улучшение, а не зависимость. Прием данных, дедупликация и отчет всегда работают; если модель недоступна, объявление просто еще не оценено, а не потеряно. Скрейпер продолжает работать, а оценка догоняет, когда модель возвращается.

Это небольшой инструмент, но он превратил тревожный ежедневный ритуал в пинг в Telegram, когда появляется что-то действительно стоящее внимания.

Прозрачность: большинство постов здесь написаны с помощью ИИ, а неанглийские версии переведены локальной LLM и вычитаны. Заметили ошибку? Напишите мне.