Подключение LLM с помощью Apache Camel и LangChain4j

LLM-модели должны быть связаны с реальным миром. Инструменты LangChain4j, совмещенные с Apache Camel, делают это легким. Camel обеспечивает надежную интеграцию, соединяя вашу LLM с любым сервисом или API. Это позволяет вашему искусственному интеллекту взаимодействовать с базами данных, очередями и многим другим, создавая по-настоящему мощные приложения. Мы исследуем эту мощную комбинацию и ее потенциал.

Настройка среды разработки

  • Ollama: Предоставляет возможность запускать большие языковые модели (LLM) локально. Вы можете запускать множество моделей, таких как LLama3, Mistral, CodeLlama и многие другие на своем компьютере с полной поддержкой процессора и графического ускорителя.
  • Visual Studio Code: С установленными плагинами Kaoto, Java и Quarkus.
  • OpenJDK 21
  • Maven
  • Quarkus 3.17
  • Сервисы разработки Quarkus: Особенность Quarkus, упрощающая разработку и тестирование приложений, использующих внешние сервисы, такие как базы данных, системы обмена сообщениями и другие ресурсы.

Вы можете скачать полный код в следующем репозитории GitHub.

Следующие инструкции будут выполнены в Visual Studio Code:

1. Создание проекта Quarkus

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. Добавление расширений langchain4j для Quarkus

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 для запуска LLM Ollama

Откройте файл application.properties и добавьте следующие строки:

Properties files

 

#Настройка локальной модели 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 использует Ollama для запуска LLM локально и также автоматически настраивает конфигурацию для использования в компонентах Apache Camel на следующих этапах.

4. Создание маршрута Apache Camel с использованием Kaoto

Создайте новую папку с именем route в папке src/main/resources.

Создайте новый файл в папке src/main/resources/routes и назовите его route-main.camel.yaml, после чего Visual Studio Code откроет визуальный редактор Kaoto.

Нажмите на кнопку +Новый, и будет создан новый маршрут.

Нажмите на круглые стрелки, чтобы заменить компонент таймера.

Поиск и выбор компонента platform-http из каталога.

Настройте необходимые свойства platform-http:

  • Установите путь со значением /camel/chat

По умолчанию platform-http будет работать на порту 8080.

Нажмите на  значок Добавить шаг в стрелке после компонента platform-http.

Поиск и выбор компонента langchain4j-tools в каталоге.

Настройте необходимые свойства langchain4j-tools:

  • Установите Идентификатор инструмента со значением my-tools.
  • Установите Теги со значением store (Определение меток необходимо для группировки инструментов для использования с LLM).

Вы должны обработать сообщение ввода пользователя для компонента langchain4j-tools , а затем нажмите на значок Добавить шаг в стрелке после компонента platform-http.

Поиск и выбор компонента Процесс в каталоге.

Настройте необходимые свойства:

  • Установите Ref со значением createChatMessage.

Компонент process будет использовать метод createChatMessage, который вы создадите на следующем шаге.

5. Создайте процесс для отправки пользовательского ввода в LLM

Создайте новый Java-класс в папке src/main/java с именем 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 {
        // Маршруты загружаются из 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);
            }
        };
    }
}

Этот класс помогает создать Camel Processor для преобразования пользовательского ввода в объект, который может обрабатывать компонент langchain4j в маршруте. Он также предоставляет LLM контекст для использования инструментов и объясняет задачу агента.

6. Создание инструментов Apache Camel для использования с LLM

Создайте новый файл в папке src/main/resources/routes и назовите его route-tool-products.camel.yaml, и в Visual Studio Code откройте визуальный редактор Kaoto.

Нажмите на кнопку +New, и будет создан новый маршрут.

Нажмите на круговые стрелки, чтобы заменить компонент timer.

Найдите и выберите компонент langchain4j-tools в каталоге.

