Реалізація AI-асистента для підбору нерухомості у мобільному застосунку

TRUETECH займається розробкою, підтримкою та обслуговуванням мобільних додатків iOS, Android, PWA. Маємо великий досвід та експертизу для публікації мобільних додатків до популярних маркетів Google Play, App Store, Amazon, AppGallery та інші.

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1735 послуг
Реалізація AI-асистента для підбору нерухомості у мобільному застосунку
Складний
~1-2 тижні
Часті запитання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    792
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    671
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1097
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    969
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    914
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    495

AI-Асистент для вибору нерухомості у мобільних застосунках

Підбір нерухомості—завдання з багатою структурованою базою даних (оголошення) та погано формалізованими вимогами користувача. «Тихий район, недалеко від метро, світла квартира»—це не фільтри, це наміри. AI-асистент перекладає наміри в параметри пошуку та пояснює, чому конкретний об'єкт підходить чи ні.

Розбір вимог через Function Calling

Користувачі описують бажану нерухомість вільним текстом. Function calling виділяє структуровані критерії:

let extractFiltersFunction: [String: Any] = [
    "name": "extract_search_filters",
    "description": "Extract real estate search criteria from user message",
    "parameters": [
        "type": "object",
        "properties": [
            "property_type": ["type": "string", "enum": ["apartment", "house", "studio", "commercial"]],
            "min_rooms": ["type": "integer"],
            "max_rooms": ["type": "integer"],
            "min_area_sqm": ["type": "number"],
            "max_price": ["type": "number"],
            "metro_walk_minutes": ["type": "integer", "description": "Max walking time to metro"],
            "districts": ["type": "array", "items": ["type": "string"]],
            "floor_preference": ["type": "string", "enum": ["not_ground", "not_top", "high", "any"]],
            "must_haves": ["type": "array", "items": ["type": "string"],
                "description": "Required features: parking, balcony, new_building, quiet_street, etc."],
            "deal_type": ["type": "string", "enum": ["buy", "rent"]]
        ]
    ]
]

Діалог може уточнюватися—«що означає недалеко від метро?», «у якому ціновому діапазоні?» Це багатоходовий розмова, контекст якої накопичується.

Інтеграція з API оголошень

Після виділення фільтрів—запит до бази оголошень (ЦИАН, Авито, Яндекс.Нерухомість або власна база).

class RealEstateSearchService {
    func search(filters: SearchFilters) async throws -> [Property] {
        var params = [URLQueryItem]()
        params.append(URLQueryItem(name: "type", value: filters.propertyType))
        if let maxPrice = filters.maxPrice {
            params.append(URLQueryItem(name: "price_max", value: String(maxPrice)))
        }
        if let rooms = filters.minRooms {
            params.append(URLQueryItem(name: "rooms_min", value: String(rooms)))
        }
        // ... решта фільтрів

        var url = URLComponents(string: baseURL + "/search")!
        url.queryItems = params

        let (data, _) = try await URLSession.shared.data(from: url.url!)
        return try JSONDecoder().decode([Property].self, from: data)
    }
}

Геофільтр «недалеко від метро» реалізується через геокоординати станцій + MapKit.MKCoordinateRegion або CLLocation.distance(from:). Не через текстову назву району—надійніше.

AI-пояснення збігів

Список оголошень без пояснення «чому це підходить»—слабкий UX. Генеруйте короткі AI-описи для кожного об'єкта (або топ-3), пояснюючи відповідність.

func generateMatchExplanation(property: Property, userRequirements: String) async throws -> String {
    let prompt = """
    The user is looking for: \(userRequirements)

    Property details:
    - \(property.rooms) rooms, \(property.area) sqm
    - Floor: \(property.floor)/\(property.totalFloors)
    - Metro: \(property.metroStation), \(property.metroWalkMinutes) min walk
    - Price: \(property.price) \(property.currency)/month
    - Features: \(property.features.joined(separator: ", "))
    - District: \(property.district)

    In 2-3 sentences, explain why this property matches (or doesn't fully match) the requirements.
    Be specific about matches and mismatches. No marketing language.
    """

    return try await openAI.complete(prompt: prompt, maxTokens: 100)
}

100 токенів—жорсткий ліміт. Пояснення повинні бути короткими й по суті.

Карта з кластеризацією

Завжди показуйте оголошення на карті. На iOS використовуйте MapKit з кастомними MKAnnotationView. Для великої кількості точок—кластеризація через MKClusterAnnotation.

// Настройка кластеризації
let annotationView = MKMarkerAnnotationView(annotation: annotation, reuseIdentifier: "property")
annotationView.clusteringIdentifier = "properties"  // включає автокластеризацію

// Кастомний вид кластера з кількістю
class PropertyClusterAnnotationView: MKAnnotationView {
    override func prepareForDisplay() {
        super.prepareForDisplay()
        if let cluster = annotation as? MKClusterAnnotation {
            let count = cluster.memberAnnotations.count
            image = drawClusterBadge(count: count)
        }
    }
}

На Android використовуйте Google Maps SDK із ClusterManager з бібліотеки android-maps-utils.

Збережені пошуки й сповіщення

Коли користувачі зберігають критерії пошуку, система повинна сповіщати про нові оголошення. На сервері—періодичний job, що прогоняє збережені фільтри за новими оголошеннями й надсилає push-сповіщення.

// Android - обробка push із новим оголошенням
class NewPropertyNotificationHandler : FirebaseMessagingService() {
    override fun onMessageReceived(remoteMessage: RemoteMessage) {
        val propertyId = remoteMessage.data["property_id"] ?: return
        val notification = NotificationCompat.Builder(this, CHANNEL_NEW_PROPERTIES)
            .setContentTitle("Нове оголошення за вашим запитом")
            .setContentText(remoteMessage.data["summary"])
            .setSmallIcon(R.drawable.ic_home)
            .setContentIntent(buildDeepLinkIntent(propertyId))
            .setAutoCancel(true)
            .build()

        NotificationManagerCompat.from(this).notify(propertyId.hashCode(), notification)
    }
}

Орієнтири за часом

Базовий пошук з AI-розбором фільтрів + список результатів—5–7 днів. Повноцінний асистент із діалогом, картою, AI-поясненнями збігів, збереженими пошуками й push-сповіщеннями—4–6 тижнів.