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
|
||||
## RAG-System – Phase A Abschluss
|
||||
|
||||
**Projekt:** KI-RAG System
|
||||
**Architekturstand:** Phase A abgeschlossen
|
||||
**Datum:** Februar 2026
|
||||
**Status:** Verbindliche Referenzdokumentation
|
||||
# TECHNISCHER AUDIT-BERICHT
|
||||
## RAG-System – Enterprise Architektur
|
||||
**Stand:** 26.02.2026
|
||||
**Audit-Basis:** vollständig neu entpackte und indexierte `rag.zip` (159 Dateien)
|
||||
**Architektur-Level:** NDJSON + FAISS + Job-Orchestrierung + Tag-System + Persistenter Vector-Service
|
||||
|
||||
---
|
||||
|
||||
# 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)
|
||||
- Deterministische Indexierung
|
||||
- Strikte Trennung von Domain (PHP) und Runtime (Python)
|
||||
- Zentrale Konfigurationssteuerung
|
||||
- Drift-Sicherheit des Vector-Index
|
||||
Die Architektur ist:
|
||||
|
||||
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**
|
||||
Alle Vektoren werden deterministisch aus `index.ndjson` erzeugt.
|
||||
### PHP (Symfony Core)
|
||||
- IngestFlow
|
||||
- IngestOrchestrator
|
||||
- ChunkManager
|
||||
- IndexMetaManager
|
||||
- VectorIndexBuilder
|
||||
- TagService
|
||||
- TagRoutingService
|
||||
- Job-System
|
||||
- LockService
|
||||
- PromptBuilder
|
||||
- Admin-Controller
|
||||
|
||||
2. **Full Rebuild statt inkrementeller Mutation**
|
||||
Der FAISS-Index wird bei Änderungen vollständig neu aufgebaut.
|
||||
### Python Layer
|
||||
- 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**
|
||||
Keine vollständigen JSON-Arrays im Speicher.
|
||||
|
||||
4. **Runtime und Domain sind strikt getrennt**
|
||||
PHP enthält Orchestrierung und Governance, Python enthält Vektor-Runtime.
|
||||
|
||||
5. **Atomare Dateioperationen**
|
||||
Schreibvorgänge erfolgen über `.tmp` + `rename()`.
|
||||
|
||||
6. **Konfigurationszentrierung**
|
||||
Alle Pfade und Script-Referenzen sind über `services.yaml` parametriert.
|
||||
### Speicher
|
||||
- index.ndjson (Single Source of Truth)
|
||||
- vector.index (FAISS)
|
||||
- tag_vector.index
|
||||
- index_meta.json
|
||||
|
||||
---
|
||||
|
||||
# 3. Umsetzung Phase A
|
||||
# 3. Architekturmodell
|
||||
|
||||
## A1 – Streaming-Architektur
|
||||
## Retrieval Architektur
|
||||
|
||||
### Problem
|
||||
RAM-basierte JSON-Verarbeitung hätte bei steigender Chunk-Zahl zu Speicherproblemen geführt.
|
||||
Hybrid:
|
||||
|
||||
### Umsetzung
|
||||
1. Keyword-Retrieval (führend)
|
||||
2. FAISS Vector Retrieval (ergänzend)
|
||||
3. Score-Fusion
|
||||
|
||||
- Einführung von NDJSON als persistentes Format
|
||||
- Streaming-Verarbeitung in:
|
||||
- `ChunkManager::streamAll()`
|
||||
- `ChunkManager::countAllChunks()`
|
||||
- `ChunkManager::compactByDocument()`
|
||||
- `ChunkManager::rewriteAll()`
|
||||
- Entfernung von `iterator_to_array` im IngestFlow
|
||||
Tags:
|
||||
- Separater Tag-Vektorindex
|
||||
- Optionales Routing
|
||||
- Soft-Gate Scoring
|
||||
|
||||
### Ergebnis
|
||||
|
||||
- Speicherverbrauch unabhängig von Chunk-Anzahl
|
||||
- Stabil bis mindestens 120.000 Chunks
|
||||
Saubere Layer-Trennung vorhanden.
|
||||
|
||||
---
|
||||
|
||||
## 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.
|
||||
|
||||
338
README.md
338
README.md
@@ -1,8 +1,9 @@
|
||||
# RAG-System – Technische Projektdokumentation
|
||||
**Version:** 1.0
|
||||
**Version:** 1.3
|
||||
**Stand:** Februar 2026
|
||||
**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.
|
||||
|
||||
Grundprinzip:
|
||||
|
||||
> „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
|
||||
- NDJSON als Single Source of Truth
|
||||
- Vollständigen FAISS-Rebuild
|
||||
- Hybrid Retrieval (Keyword + Vector + Tag)
|
||||
- Job-basierte Orchestrierung
|
||||
- Vollständiger FAISS-Rebuild aus NDJSON
|
||||
- Rein vektorbasiertes Retrieval (Chunks + optional Tags)
|
||||
- Job-basierte Orchestrierung (async)
|
||||
- Rollen- und Guardrail-Architektur
|
||||
- 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.1 Systemebenen
|
||||
|
||||
### 1. Admin-Ebene (Symfony Backend)
|
||||
### 1) Admin-Ebene (Symfony Backend)
|
||||
|
||||
Verantwortlich für:
|
||||
|
||||
- Dokumentverwaltung
|
||||
- Versionierung
|
||||
- Aktivierung von DocumentVersion
|
||||
- Tag-Management
|
||||
- Job-Steuerung
|
||||
- Ingest-Jobs
|
||||
- Tag-Rebuild-Jobs
|
||||
- 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)
|
||||
- FAISS-Index (Chunks)
|
||||
- FAISS-Index (Tags)
|
||||
- Persistenter Vector-Service
|
||||
- CLI-Fallback
|
||||
- CLI-Fallback-Skripte
|
||||
- Control-Script für Install / Start / Stop / Reload / Status
|
||||
|
||||
### 4. Agent-Ebene
|
||||
- Retrieval-Fusion
|
||||
FAISS wird ausschließlich aus `index.ndjson` erzeugt.
|
||||
|
||||
---
|
||||
|
||||
### 4) Agent-Ebene
|
||||
|
||||
- Retrieval über `NdjsonHybridRetriever`
|
||||
- Query-Cleaning nur für Retrieval
|
||||
- Optionales Tag-Routing
|
||||
- PromptBuilder
|
||||
- SSE-Streaming
|
||||
- Chat-History-Verarbeitung
|
||||
- History-Verarbeitung
|
||||
|
||||
---
|
||||
|
||||
# 3. Dokumentenarchitektur
|
||||
|
||||
## 3.1 Primärquellen
|
||||
## 3.1 Primärquellen-Prinzip
|
||||
|
||||
- Dokumente sind immutable.
|
||||
- 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
|
||||
---
|
||||
|
||||
## 3.2 Aktivierungsprozess (Async)
|
||||
|
||||
1. Aktivierung einer DocumentVersion
|
||||
2. Erstellung eines IngestJob (Status: QUEUED)
|
||||
3. Async-Ausführung:
|
||||
|
||||
1. Aktivierung einer Version
|
||||
2. Erstellung eines IngestJob
|
||||
3. Async-Start:
|
||||
```
|
||||
bin/console mto:agent:ingest:run <jobId>
|
||||
```
|
||||
4. IngestOrchestrator:
|
||||
|
||||
4. IngestOrchestrator führt deterministisch aus:
|
||||
|
||||
- Guardrail-Validierung
|
||||
- NDJSON Compaction by document_id
|
||||
- Chunking
|
||||
- Streaming Append
|
||||
- Streaming Write
|
||||
- Vollständiger FAISS-Rebuild
|
||||
- index_meta.json Update
|
||||
- Status COMPLETED/FAILED
|
||||
- Atomare Datei-Switches
|
||||
- Update von index_meta.json
|
||||
- Job-Status: COMPLETED / FAILED / ABORTED
|
||||
|
||||
---
|
||||
|
||||
# 4. NDJSON-Architektur
|
||||
|
||||
## 4.1 index.ndjson (Single Source of Truth)
|
||||
## 4.1 index.ndjson
|
||||
|
||||
- Streamingfähiges Format
|
||||
- Kein JSON-Array
|
||||
- Append-only mit Compaction
|
||||
- Keine vollständige RAM-Verarbeitung
|
||||
- Atomare Datei-Switches (.tmp → rename)
|
||||
Eigenschaften:
|
||||
|
||||
- NDJSON (kein JSON-Array)
|
||||
- Streaming-fähig
|
||||
- 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
|
||||
|
||||
Enthält:
|
||||
Struktur (validiert):
|
||||
|
||||
- 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_dimension
|
||||
- chunk_size
|
||||
- overlap
|
||||
- scoring_version
|
||||
- index_format
|
||||
|
||||
### Guardrail-Mechanismus
|
||||
|
||||
Bei strukturellen Änderungen (Embedding, Chunking, Scoring):
|
||||
- Lokaler Ingest wird blockiert
|
||||
- Global Reindex erforderlich
|
||||
wird lokaler Ingest blockiert und ein Global Reindex erforderlich.
|
||||
|
||||
---
|
||||
|
||||
# 5. Chunk-Management
|
||||
|
||||
Verantwortlich: ChunkManager
|
||||
Verantwortlich: ChunkManager + Ingest-Services
|
||||
|
||||
Eigenschaften:
|
||||
|
||||
- Streaming-basiertes Schreiben
|
||||
- Streaming-Schreiben
|
||||
- Deterministische Reproduktion
|
||||
- Hard Limit: 120.000 Chunks
|
||||
- Warnlimit: 100.000 Chunks
|
||||
- Kein vollständiger JSON-RAM-Load
|
||||
- Kein vollständiger RAM-Load
|
||||
|
||||
---
|
||||
|
||||
# 6. Vector-Architektur
|
||||
|
||||
## 6.1 Betriebsmodi
|
||||
## 6.1 Persistenter Vector-Service (Standard)
|
||||
|
||||
### A) Persistenter Vector-Service (bevorzugt)
|
||||
- Lädt Embedding-Modell einmal
|
||||
- Lädt FAISS-Indizes in RAM
|
||||
- REST-Endpunkte:
|
||||
- /search-chunks
|
||||
- /search-tags
|
||||
Service-URL (Default):
|
||||
|
||||
### B) CLI-Fallback
|
||||
- Python-Skripte
|
||||
- Wird genutzt, falls Service nicht verfügbar ist
|
||||
http://127.0.0.1:8090
|
||||
|
||||
## 6.2 Rebuild-Strategie
|
||||
Endpoints:
|
||||
|
||||
- Immer vollständiger FAISS-Rebuild
|
||||
- Kein inkrementelles Patchen
|
||||
- Atomarer Index-Switch
|
||||
- Deterministisch und drift-sicher
|
||||
- POST /search-chunks
|
||||
- POST /search-tags
|
||||
|
||||
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)
|
||||
2. FAISS-Chunk-Retrieval (ergänzend)
|
||||
3. Tag-Routing (Soft-Gate)
|
||||
- python/vector/vector_search.py
|
||||
- python/vector/vector_ingest.py
|
||||
- python/vector/vector_search_tags.py
|
||||
- python/vector/vector_ingest_tags.py
|
||||
|
||||
## 7.2 Score-Fusion
|
||||
---
|
||||
|
||||
- Keyword hat Priorität
|
||||
- Vector ergänzt semantische Nähe
|
||||
- Tags dienen als Routing-Verstärker
|
||||
## 6.3 Rebuild-Strategie
|
||||
|
||||
- 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
|
||||
- TagRebuildJob
|
||||
|
||||
## 8.2 Trigger-Logik
|
||||
## 8.2 Trigger
|
||||
|
||||
Ein Rebuild wird ausgelöst bei:
|
||||
Rebuild bei:
|
||||
|
||||
- Tag-Erstellung
|
||||
- Tag-Löschung
|
||||
- Tag-Zuweisung
|
||||
- Tag-Entfernung
|
||||
|
||||
## 8.3 Job-Mechanik
|
||||
## 8.3 Async-Ausführung
|
||||
|
||||
- Async-Start via:
|
||||
```
|
||||
php bin/console mto:agent:tags:job:run <jobId>
|
||||
```
|
||||
- Logfile unter:
|
||||
```
|
||||
|
||||
Log:
|
||||
|
||||
var/log/tags/job_<uuid>.log
|
||||
```
|
||||
|
||||
## 8.4 Stale-Protection
|
||||
|
||||
- QUEUED-Jobs älter als 5 Minuten → FAILED
|
||||
- System kann nicht dauerhaft blockieren
|
||||
- Coalescing (max. 1 aktiver Job)
|
||||
- QUEUED > 300 Sekunden → FAILED
|
||||
- Maximal 1 aktiver Job
|
||||
- Lockfile: var/knowledge/locks/tag_rebuild.lock
|
||||
|
||||
## 8.5 Tag-Index
|
||||
|
||||
- tags.ndjson
|
||||
- vector_tags.index
|
||||
- Vollständiger Rebuild bei Änderung
|
||||
- vector_tags.index.meta.json
|
||||
|
||||
Vollständiger Rebuild bei Änderung.
|
||||
|
||||
---
|
||||
|
||||
# 9. Job-Architektur
|
||||
|
||||
Statusmodell:
|
||||
Status:
|
||||
|
||||
- QUEUED
|
||||
- RUNNING
|
||||
- COMPLETED
|
||||
- FAILED
|
||||
- ABORTED (Ingest)
|
||||
|
||||
Eigenschaften:
|
||||
|
||||
- Async exec
|
||||
- LockService gegen Parallel-Ausführung
|
||||
- Self-Healing gegen blockierte Jobs
|
||||
- Locking gegen Parallel-Ausführung
|
||||
- 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
|
||||
- Knowledge Admin
|
||||
- Redaktion
|
||||
- Frontend-User
|
||||
|
||||
## 10.2 Schutzmechanismen
|
||||
Schutzmechanismen:
|
||||
|
||||
- Dokumente immutable
|
||||
- Keine manuelle Chunk-Manipulation
|
||||
- Versionierte Ingest-Profile
|
||||
- Versionierte System-Prompts
|
||||
- Konfigurierbare KI-Endpunkte
|
||||
- Logging & Audit-Fähigkeit
|
||||
|
||||
---
|
||||
|
||||
# 11. Agent-Architektur
|
||||
|
||||
- SSE-Streaming
|
||||
- Historienverarbeitung korrekt implementiert
|
||||
- Deterministischer PromptBuilder
|
||||
- Retrieval-Kontext explizit eingebettet
|
||||
- Kein Think-Mode-Leak
|
||||
- Immutable Dokumente
|
||||
- Versionierung statt Ersetzen
|
||||
- Keine Chunk-Editierung
|
||||
- Guardrail gegen Strukturdrift
|
||||
- Atomare Dateioperationen
|
||||
- Locking & Job-Orchestrierung
|
||||
- Logging & Audit
|
||||
|
||||
---
|
||||
|
||||
# 12. Skalierbarkeit
|
||||
|
||||
Zielgröße:
|
||||
Ausgelegt für:
|
||||
|
||||
- >120.000 Chunks
|
||||
≥ 120.000 Chunks
|
||||
|
||||
Ermöglicht durch:
|
||||
|
||||
- NDJSON Streaming
|
||||
- Kein Full-RAM-JSON
|
||||
- Kein Full-RAM JSON
|
||||
- Vollständiger FAISS-Rebuild
|
||||
- Persistenter Vector-Service
|
||||
- Atomare Switches
|
||||
- Locking-Mechanismen
|
||||
|
||||
Ab >300k Chunks sollte Sharding evaluiert werden.
|
||||
|
||||
---
|
||||
|
||||
# 13. Stabilitätsstatus (Freeze-Zustand)
|
||||
# 13. Stabilitätsstatus
|
||||
|
||||
| Bereich | Status |
|
||||
|----------|--------|
|
||||
| Dokument-Ingest | Stabil |
|
||||
| NDJSON-Architektur | Enterprise-Stabil |
|
||||
| NDJSON | Enterprise-stabil |
|
||||
| FAISS-Rebuild | Deterministisch |
|
||||
| Tag-System | Stabil mit Stale-Recovery |
|
||||
| Vector-Service | Stabil |
|
||||
| Tag-System | Stabil |
|
||||
| Async-Jobs | Blockiersicher |
|
||||
| Retrieval-Fusion | Funktional |
|
||||
| Retrieval | Vector-only |
|
||||
| SSE | Stabil |
|
||||
| Governance | Aktiv |
|
||||
|
||||
@@ -295,15 +378,19 @@ Ermöglicht durch:
|
||||
|
||||
# 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.
|
||||
- Erweiterungen nur inkrementell.
|
||||
- Keine Architektur-Rewrites.
|
||||
- Keine inkrementellen Vector-Patches.
|
||||
- Keine zweite Wahrheitsquelle neben index.ndjson.
|
||||
- Erweiterungen nur additiv.
|
||||
- Kein Architektur-Rewrite.
|
||||
- Determinismus und Reproduzierbarkeit sind oberstes Prinzip.
|
||||
|
||||
Phase A ist abgeschlossen.
|
||||
|
||||
---
|
||||
|
||||
# 15. Zusammenfassung
|
||||
@@ -315,7 +402,14 @@ Das System ist:
|
||||
- governance-konform
|
||||
- skalierbar
|
||||
- blockiersicher
|
||||
- debugbar
|
||||
- auditierbar
|
||||
- reproduzierbar
|
||||
- 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