Настройте langchain4j-tools, нажмите на вкладку Все и найдите свойства конечной точки.

  • Установите ID инструмента со значением productsbycategoryandcolor.
  • Установите Теги с магазином (так же, как в основном маршруте).
  • Установите Описание со значением Запрос продуктов базы данных по категории и цвету (краткое описание инструмента).


Добавьте параметры, которые будут использоваться инструментом:

  • ИМЯ: категория, ЗНАЧЕНИЕ: строка
  • ИМЯ: цвет, ЗНАЧЕНИЕ: строка

Эти параметры будут назначены LLM для использования в инструменте и передаются через заголовок.

Добавьте компонент SQL для запроса базы данных, затем нажмите на Добавить шаг после компонента langchain4j-tools.

Найдите и выберите SQL компонент.

Настройте необходимые свойства SQL:

  • Запрос со следующим значением.
SQL

 

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

Обработайте параметры для использования в запросе, затем добавьте компонент Преобразовать заголовок для преобразования параметров в правильный тип объекта.

Нажмите на кнопку Добавить шаг после langchain4j-tools, найдите и выберите преобразование Преобразовать заголовок в в каталоге.

Настройте необходимые свойства для компонента:

  • Имя со значением category
  • Тип со значением String


Повторите шаги с следующими значениями:

  • Имя со значением color
  • Тип со значением String

В итоге маршрут выглядит следующим образом:

Наконец, вам нужно преобразовать результат запроса в объект, который может обрабатывать LLM; в этом примере вы преобразуете его в JSON.

Нажмите кнопку Добавить шаг после SQL-компонента и добавьте компонент Marshal.

Настройте свойства формата данных для Marshal и выберите JSon из списка.

7. Настройте Quarkus Dev Services для PostgreSQL

Добавьте расширение Quarkus для предоставления PostgreSQL для разработки, выполните следующую команду в терминале.

Shell

 

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

Откройте application.properties и добавьте следующие строки:

Properties files

 

#Настройка devservices для 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

Наконец, создайте наш SQL-скрипт для загрузки базы данных.

Создайте папку с именем db в src/main/resources, и в этой папке создайте файл с именем schema-init.sql с следующим содержимым.

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. Включите наш маршрут, чтобы он был загружен проектом Quarkus

Camel Quarkus поддерживает несколько языков, специфичных для области (DSL), для определения маршрутов Camel.

Также возможно включить маршруты yaml DSL, добавив следующую строку в файл application.properties.

Properties files

 

# маршруты для загрузки
camel.main.routes-include-pattern = routes/*.yaml

Это загрузит все маршруты из папки src/main/resources/routes.

9. Протестируйте приложение

Запустите приложение с помощью Maven, откройте терминал в Visual Studio Code и выполните следующую команду.

Shell

 

mvn quarkus:dev

Как только оно запустится, Quarkus вызывает Ollama и запускает вашу LLM локально, открывает терминал и проверяет с помощью следующей команды.

Shell

 

ollama ps

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

Кроме того, Quarkus создает контейнер с PostgreSQL и создает базу данных и схему. Вы можете подключиться, используя команду psql.

Shell

 

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

И запросить таблицу продуктов:

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)

Чтобы протестировать приложение, отправьте POST-запрос на localhost:8080/camel/chat с текстовым телом запроса, запрашивая какой-либо продукт.

LLM могла ошибиться. Пожалуйста, попробуйте снова, немного изменив ваш запрос.

Вы можете увидеть, как LLM использует инструмент и получает информацию из базы данных, используя предоставленный запрос на естественном языке. LLM определяет параметры и отправляет их инструменту. Если вы посмотрите в журнал запросов, вы можете найти инструменты и параметры, которые LLM использует для создания ответа.

Заключение

Вы исследовали, как использовать возможности LLM в ваших интеграционных потоках с помощью Apache Camel и компонента LangChain4j. Мы увидели, как это сочетание позволяет вам бесшовно интегрировать мощные языковые модели в ваши существующие маршруты Camel, позволяя создавать сложные приложения, которые могут понимать, генерировать и взаимодействовать с человеческим языком.

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