LLM Wiki: 문서를 자동으로 위키 형태 지식 베이스로 컴파일하는 데스크톱 애플리케이션 (feat. Karpathy LLM Wiki 패턴)

LLM Wiki 소개

개인 지식 관리에 LLM을 도입하면 흔히 RAG(Retrieval-Augmented Generation, 검색 증강 생성) 패턴이 먼저 떠오릅니다. 그러나 RAG는 사용자가 질문할 때마다 원본 문서에서 매번 처음부터 검색하고 답변을 생성하는 방식이라, 동일한 자료에 대해 같은 추론이 반복되고 그 과정에서 토큰과 시간이 계속 소모됩니다. 또한 검색된 청크(chunk) 단위 응답이라 원본 문서 사이의 관계, 모순, 빈 곳을 사용자가 한눈에 보기 어렵습니다. Andrej Karpathy는 이러한 한계를 극복하기 위해 LLM이 점진적으로 위키(wiki)를 만들고 유지·보수하는 패턴을 llm-wiki.md 라는 짧은 문서로 제안했습니다. LLM Wiki는 이 패턴을 추상 디자인이 아니라 누구나 설치해 사용할 수 있는 크로스플랫폼 데스크톱 애플리케이션으로 구현한 오픈소스 프로젝트입니다.

LLM Wiki의 핵심 접근법은 RAG와 달리 LLM이 한 번 분석한 결과를 위키 페이지로 영속화하고, 새 자료가 들어올 때만 점진적으로 업데이트하는 점입니다. 사용자가 PDF나 DOCX, PPTX 같은 문서를 등록하면 LLM은 두 단계 사고 사슬(Two-Step Chain-of-Thought) 인제스트를 통해 먼저 핵심 엔티티와 개념, 기존 위키와의 모순을 분석하고, 이어서 그 분석 결과를 바탕으로 위키 페이지를 생성합니다. 페이지 사이 관계는 [[wikilinks]]와 4 신호 관련도 모델(4-Signal Relevance Model)로 구성된 지식 그래프(Knowledge Graph)에 반영되며, Louvain 커뮤니티 탐지(Community Detection)를 통해 자료 사이의 자연스러운 클러스터까지 드러냅니다. 그 결과 사용자는 RAG처럼 매번 처음부터 검색되는 답변이 아니라, 시간이 지날수록 풍부해지는 자기만의 위키와 대화하게 됩니다.

기능적으로 LLM Wiki는 단순한 노트 앱을 넘어 위키, 지식 그래프, 검색, Lint, 리뷰, Deep Research, 설정 패널을 하나의 화면에서 다루는 통합 작업 환경에 가깝습니다. 데스크톱 본체는 Tauri v2 + Rust 백엔드, 프런트엔드는 React 19 + TypeScript + Vite, UI는 shadcn/ui와 Tailwind CSS v4, 그래프는 sigma.js와 graphology, 벡터 검색은 LanceDB(Rust 임베디드)로 구성되어 있어 외부 서비스 의존성을 최소화합니다. 또한 별도의 Chrome 확장(Web Clipper)을 통해 웹 페이지를 한 번에 위키로 가져올 수 있고, 동일 디렉토리를 그대로 Obsidian 볼트로 사용할 수 있도록 설계되어 기존 Obsidian 사용자도 자연스럽게 통합할 수 있습니다.

LLM Wiki의 위키 구조와 디렉토리 레이아웃

LLM Wiki는 Karpathy의 원안에서 제시한 3계층 아키텍처를 그대로 따릅니다. 첫 번째 계층은 변경되지 않는 원본 자료(Raw Sources)이고, 두 번째 계층은 LLM이 생성한 위키(Wiki) 페이지들이며, 세 번째 계층은 위키의 동작 규칙을 정의한 스키마(Schema)입니다. 각 위키 페이지는 YAML 프런트매터(frontmatter)와 [[wikilinks]]를 사용해 서로를 참조하고, index.md는 전체 콘텐츠 카탈로그 역할, log.md는 시간순 작업 기록 역할을 맡습니다. 모든 페이지는 Markdown으로 저장되므로, LLM Wiki를 사용하지 않는 시점에도 그대로 다른 도구(예: Obsidian, VS Code)로 열어 읽을 수 있다는 점이 특징입니다.

