AI Assistent mit LangChain4j und Spring Boot

LangChain4j ist ein neues und populäres Framework, um LLMs, Vektor-Datenbanken und weitere KI-Funktionen in Java Systemen zu nutzen. In diesem Artikel integrieren wir LangChain4j in eine Spring Boot Anwendung.

Spring Boot mit LangChain4j

Maven Dependencies

Stand 22.07.2024 hat LangChain4j noch eine Nuller-Version im Maven Repository. LangChain4j integrieren wir als 3rd-Party Bibliothek in unser Spring Boot Projekt:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-spring-boot-starter</artifactId>
<version>0.32.0</version>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-azure-open-ai-spring-boot-starter</artifactId>
<version>0.32.0</version>     </dependency> 

  • langchain4j-spring-boot-starter ist keine von Spring gewartete Spring Boot Starter Dependency. Die Spring Boot Starter Konfiguration wird vom LangChain4j Opensource Projekt entwickelt. Deshalb muss die Versionsnummer angegeben werden, hier 0.32.0.
  • Ich verwende ein OpenAI LLM in Azure. Daher benötige ich neben der Basis Bibliothek langchain4j-spring-boot-starter noch diese Azure-LLM Integrations-Bibliothek langchain4j-azure-open-ai-spring-boot-starter.

Konfiguration in application.properties

Die beiden Spring Boot Starter Dependencies bringen eine Auto-Konfiguration mit. Diese passen wir für den Zugriff auf unseren OpenAI LLM Azure-Service in den appliation.properties wie folgt an:

langchain4j.azure-open-ai.chat-model.api-key=geheim
langchain4j.azure-open-ai.chat-model.endpoint=https://azure.url
langchain4j.azure-open-ai.chat-model.deployment-name=gpt-4-turbo-preview
langchain4j.azure-open-ai.chat-model.log-requests-and-responses=true

logging.level.dev.langchain4j=DEBUG
logging.level.dev.ai4j.openai4j=DEBUG
  • ...endpoint und ...deployment-name definieren wo unser LLM Service gefunden wird. Anhand des vollen Property-keys "langchain4j.azure-open-ai" steht fest, dass es die Azure Cloud ist.
  • Der API-Key in ...api-key authentifiziert und autorisiert meine Spring Boot Anwendung für den Zugriff auf den Azure LLM Service.
  • Alle weiteren Properties sind optional. Hier sehen wir noch Einstellung für das Debug-Logging zur Interaktion mit dem LLM.

Chatbot Bean mit @AiService und @SystemMessage

Einfache Chatbots definieren wir mit LangChain4j per Interface und Annotation.
Der Spring Boot Starter in der LangChain4j Bibliothek erzeugt daraus eine Chatbot Bean
- die Implementierung des Interfaces stellt LangChain4j bereit.
import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.spring.AiService;

@AiService
interface Assistant {
@SystemMessage("Du bist ein freundlicher Assistent und antwortest in Deutsch.")
String chat(String userMessage);
}
  • @AiService stellt die Implementierung des Interfaces und eine Assistant Bean bereit.
  • @SystemMessage definiert den 1. System-Prompt des Chatbots.
Die Assistant Bean nutzen wir in unserer Spring Anwendung analog zu beliebigen, anderen Beans. Für einfache Tests bzw. Demos exponieren wir den Chatbot per RestController:
@RestController
class AssistantController {
@Autowired
private Assistant assistant;

@GetMapping("/assistant")
public String assistant(@RequestParam String message) {
return assistant.chat(message);
}
}

Chatverlauf merken

Testen wir den Chatbot mit diesen beiden GET-Requests (im Browser):
  1. http://localhost:8080/assistant?message="Hallo, ich bin Elmar"
  2. http://localhost:8080/assistant?message="Wie ist mein Name"
Dann stellen wir fest, dass der Chatbot kein Gedächtnis hat und im zweiten Request den Namen nicht mehr kennt. Das ändern wir mit einer ChatMemory Bean:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import dev.langchain4j.memory.ChatMemory;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;

@Configuration
class AssistantConfiguration {
@Bean
ChatMemory chatMemory() {
return MessageWindowChatMemory.withMaxMessages(10);
}
}
Durch die ChatMemory Bean kennt der Assistant in diesem Code-Beispiel die letzten 10 Chat-Nachrichten. In diesem Beispiel teilen sich alle Benutzer dasselbe Gedächtnis im Chatbot - bei mehr als einen Benutzer benötigen wir eine andere Lösung.

Fazit

LangChain4j bietet noch viele weitere interessante Features, siehe dazu https://docs.langchain4j.dev/. Es ist vergleichbar zu Spring AI. Beide Frameworks vereinfachen die Nutzung von LLMs erheblich und bieten praktische Features für die Entwicklung und Integration von AI in bestehende Java-Anwendungen.

Kommentare

Beliebte Posts aus diesem Blog

OpenID Connect mit Spring Boot 3

CronJobs mit Spring

Kernkonzepte von Spring: Beans und Dependency Injection