تشغيل LLMs باستخدام Apache Camel و LangChain4j

LLMs تحتاج إلى الاتصال بالعالم الحقيقي. أدوات LangChain4j، بالاشتراك مع Apache Camel، تجعل هذا سهلاً. يوفر Camel تكاملًا قويًا، يربط LLM الخاص بك بأي خدمة أو واجهة برمجة تطبيقات. يتيح ذلك لذكاء الاصطناعي الخاص بك التفاعل مع قواعد البيانات، والطوابور، وأكثر من ذلك، مما يخلق تطبيقات قوية حقًا. سنستكشف هذا التوازن القوي وإمكانياته.

إعداد بيئة التطوير

  • Ollama: يوفر طريقة لتشغيل نماذج اللغة الكبيرة (LLMs) محليًا. يمكنك تشغيل العديد من النماذج، مثل 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. إضافة ملحقات Quarkus لـ langchain4j

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.

ابحث واختر مكون Process في الفهرس.

قم بتكوين الخصائص المطلوبة:

  • تعيين Ref بالقيمة createChatMessage.

سيستخدم مكون المعالج الطريقة 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 لتحويل إدخال المستخدم إلى كائن يمكنه التعامل مع مكون 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، انقر على علامة الكل وابحث عن خصائص النقطة النهائية.

  • قم بتعيين معرف الأداة بالقيمة productsbycategoryandcolor.
  • قم بتعيين العلامات بقيمة store (نفس القيمة المستخدمة في المسار الرئيسي).
  • قم بتعيين الوصف بالقيمة استعلام قاعدة البيانات للمنتجات حسب الفئة واللون (وصف موجز للأداة).


أضف المعلمات التي ستستخدمها الأداة:

  • الاسم: الفئة، القيمة: سلسلة
  • الاسم: اللون، القيمة: سلسلة

سيتم تعيين هذه المعلمات من قبل 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، ابحث وحدد تحويل رأس إلى في الكتالوج.

قم بتكوين الخصائص المطلوبة للمكون:

  • الاسم بالقيمة الفئة
  • النوع بالقيمة سلسلة


كرر الخطوات بالقيم التالية:

  • الاسم بالقيمة اللون
  • النوع بالقيمة سلسلة

وبما أن، هكذا تبدو المسار:

أخيرًا، تحتاج إلى تحويل نتيجة الاستعلام إلى كائن يمكن لـ LLM التعامل معه؛ في هذا المثال، قم بتحويله إلى JSON.

انقر على زر إضافة خطوة بعد عنصر SQL، وأضف عنصر Marshal.

قم بتكوين خصائص تنسيق البيانات للـ Marshal واختر JSon من القائمة.

7. قم بتكوين خدمات Quarkus Dev لـ PostgreSQL

أضف امتداد Quarkus لتوفير PostgreSQL لأغراض التطوير، قم بتشغيل الأمر التالي في وحدة التحكم.

Shell

 

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

افتح application.properties وأضف الأسطر التالية:

Properties files

 

#تكوين خدمات التطوير لـ 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 عدة لغات متخصصة في المجال (DSLs) في تعريف مسارات 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 لإنشاء الإجابة.

الاستنتاج

لقد استكشفت كيفية الاستفادة من قوة نماذج اللغة الكبيرة (LLMs) ضمن تدفقات التكامل الخاصة بك باستخدام Apache Camel ومكون LangChain4j. لقد رأينا كيف أن هذه التركيبة تتيح لك دمج نماذج لغة قوية بسلاسة في مسارات Camel الحالية الخاصة بك، مما يمكنك من بناء تطبيقات متطورة يمكنها فهم وتوليد والتفاعل مع اللغة البشرية.

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