diff --git a/app/core/graph_adapter.py b/app/core/graph_adapter.py index d324b96..599c48b 100644 --- a/app/core/graph_adapter.py +++ b/app/core/graph_adapter.py @@ -14,7 +14,8 @@ Kompatibilität: (tests/test_retriever_edges.py patcht expand()). 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 @@ -38,13 +39,24 @@ except Exception: # pragma: no cover # Basisgewichte je Edge-Typ. # Diese Werte werden mit der in der Edge-Payload hinterlegten "confidence" # 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] = { - "references": 0.20, - "belongs_to": 0.10, - "next": 0.06, - "prev": 0.06, - "backlink": 0.04, - "references_at": 0.08, + # Struktur / Navigationskanten + "belongs_to": 0.10, + "next": 0.06, + "prev": 0.06, + "backlink": 0.04, + "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 } @@ -173,9 +185,18 @@ class Subgraph: """ 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: """ - 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 """ import math @@ -197,9 +218,9 @@ def expand( Expandiert ab Seeds entlang von Edges (bis `depth`), optional gefiltert nach Edge-Typen. - Seeds sind stabile payload-IDs (z. B. note_id, chunk_id). Es werden Edges - berücksichtigt, bei denen source_id ODER target_id ODER note_id einem der - Seeds entspricht. + Seeds sind stabile payload-IDs (in unserem Fall vor allem note_id). + Es werden Edges berücksichtigt, bei denen source_id ODER target_id ODER + note_id einem der Seeds entspricht. """ sg = Subgraph() frontier = set(seeds)