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: תכונה של 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. יצירת מסלול 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.
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.
לחץ על הכפתור +חדש, ונתיב חדש ייווצר.
לחץ על החצים המעגליים כדי להחליף את רכיב ה-timer.
חפש ובחר את רכיב langchain4j-tools בקטלוג.
קביעת langchain4j-tools, לחץ על הלשונית הכל וחפש מאפייני נקודת קצה.
- קבע מזהה כלי עם הערך productsbycategoryandcolor.
- קבע תגיות עם store (כפי שבנתיב הראשי).
- קבע תיאור עם הערך שאילתת מוצרים במסד נתונים לפי קטגוריה וצבע (תיאור קצר של הכלי).
הוסף פרמטרים שישמשו בכלי:
- שם: קטגוריה, ערך: מחרוזת
- שם: צבע, ערך: מחרוזת
הפרמטרים הללו יועברו על ידי ה-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. הגדר שירותי Dev של Quarkus עבור PostgreSQL
הוסף הרחבה של Quarkus כדי לספק PostgreSQL לצורכי פיתוח, הרץ את הפקודה הבאה במסוף.
./mvnw quarkus:add-extension -Dextensions="io.quarkus:quarkus-jdbc-postgresql"
פתח את application.properties והוסף את השורות הבאות:
#הגדרת שירותי 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 עם התוכן הבא.
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 תומך בכמה שפות ספציפיות לדומיין (DSLs) בהגדרת מסלולי Camel.
ניתן גם לכלול נתיבי 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)
כדי לבדוק את היישום, שלחו בקשת POST אל localhost:8080/camel/chat עם גוף טקסט פשוט כקלט. בקשה למוצר מסוים.
ה־LLM עשוי להזיה. נסו שוב ושנו את הבקשה שלכם מעט.
ניתן לראות כיצד ה־LLM משתמש בכלי ומקבל מידע ממסד הנתונים באמצעות הבקשה בשפה הטבעית שסופקה. ה־LLM מזהה את הפרמטרים ושולח אותם לכלי. אם תבדקו ביומן הבקשות, תוכלו למצוא את הכלים והפרמטרים שה־LLM משתמש בהם כדי ליצור את התשובה.
מסקנה
בחקרת כיצד להשתמש בעוצמת LLMs בתוך זרימות השילוב שלך באמצעות Apache Camel ורכיב LangChain4j. ראינו כיצד השילוב הזה מאפשר לך לשלב באופן שקוף מודלי שפה חזקים לתוך הנתיבים הקיימים שלך ב-Camel, מאפשר לך לבנות אפליקציות מתקדמות שיכולות להבין, ליצור, ולהתקשר עם שפה אנושית.
Source:
https://dzone.com/articles/powering-llms-with-apache-camel-and-langchain4j