LLMsは現実世界と接続する必要があります。LangChain4jツールは、Apache Camelと組み合わせることで、これを容易にします。Camelは堅牢な統合を提供し、LLMを任意のサービスやAPIに接続します。これにより、AIがデータベース、キューなどと対話し、本当に強力なアプリケーションを作成できます。この強力な組み合わせとその可能性について探っていきます。
開発環境の設定
- Ollama: 大規模な言語モデル(LLMs)をローカルで実行する方法を提供します。LLama3、Mistral、CodeLlamaなどの多くのモデルを、CPUとGPUのフルサポートを備えたマシン上で実行できます。
- Visual Studio Code: Kaoto、Java、Quarkusプラグインがインストールされています。
- OpenJDK 21
- Maven
- Quarkus 3.17
- Quarkus Dev Services: Quarkusの機能で、データベース、メッセージングシステム、その他のリソースに依存するアプリケーションの開発とテストを簡素化します。
以下のGitHubリポジトリで完全なコードをダウンロードできます。
以下の手順は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 LLMの実行
application.propertiesファイルを開き、以下の行を追加してください:
#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. Kaotoを使用したApache Camelルートの作成
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で提供されます。
プラットフォーム-httpコンポーネントの後の矢印にある 「ステップ追加アイコン」をクリックします。
カタログでlangchain4j-toolsコンポーネントを検索して選択します。
必要なlangchain4j-toolsプロパティを設定します:
- 値ツールIDをmy-toolsで設定します。
- 値タグをstoreで設定します(タグを定義するのは、LLMと一緒に使用するツールをグループ化するためです)。
ユーザー入力メッセージを処理して、langchain4j-toolsコンポーネントが使用できるようにし、その後ステップ追加アイコンをクリックします。
カタログからプロセスコンポーネントを検索して選択します。
必要なプロパティを設定します:
- 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 Processorを作成するのに役立ちます。また、ツールの使用にLLMコンテキストを提供し、エージェントのタスクを説明します。
6. LLMと使用するためのApache Camelツールを作成します。
src/main/resources/routesフォルダに新しいファイルを作成し、route-tool-products.camel.yamlと名前を付けます。Visual Studio CodeでKaotoビジュアルエディタを開きます。
+新規ボタンをクリックすると、新しいルートが作成されます。
タイマーコンポーネントを置き換えるには、円形の矢印をクリックします。
カタログでlangchain4j-toolsコンポーネントを検索して選択します。
langchain4j-toolsの構成、Allタブをクリックし、Endpointプロパティを検索します。
- Tool Idを値productsbycategoryandcolorで設定します。
- Tagsには、メインルートと同じくstoreを設定します。
- Descriptionを値Query database products by category and color(ツールの簡単な説明)で設定します。
ツールで使用されるパラメータを追加します:
- NAME:category、VALUE: string
- NAME: color、VALUE: 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 スクリプトを作成します。
src/main/resources に db という名前のフォルダーを作成し、このフォルダー内に 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 Code でターミナルを開き、次のコマンドを実行します。
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コンポーネントを使用して、統合フロー内でLLMの力を活用する方法を探求しました。この組み合わせにより、強力な言語モデルを既存のCamelルートにシームレスに統合できることがわかりました。これにより、人間の言語を理解し、生成し、対話できる高度なアプリケーションを構築することが可能になります。
Source:
https://dzone.com/articles/powering-llms-with-apache-camel-and-langchain4j