app/core/graph_adapter.py aktualisiert
All checks were successful
Deploy mindnet to llm-node / deploy (push) Successful in 4s

This commit is contained in:
Lars 2025-12-04 11:16:03 +01:00
parent 13b7c8858a
commit 1688cf0a1e

View File

@ -14,7 +14,8 @@ Kompatibilität:
(tests/test_retriever_edges.py patcht expand()). (tests/test_retriever_edges.py patcht expand()).
Version: Version:
0.2.0 (2025-11-30 direkte Qdrant-Abfrage, confidence-basiertes Gewicht) 0.3.0 (2025-12-04 note_id-bewusste Expansion, zusätzliche Edge-Typ-Gewichte,
Subgraph.edge_bonus() für Kompatibilität zum Retriever)
""" """
from __future__ import annotations from __future__ import annotations
@ -38,13 +39,24 @@ except Exception: # pragma: no cover
# Basisgewichte je Edge-Typ. # Basisgewichte je Edge-Typ.
# Diese Werte werden mit der in der Edge-Payload hinterlegten "confidence" # Diese Werte werden mit der in der Edge-Payload hinterlegten "confidence"
# multipliziert, falls vorhanden. # multipliziert, falls vorhanden.
#
# Hinweis:
# - Strukturkanten (belongs_to, next/prev) sind schwächer gewichtet.
# - Wissenskanten (depends_on, related_to, similar_to, references) erhalten
# höhere Basisgewichte, damit sie sich im Retriever bemerkbar machen.
EDGE_BASE_WEIGHTS: Dict[str, float] = { EDGE_BASE_WEIGHTS: Dict[str, float] = {
"references": 0.20, # Struktur / Navigationskanten
"belongs_to": 0.10, "belongs_to": 0.10,
"next": 0.06, "next": 0.06,
"prev": 0.06, "prev": 0.06,
"backlink": 0.04, "backlink": 0.04,
"references_at": 0.08, "references_at": 0.08,
# Wissenskanten
"references": 0.20,
"depends_on": 0.18,
"related_to": 0.15,
"similar_to": 0.12,
# weitere Typen erhalten per Default 0.0 und wirken nur über centrality # weitere Typen erhalten per Default 0.0 und wirken nur über centrality
} }
@ -173,9 +185,18 @@ class Subgraph:
""" """
return sum(edge["weight"] for edge in self.adj.get(node_id, [])) return sum(edge["weight"] for edge in self.adj.get(node_id, []))
def edge_bonus(self, node_id: str) -> float:
"""
Kompatibilitäts-Methode für den Retriever.
Der Retriever ruft subgraph.edge_bonus(node_id) auf. Intern verwenden
wir aggregate_edge_bonus(...), um bestehende Tests nicht zu brechen.
"""
return self.aggregate_edge_bonus(node_id)
def centrality_bonus(self, node_id: str) -> float: def centrality_bonus(self, node_id: str) -> float:
""" """
Einfache log-gedämpfte Zentralität auf Basis der In-Degree. Einfache log-gedämpfte Zentralität auf Basis des In-Degree.
Obergrenze: 0.15 Obergrenze: 0.15
""" """
import math import math
@ -197,9 +218,9 @@ def expand(
Expandiert ab Seeds entlang von Edges (bis `depth`), optional gefiltert Expandiert ab Seeds entlang von Edges (bis `depth`), optional gefiltert
nach Edge-Typen. nach Edge-Typen.
Seeds sind stabile payload-IDs (z. B. note_id, chunk_id). Es werden Edges Seeds sind stabile payload-IDs (in unserem Fall vor allem note_id).
berücksichtigt, bei denen source_id ODER target_id ODER note_id einem der Es werden Edges berücksichtigt, bei denen source_id ODER target_id ODER
Seeds entspricht. note_id einem der Seeds entspricht.
""" """
sg = Subgraph() sg = Subgraph()
frontier = set(seeds) frontier = set(seeds)