LLM Wiki + Graphify를 직접 만들다

흩어진 메모에서 살아있는 지식 그래프로

by 송 재희

Visa Inc.에서 수년간 엔지니어링 그룹의 지식 관리자로 일한 적이 있다. 이 기간 동안 회사 차원의 지식 관리뿐만 아니라 개인 차원의 지식 관리의 중요성, 방법론, 그리고 다양한 도구들을 폭넓게 활용했다.


그럼에도 불구하고 지식 관리는 여전히 쉽지 않다. 내 지식은 아직도 Google Drive, 이메일, Microsoft OneNote, Apple Notes, Samsung Notes, Slack 스레드, Medium 글, 브런치 포스트 등에 흩어져 존재한다. 특정 개념을 찾아야 할 때마다 어디부터 찾아야 할지 감이 잡히지 않는다. 같은 정보가 여기저기 복제되고, 어느새 오래된 자료가 되거나 소음 속에 묻혀 사라지곤 한다.


해결책이 필요했다. 그러다 Andrej Karpathy의 LLM Wiki 개념을 만났다. 로컬에서 Obsidian으로 구현해 봤더니, 작동은 훌륭했다. 문제는 하나 — 내 노트북 안에만 갇혀 있다는 것.


가장 쉬운 해법은 월 5달러짜리 Obsidian Sync였다. 그런데 지금은 고정 수입이 안정적이지 않은 상태라, 매달 빠져나가는 구독료는 내가 정당화할 수 있는 종류의 사치가 아니었다.


그래서 웹 버전을 직접 만들기로 했다. 저렴한 리눅스 서버(Hetzner CX23)를 하나 올리고, 텔레그램으로 Hermes 에이전트를 연결한 뒤, AI에게 웹 기반 LLM Wiki를 만들어 달라고 반복해서 지시했다. 작동은 했다 — 데이터를 집어넣고 위키를 읽는 FastAPI + Vanilla JS SPA가 생겼다. 그런데 뭔가 허전했다. 문서들 사이의 시각적 연결이 없었다. 그냥 좀 예쁜 텍스트 데이터베이스였을 뿐.


그러다 Graphify를 알게 됐다. LLM Wiki에 Graphify를 붙이는 순간, 단순히 기능 하나를 추가한 게 아니었다. 흩어진 메모들이 연결된, 시각화된, 살아있는 지식 네트워크로 진화한 것이다.


image.png


LLM Wiki란 무엇인가

LLM Wiki의 핵심은 "파일을 저장한다"에서 "지식을 컴파일한다"로 생각의 축을 바꾸는 데 있다.

기존 메모 앱은 문서를 그저 텍스트가 담긴 양동이 취급한다. LLM Wiki는 문서를 원재료로 본다. 그 원재료를 원자 단위의 개념으로 증류해 내는 게 목적이다. URL이든 PDF든 텍스트 파일이든 이 시스템에 집어넣으면, 엄격한 3계층 구조를 따른다.


image.png


하나의 개념을 찾겠다고 10페이지짜리 PDF를 다시 읽을 필요가 없다. LLM이 이미 그 개념만 뽑아서 독립된 위키 페이지로 만들어 놓았고, 관련된 다른 모든 것과 교차 링크까지 걸어 뒀기 때문이다. Obsidian 호환 vault가 저렴한 웹 서버 위에서 돌아가고, 어느 기기에서든 접근할 수 있다.


한계

LLM Wiki는 텍스트를 종합하는 데는 탁월하다. 하지만 개념들이 서로 어떻게 연결되는지는 오직 LLM의 추측에만 의존한다. 선형적이다. 구조적 확실성도, 시각적 맥락도 부족하다.


Graphify란 무엇인가

Graphify는 오픈소스 파이썬 라이브러리로, 비정형 데이터 — 문서, 코드, 이미지, 오디오 — 를 질의 가능한 지식 그래프로 바꿔준다. 그래프는 노드(개념)와 엣지(관계)로 이뤄진 네트워크다.

LLM Wiki가 AI를 시켜서 "읽고 요약"하는 방식이라면, Graphify는 하이브리드 방식으로 "지도를 그리고 연결"한다.

코드: Tree-sitter AST(추상 구문 트리)가 25개 언어에서 함수, 클래스, import를 추출한다. 완전히 결정론적이다 — LLM 토큰 낭비 없음, 할루시네이션 제로.

문서/이미지/영상: LLM과 로컬 전사(faster-whisper)가 의미 관계를 뽑아낸다.

신뢰도 점수: 관계에 타입이 붙는다 — EXTRACTED(100% 확실), INFERRED(신뢰도 점수 부여), AMBIGUOUS(사람이 검토해야 함).

커뮤니티 탐지: Leiden 알고리즘이 관련 노드들을 자동으로 "지식의 동네"로 묶어준다.

image.png


둘을 합치면 뭐가 달라지는가

