Спираючись на навички та досвід реалізуємо AI-агент для роботи з технічним контекстом. За основу мовної моделі вибрано LLM Lapa, яка розроблена для RAG систем та роботи з конфіденційними текстами. Коротко про складові проєкту. В програмі використана LLM Lapa, яка є відкритою українською моделлю для генерування тексту і розуміння мови. Модель працює в локальному режимі, для чого необхідна програма Ollama, яка являється своєрідним сервером для запуску LLM. Інтегрування в додаток агенту здійснюється за допомогою фреймворка, з відкритим кодом, LangChain4j. Пошук і аналіз інформації здійснюється за принципом RAG– концепції, що включає пошук аргументації та доповнення. Даний підхід передбачає роботу моделі з векторною БД, в даному випадку з нейромережою Doc2Vec. Остання знаходить найрелевантніший контекст, який додається в структурний запит для моделі. Більш детально та вихідний код проєкту дивись за посиланням Al-agent. LLM Lapa and Doc2Vec. RAG system. Запуск Ollama та LLM Lapa. Для локального запуску мовної моделі з термінала або через додаток на JavaFX, необхідно завантажити і встановити Ollama та саму мовну модель. Посилання https://ollama.com/ та https://huggingface.co/lapa-llm/lapa-v0.1.2-instruct-GGUF/tree/main відповідно. Далі реєстрація та запуск моделі, через термінал PowerShell в папці розміщення файлу мовної моделі. Команди:

ollama create lapa -f Modelfile - реєстрація моделі.
ollama list – перевірка на наявність в списку.
ollama run lapa – запуск моделі.
Також в теці створюємо конфігураційний файл для запуску моделі Modelfile, де вказано шлях до завантаження Lapa.

FROM lapa-v0.1.2-instruct-Q4_K_M  
AL агент на JavaFX. Приклад RAG системи з LLM Lapa та Doc2Vec. - 1 Фреймворк LangChain4j та структура AI-агенту. LangChain4j надає єдиний уніфікований API для взаємодії з популярними LLM-провайдерами та векторними базами даних, що абстрагує складність роботи з різними AI-сервісами використовуючи єдиний інтерфейс бібліотеки Інтегруємо бібліотеку в мавен залежність проєкту на JavaFX.

<dependency>
  <groupId>dev.langchain4j</groupId>
  <artifactId>langchain4j</artifactId>
  <version>0.36.0</version>
</dependency>
Реалізуємо AI-agent, для чого нам потрібен інтерфейс, який буде проектувати поведінку агента. А саме за допомогою анотацій: глобальні правила для ШІ (@SystemMessage), контекст для передачі моделі (@UserMessage) та аргументи які формують цей контекст (@V).

public interface TechnicalAgent {
  @SystemMessage({
    "Аналізуй ситуацію, враховуючи історію діалогу та контекст Doc2Vec.",
    "Дай чіткий технічний діагноз та покрокову інструкцію."
  })
  @UserMessage({
    "--- ІСТОРІЯ ДІАЛОГУ (Зчитана з JSON) ---",
    "{{chatHistory}}",
    "",
    "--- ПОТОЧНИЙ ЗАПИТ (Нові дані від оператора + Doc2Vec) ---",
    "[CONTEXT (Doc2Vec)]:",
    "{{historyContext}}",
    "",
    "[USER]: {{userRequest}}"
  })
  String processLog(
    @V("chatHistory")    String chatHistory,         // історія діалогу
    @V("userRequest")    String userRequest,    // запит від користувача
    @V("historyContext") String historyContext   // дані з Doc2Vec
  );
}
Конструктор для налаштування моделі, а саме підключення самої моделі за адресом та портом через Ollama. Налаштування температури для зменшення фантазування моделі, максимальна кількість слів для відповіді numPredict, вибір найбільшої ймовірності слова topP(0.4), максимальний час відповіді Duration.ofSeconds(120) та ініціалізаця самого агента.

public TechnicalAgentService() {
  try {
    ChatLanguageModel lapaModel = OllamaChatModel.builder()
      .baseUrl("http://127.0.0.1:11434")
      .modelName("lapa-short")
      .temperature(0.1)
      .numPredict(50)
      .topP(0.4)
      .timeout(Duration.ofSeconds(120))
      .build();
      this.agent = AiServices.builder(TechnicalAgent.class)
        .chatLanguageModel(lapaModel)
        .build();
  } catch (Exception e) {
	e.printStackTrace();
	throw e;
  }
}
AI-agent налаштований, модель запущена. Відправляємо агенту історію діалогів, запит та знайдений контекст в БД. Структурується запит та відсилається моделі. Модель в свою чергу аналізує та видає свою відповідь. RAG концепція ( Retrieval-Augmented Generation ). Доповнення контексту пошуком актуальних даних це і є генерація з доповненою вибіркою. В даному випадку агент спочатку шукає схожий контекст в векторній базі даних через нейромережу Doc2Vec (doc2vecContext) та передає історію діалогу (formattedHistory).

private TechnicalAgent  agent = null;
String aiResponse = agent.processLog(formattedHistory, userInput, doc2vecContext);
Виводимо відповідь моделі aiResponse. Нижче приклад запиту користувача в технічному контексті і відповідь моделі [AI] яка спирається на технічний контекст векторної БД. AL агент на JavaFX. Приклад RAG системи з LLM Lapa та Doc2Vec. - 2 Більш детально про обробку запитів, логування історії та нейромережу Doc2Vec дивись в проекті за посиланням вище. Дане архітектурне рішення дає змогу моделі генерувати більш чітку та правдиву відповідь обробляючи документи в технічному контексті з практичним досвідом та працювати в конфіденційному режимі без інтернет з’єднання.