update README.md

This commit is contained in:
team2
2026-02-23 21:02:55 +01:00
parent 0aff4d5f3b
commit a2a6e1bca2

577
README.md
View File

@@ -1,396 +1,321 @@
# mitho AI Agent Developer README # RAG-System Technische Projektdokumentation
Enterprise Hybrid RAG System (Symfony + NDJSON + FAISS + Persistent Vector Service) **Version:** 1.0
**Stand:** Februar 2026
Stand: Februar 2026 **Autor:** mitho
Status: Produktiv stabil Job-basierte Ingest-Architektur + Persistenter Vector-Service integriert **Status:** Verbindliche Referenzarchitektur (System Freeze)
--- ---
# 1. Systemüberblick # 1. Ziel des Systems
Dieses System implementiert eine deterministische, governance-stabile Das RAG-System dient der deterministischen, governance-stabilen Beantwortung von Nutzeranfragen auf Basis versionierter, kontrollierter Wissensquellen.
Hybrid-RAG-Architektur mit:
- Symfony (PHP Backend)
- NDJSON als Single Source of Truth
- FAISS als Vektorindex (immer Full Rebuild)
- Persistenter Python Vector-Service (FastAPI + Uvicorn)
- Hybrid Retrieval (Keyword + Vektor)
- Versioniertes Dokumentmodell
- Job-basierte Ingest-Pipeline
- Lock-geschützte Reindex-Operationen
- SSE-Streaming im Frontend
Grundprinzip: Grundprinzip:
> „Wir nutzen KI nicht, um kreativ zu raten, sondern um verlässlich auf Basis Ihres Wissens zu antworten.“
- Keine inkrementellen Vektor-Updates Das System kombiniert:
- FAISS wird immer vollständig aus `index.ndjson` neu gebaut
- Retrieval läuft über einen persistenten Service (kein Python-Spawn pro Anfrage) - Versionierte Dokumentverwaltung
- Deterministisches Chunking
- NDJSON als Single Source of Truth
- Vollständigen FAISS-Rebuild
- Hybrid Retrieval (Keyword + Vector + Tag)
- Job-basierte Orchestrierung
- Rollen- und Guardrail-Architektur
- SSE-Streaming
--- ---
# 2. Architekturprinzipien # 2. Architekturüberblick
## 2.1 Determinismus ## 2.1 Systemebenen
- Gleiche Dokumente + gleiche Konfiguration → identisches `index.ndjson` ### 1. Admin-Ebene (Symfony Backend)
- Gleiches `index.ndjson` → identisches FAISS - Dokumentverwaltung
- Gleiche Query → identisches Retrieval-Ergebnis - Versionierung
- Tag-Management
- Job-Steuerung
- System-Prompt-Verwaltung
- KI-Endpoint-Konfiguration
## 2.2 Governance ### 2. Wissensebene
- Dokumente (immutable)
- DocumentVersion
- Chunks
- index.ndjson
- index_meta.json
- Eine aktive Version pro Dokument ### 3. Vector-Ebene (Python)
- Keine impliziten Index-Änderungen - Embedding-Modell (lokal)
- Strukturänderungen erzwingen Global Reindex - FAISS-Index (Chunks)
- Keine Selbstmodifikation durch KI - FAISS-Index (Tags)
- Persistenter Vector-Service
- CLI-Fallback
## 2.3 Skalierbarkeit ### 4. Agent-Ebene
- Retrieval-Fusion
- NDJSON (streamingfähig) - PromptBuilder
- Kein RAM-basiertes JSON-Array - SSE-Streaming
- Zielgröße > 200k Chunks - Chat-History-Verarbeitung
- FAISS Full Rebuild ist deterministisch
--- ---
# 3. Wissensspeicher # 3. Dokumentenarchitektur
## 3.1 index.ndjson ## 3.1 Primärquellen
Single Source of Truth. - Dokumente sind immutable.
- Jede Änderung erzeugt eine neue DocumentVersion.
- Pro Dokument existiert genau eine aktive Version.
- 1 JSON-Objekt pro Zeile ## 3.2 Aktivierungsprozess
- Streaming-Append
- Deterministische Compaction by `document_id`
Beispielstruktur: 1. Aktivierung einer Version
2. Erstellung eines IngestJob
3. Async-Start:
```
bin/console mto:agent:ingest:run <jobId>
```
4. IngestOrchestrator:
- Guardrail-Validierung
- NDJSON Compaction by document_id
- Chunking
- Streaming Append
- Vollständiger FAISS-Rebuild
- index_meta.json Update
- Status COMPLETED/FAILED
```json ---
{
"chunk_id": "uuid", # 4. NDJSON-Architektur
"document_id": "uuid",
"document_version_id": "uuid", ## 4.1 index.ndjson (Single Source of Truth)
"text": "...",
"meta": { ... } - Streamingfähiges Format
} - Kein JSON-Array
- Append-only mit Compaction
- Keine vollständige RAM-Verarbeitung
- Atomare Datei-Switches (.tmp → rename)
## 4.2 index_meta.json
Enthält:
- index_version
- 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
---
# 5. Chunk-Management
Verantwortlich: ChunkManager
Eigenschaften:
- Streaming-basiertes Schreiben
- Deterministische Reproduktion
- Hard Limit: 120.000 Chunks
- Warnlimit: 100.000 Chunks
- Kein vollständiger JSON-RAM-Load
---
# 6. Vector-Architektur
## 6.1 Betriebsmodi
### A) Persistenter Vector-Service (bevorzugt)
- Lädt Embedding-Modell einmal
- Lädt FAISS-Indizes in RAM
- REST-Endpunkte:
- /search-chunks
- /search-tags
### B) CLI-Fallback
- Python-Skripte
- Wird genutzt, falls Service nicht verfügbar ist
## 6.2 Rebuild-Strategie
- Immer vollständiger FAISS-Rebuild
- Kein inkrementelles Patchen
- Atomarer Index-Switch
- Deterministisch und drift-sicher
---
# 7. Hybrid Retrieval
## 7.1 Retrieval-Komponenten
1. Keyword-Retrieval (führend)
2. FAISS-Chunk-Retrieval (ergänzend)
3. Tag-Routing (Soft-Gate)
## 7.2 Score-Fusion
- Keyword hat Priorität
- Vector ergänzt semantische Nähe
- Tags dienen als Routing-Verstärker
---
# 8. Tag-System
## 8.1 Entities
- Tag
- DocumentTag
- TagRebuildJob
## 8.2 Trigger-Logik
Ein Rebuild wird ausgelöst bei:
- Tag-Erstellung
- Tag-Löschung
- Tag-Zuweisung
- Tag-Entfernung
## 8.3 Job-Mechanik
- Async-Start via:
```
php bin/console mto:agent:tags:job:run <jobId>
```
- Logfile unter:
```
var/log/tags/job_<uuid>.log
``` ```
Regeln: ## 8.4 Stale-Protection
- Keine JSON-Array-Datei - QUEUED-Jobs älter als 5 Minuten → FAILED
- Keine Mutation einzelner Chunks - System kann nicht dauerhaft blockieren
- Nur Append + deterministische Entfernung per `document_id` - Coalescing (max. 1 aktiver Job)
## 8.5 Tag-Index
- tags.ndjson
- vector_tags.index
- Vollständiger Rebuild bei Änderung
--- ---
## 3.2 index_meta.json # 9. Job-Architektur
Strukturparameter: Statusmodell:
- `index_version` - QUEUED
- `embedding_model` - RUNNING
- `embedding_dimension` - COMPLETED
- `chunk_size` - FAILED
- `chunk_overlap`
- `scoring_version`
- `index_format`
- `vector_backend`
Wenn einer dieser Werte sich ändert: Eigenschaften:
**Global Reindex zwingend erforderlich** - Async exec
- LockService gegen Parallel-Ausführung
- Self-Healing gegen blockierte Jobs
- Logging pro Job
--- ---
## 3.3 FAISS # 10. Governance & Guardrails
Dateien: ## 10.1 Rollen
- `vector.index` - Super Admin
- `vector.index.meta.json` - Knowledge Admin
- `vector_tags.index` - Redaktion
- `vector_tags.index.meta.json` - Frontend-User
FAISS wird IMMER vollständig aus `index.ndjson` gebaut. ## 10.2 Schutzmechanismen
Keine Partial Updates. - Dokumente immutable
Kein inkrementelles Vector-Append. - Keine manuelle Chunk-Manipulation
- Versionierte Ingest-Profile
- Versionierte System-Prompts
- Konfigurierbare KI-Endpunkte
- Logging & Audit-Fähigkeit
--- ---
# 4. Persistenter Vector-Service # 11. Agent-Architektur
Retrieval läuft nicht mehr über: - SSE-Streaming
- Historienverarbeitung korrekt implementiert
- Symfony Process - Deterministischer PromptBuilder
- `exec()` - Retrieval-Kontext explizit eingebettet
- `python vector_search.py` pro Anfrage - Kein Think-Mode-Leak
Sondern über:
**FastAPI + Uvicorn (persistent im RAM)**
## 4.1 Eigenschaften
Beim Start lädt der Service:
- Embedding-Modell
- Chunk-Index
- Tag-Index
- ID-Mappings
Diese bleiben dauerhaft im RAM.
Kein Modell-Reload pro Anfrage.
Kein Disk-Reload pro Anfrage.
Kein Python-Spawn pro Anfrage.
## 4.2 Endpoints
- `GET /health`
- `POST /search-chunks`
- `POST /search-tags`
- `POST /reload`
## 4.3 Reload-Mechanismus
Nach Global Reindex:
```bash
curl -X POST http://127.0.0.1:8090/reload
```
Lädt:
- Chunk-Index neu
- Tag-Index neu
- Modell nur wenn `embedding_model` geändert wurde
Kein Neustart nötig.
Keine Downtime.
--- ---
# 5. Score-Gates (Routing-Sicherheit) # 12. Skalierbarkeit
## 5.1 Tag-Gate Zielgröße:
Tags steuern Routing. - >120.000 Chunks
Empfohlener Mindestscore: Ermöglicht durch:
`MIN_SCORE ≈ 0.70` - NDJSON Streaming
- Kein Full-RAM-JSON
Schützt vor: - Vollständiger FAISS-Rebuild
- Persistenter Vector-Service
- zufälligen semantischen Treffern - Atomare Switches
- falschem Dokumentrouting - Locking-Mechanismen
## 5.2 Chunk-Gate
Chunks sind Kontext.
Weicher Gate:
`MIN_SCORE ≈ 0.50`
Optional: relativer Score zum besten Treffer.
--- ---
# 6. Dokument- & Versionsmodell # 13. Stabilitätsstatus (Freeze-Zustand)
Document | Bereich | Status |
→ enthält mehrere `DocumentVersion` |----------|--------|
→ genau eine Version ist aktiv | Dokument-Ingest | Stabil |
| NDJSON-Architektur | Enterprise-Stabil |
Regel: | FAISS-Rebuild | Deterministisch |
| Tag-System | Stabil mit Stale-Recovery |
Es darf immer nur eine aktive Version pro Dokument existieren. | Async-Jobs | Blockiersicher |
| Retrieval-Fusion | Funktional |
Beim Aktivieren einer Version: | SSE | Stabil |
| Governance | Aktiv |
- Alle anderen Versionen werden inaktiv
- `IngestStatus → PENDING`
- Re-Ingest via Job
--- ---
# 7. Ingest-Architektur (vollständig Job-basiert) # 14. System-Freeze-Definition
Ingest läuft NIEMALS synchron im HTTP-Request. Dieses Dokument definiert den verbindlichen Referenzstand des Systems.
Jede Mutation am Index läuft über: Ab diesem Punkt gilt:
IngestJob → CLI Runner → IngestOrchestrator → IngestFlow - Keine strukturellen Änderungen ohne explizite Freigabe.
- Erweiterungen nur inkrementell.
## 7.1 Job-Typen - Keine Architektur-Rewrites.
- Determinismus und Reproduzierbarkeit sind oberstes Prinzip.
- `DOCUMENT_VERSION_ACTIVATE`
- `DOCUMENT`
- `GLOBAL_REINDEX`
## 7.2 Job-Status
- `QUEUED`
- `RUNNING`
- `COMPLETED`
- `FAILED`
- `ABORTED`
CLI-Ausführung:
```bash
php bin/console mto:agent:ingest:run <jobId>
```
--- ---
# 8. Hybrid Retrieval # 15. Zusammenfassung
Flow: Das System ist:
User Query
→ Keyword Retrieval
→ Tag Vector Search
→ Dokumentfilter
→ Chunk Vector Retrieval
→ Score Fusion
→ NDJSON Lookup
→ Context Builder
→ LLM
→ SSE Streaming
Keyword bleibt Primärsignal.
Vector ergänzt Semantik.
---
# 9. Locking & Concurrency
LockService verhindert:
- parallelen Ingest
- gleichzeitige Reindex-Vorgänge
- NDJSON-Korruption
Keine gleichzeitigen Mutationen erlaubt.
---
# 10. Vector Control (Production Safe)
Ein zentrales Kommando steuert:
- Dependency-Check
- Auto-Install (opt-in)
- Service Start
- Service Stop
- Reload
- Status
- Health-Check
- PID-Management
## Command
`mto:agent:vector:control`
## Beispiele
Status:
```bash
bin/console mto:agent:vector:control
```
Install + Start:
```bash
bin/console mto:agent:vector:control --install --start
```
Stop:
```bash
bin/console mto:agent:vector:control --stop
```
Reload:
```bash
bin/console mto:agent:vector:control --reload
```
## Production-Safety
- PID-File unter `var/run/vector_service.pid`
- SIGTERM Stop mit Timeout
- Optional SIGKILL (`--force`)
- Health-Check mit Retry-Mechanismus
- Kein automatisches Install ohne Flag
---
# 11. CLI Commands
- `mto:agent:ingest:run <jobId>`
- `mto:agent:vector:control`
- `mto:agent:test`
- `mto:agent:chat`
Alle Commands unter:
`mto:agent:*`
---
# 12. Failure Modes
Vector Service nicht erreichbar
`vector:control --start`
Reload Endpoint fehlt
→ falsche Service-Version
index_meta mismatch
→ Global Reindex
Lock aktiv
→ Parallel-Ingest blockiert
---
# 13. Non-Goals
- Kein Online-Learning
- Keine inkrementellen FAISS Updates
- Keine selbstverändernden Prompts
- Kein Auto-Merging von Chunks
- Kein Vector-Append im Runtime
Strukturänderungen → explizit + Reindex.
---
# 14. Zusammenfassung
Dieses System ist:
- deterministisch - deterministisch
- reproduzierbar
- drift-sicher - drift-sicher
- governance-stabil - governance-konform
- skalierbar
- blockiersicher
- debugbar
- enterprise-ready - enterprise-ready
- job-basiert
- versionssicher
- persistent im Retrieval
- ohne Spawn-Overhead
- reload-fähig ohne Downtime
Wichtige Neuerungen: Es erfüllt die Anforderungen an ein kontrolliertes, reproduzierbares RAG-System mit klarer Trennung zwischen Wissensquelle, Index, Retrieval und Generierung.
- Persistenter Vector-Service ersetzt CLI-Spawn
- Score-Gates verhindern falsches Routing
- Reload-Endpoint vermeidet Neustarts
- Production-Safe Control Command integriert
- Vollständige Trennung von Ingest und Runtime