핵심 철학은 이것이다 — 위키를 대체하지 말고, 그래프 계층을 덧입혀라. LLM Wiki는 사람이 읽기 좋은 프론트엔드로 남는다. Graphify는 구조적, 분석적 백엔드가 된다.


1. 멀티모달 수집에 힘이 붙는다

예전엔 위키가 URL과 텍스트만 받을 수 있었다. 지금은 GitHub 저장소 URL 하나, UI 스크린샷 세 장, 유튜브 컨퍼런스 영상 한 개를 동시에 웹 포털에 던져 넣을 수 있다.

Graphify는 저장소를 클론해서 AST로 코드 아키텍처를 지도화한다. 유튜브 영상은 faster-whisper로 로컬에서 전사한다. 그리고 이 모든 걸 LLM Wiki에 넘겨서 코드를 이해한 아주 구체적인 위키 페이지들을 생성한다.


2. 신(God) 노드와 뜻밖의 연결

Graphify는 네트워크의 수학적 중심성을 계산해서 **신 노드(God Nodes)**를 찾아낸다. 다른 개념들과 가장 많이 연결되는 개념들 말이다(기준: 평균 차수 + 2 × 표준편차). 또 먼 두 개념이 예상 밖의 경로로 이어져 있는 **뜻밖의 연결(Surprising Connections)**도 잡아낸다.

실제 사례
OAuth2 모듈과 PaymentGateway 모듈이 공유 유틸리티 함수 하나를 통해 긴밀하게 엮여 있다는 걸 Graphify가 발견했다. 아무도 눈치채지 못했던 연결이었다. 이런 고리는 위키의 수동 위키링크에서는 절대 드러나지 않았을 것이다.


3. 그래프 기반 교차 참조

이제 위키 페이지를 열면 맨 아래에 새 섹션이 자동으로 주입된다. LLM의 기억에 기대는 게 아니라 그래프에서 바로 끌어온, 구조적이고 단단한 데이터다.


