Генерация описаний объявлений для Авито и ЦИАН, подбор объектов под критерии клиента, автоответы на лиды, анализ рынка и ценообразование, интеграция с Битрикс24 и AmoCRM. Реальный Python-код с OpenAI API, скоринг выдачи, SVG-схема пайплайна и расчёт бюджета — всё, чтобы риелтор и агентство сэкономили часы рутины и закрывали больше сделок.
Работа риелтора на 70% состоит из повторяющихся действий: написать описание для очередной квартиры, ответить на десять одинаковых вопросов в мессенджерах, подобрать варианты под запрос клиента, прикинуть адекватную цену по району. Каждое из этих действий — кандидат на автоматизацию через AI-агента. Агент в недвижимости — это не «чат с ботом», а программа, которая сама вызывает нужные функции: тянет параметры объекта, генерирует текст по вашим шаблонам, классифицирует лиды, скорит выдачу и пишет данные в CRM. Этот гайд показывает, как собрать такой конвейер из готовых кусков — с реальным рабочим кодом, который можно запустить прямо сейчас. Всё на Python и OpenAI API: понадобится только ключ и базовое понимание того, что такое переменная.
Главный ресурс риелтора — время, а не деньги. Каждый час, потраченный на переписывание шаблонного текста объявления или на ответ «цена актуальна?» в пятый раз за день, — это час, который мог уйти на показ, переговоры и закрытие сделки. AI-агенты снимают именно этот слой рутины. Вот что они забирают на себя уже в 2026 году:
01. Генерация описаний объявлений — квартира заводится в базу с 10 параметрами, а на выходе готовый продающий текст для Авито и ЦИАН. Экономия 15–20 минут на объект.
02. Подбор объектов под клиента — агент фильтрует и скорит выдачу по бюджету, метражу, району и «хотелкам», отдавая топ-5 вместо простыни из 200 объявлений.
03. Автоответы на лиды — мгновенная реакция ночью и в выходные: классификация сообщения и шаблонный ответ за секунду, пока конкурент спит.
04. Анализ рынка и ценообразование — медиана цены за квадрат по району, чтобы выставлять объект не «на глазок», а по данным.
Ключевое отличие агента от обычного скрипта — он не тупой. Он понимает свободный текст клиента, сам решает, какую функцию вызвать, и собирает результат в человеческий ответ. Вы описываете правила и даёте инструменты — остальное модель делает сама. Начнём с самой частой задачи: описания объявлений.
Хорошее описание на Авито и ЦИАН решает две задачи: поднимает объявление в выдаче (площадки любят уникальный текст с ключевыми словами) и конвертит просмотр в звонок. Риелтор знает, что писать, но на каждый объект уходит 15–20 минут. Агент делает то же самое за 5 секунд по вашим правилам, заданным в системном промпте. Ниже — рабочий вызов OpenAI API: на вход словарь с параметрами квартиры, на выходе — готовый текст.
import os, json from openai import OpenAI client = OpenAI(api_key=os.environ["OPENAI_API_KEY"]) SYSTEM_PROMPT = """Ты — копирайтер агентства недвижимости. Правила: первый абзац — цепляющий, без канцелярита и CAPS LOCK. Дальше — факты по параметрам, в конце — призыв к показу. Упоминай район и метро в первом абзаце (важно для SEO выдачи).""" def generate_listing(flat: dict) -> str: resp = client.chat.completions.create( model="gpt-4o-mini", temperature=0.7, messages=[ {"role": "system", "content": SYSTEM_PROMPT}, {"role": "user", "content": json.dumps(flat, ensure_ascii=False)}, ], ) return resp.choices[0].message.content flat = { "rooms": 2, "area": 54, "floor": 7, "total_floors": 12, "district": "Академический", "metro": "Профсоюзная, 5 минут пешком", "price": 12_900_000, "features": "кухня-гостиная, лоджия, свежий ремонт", } print(generate_listing(flat)) # → "Уютная двушка в Академическом, 5 минут до Профсоюзной..."
Два совета, которые реально влияют на результат. Во-первых, держите системный промпт жёстким: модель должна получать правила стиля, а не «придумай что-нибудь красивое» — иначе вы получите воду. Во-вторых, не выдумывайте факты: передавайте модели только те параметры, что есть в базе. Температура 0.7 даёт разнообразие между объявлениями одного ЖК; для строго одинакового стиля снизьте до 0.3. Для пакетной генерации 50 квартир просто прогоните список в цикле — это один вызов на объект, примерно 0.5–1 секунда каждый.
Клиент приходит с размытым запросом: «двушка до 13 млн, желательно с лоджией, недалеко от метро». Вместо того чтобы руками перебирать выдачу, агент парсит базу объектов, фильтрует по жёстким критериям и скорит каждый вариант баллами. На выходе — топ-5 с объяснением, почему именно эти. Ключевой приём: жёсткие фильтры (бюджет, комнаты, метро) отсекают мусор, а мягкие «хотелки» добавляют баллы. Так клиент получает не 200 объявлений, а 5 осмысленных.
def score_object(flat: dict, criteria: dict) -> dict: score = 0 reasons = [] # жёсткий критерий: бюджет if flat["price"] <= criteria["budget"]: score += 3; reasons.append("в бюджете") else: score -= 2 if flat["rooms"] >= criteria["rooms_min"]: score += 2 if flat["metro_min"] <= criteria["max_metro_min"]: score += 2 reasons.append("рядом с метро") # мягкие «хотелки» have = set(flat["features"]) miss = criteria["must_have"] - have if not miss: score += 3; reasons.append("все хотелки на месте") else: reasons.append(f"нет: {', '.join(miss)}") return {"score": score, "reasons": reasons} criteria = {"budget": 13_000_000, "rooms_min": 2, "max_metro_min": 10, "must_have": {"лоджия"}} ranked = sorted( ((f, score_object(f, criteria)) for f in flats), key=lambda x: -x[1]["score"], ) for flat, res in ranked[:5]: print(f"{res['score']:>3} | {flat['address']} | {flat['price']:,} руб | {'; '.join(res['reasons'])}")
Такой скоринг — детерминированный и прозрачный: вы в любой момент объясните клиенту, почему показали именно эти варианты. Когда объектов много, добавьте слой LLM: модель читает свободный текст клиента, вытаскивает критерии через function calling и передаёт их в скоринг. Парсинг самой выдачи Авито/ЦИАН делается отдельным модулем (requests + BeautifulSoup или готовые библиотеки), но это тема для отдельного гайда — здесь важно, что на вход скоринга попадает нормализованный список словарей.
Скорость реакции — главный фактор конверсии лида в сделку: по данным площадок, ответ в первые 5 минут в разы повышает шанс. Агент-автоответчик закрывает три вещи: классифицирует сообщение, отвечает по шаблону и эскалирует сложное менеджеру. Классификация через LLM с temperature=0 даёт стабильный результат: модель определяет, о чём спрашивает клиент, а дальше срабатывает словарь готовых ответов.
CLASSIFY_PROMPT = """Классифицируй сообщение клиента строго одной меткой: PRICE — вопрос о цене или торг VIEW — запрос на просмотр / запись на показ INFO — вопрос о характеристиках объекта OTHER — всё остальное""" def classify_lead(text: str) -> str: resp = client.chat.completions.create( model="gpt-4o-mini", temperature=0, messages=[ {"role": "system", "content": CLASSIFY_PROMPT}, {"role": "user", "content": text}, ], ) return resp.choices[0].message.content.strip().upper() AUTO_REPLIES = { "VIEW": "Здравствуйте! Свободное время для показа: завтра 11:00 или 17:00. Какой удобнее?", "PRICE": "Здравствуйте! Цена актуальна. Возможен небольшой торг при быстром выходе на сделку.", "INFO": "Здравствуйте! Уточните, что интересует: планировка, состояние или документы?", } def reply_to_lead(text: str) -> str: cat = classify_lead(text) if cat == "OTHER": return "Здравствуйте! Менеджер ответит в течение 15 минут." # эскалация return AUTO_REPLIES[cat] print(reply_to_lead("а можно завтра посмотреть квартиру?")) # → "Здравствуйте! Свободное время для показа: завтра 11:00 или 17:00..."
Интеграция с мессенджерами — вопрос обвязки: Telegram подключается через библиотеку python-telegram-bot или aiogram, WhatsApp — через официальный Cloud API, Авито и ЦИАН — через API кабинетов или вебхуки. Общий паттерн один: сообщение приходит на вебхук → вы зовёте reply_to_lead → отправляете ответ обратно. Важно держать паузу и не спамить: один автоответ на сообщение, дальше — только менеджер. И всегда оставляйте «OTHER» как эскалацию — попытка ответить на всё подряд убивает доверие клиента.
Правильная цена — половина скорости продажи. Переоценил — объект висит месяцами, недооценил — теряешь деньги клиента. Агент собирает объявления по району и считает медиану цены за квадратный метр — это надёжнее среднего, потому что не искажается одним «золотым» пентхаусом или заниженной квартирой с обременением. Ниже — простая, но рабочая статистика по собранным данным.
import statistics # результат парсинга: (район, цена за м²) listings = [ ("Академический", 245_000), ("Академический", 252_000), ("Академический", 239_000), ("Академический", 390_000), ("Черёмушки", 231_000), ("Черёмушки", 228_000), ("Черёмушки", 235_000), ("Коньково", 210_000), ("Коньково", 218_000), ] def price_stats(district: str) -> dict: prices = [p for d, p in listings if d == district] return { "median": statistics.median(prices), "n": len(prices), } for d in {"Академический", "Черёмушки", "Коньково"}: s = price_stats(d) print(f"{d}: медиана {s['median']:,} ₽/м² ({s['n']} объявлений)") # → Академический: медиана 245 000 ₽/м² (4 объявлений)
Заметьте: выброс в 390 000 ₽/м² не сдвинул медиану, а вот среднее он бы задрал на 35 тысяч. Именно поэтому для ценообразования используют медиану, а не среднее. На реальных данных картина та же: медиана цены за квадрат по району ± коридор в 5–7% даёт адекватную вилку для выставления объекта. Дальше можно подключить LLM для сводки: «в Черёмушках рынок на 6% ниже Академического при сопоставимом метраже — рекомендую стартовать от 240 000 ₽/м²». Сбор объявлений — отдельная тема парсинга, но статистика выше работает с любым источником данных.
Агент бесполезен, если лид не попадает в CRM. Финальный шаг пайплайна — записать сделку и контакт, чтобы менеджер видел всю историю. AmoCRM и Битрикс24 отдают REST API с токенами: у amoCRM это долгоживущий access token, у Битрикс24 — входящий вебхук, который генерируется в интерфейсе за минуту. Ниже — рабочие вызовы для создания лида в обеих системах.
import os, requests # --- AmoCRM: сделка + контакт --- AMO_BASE = "https://yourdomain.amocrm.ru" AMO_TOKEN = os.environ["AMO_TOKEN"] def amo_create_lead(name, phone, comment): resp = requests.post( f"{AMO_BASE}/api/v4/leads", headers={"Authorization": f"Bearer {AMO_TOKEN}"}, json=[{ "name": f"Сделка: {name}", "_embedded": { "contacts": [{ "name": name, "custom_fields_values": [ {"field_code": "PHONE", "values": [{"value": phone}]} ], }] }, }], ) resp.raise_for_status() return resp.json() # --- Битрикс24: лид через входящий вебхук --- BITRIX = "https://yourdomain.bitrix24.ru/rest/1/TOKEN" def bitrix_create_lead(title, phone): resp = requests.post( f"{BITRIX}/crm.lead.add.json", json={"fields": { "TITLE": title, "PHONE": [{"VALUE": phone, "VALUE_TYPE": "WORK"}], }}, ) return resp.json()
Готовый пайплайн выглядит так: клиент пишет в мессенджер → агент классифицирует лид → автоответ уходит сразу → параллельно лид записывается в CRM через API выше. Менеджер утром открывает Битрикс24 и видит всех ночных лидов с уже отправленным первым ответом — остаётся только перезвонить. Это и есть та самая экономия, ради которой всё затевается: ни один лид не теряется, а скорость реакции больше не зависит от того, спит ли риелтор.
Соберём всё в единый стек. Язык — Python, модель — gpt-4o-mini для рутины (классификация, описания) и gpt-4o для сложных сводок по рынку, обвязка — FastAPI для вебхуков, python-telegram-bot для Telegram, requests для CRM. Весь пайплайн — это конвейер: клиент → агент (классификация) → LLM (генерация/скоринг) → CRM (сделка), как на схеме выше.
| Компонент | Что делает | Стоимость |
|---|---|---|
| gpt-4o-mini | описания, классификация лидов, скоринг | ~$0.15/1M вх. токенов |
| gpt-4o | сводки по рынку, сложные ответы | ~$2.5/1M вх. токенов |
| VPS (хостинг агента) | FastAPI + вебхуки + парсер | от $5/мес |
| CRM (Битрикс24/AmoCRM) | хранение лидов и сделок | от 0 (тариф) / уже есть |
| Telegram Bot API | приём лидов из мессенджера | бесплатно |
Реальный бюджет агентства: тысяча описаний в месяц на gpt-4o-mini — это меньше доллара токенов, а экономия времени — десятки часов работы копирайтера. Основные затраты — не модель, а время разработчика на первую настройку. Теперь об ограничениях, которые важно учесть до старта.
⚠ Закон о персональных данных (152-ФЗ). Телефоны и ФИО клиентов — персональные данные. Храните их на своём сервере в РФ, не передавайте в зарубежные LLM (модель должна получать только обезличенный текст запроса, без имени и телефона), берите согласие на обработку.
⚠ Качество данных. Агент настолько хорош, насколько чиста ваша база объектов. Кривые параметры, дубли и устаревшие цены дают мусорные описания и неверный скоринг. Сначала нормализуйте базу, потом автоматизируйте.
⚠ Оплата зарубежных API из РФ. OpenAI не принимает российские карты напрямую — вопрос решается виртуальными картами и посредниками.
⚠ Галлюцинации. Модель может «досочинить» характеристику, которой нет. Поэтому факты передавайте только из базы, а ответы с эскалацией на человека для спорных случаев — обязательны.
AI-агент для недвижимости в 2026 году — это не игрушка, а рабочий инструмент, который забирает 70% рутины риелтора: пишет описания для Авито и ЦИАН за секунды, подбирает и скорит объекты под критерии клиента, отвечает на лиды ночью и складывает всё в Битрикс24 или AmoCRM. Стек простой: Python + OpenAI API + FastAPI + CRM REST. Стоимость токенов копеечная, главный вклад — один раз настроить конвейер и поддерживать базу объектов в чистоте. Начните с одной задачи — например, генерации описаний — измерьте экономию времени за неделю, а потом добавляйте классификацию лидов, скоринг и интеграцию с CRM. Именно так, шаг за шагом, агент превращается из демо в систему, которая реально продаёт.