Retrieval-Augmented Generation

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:

  1. 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.
  2. EmbeddingModel: Dient der Erzeugung von Vektordarstellungen (Embeddings) für Textabschnitte oder Benutzerfragen.
  3. VectorStore: Das Äquivalent zu klassischen JPA-Repositories für Vektordatenbanken. Es stellt Methoden wie add(List<Document>) und similaritySearch(SearchRequest) bereit.
  4. 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 konfigurierte EmbeddingModel in einen Vektor und fragt den VectorStore nach ähnlichen Dokumenten.
  • Er formatiert den Prompt, bettet die Textabschnitte ein und leitet den fertigen Prompt an das ChatModel weiter.

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:

EigenschaftSpring AI (Java)LangChain (Python)
ZielgruppeEnterprise-Java-TeamsData Science, Prototyping
Typsicherheitstark (kompiliert)dynamisch
Integration in Security/Transaktionennativ (Spring)manuell
Reife im Enterprise-Betriebhochmittel–hoch
Verbreitung in der KI-Forschunggeringsehr 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:

SchrittSpring-AI-KomponenteAufgabe
EinlesenDocumentReader (z. B. PagePdfDocumentReader)PDF/Text laden
ZerteilenTokenTextSplitterChunking in Segmente
VektorisierenEmbeddingModelText → Vektor
SpeichernVectorStore.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 VectorStore geladen, 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 QuestionAnswerAdvisor filtert 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.