8.4 KiB
| doc_type | audience | scope | status | version | context |
|---|---|---|---|---|---|
| technical_reference | developer, devops | backend, ingestion, smart_edges, edge_registry | active | 2.8.1 | Detaillierte technische Beschreibung der Import-Pipeline, Mistral-safe Parsing und Deep Fallback Resilienz. |
Ingestion Pipeline & Smart Processing
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 (WP-20) und ein robustes JSON-Parsing für Cloud-Modelle (Mistral/Gemini).
1. Der Import-Prozess (16-Schritte-Workflow)
Der Prozess ist asynchron und idempotent.
- Trigger & Async Dispatch:
- API (
/save): Nimmt Request entgegen, validiert und startet Background-Task ("Fire & Forget"). Antwortet sofort mit202/Queued. - CLI: Iteriert über Dateien und nutzt
asyncio.Semaphorezur Drosselung.
- API (
- Markdown lesen: Rekursives Scannen des Vaults.
- Frontmatter Check & Hard Skip (WP-22):
- Extraktion von
statusundtype. - Hard Skip Rule: Wenn
statusin['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.
- Extraktion von
- Edge Registry Initialisierung (WP-22):
- Laden der Singleton-Instanz der
EdgeRegistry. - Validierung der Vokabular-Datei unter
MINDNET_VOCAB_PATH.
- Laden der Singleton-Instanz der
- Config Resolution:
- Bestimmung von
chunking_profileundretriever_weight. - Priorität: 1. Frontmatter (Override) -> 2.
types.yaml(Type) -> 3. Global Default.
- Bestimmung von
- Note-Payload generieren:
- Erstellen des JSON-Objekts inklusive
status(für Scoring). - Multi-Hash Calculation: Berechnet Hashtabellen für
body(nur Text) undfull(Text + Metadaten).
- Erstellen des JSON-Objekts inklusive
- Change Detection:
- Vergleich des Hashes mit Qdrant.
- Strategie wählbar via ENV
MINDNET_CHANGE_DETECTION_MODE(fulloderbody).
- Chunking anwenden: Zerlegung des Textes basierend auf dem ermittelten Profil (siehe Kap. 3).
- Smart Edge Allocation (WP-20):
- Wenn
enable_smart_edge_allocation: true: DerSemanticAnalyzersendet 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 (
<s>) und Framework-Tags ([OUT]) sowie Recovery-Logik für Dictionaries (Suche nachedges,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.
- Wenn
- Inline-Kanten finden: Parsing von
[[rel:...]]. - 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.jsonlprotokolliert.
- Jede Kante wird via
- Callout-Kanten finden: Parsing von
> [!edge]. - Default- & Matrix-Edges erzeugen: Anwendung der
edge_defaultsaus Registry und Matrix-Logik. - Strukturkanten erzeugen:
belongs_to,next,prev. - Embedding (Async): Generierung via
nomic-embed-text(768 Dim). - Diagnose: Integritäts-Check nach dem Lauf.
2. Betrieb & CLI Befehle
2.1 Standard-Betrieb (Inkrementell)
Für regelmäßige Updates (Cronjob). Erkennt Änderungen via Hash.
export QDRANT_URL="http://localhost:6333"
export COLLECTION_PREFIX="mindnet"
# Steuert, wann eine Datei als "geändert" gilt
export MINDNET_CHANGE_DETECTION_MODE="full"
# 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-upsertist 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)
Notwendig bei Änderungen an types.yaml (z.B. neue Chunking-Profile), der Registry oder Modell-Wechsel.
# 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)
# --force ignoriert alle Hashes und schreibt alles neu
python3 -m scripts.import_markdown --vault ./vault --prefix "mindnet" --apply --force
3. Chunking & Payload
Das Chunking ist profilbasiert und in types.yaml konfiguriert.
3.1 Profile und Strategien (Vollständige Referenz)
| Profil | Strategie | Parameter | Einsatzgebiet |
|---|---|---|---|
sliding_short |
sliding_window |
Max: 350, Target: 200 | Kurze Logs, Chats, Risiken. |
sliding_standard |
sliding_window |
Max: 650, Target: 450 | Massendaten (Journal, Quellen). |
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). |
3.2 Die by_heading Logik (v2.9 Hybrid)
Die Strategie by_heading zerlegt Texte anhand ihrer Struktur (Überschriften). Sie unterstützt seit v2.9 ein "Safety Net" gegen zu große Chunks.
- 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.
- Safety Net: Wird ein Abschnitt zu lang (>
maxToken), wird auch ohne Überschrift getrennt.
- Jede Überschrift (
- 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 lösen nur dann einen neuen Chunk aus, wenn der aktuelle Chunk die
target-Größe erreicht hat. - Safety Net: Auch hier greift das
maxToken Limit.
3.3 Payload-Felder (Qdrant)
text: Der reine Inhalt (Anzeige im UI).window: Inhalt plus Overlap (für Embedding).chunk_profile: Das effektiv genutzte Profil (zur Nachverfolgung).
4. Edge-Erzeugung & Prioritäten (Provenance)
Kanten werden nach Vertrauenswürdigkeit (provenance) priorisiert. Die höhere Prio gewinnt.
| Prio | Quelle | Rule ID / Provenance | Confidence | Erläuterung |
|---|---|---|---|---|
| 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. |
| 4 | Semantic AI | semantic_ai |
0.90 | KI-extrahierte Verbindung (Mistral-safe). |
| 5 | Type Default | edge_defaults |
0.70 | Heuristik aus der Registry. |
| 6 | Struktur | structure |
1.00 | System-interne Verkettung (belongs_to). |
5. Quality Gates & Monitoring
In v2.7+ wurden Tools zur Überwachung der Datenqualität integriert:
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.
2. Payload Dryrun (Schema-Check): Simuliert Import, prüft JSON-Schema Konformität.
python3 -m scripts.payload_dryrun --vault ./test_vault
3. Full Edge Check (Graph-Integrität):
Prüft Invarianten (z.B. next muss reziprok zu prev sein).
python3 -m scripts.edges_full_check