@herbertbeckman - LinkedIn
@rndtavares - LinkedIn
Agent IA fiable en production avec Java Quarkus Langchain4j - Partie 1 - AI as Service (cet article)
Agent IA fiable en Java Quarkus Langchain4j prod - Partie 2 - Mémoire (à venir)
Agent IA fiable en production avec Java Quarkus Langchain4j - Partie 3 - RAG (à venir)
Agent IA de confiance en production avec Java Quarkus Langchain4j - Partie 4 - Garde-corps (à venir)
Chaque fois que nous assistons à un boom des technologies émergentes, les entreprises sont impatientes de les appliquer et de récolter les résultats tant attendus d'un point de vue commercial. C'est la course à l'innovation et la lutte pour les avantages du premier arrivé. Au milieu de cette course, les entreprises, auparavant anxieuses, finissent souvent par abandonner en raison d'une série de facteurs, l'un des principaux étant la fiabilité d'un système en général. L'intelligence artificielle (IA) subit actuellement l'une de ses plus grandes épreuves de résistance et notre travail en tant que développeurs de logiciels est de démontrer aux entreprises que, oui, il est possible de réaliser une série de tâches et de processus avec l'utilisation consciente et correcte de l'IA. . Dans cet article, nous démontrerons, en 3 parties, quelles sont les fonctionnalités et les processus que nous devons avoir dans un agent d'IA fiable en production pour qu'une entreprise obtienne les résultats tant attendus, ainsi que mettre en œuvre ensemble certains concepts utilisés sur le marché. . Nous détaillerons également les points d'attention de cette solution et vous demanderons, en tant que développeur, de réaliser un maximum de tests et de nous faire un maximum de retours afin qu'ensemble, nous puissions encore améliorer cette compréhension.
L'une des premières questions que vous pourriez vous poser est de savoir en quoi un agent diffère des autres cas d'utilisation de l'IA. L'Agent a des fonctionnalités plus liées à l'automatisation, tandis que les autres ont leurs activités orientées vers l'assistance et l'optimisation du temps. Ci-dessous, je détaille chacun des cas d'utilisation plus en détail.
Les assistants peuvent nous aider et nous faire gagner beaucoup de temps en vérifiant les informations et en étant une bonne source d'échange de connaissances. Ils parlent À PROPOS des sujets les plus variés et peuvent être utiles lorsque nous avons besoin d'un raisonnement clair pour analyser les prémisses d'un argument. Bien sûr, ils ont bien plus de pouvoirs que cela, mais je veux que vous vous concentriez sur ce que fait un assistant : il vous parle et c'est tout. Il UNIQUEMENT peut parler, résumer, détailler, etc. A titre d'exemples nous avons : ChatGPT, Claude AI et Gemini.
Les copilotes sont un peu plus puissants que les assistants. Ils peuvent effectivement faire quelque chose, une action plus concrète comme changer un texte et/ou suggérer des modifications en temps réel, mais aussi donner des conseils lors d'une modification et/ou d'un événement se déroulant dans un contexte. Cependant, comme dit précédemment, cela dépend du contexte pour faire cela et il ne dispose pas toujours de toutes les informations nécessaires pour faire une bonne suggestion, cela dépend aussi de votre autorisation expresse, créant une dépendance directe vis-à-vis de l'utilisateur. De bons exemples sont : Github Copilot, Codium et Microsoft Copilot.
L’objectif principal des agents est d’effectuer des tâches avec des objectifs clairs. L’accent est mis sur l’automatisation, c’est-à-dire qu’ils effectuent des travaux concrets de manière autonome. Tout cela n’est possible que grâce aux outils que nous mettons à leur disposition. L'Agent n'est pas le LLM lui-même, mais plutôt son application qui coordonne ce LLM. Comprenez le LLM comme le cerveau du système qui prend les décisions et son application en tant que membres du corps de ce cerveau. Quel est l'intérêt de penser à prendre un verre d'eau si je ne peux pas l'atteindre avec ma main ? Votre agent donne à LLM le pouvoir de faire quelque chose de manière sûre, vérifiable et, surtout, fiable.
Dans cette première partie de l'article, nous implémenterons l'AIService dans le projet, qui n'est rien de plus que la couche d'interface avec notre fournisseur d'IA. Dans ce projet, nous utilisons le LLM d'OpenAI, mais vous pouvez ajouter votre fournisseur préféré et ajuster les dépendances en fonction de celui-ci.
Maintenant que nous avons les concepts bien définis et que nous savons ce que nous allons faire ici, passons au codage !
Créez un projet Quarkus, en choisissant votre gestionnaire de dépendances et vos extensions dans Quarkus - Commencez à coder.
Nous utiliserons maven comme gestionnaire de dépendances du projet. Vous trouverez ci-dessous les dépendances initiales que nous avons ajoutées.
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-websockets-next</artifactId> </dependency> <dependency> <groupId>io.quarkiverse.langchain4j</groupId> <artifactId>quarkus-langchain4j-core</artifactId> <version>0.20.3</version> </dependency> <dependency> <groupId>io.quarkiverse.langchain4j</groupId> <artifactId>quarkus-langchain4j-openai</artifactId> <version>0.20.3</version> </dependency>
Ajoutez les propriétés suivantes au fichier src/main/resources/application.properties :
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-websockets-next</artifactId> </dependency> <dependency> <groupId>io.quarkiverse.langchain4j</groupId> <artifactId>quarkus-langchain4j-core</artifactId> <version>0.20.3</version> </dependency> <dependency> <groupId>io.quarkiverse.langchain4j</groupId> <artifactId>quarkus-langchain4j-openai</artifactId> <version>0.20.3</version> </dependency>
Remplacez YOUR_OPENAPI_KEY_HERE par la clé (apiKey) que vous avez enregistrée sur la plateforme OpenAI.
CONSEIL : créez une variable d'environnement dans votre IDE puis modifiez la propriété quarkus.langchain4j.openai.api-key en :
quarkus.tls.trust-all=true quarkus.langchain4j.timeout=60s quarkus.langchain4j.openai.api-key=YOUR_OPENAI_API_KEY_HERE
Nous devons d'abord créer notre AIService, qui sera la classe chargée de donner une "personnalité" à notre agent. Pour cela, dans le répertoire src/main/java/
quarkus.langchain4j.openai.api-key=${OPEN_API_KEY:NAO_ENCONTREI_A_VAR}
Comme vous pouvez le voir sur notre SystemPrompt (@SystemMessage), nous avons créé un agent spécialisé dans le football.
Maintenant que nous avons créé notre agent, nous devons créer la classe qui gérera notre conversation avec lui. Pour ce faire, dans le répertoire src/main/java/
package <seupacote>; import dev.langchain4j.service.SystemMessage; import dev.langchain4j.service.UserMessage; import io.quarkiverse.langchain4j.RegisterAiService; import jakarta.enterprise.context.ApplicationScoped; @ApplicationScoped @RegisterAiService public interface Agent { @SystemMessage(""" Você é um agente especializado em futebol brasileiro, seu nome é FutAgentBR Você sabe responder sobre os principais títulos dos principais times brasileiros e da seleção brasileira Sua resposta precisa ser educada, você pode deve responder em Português brasileiro e de forma relevante a pergunta feita Quando você não souber a resposta, responda que você não sabe responder nesse momento mas saberá em futuras versões. """) String chat(@UserMessage String message); }
Vous pouvez désormais parler à votre agent, qui est actuellement encore assistant, via l'interface utilisateur de quarkus dev. Voici quelques tirages pour vous guider :
Passons maintenant au détail qui fait toute la différence entre un agent et un assistant. Nous donnerons à notre agent la possibilité d'effectuer des tâches et/ou des processus, en ajoutant des outils (appel de fonction). Avant de coder cela, nous avons un bref graphique démontrant comment l'appel d'un outil fonctionne de manière macro.
Source : surface.ai
Maintenant que nous savons comment fonctionne un appel d'outil, nous devons créer la classe avec nos outils, vous pouvez également créer plusieurs classes différentes pour chaque outil. Dans cet exemple nous allons créer une « ToolBox », c'est-à-dire une boîte à outils, regroupant les outils que notre agent peut utiliser. Voici le code :
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-websockets-next</artifactId> </dependency> <dependency> <groupId>io.quarkiverse.langchain4j</groupId> <artifactId>quarkus-langchain4j-core</artifactId> <version>0.20.3</version> </dependency> <dependency> <groupId>io.quarkiverse.langchain4j</groupId> <artifactId>quarkus-langchain4j-openai</artifactId> <version>0.20.3</version> </dependency>
Peu de temps après, nous avons ajouté une annotation à notre agent l'informant des outils dont il dispose, via l'annotation @ToolBox(AgentTools.class). Cela ressemble à ceci :
quarkus.tls.trust-all=true quarkus.langchain4j.timeout=60s quarkus.langchain4j.openai.api-key=YOUR_OPENAI_API_KEY_HERE
Vous pouvez maintenant demander à votre agent quelle heure il est, quelle est la date du jour, lui demander d'additionner deux nombres et de calculer la racine carrée. Ce sont les outils que nous utilisons ici pour illustrer, mais vous pouvez les remplacer par un appel HTTP, une fonction de hachage, une requête SQL, etc. Les possibilités ici sont nombreuses.
Voici une capture d'écran d'un des tests effectués après ajout des outils :
Comme vous pouvez le voir, pour chaque appel d'outil, nous aurons un journal, montrant que LLM a effectivement appelé le code que nous l'avons autorisé à exécuter.
Ceci conclut le début de la création dans notre Agent. Nous ajouterons prochainement de la mémoire à notre Agent dans la partie 2, le RAG (Retrieval-Augmented Generation) dans la partie 3 et les Guardrails dans la partie 4 de cet article. J'espère que cela vous a plu et à bientôt.
Mais vous pouvez maintenant suivre et voir TOUS le code de l'article dans ce référentiel GitHub.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!