LLMs mit Apache Camel und LangChain4j betreiben

LLMs müssen mit der realen Welt verbunden werden. Die LangChain4j-Tools in Kombination mit Apache Camel machen dies einfach. Camel bietet eine robuste Integration, die Ihr LLM mit jedem Dienst oder API verbindet. Dies ermöglicht es Ihrer KI, mit Datenbanken, Warteschlangen und mehr zu interagieren und wirklich leistungsstarke Anwendungen zu erstellen. Wir werden diese leistungsstarke Kombination und ihr Potenzial erkunden.

Einrichten der Entwicklungsumgebung

  • Ollama: Bietet eine Möglichkeit, große Sprachmodelle (LLMs) lokal auszuführen. Sie können viele Modelle wie LLama3, Mistral, CodeLlama und viele andere auf Ihrem Rechner mit voller CPU- und GPU-Unterstützung ausführen.
  • Visual Studio Code: Mit installierten Kaoto, Java und Quarkus-Plugins.
  • OpenJDK 21
  • Maven
  • Quarkus 3.17
  • Quarkus Dev Services: Ein Feature von Quarkus, das die Entwicklung und Tests von Anwendungen vereinfacht, die auf externe Dienste wie Datenbanken, Nachrichtensysteme und andere Ressourcen angewiesen sind.

Sie können den vollständigen Code im folgenden GitHub-Repo herunterladen.

Die folgenden Anweisungen werden in Visual Studio Code ausgeführt:

1. Quarkus-Projekt erstellen

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. Hinzufügen von langchain4j Quarkus-Erweiterungen

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. Ollama konfigurieren, um Ollama LLM auszuführen

Öffnen Sie die application.properties Datei und fügen Sie die folgenden Zeilen hinzu:

Properties files

 

#Ollama lokales Modell konfigurieren
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 verwendet Ollama, um LLM lokal auszuführen und auch die Konfiguration für die Verwendung in Apache Camel-Komponenten in den folgenden Schritten automatisch zu verdrahten.

4. Erstellen einer Apache Camel-Route mit Kaoto

Erstellen Sie einen neuen Ordner mit dem Namen route im src/main/resources Ordner.

Erstellen Sie eine neue Datei im src/main/resources/routes Ordner und benennen Sie sie route-main.camel.yaml, und Visual Studio Code öffnet den Kaoto-Visual-Editor.

Klicken Sie auf die Schaltfläche +Neu, um eine neue Route zu erstellen.

Klicken Sie auf die kreisförmigen Pfeile, um das Timer-Element zu ersetzen.

Suchen und wählen Sie das Komponente platform-http aus dem Katalog aus.

Konfigurieren Sie die erforderlichen Eigenschaften von platform-http:

  • Setzen Sie den Pfad mit dem Wert /camel/chat

Standardmäßig wird platform-http auf Port 8080 ausgeführt.

Klicken Sie auf das Hinzufügen Schritt Symbol im Pfeil nach dem platform-http Komponente.

Suchen und wählen Sie die langchain4j-tools Komponente im Katalog aus.

Konfigurieren Sie die erforderlichen Eigenschaften von langchain4j-tools:

  • Setzen Sie Tool ID auf den Wert my-tools.
  • Setzen Sie Tags auf store (Das Definieren von Tags dient dazu, die Werkzeuge zur Verwendung mit der LLM zu gruppieren).

Sie müssen die Benutzereingabe-Nachricht an die langchain4j-tools-Komponente verarbeiten können, klicken Sie dann auf das Hinzufügen Schritt Symbol im Pfeil nach der platform-http Komponente.

Suchen und wählen Sie die Prozess Komponente im Katalog aus.

Konfigurieren Sie die erforderlichen Eigenschaften:

  • Setze Ref mit dem Wert createChatMessage.

Die Prozesskomponente wird die createChatMessage Methode verwenden, die du im folgenden Schritt erstellen wirst.

5. Erstelle einen Prozess, um Benutzereingaben an LLM zu senden

Erstelle eine neue Java-Klasse im src/main/java Ordner mit dem Namen 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 {
        // Routen werden in YAML-Dateien geladen.
    }


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

Diese Klasse hilft, einen Camel-Prozessor zu erstellen, um die Benutzereingaben in ein Objekt zu transformieren, das die langchain4j-Komponente in der Route verarbeiten kann. Sie gibt auch dem LLM Kontext zur Nutzung von Tools und erklärt die Aufgabe des Agenten.

6. Erstellen von Apache Camel-Tools zur Verwendung mit LLM

Erstelle eine neue Datei im src/main/resources/routes Ordner und nenne sie route-tool-products.camel.yaml, und öffne im Visual Studio Code den Kaoto-Visual-Editor.

Klicke auf den +Neu Knopf, und eine neue Route wird erstellt.

Klicke auf die kreisförmigen Pfeile, um die Timer Komponente zu ersetzen.

Suche und wähle die langchain4j-tools Komponente im Katalog aus.

Konfigurieren Sie langchain4j-tools, klicken Sie auf die Alle-Registerkarte und suchen Sie die Eigenschaften des Endpunkts.

  • Setzen Sie Tool Id mit dem Wert productsbycategoryandcolor.
  • Setzen Sie Tags mit store (das gleiche wie in der Hauptroute).
  • Setzen Sie Beschreibung mit dem Wert Abfrage von Datenbankprodukten nach Kategorie und Farbe (eine kurze Beschreibung des Werkzeugs).