## 관련 항목 (Graphify 추출)
- [[UserManager Class]] — `EXTRACTED` — imports_from
- [[Auth Best Practices]] — `INFERRED` (0.87) — semantically_similar_to
- 속한 커뮤니티: **인증 클러스터** (Cluster #3)


4. 인터랙티브 그래프 탐색기

웹 UI에 "Graph" 탭이 추가되면서, 전체 지식베이스가 포스 방향 네트워크 맵으로 눈앞에 펼쳐진다.

노드는 커뮤니티별로 색깔이 다르게 칠해진다. 엣지는 신뢰도에 따라 색이 바뀐다(초록 = Extracted, 노랑 = Inferred). 노드를 클릭하면 해당 위키 페이지로 바로 점프한다. "[개념 A]에서 [개념 B]까지의 경로를 보여줘"라고 입력하면, 둘을 잇는 연결 체인이 정확히 시각화된다.


시스템 아키텍처

흩어진 정보 조각이 연결된 지식 노드로 흘러가는 경로는 이렇다.

system-archtect.png

LLM Wiki + Graphify 시스템 아키텍처 — SPA 웹 UI, FastAPI 백엔드(Extractor → Graphify 파이프라인 → LLM 종합), graph.json 지식 그래프, 그리고 raw/, wiki/, graphify-out/ 디렉터리로 구성된 Wiki 마크다운 Vault.


만든 과정: 텔레그램에서 프로덕션까지

Karpathy의 gist를 텔레그램으로 에이전트에게 보냈다. 그리고 말했다. "이거 웹 버전으로 만들어 줘." 에이전트가 되묻기 시작했다. 나는 직감으로 답했다 — 몇 년간 메모 앱을 써 온 경험이지, 그런 앱을 만들어 본 경험은 아니었다.


몇 번의 반복 끝에, 호스팅 서버에서 돌아가는 버전이 생겼다. DNS를 설정해서 wiki.ai-biz.app으로 응답하게 만들었다. 이 부분은 너무 쉬워서 오히려 이상할 정도였다.


처음 시작은 이렇게

# 대충 이런 프롬프트였다 웹 기반 LLM Wiki를 다음 리포를 참고해서 만들어줘
https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f


저항하는 통합 작업

Obsidian의 동반자가 아니라 대체품을 원했다. 그 말은 그래프 뷰가 있어야 한다는 뜻이었다. Graphify를 찾았고 에이전트에게 통합을 요청했다.


이 부분이 예상보다 오래 걸렸다. 통합 자체는 간단해 보였다 — graphifyy 설치, 서비스 래퍼 추가, 재빌드 트리거. 그런데 처음 몇 번 돌렸더니 멈춰버렸다. 작업 큐는 running 상태로 끝없이 매달려 있었다. 그래프 JSON은 나오지도 않았다. 워커는 조용히 메모리만 잡아먹고 있었다.


결국 내가 터미널에 뛰어들어 로그를 직접 읽어야 했다. 큐 파일을 tail로 지켜보고, 워커 상태를 확인하고, 에러 트레이스를 grep으로 뒤졌다. 어떨 땐 말뭉치 파싱 중에 멎었다 — 망가진 마크다운에 Graphify가 체한 것이다. 어떨 땐 타임아웃 설정이 안 맞았다. 어떨 땐 에이전트가 바뀐 상태를 인식하도록 게이트웨이 자체를 재시작해야 했다.


image.png


세션을 몇 번 리셋했다. 게이트웨이를 재시작했다. 막힌 작업을 수동으로 비웠다. 그때마다 로그 조각을 텔레그램에 붙여 넣고, 무슨 상황인지 설명하고, 고쳐달라고 에이전트에게 부탁했다. 천천히, 통합이 단단해졌다. 타임아웃은 세분화됐다 — 쿼리는 10초, 경로 탐색은 30초, 전체 재빌드는 300초.


매끄러운 과정은 아니었다. 훨씬 너저분했다. 더 인간적이었다. 에이전트가 막힌 지점을 풀어주려면 내가 내부를 이해해야 했다. 그런데 사실 가장 많이 배운 곳이 바로 그 지점이었다.

image.png


보안은 의도적으로 최소화했다. 용도에 맞춰서 말이다. Caddy를 통한 TLS 1.3, bcrypt 해시 기반 HTTP 베이직 인증, 포트 8080은 관리자 IP에서만 접근 가능. 세션 관리 없음. JWT 복잡도 없음. 엔터프라이즈급 보안은 아니다 — 적정한 보안이다.


드디어 그래프가 작동한 순간

여러 번의 재시작과 로그 사냥 끝에 통합이 완성됐다. 에이전틱 AI에 관한 기술 기사 하나를 수집시켰다. 큐가 처리됐다. 마크다운이 합성됐다. 그리고 마지막으로 — 거의 덤처럼 — 그래프가 재빌드됐다.


wiki.ai-biz.app/graph를 열었다. D3.js의 포스 시뮬레이션이 노드들을 화면 안으로 끌어당겼다. "에이전틱 AI"가 "LLM 오케스트레이션"과 이어지고, 그게 몇 주 전에 수집해 뒀던 자율 시스템 관련 노트와 연결됐다. "FastAPI" 노드는 한 클러스터의 정중앙에 앉아 있었다 — 인프라 노트와 API 설계 철학 노트를 잇는 신 노드였다. 나는 그 둘을 수동으로 연결한 적이 없다. Graphify가 구조 분석만으로 그 다리를 찾아냈다.


이렇게 입력했다. "OAuth2에서 PaymentGateway까지의 경로를 보여줘." 그래프는 어느 모듈의 문서에도 언급되지 않은 공유 유틸리티 함수를 거쳐 경로를 그려냈다. 그 연결은 코드 안에 구조적으로 존재하고 있었다. 텍스트로는 보이지 않았을 뿐이다.


단순한 시각화가 아니었다. 내 사고에 대한 두 번째 의견이었다.

"대부분의 AI 기반 지식 도구는 LLM을 검색 엔진처럼 다룬다. 이 시스템은 LLM을 사서처럼 다룬다. 사서는 당신이 물어볼 때까지 기다리지 않는다 — 스스로 정리하고, 연결하고, 당신이 놓친 패턴을 알아챈다."


구현 로드맵

이걸 만드는 일은 거대한 단일 작업이 아니다. 가치 있는 단계들로 나뉜다.


image.png


텔레그램 봇에 "X와 Y는 어떻게 연결돼?"라고 물어보면 그래프에 질의



결과

저렴한 리눅스 서버 비용(여러 SaaS 구독을 대체하고 총 월 5달러)만으로, 파편화되어 있던 내 디지털 생활을 통합되고 검색 가능하며 시각적으로 연결된 뇌 한 덩이로 바꿔냈다.


LLM Wiki는 흩어진 문서를 이해하는 문제를 풀어준다. Graphify는 그것들을 연결하는 문제를 풀어준다. 둘이 합쳐지면, 실제로 작동하는 개인 지식 관리(PKM) 시스템이 된다.


혹시 당신의 노트가 잊힌 아이디어들의 무덤처럼 느껴진다면, 그건 당신이 정리에 서툴러서가 아니다. 당신이 쓰는 도구가 문서를 네트워크 속의 노드가 아니라 그냥 파일로만 다루기 때문이다. 네트워크를 만들어라. 지식은 스스로 제 갈 길을 찾아온다.


"당신의 노트에게 필요한 건 서류 캐비닛이 아니라 신경계다. 그걸 만드는 일이, 어쩌면 메시지 하나 제대로 보내는 것에서 시작될지도 모른다."




매거진의 이전글LLM Wiki + Hermes Agents