LLM Wiki는 여기에 purpose.md라는 새로운 개념을 추가했습니다. 스키마가 위키의 구조 규칙을 정의한다면, purpose.md는 위키가 왜 존재하는지, 어떤 질문에 답하고자 하는지, 어떤 가설을 점검하는지를 명시한 문서입니다. 이 패턴의 원안은 저장소의 llm-wiki.md 에 정리되어 있습니다. LLM은 매 인제스트와 질의 시점에 purpose.md를 함께 읽어, 같은 자료라도 위키의 의도에 맞게 분류하고 강조합니다. 예를 들어 "에너지 분야 산업 동향"을 목표로 하는 위키와 "개인 학습 노트"를 목표로 하는 위키는 동일한 PDF를 입력해도 서로 다른 엔티티와 개념을 추출해 정리합니다. 사용 패턴이 누적되면 LLM이 purpose.md의 업데이트를 제안할 수도 있습니다.

저장소의 디렉토리 구조는 다음과 같이 설계되어 있습니다.

my-wiki/
├── purpose.md              # 목표, 핵심 질문, 연구 범위
├── schema.md               # 위키 구조 규칙, 페이지 타입
├── raw/
│   ├── sources/            # 업로드된 원본 문서 (불변)
│   └── assets/             # 로컬 이미지
├── wiki/
│   ├── index.md            # 콘텐츠 카탈로그
│   ├── log.md              # 작업 이력
│   ├── overview.md         # 전체 요약 (자동 갱신)
│   ├── entities/           # 사람, 조직, 제품
│   ├── concepts/           # 이론, 방법, 기법
│   ├── sources/            # 자료 요약 페이지
│   ├── queries/            # 저장된 채팅 답변과 리서치
│   ├── synthesis/          # 자료 간 종합 분석
│   └── comparisons/        # 자료 간 비교
├── .obsidian/              # 자동 생성된 Obsidian 설정
└── .llm-wiki/              # 앱 설정, 채팅 이력, 리뷰 항목

이 구조 덕분에 사용자는 위키 디렉토리를 그대로 Git 저장소로 관리하거나 Obsidian 볼트로 열 수 있고, 동기화 도구를 활용하여 여러 기기 간에 위키를 공유할 수도 있습니다.

LLM Wiki의 두 단계 사고 사슬 인제스트

LLM Wiki에서 가장 두드러지는 변경점 중 하나는 인제스트(Ingest) 단계의 재설계입니다. Karpathy의 원안은 LLM이 자료를 읽고 동시에 위키를 생성하는 단일 단계로 구성되어 있지만, LLM Wiki는 이를 두 번의 LLM 호출로 분리합니다. 첫 번째 호출에서 LLM은 자료를 읽고 핵심 엔티티, 개념, 주장, 기존 위키와의 연결, 모순, 위키 구조 추천을 구조화된 분석으로 출력합니다. 두 번째 호출에서는 그 분석 결과만 입력으로 받아 자료 요약 페이지, 엔티티/개념 페이지, 갱신된 index.mdlog.md, 인간 검토가 필요한 리뷰 항목, Deep Research용 검색 쿼리까지 한꺼번에 작성합니다.

이 두 단계 분리는 단순히 호출 횟수만 늘리는 것이 아니라, "이해와 정리"를 분리해 각 단계의 품질을 끌어올리는 전략입니다. 첫 번째 단계는 자유롭게 사고하면서 자료의 맥락을 파악하는 데 집중하고, 두 번째 단계는 명시적인 페이지 형식과 위키 규칙을 따라 출력만을 담당합니다. 또한 자료 파일은 SHA256 해시 기반 증분 캐시로 관리되어, 변경되지 않은 파일은 자동으로 인제스트에서 건너뜁니다. 인제스트 큐는 디스크에 영속화되어 앱 재시작에도 유지되며, 실패한 작업은 최대 3회까지 자동으로 재시도됩니다. 추가로 폴더를 통째로 가져올 때는 폴더 경로(예: papers > energy)가 LLM에게 분류 힌트로 전달되어, 같은 자료라도 폴더 맥락에 맞게 정리됩니다.

Step 1 (Analysis): LLM이 자료를 읽고 구조화된 분석을 출력
  - 핵심 엔티티, 개념, 주장
  - 기존 위키와의 연결과 모순
  - 위키 구조 추천

Step 2 (Generation): 분석 결과만으로 위키 파일을 생성
  - YAML frontmatter가 포함된 자료 요약
  - 엔티티/개념 페이지 + 교차 참조
  - 갱신된 index.md, log.md, overview.md
  - 인간 검토용 리뷰 항목
  - Deep Research를 위한 검색 쿼리

LLM Wiki의 지식 그래프와 4 신호 관련도 모델

LLM Wiki의 지식 그래프는 단순한 시각화가 아니라, 페이지 사이 관련도를 정량화해 검색과 그래프 확장에 활용되는 핵심 엔진입니다. 4가지 신호를 결합한 관련도 모델은 다음과 같이 구성되어 있습니다.

