Two-tier graph extraction#
A pattern#
Knowledge-graph építéskor (Memgraph / Neo4j / Cypher-store-ba) NE indulj direkt LLM-extraction-nel. Helyette:
Tier 1 (deterministic baseline) — Zero-LLM, regex/parser-based: - Wikilink-importer: \[\[([^\]|]+?)(\|[^\]]+)?\]\] regex → (:SourceFile)-[:MENTIONS]->(:WikiLink) edges - Frontmatter-importer: tags:/linked-to:/depends-on: YAML mezők → typed edges - Filesystem-importer: directory-structure → (:SourceFile)-[:LOCATED_IN]->(:Folder) edges - Cost: $0, latency: O(seconds), idempotens
Tier 2 (LLM-enrichment) — Subagent-fanout-pattern-rel: - Implicit relations a markdown-szöveg-ből (entity-pair → typed-relation) - Cost: $0 (subscription) ha claude-code subagent-fanout, idő O(perc) - Confidence-tagged: minden LLM-edge confidence: 0.0-1.0 mezővel
Eval: A Tier-1 a Tier-2 ground-truth-ja — ha a Tier-2 NEM tartalmazza a Tier-1-ben szereplő edge-eket, akkor extraction-recall < 100%.
Élő példa (2026-05-17-obsidian-vault-2)#
A vault 08-Sessions/, 02-Projects/, 07-Decisions/, 11-wiki/ mappáit Memgraph-ba ingest-elve:
- Tier 1 (Wikilink-importer): 556 :SourceFile + 562 :WikiLink + 1954 :MENTIONS edges zero-cost-tal, ~22s scan
- Tier 2 (LLM-extracted, Week 1-α): 8975 :Entity + 12160 :Literal + 13812 typed-relations subagent-fanout-pattern-rel
- Overlap: ~30% (a sokak közös subject-eken mind a baseline mind az LLM-pass találja). A 70% LLM-only relations = implicit relation-ok (pl. "X uses Y" without explicit wikilink)
Top hubok a deterministic baseline-ben: 1. 05-Memory/Infrastructure (67 inbound) — szervezeti tudás-központ 2. 02-Projects/Index (38 inbound) — projekt-katalógus 3. 11-wiki/Crystallization-protocol (38 inbound) — protokoll-hivatkozás-magnet
A kétréteg ROI-ja#
- Tier 1 alone (no LLM): O(s) build, O(s) update; kevés implicit relation, magas precision, alacsony recall
- Tier 2 alone (LLM-only): O(óra) build, magasabb recall, de NO ground-truth → schema-drift risk
- Both tiers: Tier 1 mint regression-test, Tier 2 enrichment → optimum
Mikor érdemes alkalmazni#
- ✅ Bármilyen markdown-knowledge-base graph-szerű query-vel (Obsidian-vault, doc-portál, wiki)
- ✅ Bármilyen graph-extraction-pipeline, ahol az LLM-eredmény ellenőrizhetőség fontos
- ✅ Schema-versioning kontextusban — a Tier-1 stabil, Tier-2 LLM-prompt-evolúcióval változhat
2026-05-18 — graphify-tool mint Tier-2 deterministic referencia VERIFIED#
A korábban hipotetikus Tier-1 (regex/wikilink) + Tier-2 (LLM-extract) sémát most gyakorlatban verifikáltuk egy konkrét external-tool-lal: safishamsi/graphify (uv tool install graphifyy 0.8.11).
A graphify egy pure-deterministic tree-sitter AST + Leiden clustering pipeline ($0 cost, NEM-LLM), ami a vault-on: - 5,846 node / 5,479 edge / 437 community (content-filtered: 02-Projects + 07-Decisions + 11-wiki + 06-Audits + 08-Sessions + 05-Memory + 00-Meta) - graph.html 4.8 MB (force-directed interactive viz) - GRAPH_REPORT.md 160 KB ("Surprising connections" + community-list + god-nodes)
A meglevő Memgraph entity-graph (LLM-based vault-graph-extract, 8,997 entity / 28.9% typed) és a graphify-output két különböző csomóponti-modellt ad: - Memgraph: szemantikai entitások (Concept, Decision, Sprint, Project, Skill, Person, ...) - Graphify: szintaktikai node-ok (function-call, import, file-reference, AST-leaf)
Cross-validation use-case: ha egy entity csak az LLM-graph-ban van DE a deterministic-graph-ban NINCS → hallucinációs gyanú; fordítva: ha csak a tree-sitter-ben → LLM nem ismerte fel a koncepciót.
Az eredeti two-tier-pattern most már elérhető-egészen: - Tier-1A (regex-wikilink) — vault-graph-mentions-extract ÉLES (1954 :MENTIONS edge) - Tier-1B (tree-sitter AST) — graphify ÉLES (5,846 deterministic node) - Tier-2 (LLM-extract) — vault-graph-extract + vault-graph-retype (8,997 typed entity)
2026-05-19 — Jaccard 0.0070 finding (LLM-noise signal)#
A vault-graph-diff CLI (mega-session Round 8) lefuttatta a two-tier cross-validation-t. Eredmény:
| Layer | Count | Both | Layer-only |
|---|---|---|---|
| Tier-1 (Memgraph LLM) | 12,778 entity | 119 | 12,512 |
| Tier-2 (graphify deterministic) | 4,439 node | 119 | 4,320 |
| Jaccard agreement | — | 0.0070 | — |
A 0.7% agreement-rate alacsony de értelmezhető: a Tier-1 LLM-extraction sok zajt fog (quoted strings mint !busy && !mutedForTTS guard, hex-color értékek #06b6d4-cyan, code-snippet fragmentumokat) "entitásként", a Tier-2 graphify pedig structural code-symbol-okat fog amiket az LLM helyesen nem promóvál entity-szintre.
A használat: a diff-output két szegmense actionable:
- Tier-1 only (
vault-graph-diff --tier-1-only) — heurisztika-classifiername-like/fragment/short-tokencímkékkel → potential LLM-hallucination cleanup-list - Tier-2 only (
vault-graph-diff --tier-2-only) —concept-like/file-ref/snake_case-ident→ potential coverage gap az LLM-extraction-ben
Wider lesson: ahol két ortogonális extraction-stack működik párhuzamosan, a diff maga = signal a NOISE-ról. Ez reusable pattern bármely "LLM + deterministic" hybrid stack-en, NEM csak graph-extraction-ra. Ld. stale-numbers-in-static-artifacts-pattern.en hasonló cross-source-corroboration anti-rot disciplinát.
2026-05-19 PM — Cleanup did NOT lift Jaccard, structural vocab-merge required#
Tier-A + Tier-C noise-DELETE (12,778 → 8,913 entity, -30.2%) + extraction-prompt tightening (vocab v3, 7 anti-noise rule) — empirikus eredmény:
| Phase | Memgraph entities | graphify entities | Jaccard |
|---|---|---|---|
| Pre-cleanup | 12,778 | 4,439 | 0.0070 |
| Post-cleanup | 8,913 | 4,439 | 0.0078 |
Δ Jaccard = +0.0008. A Phase-4 acceptance gate (≥0.05) NEM teljesül.
Mechanism: a két extraction-stack (LLM Tier-1 narrative vs tree-sitter Tier-2 code-symbol) ortogonális vocabulary-t termel. A noise-DELETE csak a denominator-t (Tier-1 ∪ Tier-2 méretét) csökkenti, a numerator-t (Tier-1 ∩ Tier-2 méretét) nem növeli. A maradék 8,913 narrative-concept és 4,439 code-symbol között strukturálisan kevés az átfedés.
Wider lesson: cross-validation Jaccard két ortogonális-vocab stack között soha nem ér el >0.5-ös értéket pure-DELETE-tel; structural vocab-merge KÖTELEZŐ. Két opció:
- Option A (selective re-extract) — tightened prompt → új extraction → LLM-output átsoroldódik code-symbol szintre is. ETA ~3-4h.
- Option B (tree-sitter pre-pass) — vault-ko-ingest hibrid-pass: tree-sitter tokenize → symbol-extract (LLM-output ∪ tree-sitter-output). Direct vocabulary-overlap-növelés. ETA 1 nap design + 2-3h impl.
Recommended sequence: Option-A először (gyorsabb ROI), aztán Option-B ha Phase-4 gate még mindig nem teljesül. ETA acceptance: ~2026-06-02.
Részletek: ../06-Audits/2026-05-19 Memgraph cleanup execution result + ../06-Audits/2026-05-19 Memgraph cleanup Phase-3 next-step plan + llm-graph-noise-cleanup-composite-filter (filter-pattern wiki).
2026-05-20 — Option-B tree-sitter pre-pass design (SUPERSEDED, empirically refuted)#
A Phase-3 result (post---reset Memgraph: 9,517 Tier-1 vs 4,439 Tier-2, Jaccard 0.0071) megerősítette a 2026-05-19 PM finding-et: pure prompt-tightening NEM emeli a Jaccard-ot, mert a két extraction-stack ortogonális-vocabulary-t termel. A Tier-1 LLM-anti-noise rule #3 (code-keyword ban) és #6 (fenced-code-block exclusion) szándékosan kihagyja a code-symbol-okat — pontosan azokat, amiket a Tier-2 tree-sitter felfog. A két "fél" együtt fedi le a corpus-t, de a metszetük természetesen kicsi.
Az Option-B (tree-sitter pre-pass) azt javasolta, hogy egy determinisztikus pre-pass parse-olja a markdown fenced-code-blokkokat (regex-fallback Python/JS/Bash/SQL-re), és 8 új typed-predikátum (defines_function, defines_class, defines_method, defines_constant, imports, exports, calls_function, declares_variable) alá emit triple-eket — a feltételezés szerint byte-identikus szimbólumneveket kapva mint a graphify Tier-2, közvetlen Jaccard-intersection-növekedéssel.
🔴 2026-05-20 PM empirikus cáfolat (treesitter-prepass-sandbox branch-en): a graphify-out/graph.json inspekciója megmutatta, hogy graphify 0 Python source-fájlt parse-olt (367 md + 2 json + 1 sh az input, .vault-ko/scripts/*.py excluded). graphify labels markdown-section-paths (e.g. 11_wiki_foxxi_design_system_page_level, Cél, Findings), NEM code-symbol-ok mint def extract_facts. A 156 prepass-extraktált Python-symbol (os, Path, extract_facts, …) 0 graphify-overlap-tal rendelkezne — Jaccard mozogna 0.0069 → 0.0068 (regresszió a union-növekedés miatt, intersection-növekedés nélkül).
A két tier-vocabulary disjoint source-okból van, nem csak különböző distribution ugyanazon tér felett: LLM Tier-1 = magyar/angol semantic concepts prózában (non-deterministic agent behavior, Hostinger MCP SSH key discovery), graphify Tier-2 = markdown-strukturális path-ok (02_projects_kgc_erp). Code-symbol prepass semmilyen méretben nem hídalja át.
Részletek: ../06-Audits/2026-05-20 Option-B premise empirical refutation — graphify vocabulary is markdown not code. Tanulság: inspect actual output, not advertised tooling. Az ADR a graphify-package metadata-jából (tree-sitter-multi-language support) következtetett, NEM a tényleges graph.json-ból. A vendor-feature-verify-before-workaround mintát itt sajátmagunkra is alkalmazni kellett volna (vendor-feature-verify-before-workaround). Az integration code (env-gate, vocab v4, extract_facts_treesitter) érvényes és a treesitter-prepass-sandbox branchen marad mint KO-DB-only capability (defines_* query-k független érték).
2026-05-20 — Jaccard ≥0.05 acceptance gate is misformed#
Az orthogonalitás-finding implikálja: a ≥0.05 Jaccard-target rosszul-választott proxy "egyetértésre". Két extractor, ami különböző parsing-rétegekre épül (LLM-narrative-concepts vs markdown-structural-paths), alacsony Jaccard-ot KELL hogy adjon — high Jaccard gyanús lenne. A helyes Path-Z (lásd az audit-ot) komplementaritás-metrika-cserére javasol váltani:
- File-coverage agreement: % a vault-fájlok közül ami BOTH ≥1 tier-1 ÉS ≥1 tier-2 entitást ad ("agreement on what's important" softer mérce)
- Co-occurrence density: ha egy tier-1 entity létezik X.md-ben, milyen gyakran létezik tier-2 path-node ugyanannak X.md-nek?
- Cross-reference: tier-1
LangGraphentitásnak van-e párja a tier-211_wiki_langgraph_*path-node-ban? Ez a HOW OFTEN, NEM a labels-match.
Path-Z a honest answer: a két-rétegű orthogonalitás feature, nem defect. Sprint-2-ben új ADR-ben deklarálva.
2026-05-21 — Sprint-3 cleanup: FCA 1.0 + CD target revision#
Két finomítás landolt a Path-Z ADR Sprint-2-baseline-jén túl:
(a) Corpus normalization — FCA 0.93 → 1.0#
A 171/171 Tier-1 backfill után FCA = 0.9297-ben stabilizálódott a 26 tier2-only fájlon: 23 markdown a 00-Meta/ + 05-Memory/ alól (vault-meta dirs amit a KO-DB ingest by-design SKIP-pel) + 2 JSON + 1 shell. Ezek a fájlok nem tartoznak a Tier-1 ingestible corpus-hoz, így a complementarity-metrikának corpus-normalize-olnia kell ŐKET — vagyis a Tier-2 oldalról is ki kell szűrnünk őket, hogy ugyanazon a fájl-halmazon mérjünk.
vault-graph-complementarity patch (2026-05-21):
- új
--exclude-dir <DIR>repeatable flag, default00-Meta,05-Memory - új
--include-suffix <SFX>repeatable flag, default.md - mindkettő uniform-ként alkalmazva BOTH Tier-1 és Tier-2 oldalon — corpus-symmetry biztosított
--no-corpus-normalizeopt-out flag a legacy/baseline 0.9297 mérés reprodukálására
Post-normalize eredmény: FCA 1.0, XR_T1 1.0, XR_T2 1.0. Mindhárom file-szintű metrika tisztán átment a ≥0.95 / ≥0.80 targeteket.
A wider lesson: amikor két extractor disjoint corpus-policy-vel fut (Tier-1 markdown-only + vault-meta-skip, Tier-2 anything-walkable), a "fair complementarity" méréshez a lazább oldalt kell visszametszeni a szigorúbb oldal corpus-definíciójára. Hardcoded filterek a measurement-szkriptben rosszak (rejtett config-drift); explicit CLI flags + dokumentált default kombináció jó.
(b) CD target revision ≥0.50 → ≥0.35#
A 171/171 backfill után CD = 0.40-en plateau-zott. A Path-Z ADR ≥0.50 targetje empirikusan elérhetetlennek bizonyult anélkül hogy vagy (i) Tier-2 per-file outputját mesterségesen cap-elnénk (eldobjuk graphify struktúra-density signal-ját), vagy (ii) Tier-1 granularity-jét inflációlnánk (LLM section-path entity-ket bányászna → vocabulary collapse, Tier-1 abstraction elveszik).
Empirikus per-file regimes (post-backfill audit):
| Regime | Példa | Tier-1 | Tier-2 | Density |
|---|---|---|---|---|
| Narrative-heavy | superintelligent-vault-research.md | 129 | 17 | 0.13 |
| Structure-heavy | Eval_Trend.md (audit, tables) | 24 | ~60 | ~0.40 |
| Balanced | hellopack-wordpress-plugin-suite.md | 80 | 76 | 0.95 |
A long-narrative wikis dominálják a corpus-átlagot és lehúzzák CD-t 0.40 köré — by design.
Új CD-band-interpretáció (../07-Decisions/2026-05-20 CD target revision — narrative-structural asymmetry):
| CD range | Reading |
|---|---|
| ≥ 0.50 | Vocabulary collapse — két extractor azonos rétegre konvergál, gyanús |
| 0.35 – 0.50 | Healthy orthogonal complementarity — különböző réteg, mindkettő signal-ad |
| 0.20 – 0.35 | Strong asymmetry — egyik corpus extraction-density bug-os lehet |
| < 0.20 | Measurement bug vagy mis-config |
Current 0.3967 = healthy band. Goodhart-warning: ha "higher is better" target-et adunk egy by-design-bounded metrikára, a hit-rate növelés a metrikát definiáló tulajdonságot rombolja le. CD a metric, ami fines middle-band-ben kell maradjon, NEM 1.0-höz konvergáljon.
Sprint-3 acceptance ✅✅✅✅: FCA 1.0 ≥0.95 / CD 0.40 ≥0.35 / XR_T1 1.0 ≥0.95 / XR_T2 1.0 ≥0.80.
Kapcsolódó#
- sv-06-world-model-knowledge-graph — B-7 research
- memgraph-ce-feature-limits — Memgraph CE workaround-ok
- claude-code-subagent-fanout — Tier-2 LLM-extraction motorja
- vendor-feature-verify-before-workaround — kapcsolódó verifikációs lecke
- external-skill-cherry-pick — a graphify mint cherry-pick eredmény
- stale-numbers-in-static-artifacts-pattern.en — sibling cross-source-verification discipline
- llm-graph-noise-cleanup-composite-filter — Tier-A + Tier-C composite filter pattern
- vault-ko-ingest-prompt-tightening-2026-05-19 — vocab v3 prompt-tightening
- ../07-Decisions/2026-05-20 Option-B tree-sitter pre-pass for Memgraph extraction — Option-B ADR (superseded 2026-05-20 PM)
- ../06-Audits/2026-05-20 Option-B premise empirical refutation — graphify vocabulary is markdown not code — empirikus cáfolat + Path-X/Y/Z pivot
- ../07-Decisions/2026-05-20 CD target revision — narrative-structural asymmetry — Sprint-3 CD revision ADR
- metric-design-pivot-not-algorithm — meta-pattern: misformed metric vs misformed target