🧠 I built a fully local Graph RAG CLI for Obsidian vaults using LlamaIndex + Ollama #21554
benmaster82
started this conversation in
Show and tell
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
Hey LlamaIndex community 👋
I wanted to share a project I've been working on that's built almost entirely on top of LlamaIndex's graph capabilities - a local-first, privacy-respecting knowledge graph you can query in natural language from your terminal.
What is it?
Kwipu is a Graph RAG system that turns your Markdown notes - especially Obsidian vaults - into a queryable knowledge graph, with zero cloud dependency.
🔗 GitHub: https://github.com/benmaster82/Kwipu
How LlamaIndex powers it
The core of the project relies heavily on:
PropertyGraphIndex- to build and persist the knowledge graph from extracted triplesSimpleLLMPathExtractor- for entity-relation extraction from free text via OllamaImplicitPathExtractor- for implicit relationships between nodesLLMSynonymRetriever+VectorContextRetriever- combined for hybrid retrievalOn top of that I added two custom retrievers:
The hybrid retrieval strategy
The system fuses 4 retrieval signals at query time:
Results are merged and passed to a tightly constrained generation prompt that enforces source citation - no hallucinations about content not in the graph.
Obsidian-native pre-processing
Before the LLM extractors even run, a custom pre-processor parses:
[[wikilinks]]→ structural triplesThis means even small/cheap models produce a rich graph because a lot of the structure is already explicit in the notes.
Stack
Questions / things I'd love feedback on
Incremental updates - right now file modifications trigger a full rebuild. I'm using
insert_documentfor new files, but modifying an existing node cleanly is trickier. Has anyone found a good pattern for partial graph invalidation withPropertyGraphIndex?Retriever fusion - I'm doing a naive merge of the 4 retrievers. Is there a built-in re-ranking or score normalization utility in LlamaIndex I should be using instead?
Graph persistence - I'm persisting with
StorageContext.from_defaults(persist_dir=...). Any gotchas with large graphs (500+ notes)?Would love to hear thoughts from anyone who's built something similar or has experience with LlamaIndex's graph layer at scale.
Thanks for building such a solid framework 🙏
Built with: LlamaIndex · Ollama · Python · Obsidian
Beta Was this translation helpful? Give feedback.
All reactions