Het aandrijven van LLM’s met Apache Camel en LangChain4j

LLM’s moeten verbinding maken met de echte wereld. LangChain4j-tools, in combinatie met Apache Camel, maken dit eenvoudig. Camel biedt robuuste integratie, waardoor je LLM verbinding kan maken met elke service of API. Dit stelt je AI in staat om te interageren met databases, wachtrijen en meer, waardoor echt krachtige toepassingen ontstaan. We zullen deze krachtige combinatie en het potentieel ervan verkennen.

Instellen van de Ontwikkelomgeving

  • Ollama: Biedt een manier om grote taalmodellen (LLM’s) lokaal uit te voeren. Je kunt veel modellen draaien, zoals LLama3, Mistral, CodeLlama en vele anderen op je machine, met volledige CPU- en GPU-ondersteuning.
  • Visual Studio Code: Met Kaoto, Java en Quarkus-plug-ins geïnstalleerd.
  • OpenJDK 21
  • Maven
  • Quarkus 3.17
  • Quarkus Dev Services: Een functie van Quarkus die de ontwikkeling en het testen van toepassingen vereenvoudigt die afhankelijk zijn van externe services zoals databases, messaging-systemen en andere bronnen.

Je kunt de complete code downloaden in de volgende GitHub-repo.

De volgende instructies worden uitgevoerd in Visual Studio Code:

1. Het Quarkus-project maken

Shell

 

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. Toevoegen van langchain4j Quarkus-extensies

Shell

 

./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. Configureer Ollama om Ollama LLM uit te voeren

Open het application.properties bestand en voeg de volgende regels toe:

Properties files

 

#Configureer het lokale model van 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 gebruikt Ollama om LLM lokaal uit te voeren en ook automatisch de configuratie voor gebruik in Apache Camel-componenten in de volgende stappen te verbinden.

4. Een Apache Camel-route maken met Kaoto

Maak een nieuwe map met de naam route in de src/main/resources map.

Maak een nieuw bestand in de src/main/resources/routes map en noem het route-main.camel.yaml, en Visual Studio Code opent de Kaoto visuele editor.

Klik op de knop +Nieuw en er wordt een nieuwe route gemaakt.

Klik op de cirkelvormige pijlen om het timeronderdeel te vervangen.

Zoek en selecteer het component platform-http uit de catalogus.

Configureer de vereiste eigenschappen van platform-http:

  • Stel het pad in met de waarde /camel/chat

Standaard zal platform-http bereikbaar zijn op poort 8080.

Klik op het Voeg Stap Pictogram Toe in de pijl na het platform-http component.

Zoek en selecteer het langchain4j-tools component in de catalogus.

Configureer de benodigde langchain4j-tools eigenschappen:

  • Stel Tool Id  in met de waarde my-tools.
  • Stel Tags in op opslaan (Het definiëren van tags is voor het groeperen van de tools om te gebruiken met de LLM).

Je moet de gebruikersinvoer boodschap verwerken naar het langchain4j-tools  component om te kunnen gebruiken, klik vervolgens op het Voeg Stap Pictogram Toe in de pijl na het platform-http component.

Zoek en selecteer het Process component in de catalogus.

Configureer de benodigde eigenschappen:

  • Stel Ref in met de waarde createChatMessage.

De process component zal de createChatMessage methode gebruiken die je zal creëren in de volgende stap.

5. Maak een Proces om Gebruikersinvoer naar LLM te Sturen

Maak een nieuwe Java-klasse in de src/main/java map met de naam Bindings.java.

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 {
        // Routes worden geladen in yaml-bestanden.
    }


    @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);
            }
        };
    }
}

Deze klasse helpt bij het maken van een Camel Processor om de gebruikersinvoer om te zetten in een object dat de langchain4j component in de route kan verwerken. Het geeft ook de LLM-context voor het gebruik van tools en legt de taak van de Agent uit.

6. Het Creëren van Apache Camel Tools voor Gebruik met LLM

Maak een nieuw bestand in de src/main/resources/routes map en noem het route-tool-products.camel.yaml, en in Visual Studio Code, open de Kaoto visuele editor.

Klik op de +Nieuw knop, en er zal een nieuwe route worden gemaakt.

Klik op de cirkelvormige pijlen om het timer component te vervangen.

Zoek en selecteer het langchain4j-tools component in de catalogus.

Configureer langchain4j-tools, klik op het Alle tabblad en zoek naar Eindpunt eigenschappen.

  • Stel Tool Id in met de waarde productsbycategoryandcolor.
  • Stel Tags in op winkel (Hetzelfde als in de hoofdroute).
  • Stel Beschrijving in met de waarde Query database producten op categorie en kleur (een korte beschrijving van de tool).


