Ce projet est une démonstration de l'utilisation de Spring AI avec des modèles d'IA agentiques, intégrant la mémoire de conversation et l'orchestration de modèles via Spring Boot. Il simule un assistant d'assurance santé capable de gérer des dossiers de remboursement via des interactions en langage naturel.
- Agent conversationnel intelligent : Assistant spécialisé dans la gestion de dossiers de remboursement santé
- Mémoire de conversation : Maintien du contexte entre les échanges avec Spring AI Chat Memory
- Function Calling : Utilisation d'outils Spring AI pour interroger et mettre à jour la base de données
- Interface web interactive : Chat en temps réel avec streaming des réponses
- Base de données PostgreSQL : Gestion des dossiers de remboursement avec Liquibase
- Support multilingue : Prompts disponibles en français et anglais
src/main/java/com/zenika/demo/ai/functioncalling/
├── ai/ # Composants IA
│ ├── DossierRemboursementPrompter.java # Service principal d'interaction avec l'IA
│ ├── DossierRemboursementTools.java # Outils (function calling) pour l'agent
│ └── DossierRemboursementSQLPrompter.java # Génération de requêtes SQL
├── config/ # Configuration Spring
├── remboursements/ # Domaine métier
│ ├── DossierRemboursement.java # Entité principale
│ ├── DossiersRemboursements.java # Repository
│ └── UseCases.java # Logique métier
└── restapi/ # API REST
└── ConversationController.java # Endpoints de conversation
src/main/resources/
├── application.yml # Configuration principale
├── prompts/ # Prompts système pour l'IA
├── db/changelog/ # Scripts Liquibase
├── static/js/chat.js # Client JavaScript
└── templates/index.html # Interface web
Service principal orchestrant les interactions avec l'IA :
- Gère le contexte conversationnel via
ChatMemory - Configure les outils disponibles pour l'agent
- Support mode synchrone et streaming (asynchrone)
Outils Spring AI exposés à l'agent via @Tool :
getDossiers: Recherche de dossiers avec requêtes SQL générées dynamiquementinternalActionGetDossier: Récupération d'un dossier par IDinternalActionMetterAJourDossier: Mise à jour (clôture/rejet) avec confirmationlireReponseUtilisateur: Interprétation des réponses utilisateur (oui/non)
API REST exposant deux endpoints :
POST /conversations: Réponse synchronePOST /conversationsAsync: Streaming des réponses
- Java 21+
- Maven 3.9+
- Docker (pour PostgreSQL)
- Ollama avec le modèle
llama3.1:8binstallé
# Installation d'Ollama (macOS)
brew install ollama
# Démarrage du service Ollama
ollama serve
# Installation du modèle (dans un autre terminal)
ollama pull llama3.1:8b-
Cloner le dépôt et naviguer dans le répertoire
-
Démarrer PostgreSQL :
# Spring Boot Docker Compose démarre automatiquement PostgreSQL au lancement # Ou manuellement avec : docker compose -f src/main/docker/compose.yml up -d
-
Compiler et lancer :
./mvnw clean spring-boot:run
-
Accéder à l'interface : http://localhost:8080
spring:
ai:
ollama:
chat:
model: llama3.1:8b # Modèle utilisé
options:
temperature: 0.1 # Déterminisme élevé
datasource:
url: jdbc:postgresql://localhost:5432/dossiers_remboursements
dossier-remboursement:
sql-system-prompt: classpath:prompts/dossier-remboursement-sql-query-system-prompt-en.md
system-prompt: classpath:prompts/dossier-remboursement-system-prompt-en.mdModèles alternatifs disponibles (commentés dans application.yml) :
llama3-groq-tool-use:8bllama3.2:3bhf.co/Salesforce/xLAM-1b-fc-r-gguf
Consultation :
- "Affiche tous les dossiers"
- "Liste les dossiers de Jean Dupont"
- "Montre-moi le dossier numéro 3"
- "Quels sont les dossiers en attente ?"
Mise à jour (avec confirmation) :
- "Clôture le dossier 5"
- "Rejette le dossier de Marie Martin"
- "Valide le dossier numéro 2"
- L'utilisateur envoie une demande en langage naturel
- L'agent analyse la demande et détermine les outils nécessaires
- Pour les consultations : affichage direct des résultats
- Pour les mises à jour :
- Affichage du dossier concerné
- Demande de confirmation explicite
- Exécution uniquement après validation
- Spring Boot 3.5.3 : Framework applicatif
- Spring AI 1.0.3 : Intégration IA et function calling
- Ollama : Modèle LLM local (llama3.1:8b)
- PostgreSQL 17 : Base de données
- Liquibase : Gestion des migrations de schéma
spring-ai-starter-model-ollama: Client Ollamaspring-ai-starter-model-chat-memory: Mémoire conversationnellespring-boot-starter-thymeleaf: Templates HTMLspring-boot-starter-data-jdbc: Accès aux donnéesspring-boot-docker-compose: Intégration Docker automatiquemapstruct: Mapping objetlombok: Réduction du boilerplate
Table dossier_remboursement avec les colonnes :
id,nom_assure,prenom_assuremontant_rembourse,statutdate_demande, etc.
Dossiers d'exemple chargés via Liquibase au démarrage :
- Fichier CSV :
src/main/resources/db/changelog/changes/data/dossiers-remboursement-init.csv
# Compilation
./mvnw clean compile
# Tests
./mvnw test
# Exécution en mode développement (avec devtools)
./mvnw spring-boot:run
# Package
./mvnw clean packageLes logs détaillés des interactions IA sont activés :
logging:
level:
org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor: debug
com.zenika.demo.ai.agentic.agenticaidemo: debugLes fichiers dans src/main/resources/prompts/ définissent le comportement de l'agent :
dossier-remboursement-system-prompt-en.md: Instructions principalesdossier-remboursement-sql-query-system-prompt-en.md: Génération SQL
Modifiez spring.ai.ollama.chat.model dans application.yml et assurez-vous que le modèle est installé via ollama pull <model>.
Ce projet est une démonstration technique réalisée dans le cadre des Matinales CNAM par Zenika pour illustrer les capacités des agents IA avec Spring AI.
Projet à but démonstratif et éducatif.