J'ai construit une application RAG, puis je lui ai demandé quelle voiture j'aime. Elle ne savait pas.

Je développe un outil de chat documentaire appelé Kenning. Il utilise le RAG (Retrieval-Augmented Generation) pour permettre aux utilisateurs de poser des questions sur les fichiers téléchargés.

J'ai construit l'intégralité du pipeline à partir de zéro en utilisant :

  • Java 21 et Spring Boot
  • Spring AI
  • PostgreSQL avec pgvector
  • Ollama (faisant tourner llama3.2:3b et nomic-embed-text)
  • Docker Compose

Le pipeline fonctionne de la manière suivante : Téléchargement du fichier → Extraction du texte → Découpage du texte (chunking) → Conversion des segments en vecteurs → Stockage dans pgvector → Recherche de segments similaires → Envoi des segments + question au modèle → Obtention de la réponse avec les sources.

Le système fonctionnait, mais j'ai rencontré deux échecs différents. Ils semblaient identiques, mais les causes étaient distinctes.

Échec 1 : Le modèle était confus. J'ai demandé : « Quel modèle d'embedding ce projet utilise-t-il ? » Le document indiquait explicitement la réponse. Le modèle a récupéré le texte correct. Pourtant, il a répondu qu'il ne savait pas, tout en répétant le nom correct du modèle dans la phrase suivante.

Ma théorie : Le modèle 3B est trop petit. Il a récupéré les bonnes données mais n'a pas pu formuler une réponse avec assurance. Un modèle plus large réglerait probablement ce problème.

Échec 2 : Le modèle n'a rien trouvé. J'ai demandé : « Quelle marque de voiture est-ce que j'aime ? » Le document mentionnait que j'aime BMW. Mais le système n'a retourné aucun résultat. Le score de similarité était trop bas pour franchir mon seuil.

Ma théorie : La dilution des segments (chunk dilution). Mon document de test était court. Il mélangeait de nombreux sujets comme Spring AI, OAuth2 et ma préférence automobile dans un seul segment. Le vecteur de ce segment s'est retrouvé dilué à travers tous ces sujets. Une question spécifique sur les voitures a perdu de sa force face à un segment trop large. Une meilleure stratégie de découpage (chunking) corrigerait cela.

Leçons apprises :

  • Les petits modèles ont des limites de raisonnement.
  • Le découpage naïf affecte la précision de la récupération.
  • Déboguer le « pourquoi » est plus important que de simplement corriger l'erreur.

L'architecture tient la route. Elle est lente et parfois erronée, mais la boucle est bouclée.

Source : https://dev.to/mido-dev/i-built-a-rag-app-then-asked-it-what-car-i-like-it-didnt-know-583n

Communauté d'apprentissage optionnelle : https://t.me/GyaanSetuAi