What We Learned Building Conversational Real Estate Search in France
At Kazaki, we replaced the classic filter-based real estate search with a chat interface. You describe what you want in plain language, the platform finds matching properties.
Simple premise. Harder to get right than it looks.
The real problem isn't search — it's intent
Traditional platforms make users think in database terms: pick a city, set a price range, choose a surface area. But people don't think about buying a home that way.
Natural language carries signals that don't map to columns: "somewhere quiet", "good schools nearby", "charming but not too much work". Before you can search anything, you need to understand what the user actually means — and that changes with every message in the conversation.
We spent more time on intent extraction than on the search layer itself. Getting a clean, structured representation of what the user wants, from a messy conversational context, is the real bottleneck.
Hybrid search, not pure vector search
Pure vector search sounds like the obvious answer. Embed the query, embed the listings, find the closest vectors. In practice, it has a frustrating failure mode: it finds listings that feel similar but are factually wrong — wrong city, wrong budget, wrong size.
We use a hybrid approach: structured filtering to constrain the candidate set, semantic search within that subset to rank by relevance. The order matters. Filtering first keeps the vector search honest.
The other non-obvious thing: what you embed for the query matters as much as how you search. Embedding a raw conversational message gives worse results than embedding a clean summary of the user's intent. The extra extraction step is worth it.
Keeping it TypeScript all the way
We deliberately avoided Python. All data processing, embedding generation, and search logic runs in TypeScript in our monorepo. For a two-person team that already lives in a full TypeScript stack, the tradeoff is worth it — one less context switch, one less runtime to manage.
There's good tooling now. It's not the path of least resistance, but it's more manageable than people assume.
The thing that surprised us most
Conversational context is genuinely hard to handle well. A user saying "actually make it bigger" mid-conversation needs to update the previous intent, not replace it. A user saying "what about Lyon instead?" is changing one dimension while keeping everything else.
We re-run intent extraction on every message with the full conversation history as context. It's not the most efficient approach, but it handles edge cases gracefully and keeps the logic simple. At our current scale, it's the right call.
The product is live at kazaki.fr — French market, still early. If you're working on conversational search or anything in the proptech space, happy to compare notes in the comments.
Top comments (0)