Übersicht
Fess unterstützt eine KI-Suchmodus-Funktion (RAG: Retrieval-Augmented Generation), die große Sprachmodelle (LLM) nutzt. Mit dieser Funktion können Benutzer Informationen in einem dialogorientierten Format mit einem KI-Assistenten abrufen, der auf Suchergebnissen basiert, und erhalten so Antworten auf natürlichsprachliche Fragen direkt aus Ihrem Unternehmens-Suchindex mit zitierten Quellen.
Die LLM-Integrationsfunktion wird als fess-llm-*-Plugin bereitgestellt. Installieren Sie das Plugin, das dem LLM-Anbieter entspricht, den Sie verwenden möchten.
Der KI-Suchmodus ruft Dokumente über die standardmäßige Fess-Suchpipeline (Rank Fusion) ab, nicht über einen separaten Vektorindex — standardmäßig handelt es sich dabei um eine Schlüsselwortsuche (BM25). Da diese Pipeline wiederverwendet wird, nimmt der semantische Sucher der im Kern integrierten semantischen Suche (Content-Chunking + Vektorsuche), sofern aktiviert, an der Rank Fusion für alle Suchen teil, einschließlich des Abrufschritts des KI-Suchmodus; damit der semantische Sucher teilnimmt, ist keine KI-Suchmodus-spezifische Konfiguration erforderlich. Die Anzahl der Chunks, die an die Antwortgenerierung übergeben werden, lässt sich jedoch über content_chunker.chat.top_k anpassen. Siehe Hybride Suche und Rank Fusion (Semantisch + Schlüsselwort) und Semantische Suche (Content-Chunking + Vektorsuche).
Unterstützte Anbieter
Fess unterstützt die folgenden LLM-Anbieter.
| Anbieter | Einstellungswert | Plugin | Beschreibung |
|---|---|---|---|
| Ollama | ollama | fess-llm-ollama | Open-Source-LLM-Server, der in lokalen Umgebungen läuft. Kann Modelle wie Llama, Mistral und Gemma ausführen. Standardeinstellung. |
| OpenAI | openai | fess-llm-openai | Cloud-API von OpenAI. Ermöglicht die Nutzung von Modellen wie GPT-5. |
| Google Gemini | gemini | fess-llm-gemini | Cloud-API von Google. Ermöglicht die Nutzung von Gemini-Modellen. |
Anbietervergleich
Anbieter (rag.llm.name) | Standardmodell | Endpunkt | Authentifizierung | Datenstandort |
|---|---|---|---|---|
Ollama (ollama) | gemma4:e4b | http://localhost:11434 | Keine (lokal) | Lokal / selbst gehostet — Fragen und Dokumente verbleiben auf Ihrem Host |
OpenAI (openai) | gpt-5-mini | https://api.openai.com/v1 | Authorization: Bearer (rag.llm.openai.api.key) | Cloud — die Frage und die abgerufenen Dokumente werden an OpenAI gesendet |
Google Gemini (gemini) | gemini-3.1-flash-lite-preview | https://generativelanguage.googleapis.com/v1beta | x-goog-api-key (rag.llm.gemini.api.key) | Cloud — die Frage und die abgerufenen Dokumente werden an Google gesendet |
Bemerkung
Der Standardwert von rag.llm.name ist ollama. Dieser Wert bestimmt den Namen der zu ladenden DI-Komponente ({rag.llm.name}LlmClient). Wenn Sie daher rag.llm.name auf dem Standardwert belassen und nur ein anderes Plugin als fess-llm-ollama installieren, wird kein einziger LLM-Client aktiv. In diesem Fall erscheint im Log die Warnung [LLM] LlmClient not found. componentName=ollamaLlmClient, und der KI-Suchmodus steht nicht zur Verfügung. Setzen Sie rag.llm.name unbedingt entsprechend dem installierten Plugin. Mit none lässt sich die LLM-Integration explizit deaktivieren.
Plugin-Installation
Die LLM-Funktion wird als Plugin bereitgestellt. Installieren Sie das fess-llm-{provider}-Plugin, das dem gewünschten Anbieter entspricht.
Die Installation ist über die Seite System > Plugin in der Administrationsoberfläche möglich. fess-llm-*-Plugins werden in der Liste der installierbaren Plugins angezeigt.
Für die manuelle Installation legen Sie die entsprechende JAR-Datei (Beispiel: fess-llm-openai-15.8.0.jar für den OpenAI-Anbieter) im folgenden Verzeichnis ab.
In beiden Fällen wird das Plugin nach der Installation beim nächsten Neustart von Fess geladen.
Architektur
Die KI-Suchmodus-Funktion arbeitet mit dem folgenden Ablauf.
Benutzereingabe: Der Benutzer gibt eine Frage in der Chat-Oberfläche ein
Absichtsanalyse (intent): Das LLM analysiert die Benutzerfrage und extrahiert Suchbegriffe
Suchausführung (search): Die Fess-Suchmaschine sucht nach relevanten Dokumenten
Ergebnisbewertung (evaluate): Das LLM bewertet die Relevanz der Suchergebnisse und wählt die optimalen Dokumente aus
Query-Regenerierung (bei Bedarf): Werden keine Suchergebnisse gefunden oder keine relevanten Dokumente in der Bewertung ermittelt, regeneriert das LLM die Abfrage und führt eine erneute Suche durch
Inhaltsabruf (fetch): Der Volltext der ausgewählten Dokumente wird abgerufen
Antwortgenerierung (answer): Das LLM generiert eine Antwort auf Basis der abgerufenen Dokumente (mit Markdown-Rendering)
Quellenangabe: Die Antwort enthält Links zu den referenzierten Quelldokumenten
Bemerkung
Die interne Verarbeitung besteht aus fünf Phasen: intent, search, evaluate, fetch und answer. Der Fortschritt jeder Phase wird dem Client per Streaming (SSE) mitgeteilt. Die Query-Regenerierung ist keine eigenständige Phase, sondern wird als Fallback der search-Phase gemeldet; anschließend wird search erneut ausgeführt.
Bemerkung
Der oben beschriebene Ablauf gilt für den Fall, dass die Streaming-API die Absicht als „Suche“ einstuft. Je nach Ergebnis der Absichtserkennung kann der Ablauf abweichen. Wird die Frage als unklar eingestuft, wird eine Antwort ohne Suche generiert; wird eine URL-Zusammenfassung angefordert, erfolgt eine URL-Suche ohne Bewertungsphase. Zudem führt das nicht-streamende POST /api/v2/chat keine Bewertungsphase aus und meldet auch keinen phasenweisen Fortschritt.
Grundeinstellungen
Die LLM-Funktion wird an den folgenden zwei Stellen konfiguriert.
Allgemeine Einstellungen in der Administrationsoberfläche / system.properties
Konfiguration über die allgemeinen Einstellungen der Administrationsoberfläche oder in system.properties. Wird zur Auswahl des LLM-Anbieters verwendet.
fess_config.properties
Konfiguration in app/WEB-INF/classes/fess_config.properties (bei der Paketversion /etc/fess/fess_config.properties). Diese Datei dient der Aktivierung des KI-Suchmodus, der Sitzungs- und Verlaufskonfiguration sowie anbieterspezifischer Einstellungen (Verbindungs-URLs, API-Schlüssel, Generierungsparameter usw.).
Detaillierte Einstellungen für jeden Anbieter finden Sie in den folgenden Dokumenten.
Ollama-Konfiguration (Lokales LLM / RAG) - Ollama-Konfiguration
OpenAI-Konfiguration (AI-Suche / RAG) - OpenAI-Konfiguration
Google Gemini-Konfiguration (AI-Suche / RAG) - Google Gemini-Konfiguration
Gemeinsame Einstellungen
Einstellungselemente, die für alle LLM-Anbieter gemeinsam gelten. Diese werden in fess_config.properties konfiguriert.
Kontexteinstellungen
| Eigenschaft | Beschreibung | Standard |
|---|---|---|
rag.chat.context.max.documents | Maximale Anzahl der Dokumente im Kontext | 5 |
rag.chat.content.fields | Aus Dokumenten abzurufende Felder | title,url,content,doc_id,content_title,content_description |
Bemerkung
Die maximale Zeichenzahl des Kontexts (context.max.chars) wurde auf eine anbieter- und prompttypspezifische Einstellung umgestellt. Konfigurieren Sie diese in fess_config.properties als rag.llm.{provider}.{promptType}.context.max.chars.
Systemprompt
Systemprompts werden nicht in Property-Dateien, sondern in den DI-XML-Dateien der jeweiligen Plugins verwaltet.
Der Systemprompt wird in der Datei fess_llm++.xml definiert, die in der JAR-Datei jedes fess-llm-*-Plugins enthalten ist. Um den Prompt anzupassen, müssen Sie die JAR-Datei nicht entpacken und die Datei darin bearbeiten. Dank des LastaDi-Mechanismus zur Neudefinition von Komponenten wird die Komponentendefinition des Plugins ersetzt, wenn Sie in app/WEB-INF/classes/ eine Datei mit dem Namen fess_llm+{Komponentenname}.xml ablegen.
Die Komponentennamen sind je nach Anbieter wie folgt:
| Anbieter | Komponentenname |
|---|---|
| Ollama | ollamaLlmClient |
| OpenAI | openaiLlmClient |
| Google Gemini | geminiLlmClient |
Um beispielsweise den Antwortgenerierungs-Prompt des OpenAI-Anbieters zu ändern, erstellen Sie app/WEB-INF/classes/fess_llm+openaiLlmClient.xml.
Warnung
Die Neudefinitionsdatei ersetzt die Komponentendefinition vollständig. Geben Sie daher alle Inhalte an, die in der ursprünglichen fess_llm++.xml enthalten sind (Klassenname, postConstruct, preDestroy sowie alle unveränderten Prompt-Eigenschaften). Nicht angegebene Eigenschaften werden zurückgesetzt.
Warnung
Kopieren Sie nicht einfach fess_llm++.xml selbst nach app/WEB-INF/classes/. Da bei DI-XML-Dateien, deren Dateiname auf ++ endet, alle Vorkommen im Classpath als „Ergänzung“ geladen werden, würde dieselbe Komponente doppelt registriert, was zu TooManyRegistrationComponentException führt und den Start von Fess verhindert.
Verfügbarkeitsprüfung
| Eigenschaft | Beschreibung | Standard |
|---|---|---|
rag.llm.{provider}.availability.check.interval | Intervall zur regelmäßigen Prüfung der LLM-Verfügbarkeit (Sekunden) | 60 |
Diese Einstellung wird in fess_config.properties vorgenommen. Fess überprüft regelmäßig den Verbindungsstatus zum LLM-Anbieter.
Bemerkung
Wird für diese Eigenschaft ein Wert kleiner oder gleich 0 oder ein nicht-numerischer Wert angegeben, wird dieser ignoriert, und stattdessen wird der Standardwert (60) verwendet. Mit dieser Eigenschaft lässt sich die Verfügbarkeitsprüfung nicht deaktivieren. Zudem wird die Verfügbarkeitsprüfung nicht ausgeführt, wenn rag.chat.enabled auf false gesetzt ist, sowie für Anbieter, die nicht über rag.llm.name ausgewählt sind.
Sitzungsverwaltung
Einstellungen zu Chat-Sitzungen. Diese werden in fess_config.properties konfiguriert.
| Eigenschaft | Beschreibung | Standard |
|---|---|---|
rag.chat.session.timeout.minutes | Sitzungs-Timeout (Minuten) | 30 |
rag.chat.session.max.size | Maximale Anzahl der Sitzungen | 10000 |
rag.chat.history.max.messages | Maximale Anzahl der Nachrichten im Gesprächsverlauf | 30 |
Gleichzeitigkeitssteuerung
Einstellungen zur Steuerung der gleichzeitigen Anfragen an das LLM. Konfiguration in fess_config.properties.
| Eigenschaft | Beschreibung | Standard |
|---|---|---|
rag.llm.{provider}.max.concurrent.requests | Maximale Anzahl gleichzeitiger Anfragen an den Anbieter | 5 |
rag.llm.{provider}.concurrency.wait.timeout | Maximale Wartezeit (Millisekunden) bis eine freie Kapazität verfügbar ist, wenn die Gleichzeitigkeitsgrenze erreicht wurde. Wird innerhalb dieser Zeit keine Kapazität frei, wird ein Ratenlimitierungsfehler zurückgegeben | 30000 |
Um beispielsweise die Gleichzeitigkeitssteuerung für den OpenAI-Anbieter zu konfigurieren:
Bewertungseinstellungen
Einstellungen zur Bewertung der Suchergebnisse. Konfiguration in fess_config.properties.
| Eigenschaft | Beschreibung | Standard |
|---|---|---|
rag.llm.{provider}.chat.evaluation.max.relevant.docs | Maximale Anzahl der in der Bewertungsphase ausgewählten relevanten Dokumente | 3 |
Prompttypspezifische Einstellungen
Generierungsparameter können für jeden Prompttyp einzeln konfiguriert werden. Dies ermöglicht eine feinere Abstimmung je nach Verwendungszweck. Die Konfiguration erfolgt in fess_config.properties.
Prompttypen-Übersicht
| Prompttyp | Einstellungswert | Beschreibung |
|---|---|---|
| Absichtsanalyse | intent | Analysiert die Benutzerfrage und extrahiert Suchbegriffe |
| Bewertung | evaluation | Bewertet die Relevanz der Suchergebnisse |
| Unklare Anfrage | unclear | Generiert eine Antwort, wenn die Frage unklar ist |
| Keine Ergebnisse | noresults | Generiert eine Antwort, wenn keine Suchergebnisse gefunden werden |
| Dokument nicht vorhanden | docnotfound | Generiert eine Antwort, wenn kein passendes Dokument existiert |
| Antwortgenerierung | answer | Generiert eine Antwort auf Basis der Suchergebnisse |
| Zusammenfassung | summary | Generiert eine Zusammenfassung des Dokuments |
| FAQ | faq | Generiert eine Antwort im FAQ-Format |
| Direkte Antwort | direct | Generiert eine Antwort ohne Suchumweg (wird in der aktuellen Version nicht aufgerufen) |
| Query-Regenerierung | queryregeneration | Regeneriert die Abfrage, wenn keine Suchergebnisse gefunden werden |
Konfigurationsmuster
Prompttypspezifische Einstellungen werden nach folgendem Muster angegeben.
Konfigurationsbeispiel (OpenAI-Anbieter):
Bemerkung
temperature, max.tokens und context.max.chars sind bei allen Anbietern gemeinsam verfügbar. Die Standardwerte dieser Parameter unterscheiden sich jedoch je nach Anbieter und Prompttyp.
Darüber hinaus unterstützt jeder Anbieter eigene Parameter. Die Unterstützung im Überblick:
| Parameter | Ollama | OpenAI | Gemini |
|---|---|---|---|
thinking.budget | Unterstützt | Nicht unterstützt | Unterstützt |
thinking.level | Unterstützt | Nicht unterstützt | Nicht unterstützt |
top.p | Unterstützt | Unterstützt | Nicht unterstützt |
top.k, num.ctx | Unterstützt | Nicht unterstützt | Nicht unterstützt |
reasoning.effort | Nicht unterstützt | Unterstützt | Nicht unterstützt |
frequency.penalty, presence.penalty | Nicht unterstützt | Unterstützt | Nicht unterstützt |
Bemerkung
Wird ein „nicht unterstützter“ Parameter angegeben, führt dies nicht zu einem Fehler, sondern der Parameter wird einfach ignoriert. Details zur Bedeutung der einzelnen Parameter und den zulässigen Werten finden Sie in der jeweiligen Anbieterdokumentation.
Bemerkung
Nur beim Ollama-Anbieter gibt es einen Fallback, der bei fehlender prompttypspezifischer Einstellung auf rag.llm.ollama.default.{Parameter} zurückgreift (mit Ausnahme von context.max.chars). Für die Anbieter OpenAI und Gemini gibt es diesen Fallback nicht; fehlt eine prompttypspezifische Einstellung, wird stattdessen der im Plugin fest hinterlegte Standardwert verwendet.
Nächste Schritte
Ollama-Konfiguration (Lokales LLM / RAG) - Detaillierte Ollama-Konfiguration
OpenAI-Konfiguration (AI-Suche / RAG) - Detaillierte OpenAI-Konfiguration
Google Gemini-Konfiguration (AI-Suche / RAG) - Detaillierte Google Gemini-Konfiguration
AI-Suchmodus-Funktion konfigurieren - Detaillierte Konfiguration der KI-Suchmodus-Funktion
Hybride Suche und Rank Fusion (Semantisch + Schlüsselwort) - Rank Fusion Konfiguration (Zusammenführung hybrider Suchergebnisse)
KI-Suchmodus - Verwendung des KI-Suchmodus
Chat-API - Chat-API-Referenz