Urban Assist — Marché immobilier & DVF
Assistant conversationnel qui répond en langage naturel à partir des données de transactions immobilières (DVF) stockées en PostgreSQL. Le LLM orchestre les requêtes ; les chiffres viennent de la base.
Le problème
Les fichiers DVF sont riches mais peu exploitables pour un non-spécialiste : volumes, formats, agrégations par commune ou par période demandent du SQL et une bonne compréhension du schéma. Un chat « générique » sans accès aux données risque d’inventer des prix ou des tendances.
Urban Assist combine un LLM (compréhension et formulation) avec des outils serveur qui exécutent des requêtes sur une base normalisée. La réponse reste ancrée sur ce que la base contient réellement.
Comment ça marche
Données DVF en base
Les ventes et attributs utiles à l’analyse (localisation, typologie, surfaces, prix, dates…) sont importées et indexées dans PostgreSQL. Les communes sont une table de référence : l’assistant peut cibler une ville ou un ensemble de communes pour des comparaisons.
SQL via outils (tool use)
Le modèle ne « devine » pas les agrégats : il appelle un outil (CommunesTool) qui interroge ActiveRecord / SQL et renvoie des résultats structurés (identifiants communes, indicateurs). C’est le même principe que le function calling : le serveur est la source de vérité.
LLM : consignes et synthèse
Les instructions système et le contexte de conversation sont centralisés (UrbanAssistPrompt). RubyLLM enchaîne l’historique, les appels d’outils et produit une réponse en markdown (tableaux, listes) rendue côté navigateur de façon sécurisée.
Réponse naturelle
L’utilisateur lit une synthèse en français ; les communes pertinentes peuvent s’afficher sous forme de cartes, avec favoris et notes personnelles pour suivre un territoire. En cas d’erreur API ou timeout, un message générique évite d’exposer la stack.
Stack technique
| Brique | Détail |
|---|---|
| Backend | Ruby on Rails — contrôleurs sous UrbanAssist::, logique LLM dans UrbanAssist::LlmChatService |
| Données | PostgreSQL — schéma communes / messages / chats / favoris ; extension unaccent pour la recherche texte |
| LLM | RubyLLM — chat avec outils, température basse pour des réponses plus stables sur les chiffres |
| Outil métier | CommunesTool (RubyLLM::Tool) — recherche et agrégats sur les communes / DVF |
| Session | Jeton opaque visitor_token en session Rails — chats et favoris isolés par navigateur, sans compte |
| Présentation | Vues ERB sous app/views/urban_assist/, markdown via Redcarpet (helper dédié) |
Ce qui est démontré techniquement
- Intégration d’une mini-app Rails dans le portfolio (namespace
/urban-assist, scoping par session). - Séparation stricte : pas d’appels LLM directs dans les contrôleurs — service dédié et prompts externalisés.
- Pattern données réelles + LLM : réduction du risque d’hallucination sur les volumes et prix en passant par SQL.
- Perf : index PostgreSQL sur
communes, requêtes outil sansRANDOM(), fenêtre de contexte LLM bornée, timeout configurable, affichage des messages limité, seed CSV parinsert_all.