신호 가중치 설명
직접 링크(Direct link) ×3.0 [[wikilinks]] 로 직접 연결된 페이지
자료 중복(Source overlap) ×4.0 동일 원본 자료를 공유하는 페이지(YAML sources[] 기준)
Adamic-Adar ×1.5 공통 이웃을 공유하는 페이지(이웃의 차수로 가중)
타입 친화도(Type affinity) ×1.0 같은 페이지 타입(엔티티↔엔티티, 개념↔개념) 간 보너스

그래프 시각화는 sigma.js, graphology, ForceAtlas2 레이아웃으로 구현되어 있으며, 노드 색은 페이지 타입 또는 커뮤니티 기준으로 토글할 수 있고 노드 크기는 링크 수에 √ 스케일을 적용해 한쪽으로 쏠리지 않도록 합니다. 엣지의 두께와 색은 관련도 점수를 반영하며, 호버 시 이웃 노드만 강조되고 비이웃은 흐려져서 큰 그래프에서도 맥락을 유지하기 쉽습니다. 위치 캐싱이 적용되어 있어 위키 콘텐츠가 갱신되어도 그래프가 갑자기 튀는 일이 적습니다.

여기에 더해 Louvain 알고리즘 기반 커뮤니티 탐지가 자동으로 동작합니다. 페이지 타입과 무관하게 링크 토폴로지만으로 자연스럽게 형성되는 클러스터를 찾아 12색 팔레트로 시각화하며, 각 커뮤니티에는 내부 엣지 밀도를 기준으로 응집도(cohesion) 점수가 부여됩니다. 응집도가 0.15 미만인 클러스터는 경고로 표시되어, 위키에 채워야 할 영역이 어디인지 사용자에게 즉시 보여줍니다.

또한 그래프 인사이트(Graph Insights) 기능은 그래프 구조에서 자동으로 의미 있는 신호를 추출합니다. 커뮤니티 간을 잇는 의외의 연결(Surprising Connections), 차수가 1 이하인 고립 페이지(Isolated pages), 응집도가 낮으면서 페이지가 3개 이상인 희박한 커뮤니티(Sparse communities), 3개 이상의 클러스터를 잇는 브리지 노드(Bridge nodes) 등을 카드 형태로 보여주고, 클릭하면 그래프에서 해당 노드와 엣지가 강조됩니다. 인사이트 카드의 Deep Research 버튼은 overview.mdpurpose.md를 참고해 도메인에 맞는 리서치 토픽을 LLM이 직접 생성하도록 합니다.

LLM Wiki의 검색 파이프라인과 Deep Research

검색 시점의 처리 파이프라인은 다음 단계로 구성되어 있습니다. 1단계는 토큰화 검색으로, 영어는 단어 분할과 불용어 제거를 적용하고, 한국어/중국어는 CJK bigram 토큰화를 적용합니다. 1.5단계는 선택적 벡터 의미 검색으로, 임의의 OpenAI 호환 /v1/embeddings 엔드포인트를 사용해 임베딩을 만든 뒤 LanceDB에 저장하고, 코사인 유사도(cosine similarity)로 키워드가 겹치지 않더라도 의미적으로 가까운 페이지를 찾아냅니다. 2단계는 그래프 확장으로, 1단계와 1.5단계에서 얻은 페이지를 시드로 삼아 4 신호 관련도 모델로 2-홉 깊이까지 탐색합니다.

3단계 예산 통제(Budget Control)는 4K~1M 토큰 범위에서 사용자가 직접 선택할 수 있는 컨텍스트 윈도우를 가정하고, 위키 페이지 60%, 채팅 기록 20%, 인덱스 5%, 시스템 프롬프트 15% 비율로 토큰을 분배합니다. 4단계 컨텍스트 조립은 검색과 그래프 점수를 합산해 우선순위가 높은 페이지를 번호와 함께 LLM에 전달하고, LLM에게 인용 시 [1], [2] 형식으로 페이지를 명시하도록 요구합니다. 벤치마크 결과 벡터 검색을 활성화하면 전체 회수율(recall)이 58.2%에서 71.4%로 향상되었다고 보고됩니다.

Deep Research는 LLM이 위키의 빈 곳을 인식했을 때 활용됩니다. Tavily API로 웹 검색을 수행해 본문을 절단 없이 수집하고, 인제스트 시점에 미리 만들어둔 다중 쿼리를 사용합니다. 그래프 인사이트에서 트리거된 Deep Research는 overview.mdpurpose.md를 함께 읽어 도메인 맞춤 토픽과 검색 쿼리를 생성하며, 사용자가 토픽과 쿼리를 편집할 수 있는 확인 다이얼로그도 함께 제공합니다. LLM이 합성한 결과는 새 위키 페이지로 저장되고, 두 단계 인제스트 파이프라인에 자동으로 흘러 들어가 엔티티와 개념으로 분해됩니다.

