LLM은 실제 세계와 연결될 필요가 있습니다. LangChain4j 도구와 Apache Camel을 결합하면 이를 쉽게 할 수 있습니다. Camel은 강력한 통합 기능을 제공하여 LLM을 모든 서비스나 API에 연결합니다. 이를 통해 AI는 데이터베이스, 큐 등과 상호작용할 수 있어 진정으로 강력한 응용 프로그램을 생성할 수 있습니다. 우리는 이 강력한 조합과 그 잠재력을 탐구할 것입니다.
개발 환경 설정
- Ollama: 로컬에서 대형 언어 모델(LLM)을 실행할 수 있는 방법을 제공합니다. LLama3, Mistral, CodeLlama 등 다양한 모델을 CPU와 GPU 완전 지원으로 귀하의 머신에서 실행할 수 있습니다.
- Visual Studio Code: Kaoto, Java, 및 Quarkus 플러그인이 설치되어 있습니다.
- OpenJDK 21
- Maven
- Quarkus 3.17
- Quarkus Dev Services: 외부 서비스(예: 데이터베이스, 메시징 시스템 및 기타 리소스)에 의존하는 응용 프로그램의 개발 및 테스트를 간소화하는 Quarkus의 기능입니다.
다음 GitHub repo에서 전체 코드를 다운로드할 수 있습니다.
다음 지침은 Visual Studio Code에서 실행됩니다:
1. 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. langchain4j Quarkus 확장 추가
./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를 실행하도록 Ollama 구성
application.properties 파일을 열고 다음 줄을 추가하십시오:
#Configure Ollama local model
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을 실행하고 아파치 카멜 컴포넌트에서 사용하기 위한 자동 구성을 수행합니다.
4. Kaoto를 사용하여 Apache Camel Route 생성
src/main/resources 폴더에 route라는 새 폴더를 만듭니다.
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 속성을 구성합니다:
- 값을 도구 ID 로 my-tools로 설정합니다.
- 태그를 store로 설정합니다 (태그를 정의하는 것은 LLM과 함께 사용할 도구를 그룹화하기 위함입니다).
사용자 입력 메시지를 langchain4j-tools 구성 요소가 사용할 수 있도록 처리해야 하며, 그 후 단계 추가 아이콘을 클릭합니다 platform-http 구성 요소 뒤에 있습니다.
카탈로그에서 프로세스 구성 요소를 검색하고 선택합니다.
필수 속성을 구성합니다:
- Ref를 createChatMessage 값으로 설정합니다.
이 프로세스 컴포넌트는 다음 단계에서 생성할 createChatMessage 메서드를 사용할 것입니다.
5. 사용자 입력을 LLM에 전송하는 프로세스 생성
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);
}
};
}
}
이 클래스는 사용자 입력을 라우트의 langchain4j 컴포넌트를 처리할 수 있는 객체로 변환하는 Camel 프로세서를 생성하는 데 도움을 줍니다. 또한 LLM이 도구를 사용할 수 있도록 맥락을 제공하고 에이전트의 작업을 설명합니다.
6. LLM과 함께 사용할 Apache Camel 도구 생성
새 파일을 src/main/resources/routes 폴더에 생성하고 route-tool-products.camel.yaml라는 이름을 붙입니다. 그런 다음 Visual Studio Code에서 Kaoto 비주얼 편집기를 엽니다.
+New 버튼을 클릭하면 새로운 경로가 생성됩니다.
원형 화살표를 클릭하여 타이머 컴포넌트를 교체합니다.
카탈로그에서 langchain4j-tools 컴포넌트를 검색하고 선택합니다.
langchain4j-tools를 구성하고, All 탭을 클릭하여 Endpoint 속성을 검색합니다.
- Tool Id 값을 productsbycategoryandcolor로 설정합니다.
- Tags 값을 메인 루트와 동일한 store로 설정합니다.
- Description 값을 카테고리 및 색에 따라 데이터베이스 제품 쿼리로 설정합니다(도구에 대한 간단한 설명).
도구에서 사용할 매개변수를 추가합니다:
- 이름:category, 값: string
- 이름: color, 값: string
이러한 매개변수는 LLM에 의해 할당되어 도구에서 사용되며 헤더를 통해 전달됩니다.
데이터베이스 쿼리를 수행하기 위해 SQL 구성 요소를 추가한 후 langchain4j-tools 구성 요소 다음에 Add Step을 클릭합니다.
SQL 구성 요소를 검색하고 선택합니다.
필요한 SQL 속성을 구성합니다:
- 다음 값을 사용하여 쿼리를 수행합니다.
Select name, description, category, size, color, price, stock from products where Lower(category)= Lower (:#category) and Lower(color) = Lower(:#color)
쿼리에 사용할 매개변수를 처리한 다음, 매개변수를 올바른 객체 유형으로 변환하기 위해 Convert Header 구성 요소를 추가합니다.
Add Step 버튼을 클릭하여 langchain4j-tools 다음에 검색하여 카탈로그에서 Convert Header To 변환을 선택합니다.
구성해야 할 구성 요소의 필수 속성:
- 값이 category인 이름
- 값이 String인 유형
다음 값으로 단계를 반복합니다:
- 값이 color인 이름
- 값이 String인 유형
결과적으로 경로는 다음과 같습니다:
마지막으로, 쿼리 결과를 LLM이 처리할 수 있는 객체로 변환해야 합니다. 이 예에서는 JSON으로 변환합니다.
SQL 구성 요소 뒤에 Add Step 버튼을 클릭하고 Marshal 구성 요소를 추가합니다.
Marshal에 대한 데이터 형식 속성을 구성하고 목록에서 JSon을 선택합니다.
7. PostgreSQL에 대한 Quarkus Dev Services 구성하기
개발 목적을 위해 PostgreSQL을 제공하는 Quarkus 확장을 추가하고 터미널에서 다음 명령을 실행합니다.
./mvnw quarkus:add-extension -Dextensions="io.quarkus:quarkus-jdbc-postgresql"
다음 줄을 추가하려면 application.properties를 엽니다:
#Postgresql을 위한 devservices 구성 중
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 라는 파일을 다음 내용으로 생성합니다.
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는 Camel 경로를 정의하는 여러 도메인 특정 언어(DSL)를 지원합니다.
yaml DSL 라우트를 포함하는 것도 가능합니다. 다음 라인을 application.properties 파일에 추가하십시오.
# 로드할 라우트
camel.main.routes-include-pattern = routes/*.yaml
이는 src/main/resources/routes 폴더에 있는 모든 라우트를 로드합니다.
9. 앱 테스트
Maven을 사용하여 애플리케이션을 실행하고 Visual Studio 코드에서 터미널을 열어 다음 명령을 실행하십시오.
mvn quarkus:dev
시작하면 Quarkus가 Ollama를 호출하여 로컬 LLM을 실행하고 터미널을 열어 다음 명령을 사용하여 확인합니다.
ollama ps
NAME ID SIZE PROCESSOR UNTIL
qwen2.5:0.5b a8b0c5157701 1.4 GB 100% GPU 4 minutes from now
또한, Quarkus는 PostgreSQL이 실행되는 컨테이너를 생성하고 데이터베이스 및 스키마를 생성합니다. psql
명령을 사용하여 연결할 수 있습니다.
psql -h localhost -p 5432 -U quarkus -d store
그리고 제품 테이블을 쿼리하십시오:
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)
앱을 테스트하려면 평문 본문 입력과 함께 localhost:8080/camel/chat 로 POST 요청을 보내십시오. 일부 제품을 요청합니다.
LLM이 환각을 일으킬 수 있습니다. 요청을 약간 수정하여 다시 시도하십시오.
LLM이 도구를 사용하고 데이터베이스에서 정보를 가져오는 방법 및 제공된 자연 언어 요청을 사용하는 방법을 볼 수 있습니다. LLM은 매개변수를 식별하고 해당 매개변수를 도구로 보냅니다. 요청 로그를 확인하면 LLM이 답변을 생성하는 데 사용하는 도구와 매개변수를 찾을 수 있습니다.
결론
Apache Camel 및 LangChain4j 구성 요소를 사용하여 통합 흐름 내에서 LLMs의 파워를 활용하는 방법을 탐색했습니다. 이 조합을 통해 기존의 Camel 라우트에 강력한 언어 모델을 원활하게 통합하여 인간의 언어를 이해, 생성 및 상호 작용할 수 있는 정교한 응용 프로그램을 구축할 수 있는 것을 보았습니다.
Source:
https://dzone.com/articles/powering-llms-with-apache-camel-and-langchain4j