RAG mit Spring AI: Enterprise Java und Künstliche Intelligenz
Für Enterprise-Anwendungen im Java-Ökosystem hat sich Spring AI als das führende Framework etabliert, um Künstliche Intelligenz in bestehende Applikationen zu integrieren. Analog zu Python-Frameworks wie LangChain bietet Spring AI Abstraktionen für Sprachmodelle, Vektordatenbanken und Dokumentenverarbeitungen. Es fügt sich nahtlos in das Spring-Boot-Ökosystem ein und profitiert von dessen Typsicherheit, Dependency Injection und Robustheit.
Die Kernabstraktionen in Spring AI
Spring AI stellt Entwicklern ein standardisiertes Programmiermodell zur Verfügung. Die wichtigsten Schnittstellen (Interfaces) sind:
- ChatModel (bzw. ChatClient): Die primäre Schnittstelle zur Interaktion mit Sprachmodellen. Sie abstrahiert den API-Zugriff auf OpenAI, Anthropic, Google Gemini, Ollama (für lokale Ausführungen) und viele andere Anbieter.
- EmbeddingModel: Dient der Erzeugung von Vektordarstellungen (Embeddings) für Textabschnitte oder Benutzerfragen.
- VectorStore: Das Äquivalent zu klassischen JPA-Repositories für Vektordatenbanken. Es stellt Methoden wie
add(List<Document>)undsimilaritySearch(SearchRequest)bereit. - DocumentReader & TokenSplitter: Klassen für das Einlesen (z. B. aus PDF oder Text-Dateien) und das Zerteilen (Chunking) von Dokumenten.
Code-Beispiel: RAG mit Spring AI in Java
Das folgende stark vereinfachte Beispiel zeigt, wie eine RAG-Abfrage mit dem ChatClient und einem PgVectorStore (PostgreSQL) in einem Spring-Boot-Service implementiert wird:
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.QuestionAnswerAdvisor;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.stereotype.Service;
@Service
public class RagService {
private final ChatClient chatClient;
public RagService(ChatClient.Builder chatClientBuilder, VectorStore vectorStore) {
// Der QuestionAnswerAdvisor fängt die Benutzeranfrage ab,
// führt die Vektorsuche im VectorStore aus und fügt den Kontext
// automatisch in den System-Prompt des Modells ein.
this.chatClient = chatClientBuilder
.defaultAdvisors(new QuestionAnswerAdvisor(vectorStore))
.defaultSystem("""
Du bist ein hilfsbereiter Assistent. Beantworte die Frage des
Benutzers ausschliesslich auf Basis des bereitgestellten Kontexts.
""")
.build();
}
public String askQuestion(String userQuestion) {
return this.chatClient.prompt()
.user(userQuestion)
.call()
.content();
}
}
Die Funktionsweise im Detail:
- Der QuestionAnswerAdvisor ist eine eingebaute Spring AI Komponente. Er übernimmt den kompletten RAG-Prozess (Retrieve und Augment).
- Er liest die Eingabe des Nutzers (
userQuestion), übersetzt sie über das konfigurierteEmbeddingModelin einen Vektor und fragt denVectorStorenach ähnlichen Dokumenten. - Er formatiert den Prompt, bettet die Textabschnitte ein und leitet den fertigen Prompt an das
ChatModelweiter.
Vorteile für Enterprise-Java-Entwickler
- Nahtlose Integration: KI-Funktionalitäten können direkt in bestehende Spring-Boot-Services und REST-APIs integriert werden, ohne dass eine Brücke zu Python-Skripten gebaut werden muss.
- Sicherheitsarchitektur: Zugriffskontrollen (z. B. Spring Security) und Datenbanktransaktionen funktionieren wie gewohnt und können direkt auf die Metadaten-Filterung der Vektordatenbank angewendet werden.
- Wartbarkeit: Durch die Standardisierung der Schnittstellen kann das zugrundeliegende Sprachmodell oder die Vektordatenbank mit minimalem Code-Aufwand (oft nur durch Anpassung der
application.yml-Konfiguration) ausgetauscht werden.
Spring AI vs. LangChain im Vergleich
Die Wahl des RAG-Frameworks folgt meist dem bestehenden Technologie-Stack. Die folgende Tabelle ordnet die beiden führenden Ökosysteme ein:
| Eigenschaft | Spring AI (Java) | LangChain (Python) |
|---|---|---|
| Zielgruppe | Enterprise-Java-Teams | Data Science, Prototyping |
| Typsicherheit | stark (kompiliert) | dynamisch |
| Integration in Security/Transaktionen | nativ (Spring) | manuell |
| Reife im Enterprise-Betrieb | hoch | mittel–hoch |
| Verbreitung in der KI-Forschung | gering | sehr hoch |
Faustregel: Wer bereits eine Spring-Boot-Landschaft betreibt, integriert RAG am robustesten mit Spring AI. Reine Forschungs- und Experimentier-Setups bleiben meist bei Python.
Konfiguration über die application.yml
Ein grosser Vorteil von Spring AI ist die deklarative Konfiguration. Modellanbieter, Embedding-Modell und Vektordatenbank werden über die application.yml gesetzt – ein Wechsel erfordert keine Code-Änderung:
spring:
ai:
openai:
api-key: ${OPENAI_API_KEY}
chat:
options:
model: gpt-4o-mini
embedding:
options:
model: text-embedding-3-small
vectorstore:
pgvector:
index-type: HNSW
dimensions: 1536
Mit dieser Konfiguration nutzt der VectorStore automatisch einen pgvector-Index vom Typ HNSW. Die dimensions müssen exakt zum gewählten Embedding-Modell passen – ein häufiger Fehler ist eine Diskrepanz zwischen Modell und Indexdimension.
Die Ingestion-Pipeline in Spring AI
Bevor Fragen beantwortet werden können, müssen Dokumente eingelesen, zerteilt und als Embeddings gespeichert werden. Spring AI bildet diese Schritte mit eigenen Klassen ab:
| Schritt | Spring-AI-Komponente | Aufgabe |
|---|---|---|
| Einlesen | DocumentReader (z. B. PagePdfDocumentReader) | PDF/Text laden |
| Zerteilen | TokenTextSplitter | Chunking in Segmente |
| Vektorisieren | EmbeddingModel | Text → Vektor |
| Speichern | VectorStore.add(...) | Vektoren ablegen |
Die Qualität dieser Pipeline entscheidet über die spätere Antwortgüte. Eine zu grobe oder zu feine Chunk-Grösse führt zu schlechten Treffern – die Grundlagen dazu erklärt die Seite zum Chunking. Für nachvollziehbare Antworten lohnt es sich, in den Metadaten der Document-Objekte Quellinformationen für Citations abzulegen.
Praxisbeispiel: Firmen-Wiki als RAG-Backend
Ein Java-Team baut einen Assistenten über das interne Confluence-Wiki:
- Naiv (Prototyp): Alle Seiten werden ohne Metadaten in einen einzigen
VectorStoregeladen, der System-Prompt erlaubt freie Antworten. Das Modell mischt gelegentlich Inhalte verschiedener Abteilungen und erfindet Details, wenn nichts Passendes gefunden wird. - Produktionsreif: Jeder Chunk erhält Metadaten (Abteilung, Seiten-ID, URL). Der
QuestionAnswerAdvisorfiltert per Metadaten auf die Abteilung des anfragenden Nutzers (Mandantentrennung über Spring Security), und der System-Prompt erzwingt ein No-Answer-Gate. Die Antworten zitieren nun ihre Quellen und bleiben fachlich sauber getrennt.
Die Lehre: Spring AI nimmt die technische Verdrahtung ab, doch die RAG-Qualität entsteht durch saubere Ingestion, Metadaten-Filter und ein striktes Prompt-Design – nicht durch das Framework allein.
[!TIP] Das Backend unserer interaktiven Demo auf allerate.dev wurde komplett mit Spring Boot und Spring AI umgesetzt. Überzeugen Sie sich selbst von der Performanz und besuchen Sie die RAG-Demo.
Häufig gestellte Fragen (FAQ)
Welche Java-Version wird für Spring AI vorausgesetzt?
Spring AI basiert auf Spring Boot 3.x und setzt daher mindestens Java 17 (oder neuer, wie Java 21) voraus, um moderne Sprachfeatures und Performance-Vorteile nutzen zu können.
Welche Vektordatenbanken werden von Spring AI unterstützt?
Spring AI bietet vorgefertigte Treiber (VectorStore-Implementierungen) für fast alle gängigen Datenbanken, darunter PostgreSQL (pgvector), Qdrant, Pinecone, Milvus, Redis, Neo4j und Chroma.
Sollte ich für ein RAG-Projekt Spring AI oder LangChain wählen?
Die Wahl folgt meist dem bestehenden Technologie-Stack. Wenn Ihr Unternehmen ohnehin auf Java und Spring Boot setzt, ist Spring AI die natürliche Wahl, weil es Security, Transaktionen und Dependency Injection nahtlos integriert. In einem Python-Umfeld mit Data-Science-Fokus ist LangChain oder LlamaIndex üblicher. Funktional decken alle drei die Kern-RAG-Pipeline ab.
Wie verhindert Spring AI Halluzinationen?
Spring AI selbst verhindert keine Halluzinationen – das ist eine Frage des Prompt-Designs und der Architektur. Der QuestionAnswerAdvisor liefert den abgerufenen Kontext, doch Sie müssen das Modell per System-Prompt anweisen, ausschliesslich auf Basis dieses Kontexts zu antworten und bei fehlender Information ein No-Answer-Gate auszulösen. Quellenangaben über die Dokument-Metadaten erhöhen zusätzlich die Nachvollziehbarkeit.