はじめに:AI活用が「知識のゴミ箱」化する前に
最近、Andrej Karpathy氏が提唱した「LLM Wiki / Knowledge Base」という概念(※)にヒントを得て、ローカルのMarkdown環境(Obsidianなど)とAIエージェントを組み合わせるアプローチが注目を集めています。
(※ Karpathy氏はLLM Wikiの概念やシステムのGistを提唱しましたが、本記事の「Claude Code × Obsidianを用いた厳格な3層運用」は、実務向けに発展させた独自の実装アーキテクチャです。)
しかし、SNSで見かける「便利なプロンプト集のコピペ」で実務に導入すると、高い確率で運用が属人化・カオス化します。
GraphRAGやContinuous Indexingを用いた高度なデータパイプラインを自前で構築できるチームを除き、単純なVector DBを用いた一般的なRAG(検索拡張生成) では、「知識の断片を都度検索する」ことはできても、「知識を構造化して育て、矛盾を検知する」ことが難しいためです。
本稿では、プロンプトへの過度な依存を脱却し、Claude Codeを単なるチャットツールではなく 「自律的な司書(Librarian)」としてシステムに常駐させるための具体的なアーキテクチャ設計と、 そのまま手元で動かせるカスタムスキル(Skills)の実装コードを公開します。
3層ストレージアーキテクチャ(Core Data Layer)
知識の腐敗を防ぐため、データ構造自体をLLMに依存しない厳格なディレクトリ構造で設計します。
2do-brain/
├── 01_raw/ # 生データ層:不変の一次情報(Source of Truth / Read-Only)
├── 02_wiki/ # 編集済み知識層:AIが編纂する構造化知識(Write-Allowed)
│ ├── index.md # カタログ:全ページのインデックス
│ └── log.md # 履歴:## [YYYY-MM-DD] 操作名 | 対象
└── Schema/ # 規律層:司書としてのルール定義
├── CLAUDE.md # 知識OSの憲法(基本原則)
└── .claude/
├── rules/ # 分野別ルール
└── skills/ # 実行Playbook(※本記事の核心)
このアーキテクチャの最大のポイントは 01_raw/ と 02_wiki/ の分離です。
AIに過去のWiki(要約)だけを見て要約を繰り返させると、一次情報の重要な細部が削ぎ落とされる「再帰的要約劣化」が起きます。
これを防ぐため、更新時は必ず 01_raw/ の原典を再読込させます。
Skills実装詳細(Claude Code公式仕様に準拠した運用コード)
Claude Codeの強力な機能である skills を用いて、実務運用に必要なオペレーションをコード化します。
ここでの「Skills」は、ハードコードされた外部ツール(Tools)ではなく、Claudeに特定のワークフローやドメイン知識の手順(Playbook)を与えるための仕組み(.claude/skills/<skill-name>/SKILL.md)です。
以下に、中核となる2つのSkillディレクトリ構造と実装を公開します。
Claude Codeの公式仕様に完全準拠し、引数(arguments)や、承認なしで実行できるツール(allowed-tools)を厳密に定義しています。
① 一次抽出スキル:ingest
01_raw/ に入った新着ドキュメントを読み込みます。
実行時はターミナルで /ingest 01_raw/sample.pdf のように引数(対象ファイル)を渡して呼び出します。
paths は「AIのアクセス権」ではなく、「このスキルが自動的にコンテキストに読み込まれる対象パスの条件」として機能します。
ファイルパス: .claude/skills/ingest/SKILL.md
name: ingest
description: 01_raw/ ディレクトリ以下の新規ドキュメントを読み込み、エンティティ抽出と要約を行います。
argument-hint: 対象ファイルのパス (例: 01_raw/sample.pdf)
arguments:
- name: target_path
description: 抽出対象となる一次情報のファイルパス
required: true
allowed-tools:
- Read
- Grep
paths:
- 01_raw/*
# Wiki Ingest ワークフロー
対象ファイル: $target_path
新着ドキュメントを受け取ったら、以下の手順を厳格に実行してください。
1. **抽出処理**:
- `$target_path` を読み取り、主要な主張(3〜5個)、重要なエンティティ(人名・製品名・数値)を抽出する。
- `02_wiki/index.md` を確認し、関連しそうな既存Wikiページをリストアップする。
2. **ドラフト保存**:
- 抽出結果を `02_wiki/_drafts/YYYY-MM-DD_[ファイル名].md` に一時保存する。
3. **【厳守】境界の維持**:
- この時点では絶対に `02_wiki/` 本体(既存ページ)には書き込まないこと。
【実装のポイント】
allowed-tools は「事前承認」のリストです。
ここではあえて Read と Grep(読み取り系)のみを許可しているため、手順2のドラフト保存(書き込み操作)のタイミングでAIがユーザーに実行承認を求めてきます。
この一手間が、AIの暴走を防ぐ確実な安全弁として機能します。
② 統合・編纂スキル:compile(※最重要)
Ingestで抽出したドラフトを、実際のWikiに統合します。
YAMLフロントマターの disable-model-invocation: true を設定することで、このスキルはClaudeのコンテキストやサブエージェントにプリロードされなくなります(AI側からは見えなくなる)。
AIが勝手な文脈で自動実行(Auto-invoke)してWikiを破壊するのを防ぎ、人間が意図したタイミングで /compile と明示的に手動起動させるための堅牢な運用設計です。
また、出力フォーマットを安定させるため、同ディレクトリ内に補助ファイル(examples/)を同梱し、SKILL本文から明示的にリンクさせます。
ファイルパス: .claude/skills/compile/SKILL.md
name: compile
disable-model-invocation: true
description: 抽出されたドラフト情報を既存の 02_wiki/ ページ群に統合し、出典とメタデータを更新します。
argument-hint: 統合元のドラフトファイルパス (例: 02_wiki/_drafts/draft.md)
arguments:
- name: draft_path
description: Ingestで作成されたドラフトファイルのパス
required: true
allowed-tools:
- Read
- Grep
- Edit
- Bash(git add 02_wiki/*)
# Wiki Compile ワークフロー
対象ドラフト: $draft_path
1. **基本原則の適用(Raw再読込)**:
- 既存ページを更新する場合、再帰的要約劣化を防ぐため、**必ず対応する `01_raw/` の該当箇所を再読込**して事実確認を行ってください。
- すべての主張に `[[01_raw/filename]]` の形式でインライン出典を付与すること。
2. **フォーマットとメタデータの更新**:
- 詳細な出力形式は [examples/output_template.md](examples/output_template.md) を参照し、厳密に従うこと。
- Frontmatterの `status` を `reviewed` に更新すること。
3. **インデックスとログの更新**:
- 処理の最後に必ず `02_wiki/index.md` にリンクと1行要約を追記すること。
- `02_wiki/log.md` に `## [YYYY-MM-DD] Compile | [対象ファイル名]` を追記すること。
【実装のポイント】
ここでの allowed-tools には、無制限の Bash ではなく Bash(git add 02_wiki/*) のようにコマンド単位でスコープを絞った書き方を採用しています。
強力な権限を渡す際は、必要な操作のみを許可するのが公式の推奨プラクティスです。
補助ファイルパス: .claude/skills/compile/examples/output_template.md
これによりAIは、抽象的な指示だけでなく「具体的な完成形」をFew-shotとして学習できます。
---
updated_at: YYYY-MM-DD
sources: [01_raw/filename.pdf]
status: reviewed
---
# [概念・エンティティ名]
## 概要
[ここに簡潔な説明]
## 詳細な仕様・事実
- [具体的事実1] [[01_raw/filename.pdf#anchor]]
- [具体的事実2] [[01_raw/filename.pdf#anchor]]
Obsidian Dataviewによる状態管理
前述のSkillで付与したフロントマター(YAML)は、Obsidianの強力なプラグイン「Dataview」と組み合わせることで真価を発揮します。
任意のMarkdownファイルに以下のクエリを記述するだけで、「AIが生成したまま、人間がまだレビューしていないページ一覧」を動的に取得・監視できます。
```dataview
TABLE updated_at, status
FROM "02_wiki"
WHERE status != "reviewed"
SORT updated_at ASC
```
終わりに:検索できるゴミ箱ではなく「働く脳」を
「AIに毎回前提を説明するのが面倒」という課題は、プロンプトを工夫するだけでは解決しません。
特定のSaaSプラットフォームに依存しないMarkdownとディレクトリ構造の「自由」。
そして、Claude Codeの SKILL.md の仕様を正しく活用した「規律」。
この両輪を回すことで、初めて知識は複利で成長する資産となります。
上記の実装コードをご自身の環境にコピーし、ターミナルで claude を立ち上げて /ingest 01_raw/あなたのドキュメント.md と叩いてみてください。
今日からあなたの手元で、自律した司書が働き始めます。
この記事を書いた人✏️@YushiYamamoto
ITPRODX.com代表 / AIアーキテクト
Next.js / TypeScript / n8nを活用した自律型アーキテクチャ設計を専門としています。
日々の自動化の検証結果や、ビジネス側の視点(ROI等)に関するより深い考察は、以下の公式サイトおよびnoteで発信しています。




