Java als Produktionssprache für KI: Spring Boot, RAG und pgvector
Eine praktische Anleitung zur Implementierung von RAG-Diensten auf der JVM mit Spring AI oder LangChain4j, inklusive Auswahl eines Vektorstores sowie Handhabung von Mietmodellen, Kosten, Bewertungen und Fallback-Lösungen.
Python trainiert die Modelle, während Java langsam zur Sprache wird, mit der sie in Produktion gebracht werden. Etwa drei Jahre lang wirkte die KI-Szene wie eine Python-Konferenz mit größerem Budget: Demos in Notebooks, Tutorials, die mit pip install begannen, sowie Architekturdiagramme, in denen ein kleines Kästchen namens „Python LLM Service“ vom eigentlichen Backend abgehängt war. Dieses eigentliche Backend war in der Regel Spring Boot, das bereits für Authentifizierung, Abrechnung, Audit-Logs und die Datenbank zuständig war.
Dieses kleine Kästchen ist nicht mehr zwingend erforderlich. Spring AI hat die Version 1.0 überschritten und befindet sich nun in Version 2.0. LangChain4j ist eine vollwertige JVM-Bibliothek mit über zwanzig Modellanbietern und mehr als dreißig Vektorlagern. PostgreSQL speichert Embeddings über pgvector. Ein bereits laufender Spring Boot-Dienst kann einen LLM aufrufen, kontextbezogene Informationen abrufen, Tools einsetzen, Token streamen und Micrometer-Metriken veröffentlichen – alles innerhalb der JVM.
Macht das Java zum neuen König der KI? Nicht im Sinne der üblichen Sprachstreitigkeiten. Niemand ersetzt PyTorch durch Java. Was Java gewinnt, ist der Bereich, in dem das Geld liegt: Geschäftsanwendungen, die korrekt, nachvollziehbar und auf die beste Weise langweilig sein müssen. Wenn Sie dort arbeiten, ist der Gewinner das, was bereits Ihr Produktionscluster antreibt – und das spricht zunehmend Java.
Der Rest dieses Artikels zeigt diese Veränderung auf. Er erläutert, warum sie stattgefunden hat, wie ein RAG-Dienst in Spring Boot aussieht, wie man einen Vektorlagertyp wählt und welche Produktionsaspekte eine Demo von etwas unterscheiden, dem man Kundendaten anvertrauen könnte.
Pythons Vorteil war schon immer die Forschung
Python hat aus guten Gründen die Forschungsphase dominiert – Gründe, die bis heute gelten: NumPy, PyTorch, Hugging Face, Jupyter sowie eine ganze Generation von Ingenieuren, die sich mit Tensor-Operationen auskennen. Das Feintunen eines Modells, das Testen neuer Embedding-Architekturen oder das Trainieren auf GPUs gehören weiterhin zu Python.
Die Produktveröffentlichung ist ein ganz anderes Thema. Die meisten Unternehmen trainieren kein Grundmodell. Sie rufen eines auf, und dann beginnt die eigentliche Arbeit: Das Herunterladen von Dokumenten, das Einbinden von Richtlinien, die Trennung der Nutzer, das Protokollieren von Anfragen, das Begrenzen der Ausgaben sowie die Sicherstellung, dass keine falschen Rückerstattungsbeträge ermittelt werden. Das sind API-Design, Datenzugriff, Sicherheit und Betrieb – Themen, die Spring Boot seit 2014 bewältigt.
Der beliebte Weg, das Modell hinter FastAPI zu platzieren, hatte einen wiederkehrenden Kostenfaktor:
- Zwei Sprachen innerhalb eines einzigen Produkts
- Getrennte Deployment-Pipelines
- Getrennte Monitoring-Systeme
Die Leute akzeptierten das, weil Java an seriösen Tools für große Sprachmodelle mangelte. Bis 2025 war das nicht mehr der Fall. Spring AI 1.0 wurde im Mai 2025 allgemein verfügbar, und Version 2.0 erschien im Juni 2026 zusammen mit Spring Boot 4. LangChain4j erreichte in derselben Zeit Version 1.0. Der JVM-Stack holt jetzt nicht mehr auf. Für Teams, die bereits mit Spring arbeiten, ist das eine sinnvolle Standardwahl.
Was „KI hinzufügen“ in einer Spring-Anwendung bedeutet
Es ist keine Neuimplementierung nötig, lediglich drei Funktionen.
- Eine Chat-Schicht.
ChatClientin Spring AI oder einAiServicein LangChain4j wandeln einen Prompt sowie die Nachrichtenhistorie in eine Antwort des Modells um. Der Streambetrieb ist standardmäßig vorhanden, und die strukturierte Ausgabe kann in einer Java-Record gespeichert werden, was das Auswerten von JSON aus Text mit regulären Ausdrücken überflüssig macht. - Zugriff auf eigene Daten. Sie berechnen Embeddings und speichern sie in einem Vektorlager, sodass die Antworten aus Ihren Richtlinien, Rechnungen, Handbüchern und Produktdokumentationen stammen – nicht aus dem, was das Modell nur halb in Erinnerung hat. Dies ist Retrieval-Augmented Generation (RAG).
- Aufrufe von Tools. Das Modell kann unter Berücksichtigung Ihrer Autorisierungsregeln Java-Methoden aufrufen, zum Beispiel um eine Bestellung abzurufen, einen Fall zu öffnen oder einen Saldo einzusehen. Hier kommen das Typensystem sowie die bereits vorhandenen Dienste zum Tragen. Das Modell ist nicht Ihre Quelle der Wahrheit – es arbeitet auf deren Grundlage.
Mit Spring Security, Spring Data, Actuator und PostgreSQL vorhanden ist dies eine weitere Client-Art – genauso wie damals, als Redis oder Kafka eingeführt wurden.
RAG, erklärt für Java-Entwickler
Wenn man den Mythos weglässt, handelt es sich bei RAG um einen Suchprozess, der mit einem Sprachmodell endet. Die Schritte sind:
- Dokumente in Blöcke aufteilen.
- Jeden Block in ein Embedding umwandeln, also in einen Vektor aus Gleitkommazahlen, der seine Bedeutung kodiert.
- Die Vektoren zusammen mit Metadaten wie Tenant, Dokument-ID, Quell-URI und Datum speichern.
- Wenn eine Frage eintrifft, diese in einen Vektor umwandeln und die am nächsten liegenden Blöcke suchen.
- Diese Blöcke in die Anfrage einfügen.
- Das Modell anweisen, ausschließlich auf dieser Basis zu antworten und anzugeben, wenn die Blöcke keine Antwort enthalten.
Eine Vektordatenbank ersetzt nicht Ihre transaktionale Datenbank. Es handelt sich dabei um einen semantischen Index, ähnlich wie Elasticsearch, nur mit einem anspruchsvolleren Wortschatz.
Für Spring Boot-Projekte ist PostgreSQL in Kombination mit pgvector in der Regel der Ausgangspunkt. PostgreSQL ist bereits implementiert, gesichert und gepoolt, wodurch eine Erweiterung günstiger ist als der sofortige Einsatz von Pinecone, Weaviate oder Qdrant. Spezialisierte Suchmaschinen haben zwar Vorteile, wenn die Skalierung extrem ist oder eine hybride Suche erforderlich ist, doch die meisten internen RAG-Anwendungen bleiben weit unter diesem Niveau.
Ein funktionsfähiges Skelett
In der untenstehenden Einrichtung wird Spring AI 2.0 mit Boot 4 kombiniert; bei Boot 3.4 oder 3.5 sollte stattdessen die Version 1.1.x verwendet werden. Fügen Sie zunächst die BOM hinzu, damit alle Starter-Projekte auf derselben Version laufen:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>1.1.8</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Dann deklarieren Sie nur die Abhängigkeiten, die Sie benötigen:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-vector-store-pgvector</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
JDBC wird absichtlich aufgeführt. Der pgvector-Starter funktioniert über JdbcTemplate, und das Vergessen dieser Abhängigkeit ist eine überraschend häufige Ursache für einen fehlgeschlagenen Start.
Einstellungen finden sich in application.yml. Das ist der Sinn von Spring AI: Ein Modell sollte wie eine Datenquelle konfiguriert werden.
spring:
datasource:
url: jdbc:postgresql://localhost:5432/app
username: app
password: ${DB_PASSWORD}
ai:
openai:
api-key: ${OPENAI_API_KEY}
chat:
options:
model: gpt-4o-mini
temperature: 0.2
embedding:
options:
model: text-embedding-3-small
vectorstore:
pgvector:
initialize-schema: true
index-type: HNSW
distance-type: COSINE_DISTANCE
dimensions: 1536
Zwei Aspekte in dieser Datei sind wichtiger, als es auf den ersten Blick scheint. Die Embedding-Dimension muss dem Wert entsprechen, den das Embedding-Modell erzeugt – text-embedding-3-small liefert dabei 1536. Ändert man das Modell und ignoriert diese Zahl, verschlechtert sich die Similaritätssuche, ohne dass ein Fehler auftritt. Der zweite Aspekt ist eine niedrige Temperatur für RAG, da man ein Ergebnis möchte, das eng am abgerufenen Text orientiert ist und nicht eine kreative Umformulierung eines Bilanzberichts.
Betrachten Sie die Dateneingabe als eigenständigen Service und nicht nur als einen einzigen Befehl im Controller. VectorStore.add(...) akzeptiert Document-Blöcke, und jeder Block sollte die Metadaten enthalten, nach denen Sie später filtern möchten – beispielsweise tenantId, source, docType und effectiveDate. Ohne Filter kann die semantische Suche den Vertrag eines Kunden in der Antwort eines anderen Kunden anzeigen.
Die Abfragen sind genauso kurz. Der QuestionAnswerAdvisor in Spring AI ist eine vorgefertigte Version dieses Prozesses: Daten abrufen, Kontext hinzufügen, das Modell aufrufen. Wenn Sie Filter, Neubewertung oder Zitate benötigen, verwenden Sie selbst similaritySearch und betrachten Sie filterExpression als WHERE-Klausel, denn genau dazu dient sie.
Einen Vektor-Speicher ohne Dogmen wählen
Es stehen vier Optionen zur Verfügung:
- Postgres mit pgvector. Es handelt sich um die sinnvolle Standardlösung, die gut verstanden wird. Mit HNSW-Indizierung, Überwachung der Trefferquote und kompakten Dateneinheiten kann es mit Dutzenden Millionen von Vektoren umgehen. Es reicht jedoch nicht aus, wenn Sie eine fortgeschrittene hybride Suche oder ein Team benötigen, das sich auf den Betrieb einer annähernden Nachbarschaftssuch-Infrastruktur spezialisiert hat.
Die Methode zur Entscheidungsfindung ist einfach – und das ist ihre Stärke. Beginnen Sie mit pgvector, wenn Postgres bereits in der Produktion läuft. Wechseln Sie den Ansatz, wenn sich Erinnerungsfunktionen, Latenzzeiten oder hybride Suchverfahren nicht an echte SLOs halten – und nicht, weil irgendein Vortrag behauptet, ernsthafte KI-Anwendungen würden ein bestimmtes Produkt nutzen. Halten Sie außerdem eine Referenz auf das ursprüngliche Dokument neben jedem Vektor bereit, damit Sie diesen jederzeit neu einbetten können, falls sich die Richtlinien ändern.
Dieser letzte Punkt wird in den Tutorials oft übersehen. Embedding-Modelle werden ersetzt, die Aufteilung in Blöcke wird intelligenter und Rechtsdokumente werden geändert. Ein idempotenter Eingabevorgang, der nach der Dokumentversion sortiert ist, erspart Ihnen ein Viertel der Arbeit damit, herauszufinden, warum der Bot das Gebührenschema vom letzten Jahr anwendet.
Spring AI versus LangChain4j
Sowohl Lösungen sind für die Produktion bereit. Welche sich eignet, hängt davon ab, wo Ihr Team derzeit steht.
Spring AI übernimmt die aus Spring bekannte Idee portabler Abstraktionen und wendet sie auf Modelle an. Wenn man es sich als Spring Data für LLMs vorstellt, erscheint das logisch – Auto-Konfiguration, ChatClient, Advisor, Actuator und Micrometer passen alle dazu. Verwenden Sie 2.0 mit Boot 4. Bei Boot 3 sollten Sie bei 1.1.x bleiben, da 2.0 nicht einfach so nachgerüstet werden kann.
LangChain4j ist in erster Linie für Java geschrieben und bietet zusätzlich einen Spring Starter. Es unterstützt mehr Anbieter, seine typisierten AiServices ähneln Feign-Clienten, die auf Modelle verweisen, und eignet sich für Teams, die auch Quarkus oder reines Java verwenden. Personen, die eine enge Kontrolle über den Agenten-Loop wünschen, wählen in der Regel dieses Tool.
Nichts hindert Sie daran, beides zu nutzen. Eine praktikable Aufteilung besteht darin, Spring AI für Chats und RAG im kundenorientierten Service einzusetzen, wobei LangChain4j Lücken für bestimmte Anbieter oder Agentenmuster schließt. Halten Sie die jeweiligen Komponenten getrennt und lassen Sie niemals zwei verschiedene Embedding-Modelle in dieselbe Tabelle inkompatible Vektoren schreiben.
Eine rein auf Spring Boot basierende Umgebung, die einen Upgrade auf Boot 4 planen kann, sollte Spring AI verwenden. Eine gemischte JVM-Umgebung oder eine, die seit einem Jahr bei Boot 3 feststeckt, wird vermutlich feststellen, dass LangChain4j weniger von den Versionsentwicklungen des Frameworks abhängt.
In der Produktion hat die JVM den Vorteil
Jeder kann eine Antwort demonstrieren. Ein Produkt hingegen muss einer Überprüfung standhalten. Hier sind die Bereiche, die berücksichtigt werden müssen:
- Begründung und Ablehnungen. Beschränken Sie das Modell auf den abgerufenen Kontext und geben Sie Quellenangaben an. Wenn die Ähnlichkeitswerte unter einem Schwellenwert liegen, sollte die Antwort lauten „Das steht nicht in der Wissensdatenbank“, und keine Schätzung. Im Finanzwesen, in der Betriebsführung und im Gesundheitswesen ist ein selbstbewusster Fehler teurer als eine einfache Ablehnung.
- Mietverhältnisse und Redaktion. Filtern Sie Vektoren nach Mieter und entfernen Sie sensible Informationen aus den Anfragen. Halten Sie Kreditkartennummern, Kontonummern und Gesundheitsdaten aus den Roh-Log-Dateien fern. Falls das Debuggen deren Aufzeichnung erfordert, tokenisieren Sie sie zunächst und speichern Sie sie gemäß den Aufbewahrungsregeln des Quellsystems.
- Budgets für Kosten und Latenz. Tokens kosten Geld, daher sollten Eingabetokens, Ausgabetokens, Abrufzeit und Modellzeit aufgezeichnet werden. Legen Sie eine Obergrenze für die Anzahl der Tokens pro Aufruf fest, speichern Sie Embeddings wiederholter Dokumente im Cache und leiten Sie Klassifizierungen oder Routings an ein kleineres Modell weiter; nutzen Sie nur ein größeres Modell, wenn es wirklich notwendig ist.
Das alles sind vertraute Spring-Verfahren: Einrahmen einer Remote-Aufruf, Kennzeichnen einer Metrik, Ablehnen nicht authentifizierter Anfragen. Das LLM ist eine neue Abhängigkeit mit einem schlechteren SLA, daher muss es wie eine solche verwaltet werden.
Wo der Satz „Java ist König“ zutrifft
Java ist der bessere Ausgangspunkt, wenn das System bereits auf der JVM läuft, wenn die KI-Funktion Identität, Berechtigungen und Auditing-Daten mit bestehenden APIs teilen muss, wenn sie interne Java-Dienste als Werkzeuge aufrufen muss, wenn Compliance-Vorgaben keinen „Schatten-Python-Stack“ zulassen und wenn die Personen, die um 2 Uhr morgens im Einsatz sind, bereits mit Spring Boot vertraut sind.
Python bleibt weiterhin führend, wenn man trainiert oder feintuniert, wenn man eine Forschungsbibliothek bereits in der Woche ihrer Veröffentlichung benötigt oder wenn das Modell selbst das Produkt ist und nicht nur eine Funktion innerhalb einer größeren Anwendung.
Das sind getrennte Aufgaben, und zwei Jahre lang handelte die Branche so, als wären es keine. Das Ergebnis war eine Flut an Architekturen mit einem Python Sidecar und der Hoffnung, dass dessen Konzept weiterhin gültig bleiben würde. Das für 2026 interessante Muster ist gemischt: Python oder ein gehostetes Modelllabor übernehmen das Training und die Bewertung, Java stellt den Dienst bereit, die Vektorabfrage steht neben den operativen Daten, das Modell stammt von einem Anbieter und die Domänenlogik bleibt in Ihren Händen.
Ein sinnvoles erstes Projekt
Fangen Sie nicht mit einem unbegrenzten Unternehmensweiten Chatbot an. Wählen Sie einen eng gefassten, wertvollen Inhaltsbereich sowie eine Frage, für die Sie Bewertungen vornehmen können. Einige erfolgreiche Beispiele:
- Runbook-Fragen und -Antworten für On-Call-Ingenieure, verknüpft mit der Quellseite
- Ein Richtlinienassistent, der den genauen Vertragspunkt zitiert
- Fragen und Antworten zu einer Rechnung oder einem Auszug, den ein Benutzer gerade hochgeladen hat
Platzieren Sie dies hinter einer bereits vorhandenen, authentifizierten API, protokollieren Sie jede Abfrage, zeigen Sie Zitate in der Benutzeroberfläche an, fügen Sie einen Konfigurations-Aus-Schalter hinzu und ermitteln Sie die Kosten pro Anfrage, bevor Sie das Korpus erweitern. Das erste Projekt vermittelt das Aufteilen in Blöcke, Metadaten, Bewertung sowie die Steuerung von Prompt-Änderungen – diese Fähigkeiten sind übertragbar, während die Marke des Frameworks das nicht ist.
Die Laufzeitumgebung, der Sie bereits vertrauen
„Java ist der neue König der KI“ funktioniert als Schlagzeile, aber nicht als These. Java hat das Maschinelles Lernen nicht für sich gewonnen; es hat die angewandte KI in die Plattform integriert, die bereits die weltweiten Transaktionssysteme beherbergt.
Ein Spring Boot-Entwickler benötigt weder die Erlaubnis von jemandem noch einen Abschluss in Datenwissenschaft, um hier zu arbeiten. Erforderlich sind lediglich ein Modellanbieter, ein Embedding-Modell, ein Vektorindex sowie die gleiche betriebliche Sorgfalt wie bei Zahlungen und Messaging. Python bleibt der Star im Labor. Java wird zum Leitfaden auf dem Weg vom Labor zur Buchhaltung – dort benötigen Antworten eine Grundlage, Toolaufrufe eine Autorisierung und jede Rechnung eine Erklärung. Für die meisten Teams ist das die einzige „Krone“, die es wert ist, erworben zu werden.
Falls ein Ihrer Spring Boot-Dienste bereits Identität, Geld und die Audit-Trail-Verwaltung steuert, gibt es keinen Grund, auf ein Sidecar zu warten. Wählen Sie diese Woche einen eng gefassten Datensatz aus, setzen Sie ChatClient vor pgvector und verlangen Sie Zitierungen des Modells.