← Retour aux projets

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.

Lancer l’app

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 sans RANDOM(), fenêtre de contexte LLM bornée, timeout configurable, affichage des messages limité, seed CSV par insert_all.