<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title><![CDATA[Philipp Krenn - Elasticsearch Labs]]></title>
    <description><![CDATA[Articles and tutorials from the Search team at Elastic]]></description>
    <copyright><![CDATA[© 2026. Elasticsearch B.V. All Rights Reserved]]></copyright>
    <image>
      <title><![CDATA[Philipp Krenn - Elasticsearch Labs]]></title>
      <url>https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1121c0bf0e8a6e65/6a88da6340a1841030ef456f/search-labs-thumbnail.png</url>
      <link>https://www.elastic.co/fr/search-labs/author/philipp-krenn</link>
    </image>
    <link>https://www.elastic.co/fr/search-labs/author/philipp-krenn</link>
    <atom:link href="https://www.elastic.co/fr/search-labs/rss/author/philipp-krenn.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[fr]]></language>
    <lastBuildDate>Tue, 22 Sep 2026 17:51:00 GMT</lastBuildDate>
  <item>
    <title><![CDATA[Spring AI et Elasticsearch comme base de données vectorielle]]></title>
    <description><![CDATA[Apprenez à créer une application RAG prête pour la production en utilisant Spring IA et Elasticsearch et à intégrer des LLM à vos données propriétaires à l’aide d’une Base vectorielle.
]]></description>
    <content:encoded><![CDATA[<p><strong>Spring AI</strong> est maintenant disponible, avec sa première <a href="https://spring.io/blog/2025/05/20/spring-ai-1-0-GA-released">version stable 1.0</a> prête à être téléchargée sur <a href="https://mvnrepository.com/artifact/org.springframework.ai/spring-ai-core">Maven Central.</a> Utilisons-le immédiatement pour construire une application d'IA complète, en utilisant votre <a href="https://www.elastic.co/what-is/large-language-models">LLM</a> favori et notre <a href="https://www.elastic.co/elasticsearch/vector-database">base de données vectorielle</a> préférée. Ou plongez directement dans le <a href="https://github.com/xeraa/rag-with-java-springai-elasticsearch">référentiel</a> avec l'application finale.</p><h2>Qu'est-ce que l'IA de printemps ?</h2><p><strong>Spring AI 1.0</strong>, une solution complète pour l'ingénierie de l'IA en Java, est maintenant disponible après une période de développement significative influencée par les progrès rapides dans le domaine de l'IA. Cette version comprend de nombreuses nouvelles fonctionnalités essentielles pour les ingénieurs en IA.</p><p>Java et Spring sont les mieux placés pour profiter de la vague de l'IA. Des tonnes d'entreprises utilisent Spring Boot, ce qui facilite grandement l'intégration de l'IA dans ce qu'elles font déjà. Vous pouvez relier votre logique d'entreprise et vos données à ces modèles d'IA sans trop de difficultés.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltee1f144eb9e74866/6a17e379dbb4ffdf4bfb5647/328d7c51e1c145e94ea1e73ee9ff91836d3b180e-1600x773.png" alt="Comment utiliser Spring IA avec Elasticsearch" /><p>Spring AI prend en charge <a href="https://docs.spring.io/spring-ai/reference/api/index.html">différents modèles et technologies d'IA</a>, tels que :</p><ul><li><p><strong>Modèles d'images</strong>: générer des images à partir de textes.</p></li><li><p><strong>Modèles de transcription</strong>: prendre des sources audio et les convertir en texte.</p></li><li><p><strong>Modèles d'intégration : </strong>convertissent des données arbitraires en <a href="https://www.elastic.co/what-is/vector-embedding">vecteurs</a>, qui sont des types de données optimisés pour la recherche de similarités sémantiques.</p></li><li><p><strong>Modèles de chat : </strong>cesdevraient vous être familiers ! Vous avez sans doute déjà eu une brève conversation avec l'un d'entre eux.</p></li></ul><p>Les modèles de dialogue en ligne sont ceux qui semblent le plus faire parler d'eux dans le domaine de l'IA, et à juste titre, ils sont géniaux ! Ils peuvent vous aider à corriger un document ou à écrire un poème. (Ne leur demandez pas de raconter une blague... pour l'instant). Ils sont géniaux, mais ils ont quelques problèmes.</p><h2>Des solutions d'IA de printemps pour relever les défis de l'IA</h2><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltbd2d062ded38cf83/6a17e37adbb4ff69d7fb564b/2ebd68a90ebc73847df6ef7325936d4d06b35c8c-1600x900.jpg" alt="Solutions Spring IA pour les défis de l’IA" /><p>Examinons quelques-uns de ces problèmes et leurs solutions dans Spring AI.</p><p></p><p>Problème</p><p>Solution</p><p>Cohérence</p><p>Les modèles de chat sont ouverts d'esprit et enclins à la distraction.</p><p>Vous pouvez les doter d'un système d'incitation pour régir leur forme et leur structure générales</p><p>Mémoire</p><p>Les modèles d'IA n'ont pas de mémoire et ne peuvent donc pas établir de corrélation entre les messages d'un utilisateur donné et ceux d'un autre utilisateur.</p><p>Vous pouvez leur donner un système de mémoire pour stocker les parties pertinentes de la conversation</p><p>L'isolement</p><p>Les modèles d'IA vivent dans de petits bacs à sable isolés, mais ils peuvent faire des choses vraiment étonnantes si vous leur donnez accès à des outils - des fonctions qu'ils peuvent invoquer lorsqu'ils le jugent nécessaire</p><p>Spring AI prend en charge l'appel d'outils, ce qui vous permet d'indiquer au modèle d'IA les outils présents dans son environnement, qu'il peut ensuite vous demander d'invoquer. Cette interaction à plusieurs tours est gérée de manière transparente pour vous</p><p>Données privées</p><p>Les modèles d'IA sont intelligents, mais ils ne sont pas omniscients ! Ils ne savent pas ce que contiennent vos bases de données propriétaires - et nous pensons que vous ne voudriez pas qu'ils le sachent !</p><p>Vous devez informer leurs réponses en remplissant les invites, c'est-à-dire en utilisant le puissant opérateur de concaténation de chaînes pour insérer du texte dans la demande avant que le modèle n'examine la question posée. Des informations de base, si vous voulez. Comment décidez-vous de ce qui doit être envoyé et de ce qui ne doit pas l'être ? Utilisez un magasin de vecteurs pour sélectionner uniquement les données pertinentes et les envoyer ensuite. C'est ce que l'on appelle la génération augmentée par récupération (RAG).</p><p>Hallucination</p><p>Les modèles de chat de l'IA aiment discuter ! Et parfois, ils le font avec tant d'assurance qu'ils peuvent inventer des choses</p><p>Vous devez recourir à l'évaluation - en utilisant un modèle pour valider les résultats d'un autre - pour confirmer des résultats raisonnables.</p><p></p><p>Bien entendu, aucune application d'IA n'est isolée. Aujourd'hui, les systèmes et services d'IA modernes fonctionnent mieux lorsqu'ils sont intégrés à d'autres systèmes et services. <a href="https://modelcontextprotocol.io/introduction"><strong>Model Context Protocol</strong></a>(MCP) permet de connecter vos applications d'intelligence artificielle à d'autres services basés sur MCP, quel que soit le langage dans lequel elles sont écrites. Vous pouvez assembler tous ces éléments dans des flux de travail <strong>agentiques </strong>qui mènent à un objectif plus large.</p><p>Le plus beau ? Vous pouvez faire tout cela en vous appuyant sur les idiomes et abstractions familiers auxquels tout développeur Spring Boot est habitué : des dépendances de départ pratiques pour pratiquement tout sont disponibles sur <a href="https://start.spring.io"><strong>Spring Initializr</strong></a><strong>.</strong></p><p>Spring AI fournit des autoconfigurations Spring Boot pratiques qui vous donnent la configuration conventionnelle sur la configuration que vous connaissez et attendez. Spring AI prend en charge l'observabilité avec l'Actuator de Spring Boot et le projet Micrometer. Il est également compatible avec GraalVM et les threads virtuels, ce qui vous permet de créer des applications d'IA super rapides et efficaces qui évoluent.</p><h2>Pourquoi Elasticsearch ?</h2><p>Elasticsearch est un moteur de recherche plein texte, vous le savez probablement. Alors pourquoi l'utiliser pour ce projet ? C'est <em>aussi</em> un magasin de vecteurs ! Il s'agit d'un excellent outil, dans lequel les données sont placées à côté du texte intégral. Autres avantages notables :</p><ul><li><p>Très facile à mettre en place</p></li><li><p>Opensource</p></li><li><p>Évolutivité horizontale</p></li><li><p>La plupart des données libres de votre organisation se trouvent probablement déjà dans un cluster Elasticsearch.</p></li><li><p>Fonctionnalité de moteur de recherche complète</p></li><li><p>Entièrement <a href="https://docs.spring.io/spring-ai/reference/api/vectordbs/elasticsearch.html">intégré à Spring AI</a>!</p></li></ul><p>Si l'on tient compte de tous ces éléments, Elasticsearch remplit toutes les conditions d'un excellent magasin de vecteurs, alors configurons-le et commençons à construire notre application !</p><h2>Prise en main d'Elasticsearch</h2><p>Nous allons avoir besoin d'Elasticsearch et de Kibana, la console d'interface utilisateur que vous utiliserez pour interagir avec les données hébergées dans la base de données.</p><p>Vous pouvez tout essayer sur votre machine locale grâce aux images Docker et à la <a href="http://elastic.co">page d'accueil d'Elastic.co.</a> Allez-y, faites défiler vers le bas pour trouver la commande <code>curl</code>, exécutez-la et envoyez-la directement dans votre shell :</p> curl -fsSL https://elastic.co/start-local | sh 
  ______                     
 |  ____| |         | | (_)     
 | |__  | | __  ___| |_   ___ 
 |  __| | |/ _` / __| __| |/ __|
 | |____| | (_| \__ \ |_| | (__ 
 |______|_|\__,_|___/\__|_|\___|
-------------------------------------------------
🚀 Run Elasticsearch and Kibana for local testing
-------------------------------------------------
ℹ️  Do not use this script in a production environment
⌛️ Setting up Elasticsearch and Kibana v9.0.0...
- Generated random passwords
- Created the elastic-start-local folder containing the files:
  - .env, with settings
  - docker-compose.yml, for Docker services
  - start/stop/uninstall commands
- Running docker compose up --wait
[+] Running 25/26
 ✔ kibana_settings Pulled                                                 16.7s 
 ✔ kibana Pulled                                                          26.8s 
 ✔ elasticsearch Pulled                                                   17.4s                                                                     
[+] Running 6/6
 ✔ Network elastic-start-local_default             Created                 0.0s 
 ✔ Volume "elastic-start-local_dev-elasticsearch"  Created                 0.0s 
 ✔ Volume "elastic-start-local_dev-kibana"         Created                 0.0s 
 ✔ Container es-local-dev                          Healthy                12.9s 
 ✔ Container kibana_settings                       Exited                 11.9s 
 ✔ Container kibana-local-dev                      Healthy                21.8s 
🎉 Congrats, Elasticsearch and Kibana are installed and running in Docker!
🌐 Open your browser at http://localhost:5601
   Username: elastic
   Password: w1GB15uQ
🔌 Elasticsearch API endpoint: http://localhost:9200
🔑 API key: SERqaGlKWUJLNVJDODc1UGxjLWE6WFdxSTNvMU5SbVc5NDlKMEhpMzJmZw==
Learn more at https://github.com/elastic/start-local
➜  ~ <p>Il suffit de tirer et de configurer des images Docker pour Elasticsearch et Kibana, et après quelques minutes, elles seront opérationnelles sur votre machine locale, avec les informations d'identification de connexion.</p><p>Vous avez également deux urls différentes que vous pouvez utiliser pour interagir avec votre instance Elasticsearch. Suivez les instructions et dirigez votre navigateur vers <a href="http://localhost:5601">http://localhost:5601</a>.</p><p>Notez également le nom d'utilisateur <code>elastic</code> et le mot de passe affichés sur la console : vous en aurez besoin pour vous connecter (dans l'exemple ci-dessus, il s'agit respectivement de <code>elastic</code> et <code>w1GB15uQ</code>).</p><p></p><h2>L'intégration de l'application</h2><p>Allez sur la page <a href="https://start.spring.io">Spring Initializr</a> et générez un nouveau projet Spring AI avec les dépendances suivantes :</p><ul><li><p><code>Elasticsearch Vector Store</code></p></li><li><p><code>Spring Boot Actuator</code></p></li><li><p><code>GraalVM</code></p></li><li><p><code>OpenAI</code></p></li><li><p><code>Web</code></p></li></ul><p>Veillez à choisir la dernière et la meilleure version de Java (idéalement Java 24 - au moment de la rédaction de ce document - ou une version plus récente) et l'outil de construction de votre choix. Nous utilisons Apache Maven dans cet exemple.</p><p>Cliquez sur <code>Generate</code>, puis décompressez le projet et importez-le dans l'IDE de votre choix. (Nous utilisons IntelliJ IDEA.)</p><p>Commençons par le commencement : spécifions les détails de la connexion pour votre application Spring Boot. Sur <code>application.properties,</code>, écrivez ce qui suit :</p>spring.elasticsearch.uris=http://localhost:9200
spring.elasticsearch.username=elastic
spring.elasticsearch.password=w1GB15uQ<p>Nous allons également utiliser la capacité de stockage vectoriel de Spring AI pour initialiser tout ce qui est nécessaire du côté d'Elasticsearch en termes de structures de données, donc spécifier :</p>spring.ai.vectorstore.elasticsearch.initialize-schema=true<p>Nous allons utiliser <strong>OpenAI</strong> dans cette démo, en particulier le <strong>modèle d'intégration</strong> et le <strong>modèle de conversation </strong>(n'hésitez pas à utiliser le service que vous préférez, tant que <a href="https://docs.spring.io/spring-ai/reference/api/embeddings.html#available-implementations">Spring AI le prend en charge</a>).</p><p>Le modèle d'intégration est nécessaire pour créer des intégrations des données avant de les stocker dans Elasticsearch. Pour qu'OpenAI fonctionne, nous devons spécifier l'adresse <code>API key</code>:</p>spring.ai.openai.api-key=...<p>Vous pouvez la définir comme une variable d'environnement telle que <code>SPRING_AI_OPENAI_API_KEY</code> pour éviter d'avoir à la stocker dans votre code source.</p><p>Nous allons télécharger des fichiers, donc assurez-vous de personnaliser la quantité de données pouvant être téléchargées vers le conteneur de servlet :</p>spring.servlet.multipart.max-file-size=20MB
spring.servlet.multipart.max-request-size=20MB<p>Nous y sommes presque ! Avant de nous plonger dans l'écriture du code, donnons un aperçu de la manière dont cela va fonctionner.</p><p>Sur notre machine, nous avons téléchargé le <a href="https://images-cdn.fantasyflightgames.com/filer_public/9f/aa/9faa23a3-9f71-4c77-865f-bba4aac8a258/runewars-revised-_rulebook.pdf">fichier suivant</a> (une liste de règles pour un jeu de société), l'avons renommé en <code>test.pdf</code> et l'avons placé dans <code>~/Downloads/test.pdf</code>.</p><p>Le fichier sera envoyé au point de terminaison <code>/rag/ingest</code> (remplacez le chemin d'accès en fonction de votre configuration locale) :</p>http --form POST http://localhost:8080/rag/ingest path@/Users/jlong/Downloads/test.pdf<p>Cela peut prendre quelques secondes...</p><p>En coulisses, les données sont envoyées à OpenAI, qui crée des enchâssements de données ; ces données sont ensuite écrites dans Elasticsearch, à la fois les vecteurs et le texte d'origine.</p><p>C'est à partir de ces données, et de tous les enchâssements qu'elles contiennent, que la magie opère. Nous pouvons ensuite interroger Elasticsearch à l'aide de l'interface <code>VectorStore</code>.</p><p>Le flux complet se présente comme suit :</p><ul><li><p>Le client HTTP télécharge le PDF de votre choix vers l'application Spring.</p></li><li><p>Spring AI se charge de l'extraction du texte de notre PDF et découpe chaque page en morceaux de 800 caractères.</p></li><li><p>OpenAI génère la représentation vectorielle pour chaque morceau.</p></li><li><p>Le texte fragmenté et l'intégration sont ensuite stockés dans Elasticsearch.</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt93f4a64b634e9cce/6a17e37cb1e113215879f216/9734adb2d7128e61c515d5855dfad6d3a326a4a1-1454x706.png" alt="Workflow complet : extraction PDF (Spring AI), représentation vectorielle (OpenAI) et découpage de texte (Elasticsearch) pour générer des embeddings." /><p>Enfin, nous émettrons une requête :</p>http :8080/rag/query question=="where do you place the reward card after obtaining it?" <p>Et nous obtiendrons une réponse pertinente :</p>After obtaining a Reward card, you place it facedown under the Hero card of the hero who received it.
Found at page: 28 of the manual<p>C'est bien ! Comment cela fonctionne-t-il ?</p><ul><li><p>Le client HTTP soumet la question à l'application Spring.</p></li><li><p>Spring AI obtient la représentation vectorielle de la question auprès d'OpenAI.</p></li><li><p>Cette intégration permet de rechercher des documents similaires dans les morceaux Elasticsearch stockés et d'extraire les documents les plus similaires.</p></li><li><p>Spring AI envoie ensuite la question et le contexte récupéré à OpenAI pour générer une réponse LLM.</p></li><li><p>Enfin, il renvoie la réponse générée et une référence au contexte récupéré.</p></li></ul><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfab41731851104f3/6a17e37e445de90e924d00aa/3799de6e8cb13ce49b9e136cfe593263030231a8-1464x1050.png" alt="Workflow complet :Spring IA et Open IA pour générer la réponse LLM à une question." /><p>Plongeons dans le code Java pour voir comment cela fonctionne réellement.</p><p>Tout d'abord, la classe <strong>Main</strong>: il s'agit d'une classe principale standard pour n'importe quelle application Spring Boot.</p>@SpringBootApplication
public class DemoApplication {
 	public static void main(String[] args) { 
     		SpringApplication.run(DemoApplication.class, args);
 	}
}<p>Il n'y a rien à voir. Continuons...</p><p>Ensuite, un contrôleur HTTP de base :</p>@RestController
class RagController {

   private final RagService rag;

   RagController(RagService rag) {
       this.rag = rag;
   }

   @PostMapping("/rag/ingest")
   ResponseEntity&lt;?&gt; ingestPDF(@RequestBody MultipartFile path) {
       rag.ingest(path.getResource());
       return ResponseEntity.ok().body("Done!");
   }

   @GetMapping("/rag/query")
   ResponseEntity&lt;?&gt; query(@RequestParam String question) {
       String response = rag.directRag(question);
       return ResponseEntity.ok().body(response);
   }
}<p>Le contrôleur appelle simplement un service que nous avons construit pour gérer l'ingestion de fichiers et leur écriture dans la base de données vectorielles Elasticsearch, puis pour faciliter les requêtes sur cette même base de données vectorielles.</p><p>Examinons le service :</p>@Service
class RagService {

   private final ElasticsearchVectorStore vectorStore;

   private final ChatClient ai;

   RagService(ElasticsearchVectorStore vectorStore, ChatClient.Builder clientBuilder) {
       this.vectorStore = vectorStore;
       this.ai = clientBuilder.build();
   }

   void ingest(Resource path) {
       PagePdfDocumentReader pdfReader = new PagePdfDocumentReader(path);
       List&lt;Document&gt; batch = new TokenTextSplitter().apply(pdfReader.read());
       vectorStore.add(batch);
   }

  // TBD
}<p>Ce code gère l'ensemble de l'ingestion : étant donné un Spring Framework <code>Resource</code>, qui est un conteneur d'octets, nous lisons les données PDF (présumées être un fichier <code>.PDF</code> - assurez-vous de le valider avant d'accepter des entrées arbitraires !) à l'aide de Spring AI <code>PagePdfDocumentReader</code>, puis nous les tokenisons à l'aide de Spring AI <code>TokenTextSplitter</code>, et enfin nous ajoutons les <code>List&lt;Document&gt;</code>s résultants à l'implémentation de <code>VectorStore</code>, <code>ElasticsearchVectorStore</code>.</p><p>Vous pouvez le confirmer en utilisant Kibana : après avoir envoyé un fichier au point de terminaison <code>/rag/ingest</code>, ouvrez votre navigateur sur <code>localhost:5601</code> et, dans le menu latéral de gauche, naviguez vers <code>Dev Tools</code>. Vous pouvez y émettre des requêtes pour interagir avec les données de l'instance Elasticsearch.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt45805a5b2da5e336/6a17e3803e03d70a584f2bda/c85e522f02f8b2da7462cd428dc7e952c9692542-1600x1040.png" alt="Comment créer une requête dans l’instance Elasticsearch." /><p>Emettez une requête comme celle-ci :</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt21d79210fe213b1e/6a17e382e3179163492d5767/00974a176cbce11e70fcab24fb4b3f9c6e205982-1600x1040.png" alt="Envoyer une requête dans la console Elasticsearch." /><p>Passons maintenant aux choses sérieuses : comment récupérer ces données en réponse à des requêtes d'utilisateurs ?</p><p>Voici un premier aperçu de la mise en œuvre de la requête, dans une méthode appelée <code>directRag</code>.</p>String directRag(String question) {
   // Query the vector store for documents related to the question
   List&lt;Document&gt; vectorStoreResult =
           vectorStore.doSimilaritySearch(SearchRequest.builder().query(question).topK(5)
                   .similarityThreshold(0.7).build());

   // Merging the documents into a single string
   String documents = vectorStoreResult.stream()
           .map(Document::getText)
           .collect(Collectors.joining(System.lineSeparator()));

   // Exit if the vector search didn't find any results
   if (documents.isEmpty()) {
       return "No relevant context found. Please change your question.";
   }

   // Setting the prompt with the context
   String prompt = """
           You're assisting with providing the rules of the tabletop game Runewars.
           Use the information from the DOCUMENTS section to provide accurate answers to the
           question in the QUESTION section.
           If unsure, simply state that you don't know.
          
           DOCUMENTS:
           """ + documents
           + """
           QUESTION:
           """ + question;


   // Calling the chat model with the question
   String response = ai
           .prompt()
           .user(prompt)
           .call()
           .content();

   return response +
           System.lineSeparator() +
           "Found at page: " +
           // Retrieving the first ranked page number from the document metadata
           vectorStoreResult.getFirst().getMetadata().get(PagePdfDocumentReader.METADATA_START_PAGE_NUMBER) +
           " of the manual";

}<p>Le code est assez simple, mais nous allons le décomposer en plusieurs étapes :</p><ol><li><p>Utilisez le site <code>VectorStore</code> pour effectuer une recherche de similitude.</p></li><li><p>Étant donné tous les résultats, récupérer les <code>Document</code>s sous-jacents de Spring AI et extraire leur texte, en les concaténant tous en un seul résultat.</p></li><li><p>Envoyer les résultats du site <code>VectorStore</code> au modèle, accompagnés d'une invite indiquant au modèle ce qu'il doit en faire et de la question de l'utilisateur. Attendez la réponse et renvoyez-la.</p></li></ol><p></p><p>Il s'agit de la <strong>RAG</strong> (retrieval augmented generation). Il s'agit de l'idée que nous utilisons des données provenant d'un magasin de vecteurs pour informer le traitement et l'analyse effectués par le modèle. Maintenant que vous savez comment faire, espérons que vous n'aurez jamais à le faire ! En tout cas, pas de cette manière : Les <a href="https://docs.spring.io/spring-ai/reference/api/advisors.html">conseillers de</a> Spring AI sont là pour simplifier encore davantage ce processus.</p><p>Advisors vous permet de pré- et post-traiter une requête vers un modèle donné, en plus de fournir une couche d'abstraction entre votre application et le magasin de vecteurs. Ajoutez la dépendance suivante à votre construction :
</p>&lt;dependency&gt;
   &lt;groupId&gt;org.springframework.ai&lt;/groupId&gt;
   &lt;artifactId&gt;spring-ai-advisors-vector-store&lt;/artifactId&gt;
&lt;/dependency&gt;<p>Ajoutez une autre méthode appelée <code>advisedRag(String question)</code> à la classe :</p>String advisedRag(String question) {
   return this.ai
           .prompt()
           .user(question)
           .advisors(new QuestionAnswerAdvisor(vectorStore))
           .call()
           .content();
}<p>Toute la logique du modèle RAG est encapsulée dans le site <code>QuestionAnswerAdvisor</code>. Pour le reste, tout se passe comme n'importe quelle demande adressée à <code>ChatModel</code>! C'est bien !</p><p>Vous pouvez <a href="https://github.com/xeraa/rag-with-java-springai-elasticsearch">obtenir le code complet sur GitHub</a>.</p><h2>Conclusion</h2><p>Dans cette démo, nous avons utilisé des images Docker et tout fait sur notre machine locale, mais l'objectif ici est de construire des systèmes et des services d'IA dignes d'une production. Il y a plusieurs choses que vous pouvez faire pour que cela devienne une réalité.</p><p>Tout d'abord, vous pouvez ajouter <a href="https://docs.spring.io/spring-boot/reference/actuator/index.html#actuator">Spring Boot Actuator</a> pour surveiller la consommation de jetons. Les jetons sont une approximation du coût de la complexité (et parfois du coût en dollars) d'une demande donnée au modèle.</p><p>Vous avez déjà l'Actuator Spring Boot sur le classpath, il suffit donc de spécifier les propriétés suivantes pour afficher toutes les métriques (capturées par le magnifique projet <a href="http://micrometer.io">Micrometer.io</a> ) :</p>management.endpoints.web.exposure.include=*<p>Redémarrez votre application. Effectuez une recherche, puis rendez-vous sur <a href="http://localhost:8080/actuator/metrics">:</a> http://localhost:8080/actuator/metrics. Recherchez "<code>token</code>" et vous verrez des informations sur les jetons utilisés par l'application. Veillez à garder un œil sur ce point. Vous pouvez bien sûr utiliser <a href="https://docs.micrometer.io/micrometer/reference/implementations/elastic.html">l' intégration de Micrometer pour Elasticsearch</a> pour pousser ces métriques et faire en sorte qu'Elasticsearch agisse comme votre base de données de séries temporelles de choix, aussi !</p><p>Il faut alors considérer que chaque fois que nous faisons une requête à un entrepôt de données comme Elasticsearch, ou à OpenAI, ou à d'autres services réseau, nous faisons de l'IO et - souvent - cette IO bloque les threads sur lesquels elle s'exécute. Java 21 et les versions ultérieures intègrent des <strong>threads virtuels</strong> non bloquants qui améliorent considérablement l'évolutivité. L'activer avec :
</p>spring.threads.virtual.enabled=true<p>Enfin, vous voudrez héberger votre application et vos données dans un endroit où elles pourront prospérer et évoluer. Nous sommes certains que vous avez déjà réfléchi à l'endroit où vous allez exécuter votre application, mais où allez-vous héberger vos données ? Pouvons-nous vous recommander l'<a href="https://cloud.elastic.co/">Elastic Cloud</a>? Il est sécurisé, privé, évolutif et doté de nombreuses fonctionnalités. Ce que nous préférons ? Si vous le souhaitez, vous pouvez obtenir l'édition Serverless dans laquelle Elastic porte le pager, pas vous !</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/spring-ai-elasticsearch-application</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/spring-ai-elasticsearch-application</guid>
    <category><![CDATA[IA]]></category>
    <dc:creator><![CDATA[Josh Long,Philipp Krenn,Laura Trotta]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt26b868ef618164c6/6a17e3830b0bedd68cdd3515/0771fb5b3d9234697cb868cd7d9d1b840000bf29-1280x720.png" length="0" type="image/png"/>
    <pubDate>Tue, 20 May 2025 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>