From f6f3213b84d05ecd4ffd032e8cf68a17eff3db89 Mon Sep 17 00:00:00 2001 From: Lars Date: Thu, 25 Dec 2025 22:21:41 +0100 Subject: [PATCH] WP20final --- .../03_tech_ingestion_pipeline.md | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/docs/03_Technical_References/03_tech_ingestion_pipeline.md b/docs/03_Technical_References/03_tech_ingestion_pipeline.md index 79063c1..901a05d 100644 --- a/docs/03_Technical_References/03_tech_ingestion_pipeline.md +++ b/docs/03_Technical_References/03_tech_ingestion_pipeline.md @@ -11,9 +11,9 @@ context: "Detaillierte technische Beschreibung der Import-Pipeline, Mistral-safe **Quellen:** `pipeline_playbook.md`, `ingestion.py`, `edge_registry.py`, `01_edge_vocabulary.md`, `llm_service.py` -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** und ein **robustes JSON-Parsing** für Cloud-Modelle (Mistral/Gemini). +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). -## 1. Der Import-Prozess (15-Schritte-Workflow) +## 1. Der Import-Prozess (16-Schritte-Workflow) Der Prozess ist **asynchron** und **idempotent**. @@ -23,7 +23,7 @@ Der Prozess ist **asynchron** und **idempotent**. 2. **Markdown lesen:** Rekursives Scannen des Vaults. 3. **Frontmatter Check & Hard Skip (WP-22):** * Extraktion von `status` und `type`. - * **Hard Skip Rule:** Wenn `status` in `['system', 'template']` ist, wird die Datei **sofort übersprungen**. Sie wird weder vektorisiert noch in den Graphen aufgenommen. + * **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. * Validierung der Pflichtfelder (`id`, `title`) für alle anderen Dateien. 4. **Edge Registry Initialisierung (WP-22):** * Laden der Singleton-Instanz der `EdgeRegistry`. @@ -42,7 +42,7 @@ Der Prozess ist **asynchron** und **idempotent**. * Wenn `enable_smart_edge_allocation: true`: Der `SemanticAnalyzer` sendet Chunks an das LLM. * **Traffic Control:** Request nutzt `priority="background"`. Semaphore drosselt die Last. * **Resilienz (Quota Handling):** Erkennt HTTP 429 (Rate-Limit) und pausiert kontrolliert (via `LLM_RATE_LIMIT_WAIT`), bevor ein Cloud-Retry erfolgt. - * **Mistral-safe Parsing:** Automatisierte Bereinigung von BOS-Tokens (``) und Framework-Tags (`[OUT]`) sowie Recovery-Logik für Dictionaries. + * **Mistral-safe Parsing:** Automatisierte Bereinigung von BOS-Tokens (``) und Framework-Tags (`[OUT]`) sowie Recovery-Logik für Dictionaries (Suche nach `edges`, `links`, `results`, `kanten`). * **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. 10. **Inline-Kanten finden:** Parsing von `[[rel:...]]`. 11. **Alias-Auflösung & Kanonisierung (WP-22):** @@ -55,8 +55,6 @@ Der Prozess ist **asynchron** und **idempotent**. 15. **Embedding (Async):** Generierung via `nomic-embed-text` (768 Dim). 16. **Diagnose:** Integritäts-Check nach dem Lauf. - - --- ## 2. Betrieb & CLI Befehle @@ -121,11 +119,11 @@ Die Strategie `by_heading` zerlegt Texte anhand ihrer Struktur (Überschriften). * **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. - * *Merge-Check:* Wenn der vorherige Chunk leer war (nur Überschriften), wird gemergt (verhindert verwaiste Überschriften). + * *Merge-Check:* Wenn der vorherige Chunk leer war (nur Überschriften), wird gemergt. * *Safety Net:* Wird ein Abschnitt zu lang (> `max` Token), wird auch ohne Überschrift getrennt. * **Modus "Soft" (`strict_heading_split: false`):** * **Hierarchie-Check:** Überschriften *oberhalb* des Split-Levels erzwingen **immer** einen Split. - * **Füll-Logik:** Überschriften *auf* dem Split-Level (z.B. H2) lösen nur dann einen neuen Chunk aus, wenn der aktuelle Chunk die `target`-Größe erreicht hat. + * **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. * *Safety Net:* Auch hier greift das `max` Token Limit. ### 3.3 Payload-Felder (Qdrant)