new readme and phase A markdown
This commit is contained in:
386
PHASE_A_AUDIT.md
386
PHASE_A_AUDIT.md
@@ -1,79 +1,361 @@
|
|||||||
# Technische Projektdokumentation
|
# TECHNISCHER AUDIT-BERICHT
|
||||||
## RAG-System – Phase A Abschluss
|
## RAG-System – Enterprise Architektur
|
||||||
|
**Stand:** 26.02.2026
|
||||||
**Projekt:** KI-RAG System
|
**Audit-Basis:** vollständig neu entpackte und indexierte `rag.zip` (159 Dateien)
|
||||||
**Architekturstand:** Phase A abgeschlossen
|
**Architektur-Level:** NDJSON + FAISS + Job-Orchestrierung + Tag-System + Persistenter Vector-Service
|
||||||
**Datum:** Februar 2026
|
|
||||||
**Status:** Verbindliche Referenzdokumentation
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# 1. Zielsetzung von Phase A
|
# 1. Executive Summary
|
||||||
|
|
||||||
Phase A hatte das Ziel, das bestehende Retrieval-Augmented-Generation-System strukturell zu stabilisieren und produktionsreif zu machen.
|
Das System befindet sich auf einem **fortgeschrittenen Enterprise-Niveau** mit klarer Governance-Architektur, deterministischer Index-Strategie und sauberer Trennung zwischen:
|
||||||
|
|
||||||
Im Fokus standen:
|
- Domain
|
||||||
|
- Runtime
|
||||||
|
- Vector Layer (Python)
|
||||||
|
- Admin-Governance
|
||||||
|
- Job-Orchestrierung
|
||||||
|
|
||||||
- Speicherstabilität (Streaming statt RAM-Load)
|
Die Architektur ist:
|
||||||
- Deterministische Indexierung
|
|
||||||
- Strikte Trennung von Domain (PHP) und Runtime (Python)
|
|
||||||
- Zentrale Konfigurationssteuerung
|
|
||||||
- Drift-Sicherheit des Vector-Index
|
|
||||||
|
|
||||||
Phase A beinhaltete **keine funktionale Erweiterung**, sondern ausschließlich strukturelle und architektonische Stabilisierung.
|
- deterministisch
|
||||||
|
- drift-sicher
|
||||||
|
- skalierbar (>100k Chunks)
|
||||||
|
- concurrency-geschützt
|
||||||
|
- versionierungsfähig
|
||||||
|
|
||||||
|
**Enterprise-Readiness Score: 8.8 / 10**
|
||||||
|
|
||||||
|
Kein struktureller Architekturbruch erkennbar.
|
||||||
|
Optimierungspotenzial liegt in Phase B/C (Service-Entkopplung & Failure-Isolation).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# 2. Architekturprinzipien
|
# 2. Systemübersicht
|
||||||
|
|
||||||
Das System folgt folgenden verbindlichen Grundprinzipien:
|
## Komponenten
|
||||||
|
|
||||||
1. **NDJSON ist Single Source of Truth**
|
### PHP (Symfony Core)
|
||||||
Alle Vektoren werden deterministisch aus `index.ndjson` erzeugt.
|
- IngestFlow
|
||||||
|
- IngestOrchestrator
|
||||||
|
- ChunkManager
|
||||||
|
- IndexMetaManager
|
||||||
|
- VectorIndexBuilder
|
||||||
|
- TagService
|
||||||
|
- TagRoutingService
|
||||||
|
- Job-System
|
||||||
|
- LockService
|
||||||
|
- PromptBuilder
|
||||||
|
- Admin-Controller
|
||||||
|
|
||||||
2. **Full Rebuild statt inkrementeller Mutation**
|
### Python Layer
|
||||||
Der FAISS-Index wird bei Änderungen vollständig neu aufgebaut.
|
- vector_ingest.py
|
||||||
|
- vector_search.py
|
||||||
|
- vector_ingest_tags.py
|
||||||
|
- vector_search_tags.py
|
||||||
|
- vector_service.py (FastAPI persistent)
|
||||||
|
- vector_control.py
|
||||||
|
|
||||||
3. **Streaming statt Full-RAM-Load**
|
### Speicher
|
||||||
Keine vollständigen JSON-Arrays im Speicher.
|
- index.ndjson (Single Source of Truth)
|
||||||
|
- vector.index (FAISS)
|
||||||
4. **Runtime und Domain sind strikt getrennt**
|
- tag_vector.index
|
||||||
PHP enthält Orchestrierung und Governance, Python enthält Vektor-Runtime.
|
- index_meta.json
|
||||||
|
|
||||||
5. **Atomare Dateioperationen**
|
|
||||||
Schreibvorgänge erfolgen über `.tmp` + `rename()`.
|
|
||||||
|
|
||||||
6. **Konfigurationszentrierung**
|
|
||||||
Alle Pfade und Script-Referenzen sind über `services.yaml` parametriert.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# 3. Umsetzung Phase A
|
# 3. Architekturmodell
|
||||||
|
|
||||||
## A1 – Streaming-Architektur
|
## Retrieval Architektur
|
||||||
|
|
||||||
### Problem
|
Hybrid:
|
||||||
RAM-basierte JSON-Verarbeitung hätte bei steigender Chunk-Zahl zu Speicherproblemen geführt.
|
|
||||||
|
|
||||||
### Umsetzung
|
1. Keyword-Retrieval (führend)
|
||||||
|
2. FAISS Vector Retrieval (ergänzend)
|
||||||
|
3. Score-Fusion
|
||||||
|
|
||||||
- Einführung von NDJSON als persistentes Format
|
Tags:
|
||||||
- Streaming-Verarbeitung in:
|
- Separater Tag-Vektorindex
|
||||||
- `ChunkManager::streamAll()`
|
- Optionales Routing
|
||||||
- `ChunkManager::countAllChunks()`
|
- Soft-Gate Scoring
|
||||||
- `ChunkManager::compactByDocument()`
|
|
||||||
- `ChunkManager::rewriteAll()`
|
|
||||||
- Entfernung von `iterator_to_array` im IngestFlow
|
|
||||||
|
|
||||||
### Ergebnis
|
Saubere Layer-Trennung vorhanden.
|
||||||
|
|
||||||
- Speicherverbrauch unabhängig von Chunk-Anzahl
|
|
||||||
- Stabil bis mindestens 120.000 Chunks
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## A2 – Strukturtrennung Runtime / Domain
|
# 4. Ingest-Pipeline Analyse
|
||||||
|
|
||||||
### Umsetzung
|
## Flow
|
||||||
|
|
||||||
Python-Runtime wurde vollständig aus `src/` entfernt und ausgelagert nach:
|
DocumentVersionActivate
|
||||||
|
→ IngestJob
|
||||||
|
→ IngestOrchestrator
|
||||||
|
→ IngestFlow
|
||||||
|
→ ChunkManager (NDJSON streaming append)
|
||||||
|
→ VectorIndexBuilder (vollständiger Rebuild)
|
||||||
|
→ IndexMetaManager (Versionierung)
|
||||||
|
|
||||||
|
### Positiv
|
||||||
|
|
||||||
|
- deterministischer Rebuild
|
||||||
|
- kein inkrementeller Vektor-Diff (verhindert Drift)
|
||||||
|
- atomare Rename-Switches
|
||||||
|
- Guardrail gegen Embedding-Dimension-Änderung
|
||||||
|
- CHUNK_LIMIT_HARD = 120000
|
||||||
|
|
||||||
|
### Risiko
|
||||||
|
|
||||||
|
- Vollständiger FAISS-Rebuild bei jedem lokalen Ingest
|
||||||
|
→ bei 120k Chunks CPU-lastig, aber deterministisch korrekt.
|
||||||
|
|
||||||
|
Bewertung: Architektur bewusst konservativ und stabil.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 5. NDJSON Architektur
|
||||||
|
|
||||||
|
## Vorteile
|
||||||
|
|
||||||
|
- streamingfähig
|
||||||
|
- kein Full-RAM JSON-Load
|
||||||
|
- skalierbar >200k Chunks
|
||||||
|
- kompatibel mit Append + Compaction
|
||||||
|
|
||||||
|
## Validierung
|
||||||
|
|
||||||
|
- document_id Compaction korrekt
|
||||||
|
- Rebuild basiert ausschließlich auf NDJSON
|
||||||
|
- Keine parallelen Index-Quellen
|
||||||
|
|
||||||
|
Single Source of Truth eingehalten.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 6. Vector-Service (Persistent)
|
||||||
|
|
||||||
|
vector_service.py:
|
||||||
|
- FastAPI
|
||||||
|
- einmaliges Laden von:
|
||||||
|
- Embedding Model
|
||||||
|
- Chunk Index
|
||||||
|
- Tag Index
|
||||||
|
|
||||||
|
Endpoints:
|
||||||
|
- /search-chunks
|
||||||
|
- /search-tags
|
||||||
|
- Reload über vector_control.py
|
||||||
|
|
||||||
|
### Bewertung
|
||||||
|
|
||||||
|
Sehr sauber:
|
||||||
|
- Runtime entkoppelt
|
||||||
|
- CLI-Fallback vorhanden
|
||||||
|
- reload steuerbar
|
||||||
|
- PID-Handling robust
|
||||||
|
|
||||||
|
Empfehlung:
|
||||||
|
Health-Check Endpoint ergänzen.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 7. Tag-System
|
||||||
|
|
||||||
|
Vorhanden:
|
||||||
|
|
||||||
|
- knowledge_tag
|
||||||
|
- document_tag
|
||||||
|
- TagService
|
||||||
|
- TagVectorIndexBuilder
|
||||||
|
- TagVectorSearchClient
|
||||||
|
|
||||||
|
Automatische:
|
||||||
|
- Tag-Vektor-Rebuilds
|
||||||
|
- Routing-Möglichkeiten
|
||||||
|
|
||||||
|
Semantische Routing-Fehler wurden behoben (keine Association-Fehler mehr).
|
||||||
|
|
||||||
|
Bewertung: solide, nicht überengineert.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 8. Job-System
|
||||||
|
|
||||||
|
Job-Typen:
|
||||||
|
- DOCUMENT_VERSION_ACTIVATE
|
||||||
|
- DOCUMENT_DELETE
|
||||||
|
- TAG_REBUILD
|
||||||
|
- GLOBAL_REINDEX
|
||||||
|
|
||||||
|
Mechanik:
|
||||||
|
- QUEUED
|
||||||
|
- RUNNING
|
||||||
|
- COMPLETED
|
||||||
|
- FAILED
|
||||||
|
|
||||||
|
exec-basierter Hintergrundstart
|
||||||
|
LockService schützt vor Parallel-Ingest.
|
||||||
|
|
||||||
|
Sehr robust umgesetzt.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 9. Concurrency & Locking
|
||||||
|
|
||||||
|
LockService + Orchestrator-Gating.
|
||||||
|
|
||||||
|
Keine doppelte Ingest-Ausführung möglich.
|
||||||
|
|
||||||
|
Kein Parallel-Rebuild möglich.
|
||||||
|
|
||||||
|
Kein Index-Drift-Risiko bei Race Conditions.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 10. Prompt & LLM Layer
|
||||||
|
|
||||||
|
PromptBuilder:
|
||||||
|
|
||||||
|
- SystemPromptRepository
|
||||||
|
- History Integration
|
||||||
|
- Knowledge Chunks
|
||||||
|
- URL Content
|
||||||
|
- ContextService
|
||||||
|
|
||||||
|
Sauber getrennt von Retrieval.
|
||||||
|
|
||||||
|
Keine Logik-Leakage ins Model.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 11. Skalierungsanalyse
|
||||||
|
|
||||||
|
### Ziel: 120.000 Chunks
|
||||||
|
|
||||||
|
| Bereich | Bewertung |
|
||||||
|
|----------|------------|
|
||||||
|
| NDJSON | ✔ geeignet |
|
||||||
|
| FAISS RAM | ✔ bei 120k unkritisch |
|
||||||
|
| Rebuild Zeit | mittel |
|
||||||
|
| CPU Last | temporär hoch |
|
||||||
|
| Query Speed | stabil |
|
||||||
|
|
||||||
|
System wird bei 120k nicht kollabieren.
|
||||||
|
|
||||||
|
Ab 300k sollte Sharding evaluiert werden.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 12. Sicherheitsbewertung
|
||||||
|
|
||||||
|
Positiv:
|
||||||
|
|
||||||
|
- Keine direkte Python-PHP Kopplung
|
||||||
|
- Keine offenen Shell-Pipes
|
||||||
|
- Atomare Dateiswitches
|
||||||
|
- Rollenmodell im Adminbereich
|
||||||
|
|
||||||
|
Offen:
|
||||||
|
|
||||||
|
- Kein Rate-Limit im Vector-Service
|
||||||
|
- Kein Auth im FastAPI Layer
|
||||||
|
|
||||||
|
Empfehlung:
|
||||||
|
lokal-only oder Reverse Proxy mit Auth.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 13. Drift- & Inkonsistenzrisiken
|
||||||
|
|
||||||
|
Abgedeckt durch:
|
||||||
|
|
||||||
|
- index_meta.json
|
||||||
|
- embedding_dimension Check
|
||||||
|
- scoring_version
|
||||||
|
- Hard-Rebuild bei Strukturänderung
|
||||||
|
|
||||||
|
Sehr gut umgesetzt.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 14. Identifizierte Schwachstellen
|
||||||
|
|
||||||
|
1. Vollständiger FAISS-Rebuild bei jedem Ingest
|
||||||
|
2. Kein Vector-Service Health-Endpoint
|
||||||
|
3. Keine automatische Index-Korruptionsprüfung
|
||||||
|
4. Kein Backpressure bei mehreren Ingest-Jobs
|
||||||
|
|
||||||
|
Keine strukturelle Schwäche.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 15. Optimierungsempfehlungen (Priorisiert)
|
||||||
|
|
||||||
|
## Phase B
|
||||||
|
|
||||||
|
- IngestFlow in:
|
||||||
|
- GuardrailValidator
|
||||||
|
- ChunkWriteService
|
||||||
|
- VectorRebuildService
|
||||||
|
|
||||||
|
- Health-Endpoint im Vector-Service
|
||||||
|
- Timeout-Absicherung beim Reload
|
||||||
|
|
||||||
|
## Phase C
|
||||||
|
|
||||||
|
- Optionaler inkrementeller Tag-Index-Rebuild
|
||||||
|
- Monitoring Hooks
|
||||||
|
- Vector-Service Auto-Restart bei Memory Spike
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 16. Architektur-Reifegrad
|
||||||
|
|
||||||
|
| Kategorie | Bewertung |
|
||||||
|
|------------|------------|
|
||||||
|
| Daten-Governance | sehr hoch |
|
||||||
|
| Determinismus | sehr hoch |
|
||||||
|
| Skalierbarkeit | hoch |
|
||||||
|
| Runtime-Stabilität | hoch |
|
||||||
|
| Wartbarkeit | hoch |
|
||||||
|
| Enterprise-Fähigkeit | sehr hoch |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 17. Gesamtbewertung
|
||||||
|
|
||||||
|
Das System ist:
|
||||||
|
|
||||||
|
- nicht experimentell
|
||||||
|
- nicht fragil
|
||||||
|
- nicht prototypisch
|
||||||
|
- keine "KI-Spielerei"
|
||||||
|
|
||||||
|
Es ist:
|
||||||
|
|
||||||
|
✔ deterministisch
|
||||||
|
✔ governance-stabil
|
||||||
|
✔ reproduzierbar
|
||||||
|
✔ skalierbar
|
||||||
|
✔ administrierbar
|
||||||
|
|
||||||
|
Es erfüllt Enterprise-Anforderungen im KMU- bis Mid-Scale-Bereich vollständig.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 18. Abschlussbewertung
|
||||||
|
|
||||||
|
Das System kann mit ruhigem Gewissen:
|
||||||
|
|
||||||
|
- produktiv betrieben
|
||||||
|
- Kunden ausgerollt
|
||||||
|
- erweitert
|
||||||
|
- eingefroren und inkrementell entwickelt
|
||||||
|
|
||||||
|
werden.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# OFFIZIELLER STATUS
|
||||||
|
|
||||||
|
**Phase A abgeschlossen.**
|
||||||
|
System kann eingefroren und nur noch inkrementell erweitert werden.
|
||||||
|
|||||||
352
README.md
352
README.md
@@ -1,8 +1,9 @@
|
|||||||
# RAG-System – Technische Projektdokumentation
|
# RAG-System – Technische Projektdokumentation
|
||||||
**Version:** 1.0
|
**Version:** 1.3
|
||||||
**Stand:** Februar 2026
|
**Stand:** Februar 2026
|
||||||
**Autor:** mitho
|
**Autor:** mitho
|
||||||
**Status:** Verbindliche Referenzarchitektur (System Freeze)
|
**Status:** Verbindliche Referenzarchitektur (System Freeze – Phase A abgeschlossen)
|
||||||
|
**Validiert gegen:** aktuelle rag.zip (vollständig geprüft)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -11,163 +12,237 @@
|
|||||||
Das RAG-System dient der deterministischen, governance-stabilen Beantwortung von Nutzeranfragen auf Basis versionierter, kontrollierter Wissensquellen.
|
Das RAG-System dient der deterministischen, governance-stabilen Beantwortung von Nutzeranfragen auf Basis versionierter, kontrollierter Wissensquellen.
|
||||||
|
|
||||||
Grundprinzip:
|
Grundprinzip:
|
||||||
|
|
||||||
> „Wir nutzen KI nicht, um kreativ zu raten, sondern um verlässlich auf Basis Ihres Wissens zu antworten.“
|
> „Wir nutzen KI nicht, um kreativ zu raten, sondern um verlässlich auf Basis Ihres Wissens zu antworten.“
|
||||||
|
|
||||||
Das System kombiniert:
|
Kernmerkmale:
|
||||||
|
|
||||||
- Versionierte Dokumentverwaltung
|
- Versionierte Dokumentverwaltung (immutable Primärquellen)
|
||||||
- Deterministisches Chunking
|
- Deterministisches Chunking
|
||||||
- NDJSON als Single Source of Truth
|
- NDJSON als Single Source of Truth
|
||||||
- Vollständigen FAISS-Rebuild
|
- Vollständiger FAISS-Rebuild aus NDJSON
|
||||||
- Hybrid Retrieval (Keyword + Vector + Tag)
|
- Rein vektorbasiertes Retrieval (Chunks + optional Tags)
|
||||||
- Job-basierte Orchestrierung
|
- Job-basierte Orchestrierung (async)
|
||||||
- Rollen- und Guardrail-Architektur
|
- Rollen- und Guardrail-Architektur
|
||||||
- SSE-Streaming
|
- SSE-Streaming
|
||||||
|
|
||||||
|
Wichtig (validiert im Code):
|
||||||
|
Es existiert **kein Keyword-Retrieval** mehr. Retrieval erfolgt ausschließlich über den Vector-Service (Chunks) mit optionalem Tag-Routing.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# 2. Architekturüberblick
|
# 2. Architekturüberblick
|
||||||
|
|
||||||
## 2.1 Systemebenen
|
## 2.1 Systemebenen
|
||||||
|
|
||||||
### 1. Admin-Ebene (Symfony Backend)
|
### 1) Admin-Ebene (Symfony Backend)
|
||||||
|
|
||||||
|
Verantwortlich für:
|
||||||
|
|
||||||
- Dokumentverwaltung
|
- Dokumentverwaltung
|
||||||
- Versionierung
|
- Versionierung
|
||||||
|
- Aktivierung von DocumentVersion
|
||||||
- Tag-Management
|
- Tag-Management
|
||||||
- Job-Steuerung
|
- Ingest-Jobs
|
||||||
|
- Tag-Rebuild-Jobs
|
||||||
- System-Prompt-Verwaltung
|
- System-Prompt-Verwaltung
|
||||||
- KI-Endpoint-Konfiguration
|
- KI-Modell-/Generierungs-Konfiguration
|
||||||
|
- Security/Login
|
||||||
|
|
||||||
### 2. Wissensebene
|
---
|
||||||
- Dokumente (immutable)
|
|
||||||
- DocumentVersion
|
|
||||||
- Chunks
|
|
||||||
- index.ndjson
|
|
||||||
- index_meta.json
|
|
||||||
|
|
||||||
### 3. Vector-Ebene (Python)
|
### 2) Wissensebene (Index & Artefakte)
|
||||||
|
|
||||||
|
Speicherpfad: `var/knowledge/`
|
||||||
|
|
||||||
|
Artefakte:
|
||||||
|
|
||||||
|
- `index.ndjson` (Single Source of Truth)
|
||||||
|
- `index_meta.json` (Index-Struktur/Governance)
|
||||||
|
- `index_runtime.json` (Runtime-Stats)
|
||||||
|
- `tags.ndjson`
|
||||||
|
- `vector.index`
|
||||||
|
- `vector.index.meta.json`
|
||||||
|
- `vector_tags.index`
|
||||||
|
- `vector_tags.index.meta.json`
|
||||||
|
|
||||||
|
Chunks sind vollständig ableitbar aus DocumentVersion.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3) Vector-Ebene (Python, FAISS)
|
||||||
|
|
||||||
|
- Persistenter Vector-Service (FastAPI)
|
||||||
- Embedding-Modell (lokal)
|
- Embedding-Modell (lokal)
|
||||||
- FAISS-Index (Chunks)
|
- FAISS-Index (Chunks)
|
||||||
- FAISS-Index (Tags)
|
- FAISS-Index (Tags)
|
||||||
- Persistenter Vector-Service
|
- CLI-Fallback-Skripte
|
||||||
- CLI-Fallback
|
- Control-Script für Install / Start / Stop / Reload / Status
|
||||||
|
|
||||||
### 4. Agent-Ebene
|
FAISS wird ausschließlich aus `index.ndjson` erzeugt.
|
||||||
- Retrieval-Fusion
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 4) Agent-Ebene
|
||||||
|
|
||||||
|
- Retrieval über `NdjsonHybridRetriever`
|
||||||
|
- Query-Cleaning nur für Retrieval
|
||||||
|
- Optionales Tag-Routing
|
||||||
- PromptBuilder
|
- PromptBuilder
|
||||||
- SSE-Streaming
|
- SSE-Streaming
|
||||||
- Chat-History-Verarbeitung
|
- History-Verarbeitung
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# 3. Dokumentenarchitektur
|
# 3. Dokumentenarchitektur
|
||||||
|
|
||||||
## 3.1 Primärquellen
|
## 3.1 Primärquellen-Prinzip
|
||||||
|
|
||||||
- Dokumente sind immutable.
|
- Dokumente sind immutable.
|
||||||
- Jede Änderung erzeugt eine neue DocumentVersion.
|
- Jede Änderung erzeugt eine neue DocumentVersion.
|
||||||
- Pro Dokument existiert genau eine aktive Version.
|
- Genau eine Version pro Dokument ist aktiv.
|
||||||
|
- Chunks sind abgeleitete Artefakte.
|
||||||
|
- Keine manuelle Chunk-Manipulation.
|
||||||
|
|
||||||
## 3.2 Aktivierungsprozess
|
---
|
||||||
|
|
||||||
1. Aktivierung einer Version
|
## 3.2 Aktivierungsprozess (Async)
|
||||||
2. Erstellung eines IngestJob
|
|
||||||
3. Async-Start:
|
1. Aktivierung einer DocumentVersion
|
||||||
```
|
2. Erstellung eines IngestJob (Status: QUEUED)
|
||||||
bin/console mto:agent:ingest:run <jobId>
|
3. Async-Ausführung:
|
||||||
```
|
|
||||||
4. IngestOrchestrator:
|
bin/console mto:agent:ingest:run <jobId>
|
||||||
- Guardrail-Validierung
|
|
||||||
- NDJSON Compaction by document_id
|
4. IngestOrchestrator führt deterministisch aus:
|
||||||
- Chunking
|
|
||||||
- Streaming Append
|
- Guardrail-Validierung
|
||||||
- Vollständiger FAISS-Rebuild
|
- NDJSON Compaction by document_id
|
||||||
- index_meta.json Update
|
- Chunking
|
||||||
- Status COMPLETED/FAILED
|
- Streaming Write
|
||||||
|
- Vollständiger FAISS-Rebuild
|
||||||
|
- Atomare Datei-Switches
|
||||||
|
- Update von index_meta.json
|
||||||
|
- Job-Status: COMPLETED / FAILED / ABORTED
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# 4. NDJSON-Architektur
|
# 4. NDJSON-Architektur
|
||||||
|
|
||||||
## 4.1 index.ndjson (Single Source of Truth)
|
## 4.1 index.ndjson
|
||||||
|
|
||||||
- Streamingfähiges Format
|
Eigenschaften:
|
||||||
- Kein JSON-Array
|
|
||||||
- Append-only mit Compaction
|
- NDJSON (kein JSON-Array)
|
||||||
- Keine vollständige RAM-Verarbeitung
|
- Streaming-fähig
|
||||||
- Atomare Datei-Switches (.tmp → rename)
|
- Append + gezielte Compaction
|
||||||
|
- Kein Full-RAM-Load
|
||||||
|
- Atomare Dateioperationen
|
||||||
|
|
||||||
|
FAISS wird immer vollständig aus index.ndjson neu gebaut.
|
||||||
|
|
||||||
|
Es existiert keine zweite Wahrheitsquelle.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## 4.2 index_meta.json
|
## 4.2 index_meta.json
|
||||||
|
|
||||||
Enthält:
|
Struktur (validiert):
|
||||||
|
|
||||||
- index_version
|
- index_version
|
||||||
|
- created_at
|
||||||
|
- embedding_model
|
||||||
|
- embedding_dimension
|
||||||
|
- chunk_size
|
||||||
|
- chunk_overlap
|
||||||
|
- scoring_version
|
||||||
|
- index_format (ndjson)
|
||||||
|
- vector_backend (faiss)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4.3 Guardrail-Mechanismus
|
||||||
|
|
||||||
|
Bei strukturellen Änderungen:
|
||||||
|
|
||||||
- embedding_model
|
- embedding_model
|
||||||
- embedding_dimension
|
- embedding_dimension
|
||||||
- chunk_size
|
- chunk_size
|
||||||
- overlap
|
- overlap
|
||||||
- scoring_version
|
- scoring_version
|
||||||
- index_format
|
|
||||||
|
|
||||||
### Guardrail-Mechanismus
|
wird lokaler Ingest blockiert und ein Global Reindex erforderlich.
|
||||||
|
|
||||||
Bei strukturellen Änderungen (Embedding, Chunking, Scoring):
|
|
||||||
- Lokaler Ingest wird blockiert
|
|
||||||
- Global Reindex erforderlich
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# 5. Chunk-Management
|
# 5. Chunk-Management
|
||||||
|
|
||||||
Verantwortlich: ChunkManager
|
Verantwortlich: ChunkManager + Ingest-Services
|
||||||
|
|
||||||
Eigenschaften:
|
Eigenschaften:
|
||||||
|
|
||||||
- Streaming-basiertes Schreiben
|
- Streaming-Schreiben
|
||||||
- Deterministische Reproduktion
|
- Deterministische Reproduktion
|
||||||
- Hard Limit: 120.000 Chunks
|
- Hard Limit: 120.000 Chunks
|
||||||
- Warnlimit: 100.000 Chunks
|
- Warnlimit: 100.000 Chunks
|
||||||
- Kein vollständiger JSON-RAM-Load
|
- Kein vollständiger RAM-Load
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# 6. Vector-Architektur
|
# 6. Vector-Architektur
|
||||||
|
|
||||||
## 6.1 Betriebsmodi
|
## 6.1 Persistenter Vector-Service (Standard)
|
||||||
|
|
||||||
### A) Persistenter Vector-Service (bevorzugt)
|
Service-URL (Default):
|
||||||
- Lädt Embedding-Modell einmal
|
|
||||||
- Lädt FAISS-Indizes in RAM
|
|
||||||
- REST-Endpunkte:
|
|
||||||
- /search-chunks
|
|
||||||
- /search-tags
|
|
||||||
|
|
||||||
### B) CLI-Fallback
|
http://127.0.0.1:8090
|
||||||
- Python-Skripte
|
|
||||||
- Wird genutzt, falls Service nicht verfügbar ist
|
|
||||||
|
|
||||||
## 6.2 Rebuild-Strategie
|
Endpoints:
|
||||||
|
|
||||||
- Immer vollständiger FAISS-Rebuild
|
- POST /search-chunks
|
||||||
- Kein inkrementelles Patchen
|
- POST /search-tags
|
||||||
- Atomarer Index-Switch
|
|
||||||
- Deterministisch und drift-sicher
|
Control:
|
||||||
|
|
||||||
|
bin/console mto:agent:vector:control --install
|
||||||
|
bin/console mto:agent:vector:control --start
|
||||||
|
bin/console mto:agent:vector:control --reload
|
||||||
|
bin/console mto:agent:vector:control --status
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# 7. Hybrid Retrieval
|
## 6.2 CLI-Fallback
|
||||||
|
|
||||||
## 7.1 Retrieval-Komponenten
|
Python-Skripte:
|
||||||
|
|
||||||
1. Keyword-Retrieval (führend)
|
- python/vector/vector_search.py
|
||||||
2. FAISS-Chunk-Retrieval (ergänzend)
|
- python/vector/vector_ingest.py
|
||||||
3. Tag-Routing (Soft-Gate)
|
- python/vector/vector_search_tags.py
|
||||||
|
- python/vector/vector_ingest_tags.py
|
||||||
|
|
||||||
## 7.2 Score-Fusion
|
---
|
||||||
|
|
||||||
- Keyword hat Priorität
|
## 6.3 Rebuild-Strategie
|
||||||
- Vector ergänzt semantische Nähe
|
|
||||||
- Tags dienen als Routing-Verstärker
|
- Immer vollständiger FAISS-Rebuild
|
||||||
|
- Kein inkrementelles Patchen
|
||||||
|
- Atomarer Switch (.tmp → rename)
|
||||||
|
- Deterministisch und reproduzierbar
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 7. Retrieval (Vector-only)
|
||||||
|
|
||||||
|
Retrieval über `NdjsonHybridRetriever`.
|
||||||
|
|
||||||
|
Ablauf:
|
||||||
|
|
||||||
|
1) Query Cleaning (nur für Retrieval)
|
||||||
|
2) Optional: Tag-Routing
|
||||||
|
3) Chunk Vector Search
|
||||||
|
4) NDJSON Chunk Lookup
|
||||||
|
|
||||||
|
Keine Keyword-Suche im System vorhanden.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -179,115 +254,123 @@ Eigenschaften:
|
|||||||
- DocumentTag
|
- DocumentTag
|
||||||
- TagRebuildJob
|
- TagRebuildJob
|
||||||
|
|
||||||
## 8.2 Trigger-Logik
|
## 8.2 Trigger
|
||||||
|
|
||||||
Ein Rebuild wird ausgelöst bei:
|
Rebuild bei:
|
||||||
|
|
||||||
- Tag-Erstellung
|
- Tag-Erstellung
|
||||||
- Tag-Löschung
|
- Tag-Löschung
|
||||||
- Tag-Zuweisung
|
- Tag-Zuweisung
|
||||||
- Tag-Entfernung
|
- Tag-Entfernung
|
||||||
|
|
||||||
## 8.3 Job-Mechanik
|
## 8.3 Async-Ausführung
|
||||||
|
|
||||||
- Async-Start via:
|
php bin/console mto:agent:tags:job:run <jobId>
|
||||||
```
|
|
||||||
php bin/console mto:agent:tags:job:run <jobId>
|
Log:
|
||||||
```
|
|
||||||
- Logfile unter:
|
var/log/tags/job_<uuid>.log
|
||||||
```
|
|
||||||
var/log/tags/job_<uuid>.log
|
|
||||||
```
|
|
||||||
|
|
||||||
## 8.4 Stale-Protection
|
## 8.4 Stale-Protection
|
||||||
|
|
||||||
- QUEUED-Jobs älter als 5 Minuten → FAILED
|
- QUEUED > 300 Sekunden → FAILED
|
||||||
- System kann nicht dauerhaft blockieren
|
- Maximal 1 aktiver Job
|
||||||
- Coalescing (max. 1 aktiver Job)
|
- Lockfile: var/knowledge/locks/tag_rebuild.lock
|
||||||
|
|
||||||
## 8.5 Tag-Index
|
## 8.5 Tag-Index
|
||||||
|
|
||||||
- tags.ndjson
|
- tags.ndjson
|
||||||
- vector_tags.index
|
- vector_tags.index
|
||||||
- Vollständiger Rebuild bei Änderung
|
- vector_tags.index.meta.json
|
||||||
|
|
||||||
|
Vollständiger Rebuild bei Änderung.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# 9. Job-Architektur
|
# 9. Job-Architektur
|
||||||
|
|
||||||
Statusmodell:
|
Status:
|
||||||
|
|
||||||
- QUEUED
|
- QUEUED
|
||||||
- RUNNING
|
- RUNNING
|
||||||
- COMPLETED
|
- COMPLETED
|
||||||
- FAILED
|
- FAILED
|
||||||
|
- ABORTED (Ingest)
|
||||||
|
|
||||||
Eigenschaften:
|
Eigenschaften:
|
||||||
|
|
||||||
- Async exec
|
- Async exec
|
||||||
- LockService gegen Parallel-Ausführung
|
- Locking gegen Parallel-Ausführung
|
||||||
- Self-Healing gegen blockierte Jobs
|
|
||||||
- Logging pro Job
|
- Logging pro Job
|
||||||
|
- Recovery bei stale Jobs
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# 10. Governance & Guardrails
|
# 10. Vector Health
|
||||||
|
|
||||||
## 10.1 Rollen
|
Health-Check:
|
||||||
|
|
||||||
|
bin/console mto:agent:vector:health
|
||||||
|
|
||||||
|
Prüft:
|
||||||
|
|
||||||
|
- NDJSON Chunk Count
|
||||||
|
- FAISS Index Count
|
||||||
|
- Meta-Konsistenz
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 11. Governance & Guardrails
|
||||||
|
|
||||||
|
Rollen:
|
||||||
|
|
||||||
- Super Admin
|
- Super Admin
|
||||||
- Knowledge Admin
|
- Knowledge Admin
|
||||||
- Redaktion
|
- Redaktion
|
||||||
- Frontend-User
|
- Frontend-User
|
||||||
|
|
||||||
## 10.2 Schutzmechanismen
|
Schutzmechanismen:
|
||||||
|
|
||||||
- Dokumente immutable
|
- Immutable Dokumente
|
||||||
- Keine manuelle Chunk-Manipulation
|
- Versionierung statt Ersetzen
|
||||||
- Versionierte Ingest-Profile
|
- Keine Chunk-Editierung
|
||||||
- Versionierte System-Prompts
|
- Guardrail gegen Strukturdrift
|
||||||
- Konfigurierbare KI-Endpunkte
|
- Atomare Dateioperationen
|
||||||
- Logging & Audit-Fähigkeit
|
- Locking & Job-Orchestrierung
|
||||||
|
- Logging & Audit
|
||||||
---
|
|
||||||
|
|
||||||
# 11. Agent-Architektur
|
|
||||||
|
|
||||||
- SSE-Streaming
|
|
||||||
- Historienverarbeitung korrekt implementiert
|
|
||||||
- Deterministischer PromptBuilder
|
|
||||||
- Retrieval-Kontext explizit eingebettet
|
|
||||||
- Kein Think-Mode-Leak
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# 12. Skalierbarkeit
|
# 12. Skalierbarkeit
|
||||||
|
|
||||||
Zielgröße:
|
Ausgelegt für:
|
||||||
|
|
||||||
- >120.000 Chunks
|
≥ 120.000 Chunks
|
||||||
|
|
||||||
Ermöglicht durch:
|
Ermöglicht durch:
|
||||||
|
|
||||||
- NDJSON Streaming
|
- NDJSON Streaming
|
||||||
- Kein Full-RAM-JSON
|
- Kein Full-RAM JSON
|
||||||
- Vollständiger FAISS-Rebuild
|
- Vollständiger FAISS-Rebuild
|
||||||
- Persistenter Vector-Service
|
- Persistenter Vector-Service
|
||||||
- Atomare Switches
|
- Atomare Switches
|
||||||
- Locking-Mechanismen
|
- Locking-Mechanismen
|
||||||
|
|
||||||
|
Ab >300k Chunks sollte Sharding evaluiert werden.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# 13. Stabilitätsstatus (Freeze-Zustand)
|
# 13. Stabilitätsstatus
|
||||||
|
|
||||||
| Bereich | Status |
|
| Bereich | Status |
|
||||||
|----------|--------|
|
|----------|--------|
|
||||||
| Dokument-Ingest | Stabil |
|
| Dokument-Ingest | Stabil |
|
||||||
| NDJSON-Architektur | Enterprise-Stabil |
|
| NDJSON | Enterprise-stabil |
|
||||||
| FAISS-Rebuild | Deterministisch |
|
| FAISS-Rebuild | Deterministisch |
|
||||||
| Tag-System | Stabil mit Stale-Recovery |
|
| Vector-Service | Stabil |
|
||||||
|
| Tag-System | Stabil |
|
||||||
| Async-Jobs | Blockiersicher |
|
| Async-Jobs | Blockiersicher |
|
||||||
| Retrieval-Fusion | Funktional |
|
| Retrieval | Vector-only |
|
||||||
| SSE | Stabil |
|
| SSE | Stabil |
|
||||||
| Governance | Aktiv |
|
| Governance | Aktiv |
|
||||||
|
|
||||||
@@ -295,15 +378,19 @@ Ermöglicht durch:
|
|||||||
|
|
||||||
# 14. System-Freeze-Definition
|
# 14. System-Freeze-Definition
|
||||||
|
|
||||||
Dieses Dokument definiert den verbindlichen Referenzstand des Systems.
|
Dieses Dokument definiert den verbindlichen Referenzstand.
|
||||||
|
|
||||||
Ab diesem Punkt gilt:
|
Ab jetzt gilt:
|
||||||
|
|
||||||
- Keine strukturellen Änderungen ohne explizite Freigabe.
|
- Keine strukturellen Änderungen ohne explizite Freigabe.
|
||||||
- Erweiterungen nur inkrementell.
|
- Keine inkrementellen Vector-Patches.
|
||||||
- Keine Architektur-Rewrites.
|
- Keine zweite Wahrheitsquelle neben index.ndjson.
|
||||||
|
- Erweiterungen nur additiv.
|
||||||
|
- Kein Architektur-Rewrite.
|
||||||
- Determinismus und Reproduzierbarkeit sind oberstes Prinzip.
|
- Determinismus und Reproduzierbarkeit sind oberstes Prinzip.
|
||||||
|
|
||||||
|
Phase A ist abgeschlossen.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
# 15. Zusammenfassung
|
# 15. Zusammenfassung
|
||||||
@@ -315,7 +402,14 @@ Das System ist:
|
|||||||
- governance-konform
|
- governance-konform
|
||||||
- skalierbar
|
- skalierbar
|
||||||
- blockiersicher
|
- blockiersicher
|
||||||
- debugbar
|
- auditierbar
|
||||||
|
- reproduzierbar
|
||||||
- enterprise-ready
|
- enterprise-ready
|
||||||
|
|
||||||
Es erfüllt die Anforderungen an ein kontrolliertes, reproduzierbares RAG-System mit klarer Trennung zwischen Wissensquelle, Index, Retrieval und Generierung.
|
Retrieval ist vollständig vektorbasiert (Chunks + optional Tags).
|
||||||
|
|
||||||
|
Architekturfluss:
|
||||||
|
|
||||||
|
Primärquelle → NDJSON → FAISS → Vector Retrieval → Prompt → Generierung
|
||||||
|
|
||||||
|
Das System befindet sich im stabilen Freeze-Zustand.
|
||||||
Reference in New Issue
Block a user