Les LLMs doivent se connecter au monde réel. Les outils LangChain4j, combinés à Apache Camel, facilitent cette tâche. Camel offre une intégration robuste, connectant votre LLM à tout service ou API. Cela permet à votre IA d’interagir avec des bases de données, des files d’attente, et plus encore, créant des applications vraiment puissantes. Nous allons explorer cette combinaison puissante et son potentiel.
Configuration de l’environnement de développement
- Ollama: Fournit un moyen d’exécuter localement de grands modèles de langage (LLMs). Vous pouvez exécuter de nombreux modèles, tels que LLama3, Mistral, CodeLlama, et bien d’autres sur votre machine, avec un support complet du CPU et du GPU.
- Visual Studio Code: Avec les plugins Kaoto, Java, et Quarkus installés.
- OpenJDK 21
- Maven
- Quarkus 3.17
- Quarkus Dev Services: Une fonctionnalité de Quarkus qui simplifie le développement et le test d’applications qui dépendent de services externes tels que des bases de données, des systèmes de messagerie, et d’autres ressources.
Vous pouvez télécharger le code complet sur le référentiel GitHub suivant.
Les instructions suivantes seront exécutées sur Visual Studio Code :
1. Création du projet Quarkus
mvn io.quarkus:quarkus-maven-plugin:3.17.6:create \
-DprojectGroupId=dev.mikeintoch \
-DprojectArtifactId=camel-agent-tools \
-Dextensions="camel-quarkus-core,camel-quarkus-langchain4j-chat,camel-quarkus-langchain4j-tools,camel-quarkus-platform-http,camel-quarkus-yaml-dsl"
2. Ajout des extensions Quarkus langchain4j
./mvnw quarkus:add-extension -Dextensions="io.quarkiverse.langchain4j:quarkus-langchain4j-core:0.22.0"
./mvnw quarkus:add-extension -Dextensions="io.quarkiverse.langchain4j:quarkus-langchain4j-ollama:0.22.0"
3. Configuration d’Ollama pour exécuter Ollama LLM
Ouvrez le fichier application.properties et ajoutez les lignes suivantes :
#Configurer le modèle local d'Ollama
quarkus.langchain4j.ollama.chat-model.model-id=qwen2.5:0.5b
quarkus.langchain4j.ollama.chat-model.temperature=0.0
quarkus.langchain4j.ollama.log-requests=true
quarkus.langchain4j.log-responses=true
quarkus.langchain4j.ollama.timeout=180s
Quarkus utilise Ollama pour exécuter LLM localement et aussi pour la configuration automatique des composants Apache Camel dans les étapes suivantes.
4. Création d’une route Apache Camel en utilisant Kaoto
Créez un nouveau dossier nommé route dans le dossier src/main/resources.
Créez un nouveau fichier dans le dossier src/main/resources/routes et nommez-le route-main.camel.yaml, puis Visual Studio Code ouvre l’éditeur visuel Kaoto.
Cliquez sur le bouton +Nouveau et une nouvelle route sera créée.
Cliquez sur les flèches circulaires pour remplacer le composant de minuterie.
Recherchez et sélectionnez le composant platform-http dans le catalogue.
Configurez les propriétés requises de platform-http:
- Définissez le chemin avec la valeur /camel/chat
Par défaut, platform-http sera en service sur le port 8080.
Cliquez sur l’icône Ajouter une étape dans la flèche après le composant platform-http.
Recherchez et sélectionnez le composant langchain4j-tools dans le catalogue.
Configurez les propriétés requises de langchain4j-tools:
- Définissez l’ID de l’outil avec la valeur mes-outils.
- Définissez les Tags avec store (La définition de tags sert à regrouper les outils à utiliser avec le LLM).
Vous devez traiter le message d’entrée de l’utilisateur pour que le composant langchain4j-tools puisse être utilisé, puis cliquez sur l’icône Ajouter une étape dans la flèche après le composant platform-http.
Recherchez et sélectionnez le composant Process dans le catalogue.
Configurez les propriétés requises:
- Définissez Ref avec la valeur createChatMessage.
Le composant de traitement utilisera la méthode createChatMessage que vous créerez à l’étape suivante.
5. Créez un processus pour envoyer les saisies utilisateur à LLM
Créez une nouvelle classe Java dans le dossier src/main/java nommée Bindings.java.
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
import org.apache.camel.BindToRegistry;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.builder.RouteBuilder;
import dev.langchain4j.data.message.ChatMessage;
import dev.langchain4j.data.message.SystemMessage;
import dev.langchain4j.data.message.UserMessage;
public class Bindings extends RouteBuilder{
@Override
public void configure() throws Exception {
// Les routes sont chargées dans des fichiers yaml.
}
@BindToRegistry(lazy=true)
public static Processor createChatMessage(){
return new Processor() {
public void process(Exchange exchange) throws Exception{
String payload = exchange.getMessage().getBody(String.class);
List messages = new ArrayList<>();
String systemMessage = """
You are an intelligent store assistant. Users will ask you questions about store product.
Your task is to provide accurate and concise answers.
In the store have shirts, dresses, pants, shoes with no specific category
%s
If you are unable to access the tools to answer the user's query,
Tell the user that the requested information is not available at this time and that they can try again later.
""";
String tools = """
You have access to a collection of tools
You can use multiple tools at the same time
Complete your answer using data obtained from the tools
""";
messages.add(new SystemMessage(systemMessage.formatted(tools)));
messages.add(new UserMessage(payload));
exchange.getIn().setBody(messages);
}
};
}
}
Cette classe aide à créer un Camel Processor pour transformer la saisie utilisateur en un objet pouvant gérer le composant langchain4j dans la route. Il fournit également le contexte LLM pour utiliser des outils et explique la tâche de l’agent.
6. Créer des outils Apache Camel pour utiliser avec LLM
Créez un nouveau fichier dans le dossier src/main/resources/routes et nommez-le route-tool-products.camel.yaml, et dans Visual Studio Code, ouvrez l’éditeur visuel Kaoto.
Cliquez sur le +Nouveau bouton, et une nouvelle route sera créée.
Cliquez sur les flèches circulaires pour remplacer le composant timer.
Recherchez et sélectionnez le composant langchain4j-tools dans le catalogue.
Configure langchain4j-tools, cliquez sur l’onglet All et recherchez les propriétés de l’Endpoint.
- Définissez l’ID de l’outil avec la valeur productsbycategoryandcolor.
- Définissez les Tags avec store (identique à celui de la route principale).
- Définissez la Description avec la valeur Interroger la base de données des produits par catégorie et couleur (une brève description de l’outil).
Ajoutez des paramètres qui seront utilisés par l’outil:
- NOM: catégorie, VALEUR: chaîne de caractères
- NOM: couleur, VALEUR: chaîne de caractères
Ces paramètres seront assignés par le LLM pour une utilisation dans l’outil et seront transmis via l’en-tête.
Ajoutez un composant SQL pour interroger la base de données, puis cliquez sur Ajouter une étape après le composant langchain4j-tools.
Recherchez et sélectionnez le composant SQL.
Configurez les propriétés SQL requises:
- Requête avec la valeur suivante.
Select name, description, category, size, color, price, stock from products where Lower(category)= Lower (:#category) and Lower(color) = Lower(:#color)
Gérez les paramètres à utiliser dans la requête, puis ajoutez un composant Convertir en-tête pour convertir les paramètres en un type d’objet correct.
Cliquez sur le bouton Ajouter une étape après langchain4j-tools, recherchez et sélectionnez la transformation Convertir l’en-tête en dans le catalogue.
Configurer les propriétés requises pour le composant:
- Nom avec la valeur catégorie
- Type avec la valeur String
Répétez les étapes avec les valeurs suivantes:
- Nom avec la valeur couleur
- Type avec la valeur String
En conséquence, voici à quoi ressemble la route:
Enfin, vous devez transformer le résultat de la requête en un objet que le LLM peut gérer; dans cet exemple, vous le transformez en JSON.
Cliquez sur le bouton Ajouter une étape après le composant SQL et ajoutez le composant Marshal.
Configurez les propriétés de format de données pour le composant Marshal et sélectionnez JSON dans la liste.
7. Configurez les services de développement Quarkus pour PostgreSQL
Ajoutez une extension Quarkus pour fournir PostgreSQL à des fins de développement, exécutez la commande suivante dans le terminal.
./mvnw quarkus:add-extension -Dextensions="io.quarkus:quarkus-jdbc-postgresql"
Ouvrez application.properties et ajoutez les lignes suivantes:
#Configuration des services de développement pour PostgreSQL
quarkus.datasource.db-kind=postgresql
quarkus.datasource.devservices.port=5432
quarkus.datasource.devservices.init-script-path=db/schema-init.sql
quarkus.datasource.devservices.db-name=store
Enfin, créez notre script SQL pour charger la base de données.
Créez un dossier nommé db dans src/main/resources, et dans ce dossier, créez un fichier nommé schema-init.sql avec le contenu suivant.
DROP TABLE IF EXISTS products;
CREATE TABLE IF NOT EXISTS products (
id SERIAL NOT NULL,
name VARCHAR(100) NOT NULL,
description varchar(150),
category VARCHAR(50),
size VARCHAR(20),
color VARCHAR(20),
price DECIMAL(10,2) NOT NULL,
stock INT NOT NULL,
CONSTRAINT products_pk PRIMARY KEY (id)
);
INSERT INTO products (name, description, category, size, color, price, stock)
VALUES
('Blue shirt', 'Cotton shirt, short-sleeved', 'Shirts', 'M', 'Blue', 29.99, 10),
('Black pants', 'Jeans, high waisted', 'Pants', '32', 'Black', 49.99, 5),
('White Sneakers', 'Sneakers', 'Shoes', '40', 'White', 69.99, 8),
('Floral Dress', 'Summer dress, floral print, thin straps.', 'Dress', 'M', 'Pink', 39.99, 12),
('Skinny Jeans', 'Dark denim jeans, high waist, skinny fit.', 'Pants', '28', 'Blue', 44.99, 18),
('White Sneakers', 'Casual sneakers, rubber sole, minimalist design.', 'Shoes', '40', 'White', 59.99, 10),
('Beige Chinos', 'Casual dress pants, straight cut, elastic waist.', 'Pants', '32', 'Beige', 39.99, 15),
('White Dress Shirt', 'Cotton shirt, long sleeves, classic collar.', 'Shirts', 'M', 'White', 29.99, 20),
('Brown Hiking Boots', 'Waterproof boots, rubber sole, perfect for hiking.', 'Shoes', '42', 'Brown', 89.99, 7),
('Distressed Jeans', 'Distressed denim jeans, mid-rise, regular fit.', 'Pants', '30', 'Blue', 49.99, 12);
8. Inclure notre Route à charger par le projet Quarkus
Camel Quarkus prend en charge plusieurs langages spécifiques au domaine (DSL) pour définir les Routes Camel.
Il est également possible d’inclure des routes DSL yaml, en ajoutant la ligne suivante dans le fichier application.properties.
# routes à charger
camel.main.routes-include-pattern = routes/*.yaml
Cela chargera toutes les routes du dossier src/main/resources/routes.
9. Tester l’application
Exécutez l’application à l’aide de Maven, ouvrez un terminal dans Visual Studio code, et exécutez la commande suivante.
mvn quarkus:dev
Une fois démarré, Quarkus appelle Ollama et exécute votre LLM localement, ouvre un terminal, et vérifie avec la commande suivante.
ollama ps
NAME ID SIZE PROCESSOR UNTIL
qwen2.5:0.5b a8b0c5157701 1.4 GB 100% GPU 4 minutes from now
De plus, Quarkus crée un conteneur exécutant PostgreSQL et crée une base de données et un schéma. Vous pouvez vous connecter en utilisant la commande psql
.
psql -h localhost -p 5432 -U quarkus -d store
Et interroger la table des produits :
store=# select * from products;
id | name | description | category | size | color | price | stock
----+--------------------+----------------------------------------------------+----------+------+-------+-------+-------
1 | Blue shirt | Cotton shirt, short-sleeved | Shirts | M | Blue | 29.99 | 10
2 | Black pants | Jeans, high waisted | Pants | 32 | Black | 49.99 | 5
3 | White Sneakers | Sneakers | Shoes | 40 | White | 69.99 | 8
4 | Floral Dress | Summer dress, floral print, thin straps. | Dress | M | Pink | 39.99 | 12
5 | Skinny Jeans | Dark denim jeans, high waist, skinny fit. | Pants | 28 | Blue | 44.99 | 18
6 | White Sneakers | Casual sneakers, rubber sole, minimalist design. | Shoes | 40 | White | 59.99 | 10
7 | Beige Chinos | Casual dress pants, straight cut, elastic waist. | Pants | 32 | Beige | 39.99 | 15
8 | White Dress Shirt | Cotton shirt, long sleeves, classic collar. | Shirts | M | White | 29.99 | 20
9 | Brown Hiking Boots | Waterproof boots, rubber sole, perfect for hiking. | Shoes | 42 | Brown | 89.99 | 7
10 | Distressed Jeans | Distressed denim jeans, mid-rise, regular fit. | Pants | 30 | Blue | 49.99 | 12
(10 rows)
Pour tester l’application, envoyez une requête POST à localhost:8080/camel/chat avec un corps de texte brut en entrée, demandant un produit.
Le LLM a peut-être halluciné. Veuillez réessayer en modifiant légèrement votre demande.
Vous pouvez voir comment le LLM utilise l’outil et obtient des informations depuis la base de données en utilisant la demande en langage naturel fournie. Le LLM identifie les paramètres et les envoie à l’outil. Si vous regardez dans le journal des requêtes, vous pouvez trouver les outils et les paramètres que le LLM utilise pour créer la réponse.
Conclusion
Vous avez exploré comment tirer parti de la puissance des modèles de langage (LLMs) dans vos flux d’intégration en utilisant Apache Camel et le composant LangChain4j. Nous avons vu comment cette combinaison vous permet d’intégrer de manière transparente des modèles de langage puissants dans vos routes Camel existantes, vous permettant de construire des applications sophistiquées capables de comprendre, de générer et d’interagir avec le langage humain.
Source:
https://dzone.com/articles/powering-llms-with-apache-camel-and-langchain4j