Voeg parameters toe die door de tool zullen worden gebruikt:

  • NAAM: categorie, WAARDE: tekenreeks
  • NAAM: kleur, WAARDE: tekenreeks

Deze parameters worden toegewezen door de LLM voor gebruik in de tool en worden doorgegeven via de header.

Voeg een SQL-component toe om de database te bevragen, klik vervolgens op Stap toevoegen na de langchain4j-tools component.

Zoek en selecteer de SQL-component.

Configureer vereiste SQL-eigenschappen:

  • Query met de volgende waarde.
SQL

 

Select  name, description, category, size, color, price, stock from products where Lower(category)= Lower (:#category) and Lower(color) = Lower(:#color) 

Behandel parameters om te gebruiken in de query, voeg dan een Converteer Header-component toe om parameters naar het juiste objecttype te converteren.

Klik op de Stap toevoegen knop na langchain4j-tools, zoek en selecteer de Converteer Header Naar transformatie in de catalogus.

Configureer de vereiste eigenschappen voor de component:

  • Naam met de waarde categorie
  • Type met de waarde String


Herhaal de stappen met de volgende waarden:

  • Naam met de waarde kleur
  • Type met de waarde String

Als gevolg hiervan ziet de route er als volgt uit:

Tenslotte moet je het queryresultaat omzetten in een object dat de LLM kan verwerken; in dit voorbeeld zet je het om in JSON.

Klik op de Stap toevoegen knop na de SQL-component en voeg de Marshal-component toe.

Configureer de gegevensindelingseigenschappen voor de Marshal en selecteer JSon uit de lijst.

7. Configureer Quarkus Dev Services voor PostgreSQL

Voeg Quarkus-extensie toe om PostgreSQL te leveren voor ontwikkelingsdoeleinden, voer het volgende commando uit in de terminal.

Shell

 

./mvnw quarkus:add-extension -Dextensions="io.quarkus:quarkus-jdbc-postgresql"

Open application.properties en voeg de volgende regels toe:

Properties files

 

#Configureren van devservices voor 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

Tenslotte, maak ons SQL-script om de database te laden.

Maak een map met de naam db  in src/main/resources, en maak in deze map een bestand met de naam schema-init.sql  met de volgende inhoud.

SQL

 

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. Voeg onze Route toe om te worden geladen door het Quarkus Project

Camel Quarkus ondersteunt verschillende domeinspecifieke talen (DSL’s) bij het definiëren van Camel-routes.

Het is ook mogelijk om yaml DSL-routes op te nemen door de volgende regel toe te voegen aan het application.properties-bestand.

Properties files

 

# routes om te laden
camel.main.routes-include-pattern = routes/*.yaml

Dit zal alle routes in de map src/main/resources/routes laden.

9. Test de App

Voer de toepassing uit met Maven, open een Terminal in Visual Studio Code en voer de volgende opdracht uit.

Shell

 

mvn quarkus:dev

Zodra het is gestart, roept Quarkus Ollama aan en voert uw LLM lokaal uit, opent een terminal en controleert met de volgende opdracht.

Shell

 

ollama ps

NAME            ID              SIZE      PROCESSOR    UNTIL
qwen2.5:0.5b    a8b0c5157701    1.4 GB    100% GPU     4 minutes from now

Daarnaast maakt Quarkus een container met PostgreSQL en maakt een database en schema aan. U kunt verbinding maken met de psql-opdracht.

Shell

 

psql -h localhost -p 5432 -U quarkus -d store

En query de products-tabel:

Shell

 

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)

Om de app te testen, stuur een POST-verzoek naar localhost:8080/camel/chat met een platte tekst lichaamsinvoer en vraag om een bepaald product.

De LLM kan gehallucineerd hebben. Probeer het opnieuw door uw verzoek iets aan te passen. 

U kunt zien hoe de LLM de tool gebruikt en informatie uit de database haalt met behulp van het natuurlijke taalverzoek dat is verstrekt. LLM identificeert de parameters en stuurt ze naar de tool. Als u in het verzoeklogboek kijkt, kunt u de tools en parameters vinden die LLM gebruikt om het antwoord te maken.

Conclusie

Je hebt onderzocht hoe je de kracht van LLM’s kunt benutten binnen je integratiestromen met behulp van Apache Camel en de LangChain4j-component. We hebben gezien hoe deze combinatie je in staat stelt om krachtige taalmodellen naadloos te integreren in je bestaande Camel-routes, waardoor je geavanceerde applicaties kunt bouwen die menselijke taal kunnen begrijpen, genereren en ermee kunnen interageren.

Source:
https://dzone.com/articles/powering-llms-with-apache-camel-and-langchain4j