2025-12-13 18:38:37 +01:00
---
doc_type: technical_reference
audience: developer, devops
2025-12-19 09:02:49 +01:00
scope: backend, ingestion, smart_edges, edge_registry
2025-12-13 18:38:37 +01:00
status: active
2025-12-25 22:04:34 +01:00
version: 2.8.1
context: "Detaillierte technische Beschreibung der Import-Pipeline, Mistral-safe Parsing und Deep Fallback Resilienz."
2025-12-13 18:38:37 +01:00
---
# Ingestion Pipeline & Smart Processing
2025-12-25 19:39:16 +01:00
**Quellen:** `pipeline_playbook.md` , `ingestion.py` , `edge_registry.py` , `01_edge_vocabulary.md` , `llm_service.py`
2025-12-13 18:38:37 +01:00
2025-12-25 22:21:41 +01:00
Die Ingestion transformiert Markdown in den Graphen. Entrypoint: `scripts/import_markdown.py` (CLI) oder `routers/ingest.py` (API). Seit v2.8 integriert dieser Prozess eine **intelligente Quoten-Steuerung** (WP-20) und ein **robustes JSON-Parsing** für Cloud-Modelle (Mistral/Gemini).
2025-12-13 18:38:37 +01:00
2025-12-25 22:21:41 +01:00
## 1. Der Import-Prozess (16-Schritte-Workflow)
2025-12-13 18:38:37 +01:00
Der Prozess ist **asynchron** und **idempotent** .
2025-12-16 18:46:11 +01:00
1. **Trigger & Async Dispatch:**
* **API (`/save`):** Nimmt Request entgegen, validiert und startet Background-Task ("Fire & Forget"). Antwortet sofort mit `202/Queued` .
* **CLI:** Iteriert über Dateien und nutzt `asyncio.Semaphore` zur Drosselung.
2. **Markdown lesen:** Rekursives Scannen des Vaults.
2025-12-19 09:02:49 +01:00
3. **Frontmatter Check & Hard Skip (WP-22):**
* Extraktion von `status` und `type` .
2025-12-25 22:21:41 +01:00
* **Hard Skip Rule:** Wenn `status` in `['system', 'template', 'archive', 'hidden']` ist, wird die Datei **sofort übersprungen** . Sie wird weder vektorisiert noch in den Graphen aufgenommen.
2025-12-19 09:02:49 +01:00
* Validierung der Pflichtfelder (`id`, `title` ) für alle anderen Dateien.
4. **Edge Registry Initialisierung (WP-22):**
* Laden der Singleton-Instanz der `EdgeRegistry` .
* Validierung der Vokabular-Datei unter `MINDNET_VOCAB_PATH` .
5. **Config Resolution:**
2025-12-16 18:46:11 +01:00
* Bestimmung von `chunking_profile` und `retriever_weight` .
2025-12-19 09:02:49 +01:00
* **Priorität:** 1. Frontmatter (Override) -> 2. `types.yaml` (Type) -> 3. Global Default.
6. **Note-Payload generieren:**
* Erstellen des JSON-Objekts inklusive `status` (für Scoring).
2025-12-16 18:46:11 +01:00
* **Multi-Hash Calculation:** Berechnet Hashtabellen für `body` (nur Text) und `full` (Text + Metadaten).
2025-12-19 09:02:49 +01:00
7. **Change Detection:**
2025-12-16 18:46:11 +01:00
* Vergleich des Hashes mit Qdrant.
* Strategie wählbar via ENV `MINDNET_CHANGE_DETECTION_MODE` (`full` oder `body` ).
2025-12-19 09:02:49 +01:00
8. **Chunking anwenden:** Zerlegung des Textes basierend auf dem ermittelten Profil (siehe Kap. 3).
2025-12-25 22:04:34 +01:00
9. **Smart Edge Allocation (WP-20):**
2025-12-13 18:38:37 +01:00
* Wenn `enable_smart_edge_allocation: true` : Der `SemanticAnalyzer` sendet Chunks an das LLM.
2025-12-25 19:39:16 +01:00
* **Traffic Control:** Request nutzt `priority="background"` . Semaphore drosselt die Last.
2025-12-25 22:04:34 +01:00
* **Resilienz (Quota Handling):** Erkennt HTTP 429 (Rate-Limit) und pausiert kontrolliert (via `LLM_RATE_LIMIT_WAIT` ), bevor ein Cloud-Retry erfolgt.
2025-12-25 22:21:41 +01:00
* **Mistral-safe Parsing:** Automatisierte Bereinigung von BOS-Tokens (`< s > `) und Framework-Tags (`[OUT]`) sowie Recovery-Logik für Dictionaries (Suche nach `edges` , `links` , `results` , `kanten` ).
2025-12-25 22:04:34 +01:00
* **Deep Fallback (v2.11.14):** Erkennt "Silent Refusals" (Data Policy Violations). Liefert die Cloud trotz erfolgreicher Verbindung keine verwertbaren Kanten, wird ein lokaler Fallback via Ollama erzwungen, um Kantenverlust zu vermeiden.
2025-12-19 09:02:49 +01:00
10. **Inline-Kanten finden:** Parsing von `[[rel:...]]` .
11. **Alias-Auflösung & Kanonisierung (WP-22):**
* Jede Kante wird via `edge_registry.resolve()` normalisiert.
* Aliase (z.B. `basiert_auf` ) werden zu kanonischen Typen (z.B. `based_on` ) aufgelöst.
* Unbekannte Typen werden in `unknown_edges.jsonl` protokolliert.
12. **Callout-Kanten finden:** Parsing von `> [!edge]` .
13. **Default- & Matrix-Edges erzeugen:** Anwendung der `edge_defaults` aus Registry und Matrix-Logik.
14. **Strukturkanten erzeugen:** `belongs_to` , `next` , `prev` .
15. **Embedding (Async):** Generierung via `nomic-embed-text` (768 Dim).
16. **Diagnose:** Integritäts-Check nach dem Lauf.
2025-12-13 18:38:37 +01:00
---
## 2. Betrieb & CLI Befehle
### 2.1 Standard-Betrieb (Inkrementell)
Für regelmäßige Updates (Cronjob). Erkennt Änderungen via Hash.
```bash
export QDRANT_URL="http://localhost:6333"
export COLLECTION_PREFIX="mindnet"
2025-12-16 18:46:11 +01:00
# Steuert, wann eine Datei als "geändert" gilt
export MINDNET_CHANGE_DETECTION_MODE="full"
2025-12-13 18:38:37 +01:00
# Nutzt das Venv der Produktionsumgebung
/home/llmadmin/mindnet/.venv/bin/python3 -m scripts.import_markdown \
--vault ./vault \
--prefix "$COLLECTION_PREFIX" \
--apply \
--purge-before-upsert \
--sync-deletes
```
> **[!WARNING] Purge-Before-Upsert**
> Das Flag `--purge-before-upsert` ist kritisch. Es löscht vor dem Schreiben einer Note ihre alten Chunks/Edges. Ohne dieses Flag entstehen **"Geister-Chunks"** (alte Textabschnitte, die im Markdown gelöscht wurden, aber im Index verbleiben).
### 2.2 Full Rebuild (Clean Slate)
2025-12-19 09:02:49 +01:00
Notwendig bei Änderungen an `types.yaml` (z.B. neue Chunking-Profile), der Registry oder Modell-Wechsel.
2025-12-13 18:38:37 +01:00
```bash
# 0. Modell sicherstellen
ollama pull nomic-embed-text
# 1. Qdrant Collections löschen (Wipe)
python3 -m scripts.reset_qdrant --mode wipe --prefix "mindnet" --yes
# 2. Vollständiger Import (Force)
2025-12-16 18:46:11 +01:00
# --force ignoriert alle Hashes und schreibt alles neu
2025-12-13 18:38:37 +01:00
python3 -m scripts.import_markdown --vault ./vault --prefix "mindnet" --apply --force
```
---
## 3. Chunking & Payload
2025-12-19 09:02:49 +01:00
Das Chunking ist profilbasiert und in `types.yaml` konfiguriert.
2025-12-13 18:38:37 +01:00
2025-12-19 09:02:49 +01:00
### 3.1 Profile und Strategien (Vollständige Referenz)
2025-12-16 14:48:04 +01:00
| Profil | Strategie | Parameter | Einsatzgebiet |
2025-12-13 18:38:37 +01:00
| :--- | :--- | :--- | :--- |
2025-12-16 14:48:04 +01:00
| `sliding_short` | `sliding_window` | Max: 350, Target: 200 | Kurze Logs, Chats, Risiken. |
| `sliding_standard` | `sliding_window` | Max: 650, Target: 450 | Massendaten (Journal, Quellen). |
2025-12-19 09:02:49 +01:00
| `sliding_smart_edges` | `sliding_window` | Max: 600, Target: 400 | Fließtexte mit hohem Wert (Projekte). |
| `structured_smart_edges` | `by_heading` | `strict: false` (Soft) | Strukturierte Texte, Merging erlaubt. |
| `structured_smart_edges_strict` | `by_heading` | `strict: true` (Hard) | **Atomare Einheiten** : Entscheidungen, Werte. |
| `structured_smart_edges_strict_L3` | `by_heading` | `strict: true` , `level: 3` | Tief geschachtelte Prinzipien (Tier 2/MP1). |
2025-12-16 14:48:04 +01:00
2025-12-16 18:46:11 +01:00
### 3.2 Die `by_heading` Logik (v2.9 Hybrid)
2025-12-16 14:48:04 +01:00
2025-12-16 18:46:11 +01:00
Die Strategie `by_heading` zerlegt Texte anhand ihrer Struktur (Überschriften). Sie unterstützt seit v2.9 ein "Safety Net" gegen zu große Chunks.
2025-12-16 14:48:04 +01:00
* **Split Level:** Definiert die Tiefe (z.B. `2` = H1 & H2 triggern Split).
* **Modus "Strict" (`strict_heading_split: true`):**
* Jede Überschrift (`< = split_level`) erzwingt einen neuen Chunk.
2025-12-25 22:21:41 +01:00
* *Merge-Check:* Wenn der vorherige Chunk leer war (nur Überschriften), wird gemergt.
2025-12-16 18:46:11 +01:00
* *Safety Net:* Wird ein Abschnitt zu lang (> `max` Token), wird auch ohne Überschrift getrennt.
2025-12-16 14:48:04 +01:00
* **Modus "Soft" (`strict_heading_split: false`):**
2025-12-19 09:02:49 +01:00
* **Hierarchie-Check:** Überschriften *oberhalb* des Split-Levels erzwingen **immer** einen Split.
2025-12-25 22:21:41 +01:00
* **Füll-Logik:** Überschriften *auf* dem Split-Level lösen nur dann einen neuen Chunk aus, wenn der aktuelle Chunk die `target` -Größe erreicht hat.
2025-12-16 18:46:11 +01:00
* *Safety Net:* Auch hier greift das `max` Token Limit.
2025-12-16 14:48:04 +01:00
### 3.3 Payload-Felder (Qdrant)
2025-12-19 09:02:49 +01:00
* `text` : Der reine Inhalt (Anzeige im UI).
* `window` : Inhalt plus Overlap (für Embedding).
2025-12-16 18:46:11 +01:00
* `chunk_profile` : Das effektiv genutzte Profil (zur Nachverfolgung).
2025-12-13 18:38:37 +01:00
---
2025-12-19 09:02:49 +01:00
## 4. Edge-Erzeugung & Prioritäten (Provenance)
2025-12-13 18:38:37 +01:00
Kanten werden nach Vertrauenswürdigkeit (`provenance`) priorisiert. Die höhere Prio gewinnt.
2025-12-25 19:39:16 +01:00
| Prio | Quelle | Rule ID / Provenance | Confidence | Erläuterung |
2025-12-19 09:02:49 +01:00
| :--- | :--- | :--- | :--- | :--- |
| **1** | Wikilink | `explicit:wikilink` | **1.00** | Harte menschliche Setzung. |
| **2** | Inline | `inline:rel` | **0.95** | Typisierte menschliche Kante. |
| **3** | Callout | `callout:edge` | **0.90** | Explizite Meta-Information. |
2025-12-25 19:39:16 +01:00
| **4** | Semantic AI | `semantic_ai` | **0.90** | KI-extrahierte Verbindung (Mistral-safe). |
2025-12-19 09:02:49 +01:00
| **5** | Type Default | `edge_defaults` | **0.70** | Heuristik aus der Registry. |
2025-12-25 19:39:16 +01:00
| **6** | Struktur | `structure` | **1.00** | System-interne Verkettung (`belongs_to`). |
2025-12-13 18:38:37 +01:00
---
2025-12-19 09:02:49 +01:00
## 5. Quality Gates & Monitoring
2025-12-25 19:39:16 +01:00
In v2.7+ wurden Tools zur Überwachung der Datenqualität integriert:
2025-12-13 18:38:37 +01:00
2025-12-19 09:02:49 +01:00
**1. Registry Review:** Prüfung der `data/logs/unknown_edges.jsonl` . Administratoren sollten hier gelistete Begriffe als Aliase in die `01_edge_vocabulary.md` aufnehmen.
2025-12-13 18:38:37 +01:00
2025-12-19 09:02:49 +01:00
**2. Payload Dryrun (Schema-Check):**
2025-12-13 18:38:37 +01:00
Simuliert Import, prüft JSON-Schema Konformität.
```bash
python3 -m scripts.payload_dryrun --vault ./test_vault
```
2025-12-19 09:02:49 +01:00
**3. Full Edge Check (Graph-Integrität):**
2025-12-13 18:38:37 +01:00
Prüft Invarianten (z.B. `next` muss reziprok zu `prev` sein).
```bash
python3 -m scripts.edges_full_check
```