Это приложение собирало объявления о квартирах с двух крупных сайтов, смотрело на фото каждой квартиры локальной ИИ-моделью и выводило вперёд квартиры в лучшем состоянии. Оно собрало больше 100 000 объявлений. Эта страница о том, как оно работало и в каком оно состоянии; чтобы посмотреть собранные объявления, перейдите на страницу приложения. Краулер у нас не работал круглосуточно: мы время от времени запускали его на локальной машине. Сейчас мы не запускаем его совсем, потому что не нашли законного способа сделать из проекта продукт, а держать его бесплатно у нас нет времени. Приложение работает и хранит собранные к этому моменту объявления, но новые не появляются. Код открыт, а статья о том, как всё устроено, — по ссылке ниже.
| Язык | C#, .NET |
| Тип проекта | Приложение (краулер, ИИ-оценка, API, Telegram-боты) |
| Статус | Работает с собранными данными; краулер не запускается, новых объявлений нет |
| Лицензия | AGPL-3.0 |
| GitHub | Laraue.Apps.RealEstate |
Идея: сортировать объявления по состоянию, а не по дате
Сайты объявлений сортируют по свежести или цене, и это удобно продавцам. Квартира, выложенная вчера, может быть с отходящими обоями и тёмными фотографиями, а квартира трёхнедельной давности по той же цене — со свежим ремонтом. Опытный риелтор по набору фото за секунды понимает, что перед ним. Мы хотели программу, которая делает то же самое, чтобы покупатель или арендатор сначала смотрел те квартиры, на которые стоит ехать.
Как это работало
Система состоит из нескольких небольших сервисов вокруг одной базы PostgreSQL:
- CrawlingHost читает страницы выдачи сайтов объявлений через библиотеку Laraue.Crawling. Сессия берёт только объявления, появившиеся после прошлой; в настройках репозитория сессия запускается раз в четыре часа, хотя мы запускали её вручную.
- GpuWorkerHost берёт объявления по одному и отправляет все фото объявления, склеенные в один коллаж, локальной vision-модели, которую обслуживает Ollama (по умолчанию
qwen2.5vl:7b). Модель оценивает квартиру целиком по шкале от 0 до 10 и перечисляет её особенности. Она занимает около 8 ГБ памяти, лучше на видеокарте. Объявление без загружаемых фото получает 0. - WorkerHost запускает фоновые задачи. Он берёт оценённые объявления, считает для них предсказанную цену и идеальность и помечает готовыми для API. Он же отправляет сообщения в Telegram, архивирует объявления без фото и чистит недоступные ссылки.
- ApiHost отдаёт объявления с фильтрами: цена, цена за квадратный метр, площадь, комнаты, этаж, рейтинг ремонта, станция метро, источник, текстовый поиск и даты.
- TelegramHost отправляет результаты людям.
Второе число, идеальность, сравнивает реальную цену квадратного метра с ценой плюс штрафы. Штрафы складываются из оценки ремонта (1 - оценка / 10), первого или последнего этажа (0,2) и ближайшей остановки метро (время пешком сверх 5 минут и приоритет станции). Всё работает локально — без облачных ИИ-сервисов и без передачи данных третьим лицам.
Подробности на уровне кода (краулер, коллаж, промпт и формула ранжирования) — в технической статье.
Telegram: личные подборки и публичный канал
Пользователь может задать фильтр (цена, комнаты, минимальный рейтинг), и бот присылает подходящие объявления, листая их inline-кнопками. Режим публичного канала после каждой сессии краулера публикует лучшие новые объявления: рейтинг ремонта от 7, цена от 5 до 9 миллионов рублей, первые три. Без сессий краулера новых объявлений для отправки нет.
Что получилось хуже
- Оценка иногда ошибается. Фото под странным углом, очень тёмные снимки и интерьеры, сильно заставленные мебелью для съёмки, дают неверную оценку. Модель видит сразу все фото квартиры, поэтому одно неудачное фото влияет слабее, но ошибки это не убирает.
- Оценка по фото — не осмотр. Она хорошо отсеивает явно плохие квартиры. О шуме, соседях и доме она ничего не скажет.
- Мы делали его сначала под один город. Схемы краулера написаны под конкретные сайты, а код устроен по городам. В README упомянуты Москва и Волгоград как города, которые можно включить, но запускали мы Санкт-Петербург.
- Не получилось сделать из этого продукт. Это настоящая причина, по которой мы перестали запускать краулер, и технически её не исправить.
Что осталось
- Приложение и данные. Оно остаётся доступным и хранит историю больше чем 100 000 объявлений с рейтингами. Ничего нового не добавляется.
- Код под AGPL-3.0: github.com/Laraue/Laraue.Apps.RealEstate. Чтобы запустить его самому, нужны PostgreSQL 15 или новее и экземпляр Ollama с моделью, понимающей изображения.
- История создания: краулер, интеграция с Ollama и ранжирование — в технической статье. Библиотека краулера описана на странице Laraue.Crawling.
Осмысленными остаются вклады в виде схем краулера для других источников объявлений и более точных промптов для оценки ремонта.