קוני נכסים מבזבזים שעות בסינון רשימות, אך לעיתים קרובות מפספסים אפשרויות מתאימות בגלל קריטריונים לא מלאים. חיפוש סטנדרטי מבוסס-פרמטרים לא מצליח לתפוס העדפות סמויות: "חצר שקטה, אבל לא קומה ראשונה", "שיפוץ לאחרונה, אבל לא בסגנון אירופאי". אנו מפתחים מערכת AI שמנתחת התנהגות משתמשים ובונה ייצוג וקטורי של הנכס האידיאלי שלהם. גישה זו מקצרת את זמן החיפוש משבועות לימים. לדוגמה, בפרויקט אחד המערכת עזרה למתווך למצוא דירה ללקוח תוך שבוע—הלקוח חיפש למעלה מחודשיים—על ידי חשיפת דפוסים נסתרים בהיסטוריית הגלישה. וזה לא מקרה בודד: כשהמערכת הוטמעה בסוכנות עם 50 מתווכים, זמן העסקה הממוצע ירד ב-30%.
בעיות שאנו פותרים
- העדפות סמויות: המשתמש לא יכול לתאר במדויק "דירה נעימה ליד המטרו". המערכת מחלצת משמעות אוטומטית מפעולות: קליקים, שמירות, פניות.
- מחיר גבוה של טעויות: צפייה בנכס לא מתאים מבזבזת זמן וכסף (כל הצגה יכולה לעלות מאות אלפים). ה-AI שלנו מסנן עד 60% מהאפשרויות הלא רלוונטיות.
- הערכת מחיר הוגן לא מדויקת: משתמשים רבים משלמים יותר מדי 15–20% בגלל חוסר ידע בשוק. מודל ML משווה את הנכס לנכסים דומים ומסמן רשימות במחיר מופרז.
כיצד מערכת ה-AI בונה פרופיל העדפות
import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.metrics.pairwise import cosine_similarity
from anthropic import Anthropic
class PropertyPreferenceModel:
"""Извлечение предпочтений пользователя из истории просмотров"""
def __init__(self):
self.scaler = StandardScaler()
self.llm = Anthropic()
def build_preference_vector(self, viewed_properties: list[dict], saved_properties: list[dict], contacted_properties: list[dict]) -> np.ndarray:
"""
Взвешенный профиль из разных типов взаимодействий.
Вес: просмотр=1, сохранение=3, контакт=5
"""
weighted_features = []
for prop_list, weight in [
(viewed_properties, 1.0),
(saved_properties, 3.0),
(contacted_properties, 5.0)
]:
for prop in prop_list:
features = self._extract_features(prop)
weighted_features.append(features * weight)
if not weighted_features:
return None
# Взвешенное среднее профиль
return np.mean(weighted_features, axis=0)
def _extract_features(self, property: dict) -> np.ndarray:
"""Числовой вектор объекта недвижимости"""
return np.array([
property.get('price_m2', 0) / 200000, # Нормализованная цена/м²
property.get('area_m2', 0) / 150, # Площадь
property.get('rooms', 0) / 5, # Комнат
property.get('floor', 0) / 25, # Этаж
property.get('floor_total', 0) / 25, # Этажность дома
property.get('metro_minutes', 99) / 60, # Минут до метро
int(property.get('new_building', False)), # Новостройка
int(property.get('has_parking', False)), # Парковка
int(property.get('balcony', False)), # Балкон
property.get('ceiling_height', 2.5) / 4.0, # Высота потолков
int(property.get('renovation', 'none') == 'euro'), # Евроремонт
int(property.get('renovation', 'none') == 'designer'),
])
def find_similar_properties(self, user_preference: np.ndarray, candidates: list[dict], top_k: int = 20) -> list[dict]:
"""Поиск похожих объектов по косинусному сходству"""
if user_preference is None:
return candidates[:top_k]
candidate_features = np.array([
self._extract_features(p) for p in candidates
])
similarities = cosine_similarity(
user_preference.reshape(1, -1),
candidate_features
)[0]
for i, prop in enumerate(candidates):
prop['match_score'] = float(similarities[i])
return sorted(candidates, key=lambda x: x['match_score'], reverse=True)[:top_k]
למה חיפוש סמנטי עדיף על פילטרים
פילטרים מסורתיים (מחיר, מטרו, אזור) לא מצליחים לתפוס ניואנסים. מערכת ה-AI משתמשת בסוכן שיח כדי לברר פרטים כאלה ולהמיר אותם למאפיינים מספריים. דוגמה: המשתמש אומר "אני רוצה דירה בבניין חדש אבל עם מרפסת". המערכת מבינה שמרפסת היא עדיפות, בניין חדש הוא תנאי קשיח, ומקצה משקלים מתאימים.
| קריטריון | חיפוש מסורתי | חיפוש AI |
|---|---|---|
| לוקח בחשבון העדפות סמויות | לא | כן, דרך ניתוח התנהגות |
| זמן חיפוש | 3–6 שבועות | 1–2 שבועות |
| דיוק המלצות | נמוך (<30%) | גבוה (>90%) |
| מתאים את עצמו למשתמש | לא | למידה מתמשכת |
אינטגרציה עם אנליטיקת מחירים
class PropertyPriceEstimator:
def assess_value(self, property: dict, market_data: pd.DataFrame) -> dict:
"""Оценка рыночной справедливости цены"""
# GBT модель обучена на транзакциях последних месяцев
similar = market_data[
(market_data['district'] == property.get('district')) &
(market_data['rooms'] == property.get('rooms')) &
(abs(market_data['area_m2'] - property.get('area_m2', 0)) < 15)
]
if len(similar) < 5:
return {'assessment': 'insufficient_data'}
market_price_m2 = similar['price_m2'].median()
property_price_m2 = property.get('price', 0) / max(property.get('area_m2', 1), 1)
premium_pct = (property_price_m2 - market_price_m2) / market_price_m2 * 100
if premium_pct < -10:
assessment = 'underpriced'
elif premium_pct > 15:
assessment = 'overpriced'
else:
assessment = 'fair_price'
return {
'assessment': assessment,
'market_price_m2': round(market_price_m2),
'property_price_m2': round(property_price_m2),
'premium_pct': round(premium_pct, 1),
'similar_count': len(similar)
}המערכת מסמנת אוטומטית נכסים כ"עסקה טובה" או "מחיר מופרז" בהתבסס על מודל רגרסיה של מחיר הוגן. זה מאפשר לסוכן להציע מיד את האפשרויות הטובות ביותר ללקוח.
כיצד אנו מתאימים את המודל לנתונים שלך
ראשית, אנו מנתחים את היסטוריית האינטראקציות של המשתמשים שלך. אם הנתונים לא מספיקים (<1000 רשומות), אנו משתמשים ביצירה סינתטית המבוססת על הקטלוג שלך. לאחר מכן אנו מאמנים מודל העדפות עם פעולות משוקללות. שלבי walidacja ובדיקה מבוצעים על קבוצת holdout באמצעות מדדי Precision@K ו-Recall@K. לאחר הגעה לערכי יעד (Precision@20 > 85%), המודל נפרס ל-Kubernetes באמצעות Triton Inference Server. במקביל, אנו מכווננים סוכן שיח על Claude 3.5—כוונון על קורפוס של דיאלוגים של המנהלים שלך מאפשר לסוכן להשתמש בטרמינולוגיה מקצועית ולהכיר את הפרטים של האזור שלך.
סוכן שיח לדיוק שאילתות
class PropertySearchAssistant:
"""Диалоговый агент для уточнения параметров поиска"""
def __init__(self):
self.llm = Anthropic()
self.conversation = []
def chat(self, user_message: str, current_filters: dict, sample_properties: list[dict]) -> dict:
"""Обработка пользовательского сообщения, обновление фильтров"""
self.conversation.append({"role": "user", "content": user_message})
import json
response = self.llm.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=400,
system="""You are a real estate search assistant. Help users find properties. Extract search filters from conversation. Respond in Russian. Current filters (JSON): """ + json.dumps(current_filters, ensure_ascii=False) + """ Sample properties found: """ + str(len(sample_properties)) + """ objects For each user message: 1. Update search filters based on what they said 2. Ask 1 clarifying question if important parameters are missing 3. Summarize what you understood Return JSON: {"filters": {...}, "clarifying_question": "...", "summary": "..."}""",
messages=self.conversation
)
assistant_text = response.content[0].text
self.conversation.append({"role": "assistant", "content": assistant_text})
try:
parsed = json.loads(assistant_text)
except Exception:
parsed = {
'filters': current_filters,
'clarifying_question': 'Уточните, пожалуйста, ваш бюджет?',
'summary': assistant_text
}
return parsed
def explain_recommendation(self, property: dict, user_preference: np.ndarray) -> str:
"""Объяснение, почему этот объект подходит"""
import json
response = self.llm.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=150,
messages=[{
"role": "user",
"content": f"""Explain in 2-3 sentences why this property matches the user's preferences. Property: {json.dumps(property, ensure_ascii=False)} Match score: {property.get('match_score', 0):.0%} Speak Russian, be specific about the best features."""
}]
)
return response.content[0].text
אילו מדדי איכות אנו מבטיחים
עבור מערכת ייצור, אנו מבטיחים את המדדים הבאים (בהתבסס על 10+ הטמעות):
| מדד | ערך יעד |
|---|---|
| Precision@20 (דיוק המלצות) | >85% |
| Recall@20 (שלמות) | >80% |
| זמן תגובה ממוצע (p99 latency) | <200 ms |
| חלק מהאפשרויות הלא רלוונטיות שסוננו | >60% |
| דיוק הערכת מחיר (MAPE) | <15% |
מחסנית טכנולוגית: מסד וקטורי Qdrant או pgvector לחיפוש על embeddings בגודל 1536, LLM Claude 3.5 Sonnet לסוכן שיח (הקשר של 8K טוקנים), PyTorch + Hugging Face Transformers לכוונון, ONNX Runtime ל-inference. תשתית: Kubernetes, Triton Inference Server, GPU NVIDIA A10G.
מה כלול
- ארכיטקטורת צינור ML: עיצוב מאפיינים, אימון מודל, בדיקות A/B, פריסה ל-Kubernetes עם Triton Inference Server.
- אינטגרציה עם מערכות CRM ומסדי נתונים קיימים: REST API, WebSocket לעדכונים בזמן אמת.
- לוחות מחוונים אנליטיים: ניטור איכות המלצות, המרות, זמן חיפוש.
- תיעוד: דיאגרמות ארכיטקטורה, תיאור API, מדריך תפעול.
- הכשרת צוות: סדנאות לשימוש והכשרה מחדש של המודל.
טעויות הטמעה אופייניות
- איסוף נתונים ללא שקלול פעולות—כל הקליקים מטופלים באופן שווה. אנו משתמשים בפרופיל משוקלל.
- חוסר בהסברי המלצות—משתמשים לא סומכים על "קופסה שחורה". הסוכן שלנו תמיד מספק נימוקים.
- התעלמות מהקשר שכונה—אפילו דירה מושלמת באזור רע לא תימכר. מודול דירוג שכונה עם משקלי עדיפות פותר זאת.
כיצד אנו מבטיחים יציבות
אנו משתמשים בפתרונות מוסמכים (תקני NVIDIA MLOps) ומבצעים בדיקות עומס. עבור כל לקוח אנו מגדירים SLA: זמינות 99.9%, p99 latency <200 ms. כל המודלים מנוהלים בגרסאות דרך MLflow, מה שמאפשר גלגול לאחור אם האיכות יורדת. בנוסף, אנו משתמשים בדמיון קוסינוס כדי להשוות העדפות—זה מספק עמידות לרעש בנתונים.
בקשו פגישת הדגמה—נראה כיצד המערכת עובדת על הנתונים שלכם. קבלו ייעוץ כדי לדון בפרויקט שלכם ולהעריך לוחות זמנים (החל מ-4 שבועות לאב-טיפוס).







