# Conflicts: # src/Config/NdjsonHybridRetrieverConfig.php
README.md
RetrieX
Hinweis: Das System wird fachlich als RetrieX bezeichnet.
Im Repository existieren aus historischen Gründen noch einzelne Bezeichner wieRAG,rag.zipoderRAG_SYSTEM_OVERVIEW.md.
Überblick
RetrieX ist ein dokumentenbasiertes Assistenzsystem auf Basis von Retrieval-Augmented Generation.
Das System beantwortet Nutzeranfragen nicht rein frei, sondern kombiniert:
- versionierte Wissensdokumente
- deterministische Ingest- und Indexierungslogik
- hybrides Retrieval mit Routing
- optionale Shopware-Live-Produktsuche
- LLM-basierte Antwortformulierung
- SSE-Streaming für die Browserausgabe
Der aktuelle Stand ist kein generischer Chatbot, sondern eine kontrollierte Wissens- und Antwortpipeline.
Technologiestack
Backend
- PHP 8.2
- Symfony 7.4
- Doctrine ORM / Doctrine Migrations
- Symfony Messenger
- Symfony HttpClient
- Twig
Python-Layer
- SentenceTransformers
- FAISS
- FastAPI
- uvicorn
Zusätzliche Libraries
fivefilters/readability.phpfür URL-Inhaltsauswertungsmalot/pdfparserfür PDF-Textgewinnungleague/commonmarkfür Markdown-Rendering
Kernidee des Systems
RetrieX trennt klar zwischen:
-
Primärquellen
Dokumente, Dokumentversionen, aktive System-Prompts, Modellkonfigurationen, optionale Shopdaten -
Index- und Retrieval-Ebene
index.ndjson,index_meta.json,index_runtime.json,vector.index,tags.ndjson,vector_tags.index -
Orchestrierung
Anfrageannahme, Kontextaufbau, URL-Analyse, Retrieval, Commerce-Erkennung, Prompt-Aufbau, Streaming -
Ausgabe
Token-Streaming an das Frontend über Server-Sent Events
Aktuell unterstützte Dokumentformate
Der verifizierte aktuelle Loader unterstützt:
- TXT
- MD
Wichtig:
Im aktuellen Code-Stand ist kein produktiver DOCX-Loader in der eigentlichen Ingest-Pipeline sichtbar. Die README sollte deshalb bewusst nur die real verifizierten Formate nennen.
Laufzeitfluss einer Anfrage
Der zentrale Browser-Endpunkt ist:
POST /ask-sse
Die Anfrage läuft im aktuellen Stand vereinfacht so:
AskSseControllernimmt die Anfrage entgegenClientIdResolverbestimmt eine stabile Client-ID- Antwort wird als SSE-Stream geöffnet
AgentRunnerorchestriert den kompletten Ablauf- Optional wird URL-Inhalt aus dem Prompt extrahiert
RetrieverInterfacebzw.NdjsonHybridRetrieverholt Wissenskontext- Optional wird Commerce-Intent erkannt und Shopware durchsucht
PromptBuilderbaut den finalen LLM-PromptOllamaClientstreamt die Modellantwort- Die Antwort wird chunkweise ins Frontend gesendet
- Der Turn wird in der Gesprächshistorie persistiert
Gesprächskontext
ContextService verwaltet die Konversationshistorie dateibasiert.
Eigenschaften:
- Nutzerhistorie wird pro Client-ID in einer Textdatei gespeichert
- abgeschlossene Turns werden append-only geschrieben
- regulärer Kontext und Full-Context sind getrennt vorgesehen
- der aktuelle SSE-Flow ruft
AgentRunner->run(..., true)auf und nutzt damit vollen Kontext
Standardlogik im aktuellen Stand:
- normale Historie: letzte 20 Zeilen
- voller Kontext: letzte 500 Zeilen
URL-Auswertung
Wenn im Prompt eine URL vorkommt, extrahiert UrlAnalyzer den Inhalt der ersten URL.
Aktuelle Eigenschaften:
- Timeout-basiertes Laden
Readability-basierte Extraktion des lesbaren Inhalts- HTML wird entfernt
- Whitespace wird normalisiert
- Ausgabe wird auf maximal 5000 Zeichen begrenzt
Der extrahierte Text wird als zusätzlicher unterstützender Wissensblock in den finalen Prompt aufgenommen.
Ingest- und Indexarchitektur
Zielbild
RetrieX nutzt eine deterministische Ingest-Architektur mit NDJSON als operativer Wissensbasis und FAISS als Vektorindex.
Zentrale Dateien
var/knowledge/index.ndjsonvar/knowledge/index_meta.jsonvar/knowledge/index_runtime.jsonvar/knowledge/vector.indexvar/knowledge/vector.index.meta.jsonvar/knowledge/tags.ndjsonvar/knowledge/vector_tags.indexvar/knowledge/vector_tags.index.meta.json
Bedeutung
index.ndjson
Operative Chunk-Basis des Systems:
- eine JSON-Zeile pro Chunk
- streamingfähig
- geeignet für append und full rewrite
- Grundlage für den Vector-Rebuild
index_meta.json
Struktur-Metadaten des Index, u. a.:
index_versioncreated_atchunk_sizechunk_overlapembedding_modelembedding_dimensionscoring_version- weitere Strukturfelder aus der aktiven Index-Konfiguration
index_runtime.json
Laufzeitdaten, u. a.:
chunk_countlast_rebuild_at- optionale Commit-Marker wie
last_tags_rebuild_at
Dokument-Lifecycle
Der aktuelle Dokumentfluss ist technisch so aufgebaut:
- Dokumentversion wird aktiviert oder ingestiert
- Guardrails prüfen die Strukturverträglichkeit
- alte Chunks des Dokuments werden entfernt
- neue Chunks werden streamingfähig geschrieben
- der komplette Vektorindex wird neu gebaut
- Runtime-Stats werden atomar aktualisiert
- Status der Version wird auf
INDEXEDgesetzt
Wichtige Eigenschaft:
- Pro Dokument gibt es fachlich eine aktive Version
- Chunks sind abgeleitete Artefakte, keine Primärdaten
Ingest-Services im aktuellen Stand
GuardrailValidator
Prüft über IndexMetaManager, ob der aktuelle Index strukturell zur aktiven Konfiguration passt.
Wenn sich relevante Strukturparameter geändert haben, wird lokaler Ingest blockiert.
ChunkWriteService
Kapselt die Schreibzugriffe auf den Chunk-Bestand:
- Gesamtanzahl zählen
- Chunks nach
document_idkompaktieren - neue Chunks anhängen
- vollständigen Rewrite durchführen
VectorRebuildService
Führt den vollständigen FAISS-Rebuild aus und aktualisiert anschließend die Runtime-Metadaten.
IngestFlow
Orchestriert:
- Dokument-Ingest
- Global Reindex
- Dokumentlöschung inklusive Rebuild
Guardrails
RetrieX schützt sich gegen strukturellen Drift.
Lokaler Ingest darf nicht weiterlaufen, wenn sich z. B. diese Strukturparameter geändert haben:
- Embedding-Modell
- Embedding-Dimension
- Chunk-Größe
- Chunk-Overlap
- Scoring-Version
- Index-Strukturkonfiguration
Dann ist ein Global Reindex erforderlich.
Retrieval im aktuellen Stand
Der aktive Retriever ist:
App\Knowledge\Retrieval\NdjsonHybridRetriever
Wichtig:
„Hybrid“ bedeutet hier im verifizierten Code nicht einfach „Keyword + Vektor“, sondern eine orchestrierte Kombination aus mehreren Retrieval-Schritten.
Aktuelle Retrieval-Pipeline
- Query Cleaning
- Query Enrichment
- Intent-Erkennung
- Katalog-/Listenrouting
- Tag-Routing auf Kandidatendokumente
- globale Vektorsuche
- optionale gescopte Vektorsuche auf Kandidatendokumente
- Fusion der Treffer
- Selektion der finalen Chunk-IDs
- Laden der finalen Chunk-Texte aus NDJSON
Verwendete Bausteine
QueryCleanerQueryEnricherIntentLiteSalesIntentLiteCatalogIntentLiteIntentRouteResolverTagRoutingServiceVectorSearchClientNdjsonChunkLookup
Besondere Logiken
- Listenfragen werden gesondert erkannt
- Kataloganfragen können direkt einen Katalogblock statt regulärer Chunks liefern
- globale und gescopte Treffer werden gefused
- Chunk-Selektion ist dokument- und abstandsbegrenzt
Vektor-Layer
Komponenten
python/vector/vector_ingest.pypython/vector/vector_search.pypython/vector/vector_service.py
Betriebsmodus
Der produktive Zugriff erfolgt primär über den HTTP-basierten Vector-Service.
Service-URL im aktuellen Default:
http://127.0.0.1:8090
Aufgaben des Vector-Service
- Embedding-Modell laden
- FAISS-Hauptindex laden
- Tag-Index laden
- Suchanfragen für Chunks beantworten
- Suchanfragen für Tags beantworten
- Reloads auf neue Indexstände ermöglichen
Wichtige Eigenschaft
Der Python-Service hält Modell und Indizes persistent im RAM, um wiederholte Suchanfragen deutlich schneller zu bedienen.
Prompt-Aufbau
PromptBuilder setzt den finalen LLM-Prompt im aktuellen Stand aus diesen Blöcken zusammen:
-
SYSTEM
Aktiver System-Prompt aus der Datenbank -
CONVERSATION CONTEXT (authoritative)
Gesprächshistorie des Nutzers -
LIVE SHOP RESULTS (authoritative for products)
Shopware-Treffer, falls Commerce aktiv ist -
RETRIEVED KNOWLEDGE (supporting)
Wissens-Chunks aus dem Retriever -
CONTENT FROM URL (supporting)
Optional extrahierter Webinhalt -
USER QUESTION
Aktuelle Nutzerfrage
Wichtig:
Für Produktfragen behandelt das System Shopdaten explizit als führende Quelle.
Commerce- und Shopware-Integration
RetrieX besitzt im aktuellen Stand eine optionale Shopware-Store-API-Integration.
Aktivierung
Die Shop-Suche wird nur genutzt, wenn CommerceIntentLite eine passende Anfrage erkennt.
Mögliche Zustände:
noneproduct_searchadvisory_product_search
Signale für Commerce
Der Intent-Detektor reagiert u. a. auf:
- Such- und Produktbegriffe
- SKU-/Zahlenmuster
- Preisangaben
- Größenangaben
- Farbangaben
- beratende Formulierungen wie „passt“, „besser“, „empfiehl“
Aktueller Shop-Flow
- Commerce-Intent erkennen
- LLM erzeugt zunächst eine kurze Shop-Suchphrase
ShopSearchServiceruftCommerceQueryParseraufShopwareCriteriaBuilderbaut SuchkriterienStoreApiClientruft/store-api/searchauf- Ergebnisse werden zu
ShopProductResultgemappt - Ergebnisse fließen in den Prompt ein
Wichtige Anmerkung
Der aktuelle Code kombiniert also:
- heuristische Intent-Erkennung
- LLM-unterstützte Kurzsuchphrase
- deterministische Nachverarbeitung im Parser
- Store-API-Suche
Aktuelle Shop-Parameter
In services.yaml sind u. a. konfiguriert:
mto.commerce.enabledmto.commerce.max_shop_resultsmto.commerce.shop_timeoutmto.commerce.store_api_base_urlmto.commerce.sales_channel_access_key
Antwort-Streaming
Die Browserausgabe erfolgt per Server-Sent Events.
Eigenschaften des aktuellen SSE-Flows
- Output Buffer werden aktiv geleert
- Cookies werden vor Streamstart weitergereicht
- Chunks werden direkt als SSE
data:-Zeilen übertragen - Zeilenumbrüche bleiben erhalten
- am Ende wird ein
done-Event gesendet
Das ist im aktuellen System die bevorzugte Streaming-Variante für den Browser.
Projektstruktur
Die zentralen Verzeichnisse im aktuellen Stand sind:
src/config/templates/migrations/python/public/var/bin/
Wichtige Bereiche in src/
Agent/Commerce/Context/Controller/Index/Ingest/Intent/Knowledge/Routing/Shopware/Tag/Vector/
Wichtige Commands
Verifizierte relevante Commands im aktuellen Stand:
mto:agent:chatmto:agent:ingest:runmto:agent:ingest:versionmto:agent:vector:controlmto:agent:vector:rebuildmto:agent:vector:healthmto:agent:tags:exportmto:agent:tags:rebuildmto:agent:tags:job:runmto:agent:tag:healthmto:agent:system:rebuildmto:agent:test:shop-searchmto:agent:test-vectormto:agent:user:create
Besonders wichtig
Vector-Service steuern
bin/console mto:agent:vector:control --status
bin/console mto:agent:vector:control --install --start --reload