13 KiB
Mindnet v2.2 – Fachliche Architektur
Datei: docs/mindnet_functional_architecture_v2.2.md
Stand: 2025-12-08
Status: FINAL (Integrierter Stand WP01–WP05)
Dieses Dokument beschreibt was Mindnet fachlich tut und warum – mit Fokus auf die Erzeugung und Nutzung von Edges (Kanten), die Logik des Retrievers und den neuen RAG-Chat (Persönlichkeit). Die technische Umsetzung wird im technischen Dokument detailliert.
0) Zielbild & Grundprinzip
Mindnet wandelt Obsidian-Markdown-Notizen in einen dynamischen Graphen aus Punkten und Kanten um. Die drei zentralen Artefakt-Sammlungen lauten:
mindnet_notes– genau eine Note pro Markdown-Datei (Metadaten & Hashes)mindnet_chunks– semantische Teilstücke einer Note (Fenster/„Chunks“)mindnet_edges– gerichtete Beziehungen zwischen Knoten (Chunks/Notes)
Die Import-Pipeline erzeugt diese Artefakte deterministisch und idempotent (erneute Läufe überschreiben konsistent statt zu duplizieren). Die Import-Schritte sind: parse → chunk → edge → upsert.
1) Notizen & Chunks (fachliche Perspektive)
1.1 Notiz (Note)
- Repräsentiert eine fachliche Einheit (z. B. „Vector DB Basics“, „KI-Projekt“).
- Trägt Eigenschaften (Titel, Typ, Zeitstempel, optionale Policies).
- Typ (type) steuert u. a. Chunk-Profil und Default-Relationen (siehe §4).
- retriever_weight und chunk_profile werden systematisch an Note und Chunks gespiegelt, damit der Retriever beides nutzen kann.
1.2 Chunk
- Ausschnitt/Textfenster aus der Note, als eigenständiger Such-Anker.
- Jeder Chunk gehört genau einer Note.
- Chunks bilden eine Sequenz (1…N) – das ermöglicht next/prev.
- Neu in v2.2: Alle Kanten entstehen ausschließlich zwischen Chunks (Scope="chunk"), nie zwischen Notes direkt. Notes dienen nur noch als Metadatencontainer.
Wichtig: Chunking-Profile (short/medium/long) kommen aus
types.yaml(per Note-Typ), können aber lokal überschrieben werden. Die effektiven Werte werden bei der Payload-Erzeugung bestimmt.
2) Edges – fachliche Typen & Bedeutung
Edges kodieren Beziehungen. Sie sind gerichtet und werden in mindnet_edges gespeichert. Die Erzeugung folgt einer strengen Priorität: Inline > Callout > Defaults > Struktur.
2.1 Struktur-Kanten (Das Skelett)
- belongs_to: Chunk → Note (Zuordnung)
- next / prev: Kettenbeziehungen zwischen aufeinanderfolgenden Chunks derselben Note. → ermöglichen „lineares Weiterlesen“ oder Kontextpfade in Antworten. Diese Kanten entstehen immer, unabhängig von Inhalten.
2.2 Inhalts-Kanten (explizit)
Hier unterscheidet v2.2 präzise zwischen verschiedenen Quellen der Evidenz:
-
Explizite Inline-Relationen (Höchste Priorität): Im Fließtext notierte, semantisch qualifizierte Relationen.
- Syntax:
[[rel:depends_on Embeddings 101]] - Fachliche Aussage: "Hängt ab von", "Ähnlich zu".
- rule_id:
inline:rel - confidence: ~0.95
- Syntax:
-
Callout-Edges (Kuratierte Listen): Redaktionell gepflegte Listen am Ende einer Notiz (z.B. "Siehe auch").
- Syntax:
> [!edge] related_to: [[Vector DB Basics]] - rule_id:
callout:edge - confidence: ~0.90
- Syntax:
-
Wikilinks (Standard-Referenzen): Der klassische Obsidian-Link.
- Syntax:
[[Vector DB Basics]] - Typ:
references - rule_id:
explicit:wikilink - confidence: 1.0
- Syntax:
Alle expliziten Quellen (Wikilink, Inline-Rel, Callout) sind Primärbelege.
2.3 Typ-basierte Default-Kanten (Regelbasiert)
Jede Note hat einen Typ (z. B. concept, project, profile). In config/types.yaml definieren wir pro Typ edge_defaults, z. B.:
concept:["references","related_to"]project:["references","depends_on"]
Regel: Für jede gefundene explizite Referenz (s. o.) werden zusätzliche Edges nach diesen Defaults erzeugt.
Beispiel: Ein project mit edge_defaults=["depends_on"] erzeugt zu jedem explizit referenzierten Ziel zusätzlich eine depends_on-Kante.
Diese Kanten tragen provenance=rule und eine rule_id der Form edge_defaults:{note_type}:{relation} sowie eine geringere Confidence (~0.7).
3) Edge-Payload – Felder & Semantik
Jede Kante hat mindestens:
kind– Beziehungsart (belongs_to, next, prev, references, related_to, depends_on, similar_to, …)scope–"chunk"(Standard in v2.2)source_id,target_id– Quell-/Ziel-Knoten (Chunk-IDs oder Note-Titel bei unresolved Targets)note_id– Owner-Note (die Note, aus der die Kante stammt)
Erweiterte/abgeleitete Felder (WP03 Superset):
provenance–"explicit"(Wikilink/Inline/Callout) oder"rule"(Typ-Defaults)rule_id– maschinenlesbare Regelquelle (z.B.inline:rel,edge_defaults:project:depends_on)confidence– 0.0–1.0; Heuristik zur Gewichtung im Scoring.
Dedup-Schlüssel (fachlich): Gleichlautende (source_id, target_id, kind, scope, rule_id) werden nicht mehrfach geschrieben.
4) Typ-Registry (config/types.yaml)
4.1 Zweck
- Steuert Chunking-Profile (
short|medium|long) pro Typ - Liefert retriever_weight (Note-/Chunk-Gewichtung im Ranking) pro Typ
- Definiert edge_defaults je Typ (s. o.)
Der Importer lädt die Registry aus MINDNET_TYPES_FILE oder nutzt Fallbacks. Frontmatter-Overrides für Profile werden in v2.2 weitgehend ignoriert zugunsten einer zentralen Governance in der YAML-Datei.
4.2 Beispiel (auslieferungsnah)
version: 1.0
types:
concept:
chunk_profile: medium
edge_defaults: ["references", "related_to"]
retriever_weight: 0.60
project:
chunk_profile: long
edge_defaults: ["references", "depends_on"]
retriever_weight: 0.97
Auflösung im Importer
effective_chunk_profile(note_type, registry)→"short|medium|long"|Noneeffective_retriever_weight(note_type, registry)→float|None- Ergebnis wird in
note_payloadundchunk_payloadsgespiegelt.
5) Der Retriever (Funktionaler Layer)
Der Retriever ist in v2.2 der zentrale Zugangspunkt. Er realisiert die Hybride Suche.
5.1 Scoring-Modell
Die Relevanz eines Treffers ergibt sich nicht mehr nur aus Textähnlichkeit, sondern aus einer gewichteten Formel:
total_score =
semantic_weight * semantic_score
+ edge_weight * edge_bonus
+ centrality_weight * centrality_bonus
+ type_weight * retriever_weight
- semantic_score: Vektorähnlichkeit (Qdrant).
- retriever_weight: Wichtigkeit des Typs (z.B. Projekte > Quellen).
- edge_bonus: Belohnung für Chunks, die im Kontext der Anfrage stark vernetzt sind (Summe der Confidence eingehender relevanter Kanten).
- centrality_bonus: Belohnung für Knoten, die zentrale Hubs im lokalen Graphen darstellen.
5.2 Erklärbarkeit (Explainability) – WP04b
Der Retriever ist keine Blackbox mehr. Er liefert auf Wunsch (explain=True) eine strukturierte Begründung (Explanation-Objekt).
Die "Warum"-Logik:
- Semantik: Prüfung der Cosine-Similarity ("Sehr hohe textuelle Übereinstimmung").
- Typ: Prüfung des
retriever_weight("Bevorzugt, da Entscheidung"). - Graph (Kontext):
- Hub (Outgoing): Worauf verweist dieser Treffer? ("Verweist auf Qdrant").
- Authority (Incoming): Wer verweist auf diesen Treffer? ("Wird referenziert von Projekt Alpha").
Die API gibt diese Analysen als menschenlesbare Sätze (reasons) und als Datenstruktur (score_breakdown) zurück.
6) Der RAG-Chat & Persönlichkeit (WP05)
Seit WP-05 kann Mindnet nicht nur suchen, sondern als KI-Zwilling antworten.
6.1 Context Intelligence (Der "Enriched Context")
Kleine Sprachmodelle (SLMs wie Phi-3) scheitern oft an komplexen Zusammenhängen. Mindnet löst dies durch explizite Metadaten-Injection in den Prompt. Dem LLM wird nicht nur der Text eines Chunks gezeigt, sondern auch sein Typ und Score:
- "Hier ist eine Notiz vom Typ
[DECISION]. Sie erklärt, warum wir etwas tun." - "Hier ist eine Notiz vom Typ
[PROJECT]. Sie erklärt, was wir tun."
Dadurch kann das System Fragen wie "Warum nutzen wir X?" korrekt beantworten, indem es die Begründung aus der Decision-Notiz zieht, selbst wenn die Frage auf das Projekt abzielte.
6.2 Persönlichkeit (Late Binding)
Die "Persönlichkeit" von Mindnet (Stil, Werte, Tonfall) ist nicht im Python-Code verankert, sondern in config/prompts.yaml.
- System Prompt: Definiert die Rolle ("Ich bin dein digitales Gedächtnis...").
- Werte: Pragmatismus, Transparenz (kein Halluzinieren), Vernetztes Denken.
- Flexibilität: Die Persönlichkeit kann jederzeit angepasst werden (z.B. "Sei kritischer"), ohne das System neu zu starten.
7) Feedback & Lernen – WP04c
Das System verfügt nun über ein Kurzzeitgedächtnis für Interaktionen, das die Basis für zukünftiges Lernen bildet.
7.1 Der Feedback-Loop
-
Suche (Situation): Wenn ein Nutzer eine Anfrage stellt, loggt Mindnet die "Situation":
- Den Query-Text.
- Die Top-K Ergebnisse.
- Den exakten
score_breakdownzu diesem Zeitpunkt. - Eine eindeutige
query_idwird generiert.
-
Bewertung (Label): Der Nutzer (oder ein Agent) bewertet einen spezifischen Treffer (
node_id) positiv oder negativ (Score 1-5). Dieses Feedback wird unter Referenzierung derquery_idgespeichert. -
Lernen (Perspektive WP08): Durch die Verknüpfung von Situation und Bewertung entstehen Trainingsdaten. Mindnet kann später analysieren: "Nutzer bevorzugen Treffer mit hohem Edge-Bonus, auch wenn der Text weniger passt." -> Konsequenz:
edge_weighterhöhen.
8) Confidence & Provenance – wozu?
Der Retriever kann Edges gewichten:
- provenance: explicit > rule
- confidence: numerische Feinsteuerung
- retriever_weight (Note/Chunk): skaliert die Relevanz des gesamten Knotens
Eine typische Gewichtung (konfigurierbar in retriever.yaml) ist:
explicit: 1.0, rule: 0.8. Damit bevorzugt der Graph kuratiertes Wissen (explizit notierte Links) vor „erweiterten“ Default-Ableitungen.
9) Semantik ausgewählter kind-Werte
references– „Nutzt/erwähnt“; neutral, aber stützend für Kontext.related_to– Ähnlichkeit/Verwandtschaft (symmetrisch interpretierbar).similar_to– noch engere Ähnlichkeit; oft aus Inline-Rel (bewusst gesetzt).depends_on– fachliche Abhängigkeit (z. B. „Projekt X hängt von Y ab“).belongs_to,next,prev– Struktur.
Symmetrische Relationen (z. B.
related_to,similar_to) können explizit nur einseitig notiert sein, aber im Retriever beidseitig interpretiert werden.
10) Frontmatter-Eigenschaften – Rolle & Empfehlung
Frontmatter-Eigenschaften (Properties) bleiben minimiert:
- type – steuert Typ-Defaults via Registry (Pflicht für differenziertes Verhalten).
- tags – für klassische Filterung.
- retriever_weight / chunk_profile – Sollten nicht manuell gesetzt werden (Best Practice:
types.yamlnutzen). - links – Veraltet. Bitte Links primär über Text (Wikilink/Inline/Callout) pflegen.
11) Lösch-/Update-Garantien (Idempotenz)
- Jede Note hat einen stabilen note_id (Frontmatter/Hash).
- Vor einem Upsert können alte Chunks/Edges einer Note gefiltert gelöscht werden (
note_id-Filter) – das hält Collections sauber bei Re-Imports. - Die Import-Skripte unterstützen Modi wie
--purge-before-upsertund--sync-deletes, um den Graph sauber zu halten.
12) Beispiel – Von Markdown zu Kanten (v2.2)
Markdown (Auszug) # Relations Showcase … Wir nutzen rel:depends_on Qdrant Vektordatenbank für die Suche. … Siehe auch: Embeddings 101
> [!edge] related_to: [[Vector DB Basics]]
Ergebnis (fachlich)
depends_on(Chunk→Qdrant)mitrule_id=inline:rel,confidence≈0.95.references(Chunk→Embeddings 101)mitrule_id=explicit:wikilink,confidence=1.0.related_to(Chunk→Vector DB Basics)via Callout;rule_id=callout:edge,confidence≈0.90.- Typ-Defaults: Falls die Note vom Typ
projectist, entstehen zusätzlichdepends_on-Kanten zu den Zielen aus (2) und (3).
13) Referenzen (Projektdateien & Leitlinien)
- Import-Pipeline & Registry-Auflösung:
scripts/import_markdown.py. - Kantenbildung (V2-Logic):
app/core/derive_edges.py. - Typ-Registry:
config/types.yaml&TYPE_REGISTRY_MANUAL.md. - Retriever-Scoring & Explanation:
app/core/retriever.py. - Persönlichkeit & Chat:
config/prompts.yaml&app/routers/chat.py. - Logging Service:
app/services/feedback_service.py.
14) Workpackage Status (v2.2.1)
Aktueller Implementierungsstand der Module.
| WP | Titel | Status | Anmerkung |
|---|---|---|---|
| WP01 | Knowledge Design | 🟢 Live | Typen, Frontmatter definiert. |
| WP02 | Chunking Strategy | 🟢 Live | Profilbasiertes Chunking aktiv. |
| WP03 | Edge Logic / Import | 🟢 Live | Neue Importer-Pipeline mit Provenance. |
| WP04a | Retriever Scoring | 🟢 Live | Hybrider Score (Semantik + Graph). |
| WP04b | Explanation Layer | 🟢 Live | API liefert Reasons & Breakdown. |
| WP04c | Feedback Loop | 🟢 Live | Logging (JSONL) & Traceability aktiv. |
| WP05 | Persönlichkeit / Chat | 🟢 Live | RAG-Integration mit Context Enrichment. |
| WP06 | Decision Engine | 🟡 Geplant | Nächster Schritt. |
| WP08 | Self-Tuning | 🔴 Geplant | Auto-Adjustment der Gewichte. |