Fügen Sie Parameter hinzu, die vom Tool verwendet werden:

  • NAME: kategorie, WERT: string
  • NAME: farbe, WERT: string

Diese Parameter werden vom LLM zur Verwendung im Tool zugewiesen und über den Header übergeben.

Fügen Sie eine SQL-Komponente hinzu, um die Datenbank abzufragen, und klicken Sie dann auf Schritt hinzufügen nach der langchain4j-tools-Komponente.

Durchsuchen und wählen Sie SQL-Komponente aus.

Konfigurieren Sie die erforderlichen SQL-Eigenschaften:

  • Abfrage mit dem folgenden Wert.
SQL

 

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

Verarbeiten Sie die Parameter, um sie in der Abfrage zu verwenden, und fügen Sie dann eine Konvertieren Header-Komponente hinzu, um die Parameter in den richtigen Objekttyp zu konvertieren.

Klicken Sie auf die Schritt hinzufügen-Taste nach langchain4j-tools, suchen und wählen Sie die Convert Header To-Transformation im Katalog aus.

Konfigurieren Sie die erforderlichen Eigenschaften für die Komponente:

  • Name mit dem Wert Kategorie
  • Typ mit dem Wert String


Wiederholen Sie die Schritte mit den folgenden Werten:

  • Name mit dem Wert Farbe
  • Typ mit dem Wert String

Das ist das Ergebnis, wie die Route aussieht:

Schließlich müssen Sie das Abfrageergebnis in ein Objekt umwandeln, das das LLM verarbeiten kann; in diesem Beispiel wandeln Sie es in JSON um.

Klicken Sie auf die Schritt hinzufügen Schaltfläche nach der SQL-Komponente und fügen Sie die Marshal-Komponente hinzu.

Konfigurieren Sie die Datenformat-Eigenschaften für die Marshal-Komponente und wählen Sie JSON aus der Liste aus.

7. Konfigurieren Sie Quarkus Dev Services für PostgreSQL

Fügen Sie die Quarkus-Erweiterung hinzu, um PostgreSQL für Entwicklungszwecke bereitzustellen, führen Sie den folgenden Befehl im Terminal aus.

Shell

 

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

Öffnen Sie application.properties und fügen Sie die folgenden Zeilen hinzu:

Properties files

 

#Konfigurieren von Devservices für 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

Erstellen Sie schließlich unser SQL-Skript, um die Datenbank zu laden.

Erstellen Sie einen Ordner namens db in src/main/resources, und erstellen Sie in diesem Ordner eine Datei namens schema-init.sql mit folgendem Inhalt.

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. Fügen Sie unsere Route hinzu, um vom Quarkus-Projekt geladen zu werden

Camel Quarkus unterstützt mehrere domänenspezifische Sprachen (DSLs) zur Definition von Camel-Routen.

Es ist auch möglich, YAML DSL-Routen einzufügen, indem man die folgende Zeile in die application.properties-Datei hinzufügt.

Properties files

 

# zu ladende Routen
camel.main.routes-include-pattern = routes/*.yaml

Dies lädt alle Routen im src/main/resources/routes-Ordner.

9. Testen Sie die App

Führen Sie die Anwendung mit Maven aus, öffnen Sie ein Terminal in Visual Studio Code und führen Sie den folgenden Befehl aus.

Shell

 

mvn quarkus:dev

Sobald es gestartet ist, ruft Quarkus Ollama auf und führt Ihr LLM lokal aus, öffnet ein Terminal und überprüft mit dem folgenden Befehl.

Shell

 

ollama ps

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

Außerdem erstellt Quarkus einen Container, der PostgreSQL ausführt, und erstellt eine Datenbank und ein Schema. Sie können sich mit dem psql-Befehl verbinden.

Shell

 

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

Und die Produkttabelle abfragen:

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)

Um die App zu testen, senden Sie eine POST-Anfrage an localhost:8080/camel/chat mit einem Klartext-Body-Eingang, in dem Sie nach einem Produkt fragen.

Das LLM könnte halluziniert haben. Bitte versuchen Sie es erneut und ändern Sie Ihre Anfrage leicht.

Sie können sehen, wie das LLM das Tool verwendet und Informationen aus der Datenbank anhand der bereitgestellten Anfrage in natürlicher Sprache abruft. Das LLM identifiziert die Parameter und sendet sie an das Tool. Wenn Sie im Anfrageprotokoll nachsehen, können Sie die Tools und Parameter finden, die das LLM verwendet, um die Antwort zu erstellen.

Fazit

Sie haben erkundet, wie Sie die Leistung von LLMs in Ihren Integrationsflüssen mithilfe von Apache Camel und dem LangChain4j-Komponente nutzen können. Wir haben gesehen, wie diese Kombination es Ihnen ermöglicht, leistungsstarke Sprachmodelle nahtlos in Ihre vorhandenen Camel-Routen zu integrieren, sodass Sie anspruchsvolle Anwendungen entwickeln können, die menschliche Sprache verstehen, generieren und damit interagieren können.

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