Apache Camel 및 Langchain4J로 LLM의 전원
LLM은 실제 세계에 연결해야합니다. Apache Camel과 결합 된 Langchain4J 도구는 쉽게 만들 수 있습니다. Camel은 LLM을 모든 서비스 또는 API에 연결하여 강력한 통합을 제공합니다. 이를 통해 AI는 데이터베이스, 큐 등과 상호 작용하여 강력한 응용 프로그램을 생성 할 수 있습니다. 우리는이 강력한 조합과 잠재력을 탐구 할 것입니다.
개발 환경 설정
- 올라마: LLMS (Large Language Model)를 로컬로 실행하는 방법을 제공합니다. 전체 CPU 및 GPU 지원을 통해 LLAMA3, MISTRAL, CODELLAMA 및 기타 여러 모델을 컴퓨터에서 실행할 수 있습니다.
- 비주얼 스튜디오 코드: Kaoto, Java 및 Quarkus 플러그인이 설치되어 있습니다.
- OpenJDK 21
- Maven
- 쿼스 3.17
- Quarkus Dev 서비스:의 특징 Quarkus 이는 응용 프로그램의 개발 및 테스트를 단순화합니다. 데이터베이스, 메시징 시스템 및 기타 리소스와 같은 외부 서비스에 의존하는 응용 프로그램의 개발 및 테스트.
다음 Github Repo에서 전체 코드를 다운로드 할 수 있습니다.
다음 지침은 Visual Studio 코드에서 실행됩니다.
1. 쿼 쿠스 프로젝트 만들기
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 LLM을 실행하도록 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을 로컬로 실행하고 다음 단계에서 Apache Camel 구성 요소에서 사용하기위한 자동 와이어 구성을 사용합니다.
4. Kaoto를 사용하여 Apache Camel Route 만들기
이름이 지정된 새 폴더를 만듭니다 노선 에서 SRC/메인/리소스 접는 사람.
새 파일을 만듭니다 SRC/메인/리소스/경로 폴더 및 이름 Route-Main.camel.yaml그리고 Visual Studio Code가 열립니다 카오토 비주얼 편집기.
클릭하십시오 +새로운 버튼과 새로운 경로가 만들어집니다.
원형 화살표를 클릭하여 타이머 구성 요소를 교체하십시오.
검색 및 선택 플랫폼 -HTTP 카탈로그의 구성 요소.
필수 구성 플랫폼 -HTTP 속성:
- 값으로 경로를 설정하십시오 /낙타/채팅
기본적으로 플랫폼 -HTTP 포트 8080에서 복무 할 예정입니다.
클릭하십시오 그만큼 단계 아이콘을 추가하십시오 플랫폼 -HTTP 구성 요소 다음 화살표에서.
카탈로그에서 langchain4j-tools 구성 요소를 검색하고 선택하십시오.
필수 구성 langchain4j-tools 속성:
- 세트 도구 ID 가치로 My-Tools.
- 세트 태그 ~와 함께 가게 (정의 태그 LLM과 함께 사용할 도구를 그룹화하는 것입니다).
사용자 입력 메시지를 처리해야합니다 langchain4j-tools 구성 요소를 사용할 수있는 다음 클릭하십시오 단계 아이콘을 추가하십시오 이후 화살에 플랫폼 -HTTP 요소.
검색하고 선택하십시오 프로세스 카탈로그의 구성 요소.
필요한 속성 구성 :
- 세트 심판 가치와 함께 CreateChatMessage.
그만큼 프로세스 구성 요소 사용합니다 CreateChatMessage 방법 다음 단계에서 생성합니다.
5. LLM에 사용자 입력을 보내는 프로세스 생성
새 Java 클래스를 만듭니다 SRC/메인/자바 이름이 지정되었습니다 바인딩. 자바.
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 are loading in yaml files.
}
@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);
}
};
}
}
이 수업은 a를 만드는 데 도움이됩니다 낙타 프로세서 사용자 입력을 경로에서 langchain4j 구성 요소를 처리 할 수있는 객체로 변환합니다. 또한 도구를 사용하기위한 LLM 컨텍스트를 제공하고 에이전트의 작업을 설명합니다.
6. LLM과 함께 사용하기위한 아파치 낙타 도구 만들기
새 파일을 만듭니다 SRC/메인/리소스/경로 폴더와 이름을 지정하십시오 Route-Tool-Products.camel.yaml,,, Visual Studio Code에서 Kaoto Visual Editor를 열십시오.
클릭하십시오 +새로운 버튼과 새로운 경로가 만들어집니다.
원형 화살표를 클릭하여 교체하십시오 시간제 노동자 요소.
검색하고 선택하십시오 langchain4j-tools 카탈로그의 구성 요소.
구성 langchain4j-tools클릭하십시오 모두 탭 및 검색 엔드 포인트 속성.
- 세트 도구 ID 가치로 ProductsBycateandColor.
- 세트 태그 ~와 함께 가게 (주 경로와 동일).
- 세트 설명 가치로 카테고리 및 색상별 쿼리 데이터베이스 제품 (도구에 대한 간단한 설명).
도구에서 사용할 매개 변수를 추가하십시오.
- 이름: 범주값: 끈
- 이름: 색상값: 끈
이 매개 변수는 도구에 사용하기 위해 LLM에 의해 지정되며 헤더를 통해 전달됩니다.
쿼리 데이터베이스에 SQL 구성 요소를 추가 한 다음 클릭하십시오 단계를 추가하십시오 후 langchain4j-tools 요소.
검색 및 선택 SQL 구성 요소.
필수 SQL 속성 구성 :
- 다음 값을 가진 쿼리.
Select name, description, category, size, color, price, stock from products where Lower(category)= Lower (:#category) and Lower(color) = Lower(:#color)
쿼리에서 사용할 매개 변수를 처리 한 다음 추가 헤더 구성 요소를 변환합니다 매개 변수를 올바른 개체 유형으로 변환합니다.
클릭하십시오 단계 버튼을 추가하십시오 ~ 후에 langchain4j-tools검색하고 선택하십시오 헤더를 변환하십시오 카탈로그의 변환.
구성 요소에 필요한 속성 구성 :
- 값이있는 이름 범주
- 값으로 입력하십시오 끈
다음 값으로 단계를 반복하십시오.
- 값이있는 이름 색상
- 값으로 입력하십시오 끈
결과적으로 이것이 경로의 모습입니다.
마지막으로, 쿼리 결과를 LLM이 처리 할 수있는 객체로 변환해야합니다. 이 예에서는 JSON으로 변환합니다.
클릭하십시오 단계 버튼을 추가하십시오 SQL 구성 요소 후에 다음을 추가하십시오 마샬 구성 요소.
마샬 및 선택에 대한 데이터 형식 속성을 구성하십시오 JSON 목록에서.
7. PostgreSQL에 대한 Quarkus dev 서비스를 구성하십시오
Quarkus 확장자를 추가하여 DEV 목적으로 PostgreSQL을 제공하고 터미널에서 다음 명령을 실행하십시오.
./mvnw quarkus:add-extension -Dextensions="io.quarkus:quarkus-jdbc-postgresql"
열려 있는 application.properties 다음 줄을 추가하십시오.
#Configuring devservices for 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/메인/리소스이 폴더로 이름이 지정된 파일을 만듭니다 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는 낙타 경로를 정의 할 때 여러 도메인 별 언어 (DSL)를 지원합니다.
Yaml DSL 경로를 포함하여 다음 줄을 추가 할 수도 있습니다. application.properties 파일.
# routes to load
camel.main.routes-include-pattern = routes/*.yaml
이것은 모든 경로를로드합니다 SRC/메인/리소스/경로 접는 사람.
9. 앱을 테스트하십시오
Maven을 사용하여 응용 프로그램을 실행하고 Visual Studio Code에서 터미널을 열고 다음 명령을 실행하십시오.
일단 시작되면 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)
앱을 테스트하려면 게시물 요청을 보내십시오 로컬 호스트 : 8080/낙타/채팅 일반 텍스트 신체 입력. 일부 제품을 요청합니다.
LLM은 환각을 가질 수 있습니다. 요청을 약간 수정하십시오.
LLM이 도구를 사용하는 방법을 확인하고 제공된 자연어 요청을 사용하여 데이터베이스에서 정보를 얻을 수 있습니다. LLM은 매개 변수를 식별하고 도구로 보냅니다. 요청 로그를 살펴보면 LLM이 사용하는 도구 및 매개 변수를 찾을 수 있습니다.
결론
Apache Camel과 Langchain4J 구성 요소를 사용하여 통합 흐름 내에서 LLM의 전력을 활용하는 방법을 탐색했습니다. 이 조합을 통해 강력한 언어 모델을 기존 낙타 경로에 원활하게 통합 할 수 있으므로 인간 언어와 이해, 생성 및 상호 작용할 수있는 정교한 응용 프로그램을 구축 할 수 있습니다.
Post Comment