harden code and add messenger services and ne README.md and SYSTEM.,d
This commit is contained in:
334
SYSTEM.md
Normal file
334
SYSTEM.md
Normal file
@@ -0,0 +1,334 @@
|
||||
# mitho AI Agent
|
||||
Enterprise Hybrid RAG System (Symfony + NDJSON + FAISS)
|
||||
|
||||
---
|
||||
|
||||
## Überblick
|
||||
|
||||
Der **mitho AI Agent** ist ein deterministisches, governance-stabiles Enterprise-RAG-System auf Symfony-Basis.
|
||||
|
||||
Es kombiniert:
|
||||
|
||||
- Versionierte Dokumente
|
||||
- Streaming-NDJSON-Index
|
||||
- Deterministischen Full-Vector-Rebuild
|
||||
- Keyword- + Vektor-Hybrid-Retrieval
|
||||
- Rollen- und Governance-Modell
|
||||
- Lock- und Guardrail-Mechanismen
|
||||
- Produktionsfähige Adminoberfläche
|
||||
|
||||
> „Wir nutzen KI nicht, um kreativ zu raten, sondern um verlässlich auf Basis Ihres Wissens zu antworten.“
|
||||
|
||||
---
|
||||
|
||||
# Architektur (Enterprise-Version)
|
||||
|
||||
## 1. Kernprinzipien
|
||||
|
||||
- Dokumente sind immutable Primärquellen
|
||||
- index.ndjson ist Single Source of Truth
|
||||
- FAISS wird IMMER vollständig aus index.ndjson neu gebaut
|
||||
- Keine partiellen Vektor-Updates
|
||||
- Strukturänderungen erzwingen Global Reindex
|
||||
- Atomare Switch-Strategie (.tmp + rename)
|
||||
- >200k Chunks skalierbar
|
||||
- Kein Full-JSON-RAM-Load
|
||||
|
||||
---
|
||||
|
||||
# Wissensarchitektur
|
||||
|
||||
```
|
||||
var/knowledge/
|
||||
├── uploads/
|
||||
├── chunks/
|
||||
├── index.ndjson
|
||||
├── index_meta.json
|
||||
├── vector.index
|
||||
└── vector_meta.json
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# Indexstruktur
|
||||
|
||||
## index.ndjson
|
||||
|
||||
- Streamingfähig
|
||||
- Eine Zeile = ein Chunk
|
||||
- JSON pro Zeile
|
||||
- Enthält:
|
||||
- chunk_id
|
||||
- document_id
|
||||
- version
|
||||
- text
|
||||
- meta
|
||||
|
||||
NDJSON ersetzt das frühere index.json (kein Array mehr).
|
||||
|
||||
---
|
||||
|
||||
# Index Meta
|
||||
|
||||
`index_meta.json` enthält:
|
||||
|
||||
- index_version
|
||||
- embedding_model
|
||||
- embedding_dimension
|
||||
- chunk_size
|
||||
- overlap
|
||||
- scoring_version
|
||||
- index_format
|
||||
|
||||
Wird verwaltet durch:
|
||||
|
||||
- `IndexMetaManager`
|
||||
- `IndexConfiguration`
|
||||
|
||||
---
|
||||
|
||||
# Ingest-Architektur
|
||||
|
||||
## Zentrale Klassen
|
||||
|
||||
| Klasse | Aufgabe |
|
||||
|--------|----------|
|
||||
| `DocumentService` | Dokumentverwaltung |
|
||||
| `DocumentVersionRepository` | Versionierung |
|
||||
| `KnowledgeIngestService` | Chunk-Erstellung |
|
||||
| `ChunkManager` | NDJSON Append + Compaction |
|
||||
| `SimpleChunker` | deterministische Text-Splittung |
|
||||
| `TextNormalizer` | Normalisierung |
|
||||
| `StopWords` | Stopword-Filter |
|
||||
| `IngestFlow` | Ablaufsteuerung |
|
||||
| `IngestOrchestrator` | Gesamtkoordination |
|
||||
| `IngestJobService` | Job-Verwaltung |
|
||||
| `LockService` | Reindex-Lock-Mechanismus |
|
||||
| `IndexMetaManager` | Index-Metadaten |
|
||||
| `IndexStructureChangedException` | Guardrail bei Strukturdrift |
|
||||
|
||||
---
|
||||
|
||||
# Ingest-Typen
|
||||
|
||||
## 1. Lokaler Ingest
|
||||
|
||||
- Neue Dokumentversion
|
||||
- Alte Chunks der document_id werden kompakt entfernt
|
||||
- Neue Chunks werden appended
|
||||
- Danach vollständiger FAISS-Rebuild
|
||||
- index_version bleibt gleich
|
||||
|
||||
## 2. Global Reindex
|
||||
|
||||
- Alle aktiven Dokumente neu ingestieren
|
||||
- index.ndjson komplett neu schreiben
|
||||
- FAISS komplett neu bauen
|
||||
- index_version++
|
||||
|
||||
---
|
||||
|
||||
# Vektor-Architektur
|
||||
|
||||
## vector_ingest.py
|
||||
|
||||
Buildet FAISS vollständig aus index.ndjson.
|
||||
|
||||
Eigenschaften:
|
||||
|
||||
- Streaming NDJSON read
|
||||
- normalize_embeddings=True
|
||||
- IndexFlatIP (Inner Product)
|
||||
- Batch-Size 64
|
||||
- Modell konfigurierbar
|
||||
|
||||
Aufruf:
|
||||
|
||||
```bash
|
||||
python vector_ingest.py --index path/to/index.ndjson --out path/to/vector.index
|
||||
```
|
||||
|
||||
Keine inkrementellen Updates. Immer Full-Rebuild.
|
||||
|
||||
---
|
||||
|
||||
## vector_search.py
|
||||
|
||||
- Nimmt Query + Limit
|
||||
- Lädt vector.index
|
||||
- Lädt vector_meta.json
|
||||
- Gibt JSON mit chunk_id + score zurück
|
||||
|
||||
Aufruf:
|
||||
|
||||
```bash
|
||||
python vector_search.py "query" 5
|
||||
```
|
||||
|
||||
Rückgabe:
|
||||
|
||||
```json
|
||||
[
|
||||
{ "chunk_id": "...", "score": 0.83 }
|
||||
]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# Hybrid Retrieval
|
||||
|
||||
## Komponenten
|
||||
|
||||
| Klasse | Aufgabe |
|
||||
|--------|----------|
|
||||
| `NdjsonHybridRetriever` | Score-Fusion |
|
||||
| `NdjsonKeywordSearch` | Keyword-Scoring |
|
||||
| `NdjsonChunkLookup` | Chunk-Resolving |
|
||||
| `VectorSearchClient` | Python-Bridge |
|
||||
| `CachedRetriever` | Cache Layer |
|
||||
|
||||
---
|
||||
|
||||
## Retrieval Flow
|
||||
|
||||
1. Prompt
|
||||
2. Keyword-Ranking
|
||||
3. FAISS Top-K
|
||||
4. Score-Fusion
|
||||
5. Final Chunk-Auswahl
|
||||
6. Kontextaufbau
|
||||
7. LLM-Antwort
|
||||
|
||||
Keyword bleibt führend.
|
||||
Vektor ergänzt semantisch.
|
||||
|
||||
---
|
||||
|
||||
# Dokument-Extraktion
|
||||
|
||||
Unterstützt via:
|
||||
|
||||
- `DocumentExtractorInterface`
|
||||
- `ExtractorResolver`
|
||||
- `PdfExtractor`
|
||||
- `DocumentLoader`
|
||||
|
||||
PDFs werden robust extrahiert und normalisiert.
|
||||
|
||||
---
|
||||
|
||||
# Adminbereich (Symfony)
|
||||
|
||||
Controller:
|
||||
|
||||
- `DashboardController`
|
||||
- `DocumentController`
|
||||
- `IngestJobController`
|
||||
- `SecurityController`
|
||||
|
||||
Entities:
|
||||
|
||||
- `Document`
|
||||
- `DocumentVersion`
|
||||
- `IngestJob`
|
||||
- `User`
|
||||
|
||||
Repositories:
|
||||
|
||||
- `DocumentVersionRepository`
|
||||
- `UserRepository`
|
||||
|
||||
Rollenmodell:
|
||||
|
||||
- Super Admin
|
||||
- Knowledge Admin
|
||||
- Redaktion
|
||||
- Frontend User
|
||||
|
||||
---
|
||||
|
||||
# Guardrails & Sicherheit
|
||||
|
||||
- Lock bei Reindex
|
||||
- Strukturdrift-Erkennung
|
||||
- Keine Live-Änderung von Ingest-Profilen
|
||||
- Deterministische Rebuilds
|
||||
- Atomare Datei-Switches
|
||||
- NDJSON niemals vollständig im RAM
|
||||
|
||||
---
|
||||
|
||||
# LLM-Integration
|
||||
|
||||
- Ollama oder kompatibler Endpoint
|
||||
- Streaming via SSE
|
||||
- Historienverwaltung
|
||||
- Prompt-Versionierung
|
||||
- Kontextkontrolle
|
||||
|
||||
---
|
||||
|
||||
# Performance-Merkmale
|
||||
|
||||
- Streaming NDJSON
|
||||
- Kein JSON-Array-Load
|
||||
- Deterministischer FAISS-Rebuild
|
||||
- Cache-Layer
|
||||
- >200k Chunks skalierbar
|
||||
|
||||
---
|
||||
|
||||
# Mindestanforderungen
|
||||
|
||||
Backend:
|
||||
- PHP 8.2+
|
||||
- Symfony 7.x
|
||||
|
||||
Python:
|
||||
- Python 3.9+
|
||||
- faiss
|
||||
- sentence-transformers
|
||||
|
||||
Optional:
|
||||
- Ollama
|
||||
|
||||
---
|
||||
|
||||
# Produktstatus
|
||||
|
||||
Enterprise-ready:
|
||||
|
||||
- Governance-stabil
|
||||
- Drift-sicher
|
||||
- Deterministisch reproduzierbar
|
||||
- Skalierbar
|
||||
- Adminfähig
|
||||
- Rollenbasiert
|
||||
|
||||
---
|
||||
|
||||
# Positionierung
|
||||
|
||||
Dieses System ist keine generische KI.
|
||||
|
||||
Es ist:
|
||||
|
||||
- kontrolliert
|
||||
- versioniert
|
||||
- reproduzierbar
|
||||
- auditierbar
|
||||
- enterprise-tauglich
|
||||
|
||||
---
|
||||
|
||||
# Fazit
|
||||
|
||||
Der mitho AI Agent ist ein kontrolliertes Enterprise-RAG-System mit:
|
||||
|
||||
- NDJSON-Streaming-Index
|
||||
- deterministischem Vector-Rebuild
|
||||
- Hybrid-Retrieval
|
||||
- Guardrail-Mechanismen
|
||||
- Symfony-Admin-Governance
|
||||
|
||||
Er ist gebaut für produktiven, langfristigen Unternehmenseinsatz.
|
||||
Reference in New Issue
Block a user