Property information, room prices and each organization's FAQs are synced to Elasticsearch daily as dense vectors, embedded with Gemini text embedding. When a user message arrives the agent queries Elasticsearch, reranks the hits with the Vertex AI reranker, and passes the top results to Google Vertex AI for reasoning — with Azure OpenAI also in the mix on the model side. Prompt rules are tuned continuously as we see how the agent answers.
Retrieval and reranking happen before the model sees anything, so the answer is assembled from the property record rather than generated around it.
Students looking for accommodation ask things a keyword index answers badly: what a room costs, whether bills are included, how far a building is from campus, what the contract length is. Keyword search returns documents. The question needed an answer — but an answer that can only come from the platform's own property data, never invented.
The Elasticsearch migration had already put the index under the team's control, so dense vectors could live next to the documents they describe rather than in a separate store to keep in sync. Vector similarity alone, though, returns things that are merely close in meaning. The work since has been in the two stages after retrieval: reranking the candidate set so the genuinely relevant rooms and FAQ entries rise to the top, and constraining what the model is allowed to reason about once they do.
The agent handles property information queries, organization FAQs and room prices by retrieving first, reranking second, and reasoning last. Because retrieval and keyword search share a cluster, index work benefits both the classic search box and the agent — and because ranking and prompt rules are tuned separately from the code, improving answer quality does not mean redeploying the service.