Claude + Obsidian: xây knowledge graph kỹ thuật tự tiến hóa theo từng dự án
Kết hợp Claude với Obsidian qua MCP tạo ra một knowledge base kỹ thuật không chỉ lưu trữ mà còn tự cập nhật, tự liên kết, và tự tiến hóa theo từng quyết định thiết kế bạn đưa ra. Bài này đi sâu vào 4 pattern triển khai thực tế — từ setup MCP đến kiến trúc layered memory — cùng bài học từ team BKGlobal sau vài tháng áp dụng. ---
Vấn đề: mỗi sáng mở Claude là mất trắng context
Kịch bản quen thuộc: hôm qua bạn và Claude vừa cùng nhau thiết kế xong một flow xử lý event cho hệ thống đặt hàng — có ADR (Architecture Decision Record), có trade-off rõ ràng, có lý do chọn Kafka thay vì RabbitMQ. Sáng nay mở Claude lên, hỏi câu tiếp theo trong cùng context đó — Claude không biết gì. Bạn phải paste lại toàn bộ, giải thích lại từ đầu.
Đây không phải lỗi của Claude. Context window của LLM có hạn, và không có persistent memory qua session. Vấn đề nằm ở chỗ kiến thức kỹ thuật của bạn không có nơi sống một cách có cấu trúc để AI có thể đọc và tiếp tục từ đó.
Ở BKGlobal, chúng tôi đặt câu hỏi: nếu Obsidian đã là nơi lưu notes kỹ thuật, tại sao không biến nó thành bộ nhớ dài hạn cho Claude? Kết quả sau vài tháng thử nghiệm — một hệ thống mà chúng tôi gọi là AI-powered knowledge graph tự tiến hóa.
Kiến trúc tổng quan
Trước khi đi vào từng pattern, cần hiểu các lớp trong kiến trúc này:
┌─────────────────────────────────────────┐
│ Claude (reasoning layer) │
│ Đọc / viết / liên kết / phân tích │
└──────────────────┬──────────────────────┘
│ MCP (Model Context Protocol)
┌──────────────────▼──────────────────────┐
│ Obsidian REST API │
│ Vault access, search, CRUD notes │
└──────────────────┬──────────────────────┘
│
┌──────────────────▼──────────────────────┐
│ Obsidian Vault (storage) │
│ Plain markdown + wikilinks + YAML │
└──────────────────┬──────────────────────┘
│ Git
┌──────────────────▼──────────────────────┐
│ Version history │
│ Theo dõi evolution của knowledge │
└─────────────────────────────────────────┘
4 lớp: reasoning (Claude) → access (MCP) → storage (Obsidian vault) → history (Git). Hiểu rõ phân tầng này sẽ giúp bạn chọn đúng pattern cho use case của mình.
Setup MCP: cầu nối Claude ↔ Obsidian
MCP (Model Context Protocol) là chuẩn Anthropic mở ra để Claude giao tiếp với external tools. Với Obsidian, có 2 plugin MCP phổ biến:
Option 1: obsidian-claude-code-mcp (iansinnott) — phù hợp với Claude Code CLI
Plugin dùng dual-transport:
- WebSocket cho Claude Code CLI (auto-discovery qua
/ide) - HTTP/SSE cho Claude Desktop
Cài plugin trong Obsidian, sau đó cấu hình Claude Desktop:
{
"mcpServers": {
"obsidian": {
"command": "npx",
"args": ["mcp-remote", "http://localhost:22360/sse"]
}
}
}
Option 2: obsidian-mcp-tools (jacksteamdev) — nếu cần semantic search
Plugin này tích hợp thêm lớp embedding — Claude không chỉ truy cập file theo path mà còn search theo nghĩa. Ví dụ: "tìm tất cả notes liên quan đến quyết định về database sharding" sẽ cho kết quả ngữ nghĩa, không chỉ keyword match.
Prerequisite: Cài Local REST API plugin trong Obsidian trước — đây là dependency của cả hai option trên. Plugin này expose vault qua HTTP endpoint (mặc định port 27123).
4 pattern knowledge graph thực tế
Pattern 1 — Status file làm graph root
Đơn giản nhất, hiệu quả ngay lập tức. Mỗi project có một file status.md làm single source of truth:
---
project: payment-gateway-v2
last_updated: 2026-04-08
status: in-progress
---
## Phase hiện tại
Phase 3: Implement webhook verification
## Quyết định quan trọng gần đây
- 2026-04-07: Chọn HMAC-SHA256 thay vì RSA — lý do: latency thấp hơn 3x, đủ security cho use case
- 2026-04-06: Bỏ qua idempotency key trên Redis, dùng DB-level unique constraint — đơn giản hơn, ít dependency hơn
## Tasks đang block
- [ ] Test với Stripe test mode — chờ API key từ client
## Context cho Claude
Đây là hệ thống payment gateway tích hợp với 3 payment providers: VNPay, MoMo, Stripe.
Tech stack: .NET 8, PostgreSQL, Azure Service Bus.
Mỗi buổi sáng, thay vì paste lại context, bạn chỉ cần bảo Claude: "Đọc Projects/PaymentGateway/status.md và tiếp tục." Claude có đủ context để làm việc mà không cần giải thích lại.
Lesson từ BKGlobal: Chúng tôi thêm một field open_questions vào status file — những câu hỏi chưa giải quyết. Claude sẽ proactively reference back khi gặp thông tin mới liên quan.
Pattern 2 — Karpathy's wiki: AI tự biên soạn knowledge base
Andrej Karpathy mô tả một architecture thú vị: thay vì RAG (retrieve rồi generate), AI đóng vai "thủ thư nghiên cứu" — chủ động compile, lint, và interlink markdown files thành một wiki nhất quán.
Điểm đặc biệt: 71.5x token reduction so với dump toàn bộ raw files vào context mỗi session. Wiki được maintained bởi AI nên luôn compact và well-structured.
Implement với repo claude-obsidian (AgriciDaniel), có 3 lệnh chính:
/wiki - Claude đọc vault, tạo/cập nhật wiki summary
/save - Lưu session insights vào vault
/autoresearch - Claude tự research topic và thêm vào vault
Workflow thực tế trong team BKGlobal:
- Sau mỗi sprint planning, chạy
/wiki— Claude tự cập nhật project overview - Khi research một library mới, chạy
/autoresearch— Claude đọc docs, viết note kỹ thuật theo format của vault - Cuối ngày,
/save— insights từ session được persist
Pattern 3 — Layered memory architecture
Pattern phức tạp nhất, nhưng mạnh nhất cho long-running projects. Vault được tổ chức theo 3 lớp memory:
vault/
├── _agent/
│ ├── memory/
│ │ ├── working/ # Context 48 giờ — active tasks, decisions
│ │ ├── episodic/ # Lịch sử theo timestamp — "ngày 3/4 team quyết định..."
│ │ └── semantic/ # Facts đã distill — "hệ thống X dùng CQRS vì..."
│ ├── skills/ # Capabilities: "how to write ADR", "code review checklist"
│ └── heartbeat/ # Cron daily reflection
├── notes/
├── projects/
└── inbox/
Heartbeat là cơ chế làm cho graph "tự tiến hóa": một script chạy hàng ngày (hoặc Claude chạy thủ công) làm 3 việc:
- Archive
working/→episodic/(notes cũ hơn 48 giờ) - Extract patterns từ
episodic/→semantic/(insights tái xuất hiện trở thành facts) - Prune records cũ hơn 90 ngày khỏi
episodic/
Ví dụ: nếu trong 2 tuần liên tiếp Claude ghi nhận "team hay chọn Dapper thay EF Core cho read model", heartbeat sẽ promote observation này thành semantic fact: preferred_orm_for_queries: Dapper.
Pattern 4 — Semantic graph với vector embeddings
Pattern này dùng Smart Connections plugin hoặc obsidian-graph (drewburchfield, dùng pgvector + PostgreSQL) để tạo embedding cho từng note. Claude không chỉ traverse wikilinks — mà còn query theo nghĩa.
Use case điển hình: "Tìm tất cả quyết định thiết kế liên quan đến performance" sẽ tìm được cả note về database indexing strategy, caching layer, và CDN configuration — dù ba note này không có wikilink với nhau.
Trong một dự án e-commerce của BKGlobal, chúng tôi dùng pattern này để tìm precedent: trước khi quyết định về một vấn đề kỹ thuật mới, hỏi Claude "tìm các quyết định tương tự trong vault" — thường xuyên recover được reasoning từ 6 tháng trước mà không ai còn nhớ.
CLAUDE.md: bộ não hướng dẫn của vault
Dù dùng pattern nào, một file CLAUDE.md ở root của vault là bắt buộc. File này không phải documentation — đây là instruction set cho Claude về cách làm việc với vault của bạn:
# Vault brain — CLAUDE.md
## Cấu trúc vault
- `Projects/` — một folder per project, mỗi project có status.md
- `ADR/` — Architecture Decision Records, format: ADR-NNNN-title.md
- `Tech/` — notes kỹ thuật về libraries, tools, patterns
- `People/` — notes về teammates, stakeholders
- `inbox/` — dump nhanh, chưa organize
## Naming convention
- Notes: kebab-case, tiếng Anh
- ADR: `ADR-0001-chon-kafka-cho-event-streaming.md`
- Wikilink đến tech notes: `[[kafka]]`, `[[dapper]]`
## Active projects
- `[[Projects/PaymentGateway/status]]` — priority cao, đang phase 3
- `[[Projects/StaffPortal/status]]` — maintenance mode
## Khi Claude viết note mới
1. Thêm YAML frontmatter với date, tags, project
2. Liên kết tới notes liên quan bằng wikilinks
3. Nếu là quyết định kiến trúc → tạo ADR riêng
## Tech stack chung của BKGlobal projects
Backend: .NET 8, C#, Dapper/EF Core
Database: PostgreSQL, SQL Server
Cloud: Azure (App Service, Service Bus, Blob Storage)
Mức độ chi tiết của CLAUDE.md tỉ lệ thuận với chất lượng output của Claude. Chúng tôi duy trì file này như một living document — mỗi khi team quyết định convention mới, CLAUDE.md được cập nhật ngay.
Best practices từ kinh nghiệm thực tế
Atomic notes — một ý tưởng một file. Đừng viết "Toàn bộ kiến trúc hệ thống X" vào một note 500 dòng. Tách thành: event-sourcing-pattern.md, kafka-vs-rabbitmq-comparison.md, cqrs-read-model-design.md. Claude navigate tốt hơn, wikilinks có nghĩa hơn.
YAML frontmatter trên mọi note kỹ thuật:
---
date: 2026-04-09
tags: [architecture, backend, event-driven]
project: payment-gateway-v2
status: active
related: [[kafka]], [[event-sourcing]]
---
Frontmatter cho phép Claude filter và query: "Tìm tất cả notes liên quan đến project payment-gateway-v2 với tag architecture."
Git track vault. Mỗi lần Claude viết note mới, commit luôn. History của vault là history của knowledge evolution — cực kỳ có giá trị khi cần trace back "tại sao chúng tôi quyết định X hồi tháng 3."
Plain text, vendor-neutral. Obsidian markdown là format Claude xử lý natively. Không lock-in vào proprietary format — nếu mai mốt chuyển sang Gemini hay GPT-5, vault vẫn readable hoàn toàn.
Kết
Claude không phải search engine và Obsidian không phải database. Nhưng kết hợp đúng cách, hai công cụ này tạo ra thứ mà chúng tôi không có tên chính xác: một AI partner biết context của bạn, tự cập nhật theo thời gian, và ngày càng hữu ích hơn chứ không reset về zero mỗi session.
Pattern nào phù hợp với bạn phụ thuộc vào scale của use case:
- Bắt đầu ngay: Pattern 1 (status file) — setup 30 phút, thấy giá trị ngay hôm đó
- Medium-term: Pattern 2 (wiki) — phù hợp khi vault có >200 notes
- Long-term project: Pattern 3 (layered memory) — đầu tư setup nhưng mạnh nhất
- Research-heavy: Pattern 4 (semantic graph) — cần cài thêm pgvector hoặc Smart Connections
Chúng tôi đang dùng kết hợp Pattern 1 + Pattern 3 cho các dự án production tại BKGlobal. Nếu bạn đã có Obsidian vault, thử Pattern 1 ngay hôm nay — chỉ cần tạo status.md cho một project đang làm.
Bài tiếp theo trong series này: xây RAG pipeline đọc vault Obsidian — khi vault của bạn đủ lớn, semantic search qua vector embeddings sẽ mạnh hơn wikilink traversal rất nhiều. Xem bài RAG pipeline từ A đến Z để hiểu nền tảng trước khi layer thêm AI lên vault.
Son Do — BKGlobal Tech Team
#BKGlobal #AI #architecture #obsidian #knowledgemanagement #1percentbetter