LLM Wiki와 Obsidian, Chrome 확장 통합

LLM Wiki는 위키 디렉토리를 별도 변환 없이 Obsidian 볼트로 사용할 수 있도록 자동 생성된 .obsidian/ 설정을 함께 관리합니다. 즉, 같은 디렉토리를 LLM Wiki로 열 때는 LLM 기반 인제스트와 그래프 분석을 사용하고, Obsidian으로 열 때는 표준 노트 편집 기능을 사용할 수 있어 기존 Obsidian 사용자가 자신만의 워크플로우를 그대로 유지하면서 LLM 인제스트 기능만 추가로 얻을 수 있습니다.

또한 Chrome 확장 프로그램(Web Clipper)은 Manifest V3 기반으로 만들어져 있으며, Mozilla Readability.js로 본문을 추출하고 Turndown.js로 HTML을 Markdown으로 변환합니다. 다중 위키 프로젝트를 지원하므로 클립할 때 어느 위키에 저장할지 선택할 수 있고, 로컬 HTTP API(포트 19827, tiny_http)를 통해 데스크톱 앱과 통신합니다. 클립한 콘텐츠는 자동으로 두 단계 인제스트 파이프라인에 들어가 엔티티와 개념이 추출되며, 앱이 실행 중이지 않아도 기본 미리보기를 제공합니다.

LLM Wiki 설치 및 사용법

LLM Wiki는 macOS, Windows, Linux용 사전 빌드 바이너리를 GitHub Releases에서 제공합니다. macOS에서는 Apple Silicon과 Intel용 .dmg 파일이 제공되고, Windows에서는 .msi, Linux에서는 .deb.AppImage가 제공됩니다. 소스에서 직접 빌드하려면 Node.js 20 이상과 Rust 1.70 이상이 필요합니다.

# 사전 요구 사항: Node.js 20+, Rust 1.70+
git clone https://github.com/nashsu/llm_wiki.git
cd llm_wiki
npm install
npm run tauri dev      # 개발 모드
npm run tauri build    # 프로덕션 빌드

Chrome 확장은 저장소의 extension/ 디렉토리를 개발자 모드로 직접 로드하는 방식입니다.

1. 크롬에서 chrome://extensions 열기
2. "개발자 모드" 활성화
3. "압축해제된 확장 프로그램을 로드합니다" 선택
4. extension/ 디렉토리 선택

설치 후 사용 흐름은 다음과 같습니다. 앱을 실행해 새 프로젝트를 만들고(템플릿 선택 가능), 설정에서 LLM 프로바이더(API 키와 모델)를 구성한 뒤, Sources 패널에서 PDF/DOCX/MD 등의 문서를 가져옵니다. Activity 패널에서 LLM이 위키 페이지를 자동으로 만드는 과정을 실시간으로 확인할 수 있고, Chat 탭에서 위키 기반 질의를 시작할 수 있습니다. 그래프 패널에서는 페이지 간 연결을 살펴보고, Review 탭에서 LLM이 사람의 판단을 요청한 항목을 처리하며, 주기적으로 Lint를 실행해 위키 건강성을 유지하면 됩니다.

LLM 프로바이더는 OpenAI, Anthropic, Google, Ollama, Custom(OpenAI 호환 엔드포인트)을 지원하며, 각 프로바이더에 맞는 스트리밍과 헤더 처리가 내장되어 있습니다. 인제스트 시간이 길어질 수 있으므로 15분 타임아웃이 기본값으로 설정되어 있고, 이는 대형 PDF나 PPTX를 인제스트할 때 안정적인 동작을 위해 의도된 값입니다.

LLM Wiki 라이선스

LLM Wiki는 GNU General Public License v3.0(GPL-3.0)로 공개되어 있어, 개인 및 조직 내 사용은 자유롭지만 파생 프로젝트도 동일한 GPL-3.0 조건을 따라야 합니다. 의존하는 LanceDB, Tauri, sigma.js 등의 라이선스도 함께 확인하면 좋습니다.

:github: LLM Wiki 프로젝트 GitHub 저장소

더 읽어보기




이 글은 GPT 모델로 정리한 글을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다. :hugs:

:pytorch:파이토치 한국 사용자 모임:south_korea:이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일:love_letter:로 보내드립니다!
텔레그램(Telegram)이나 Slack/Discord/Teams/Dooray/GoogleChat 등으로도 새 글 알림을 받으실 수 있습니다. :smiley:

:wrapped_gift: 아래:down_right_arrow:쪽에 좋아요:+1:를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~ :star_struck:

1개의 좋아요