AIエージェント
llm-wikiとqmdの違い:LLM知識ベースは編纂か検索か
- 知識ベース
- RAG
- LLM
- llm-wiki
- qmd
- GraphRAG
- LazyGraphRAG
- RAPTOR
- Contextual Retrieval
- Claude Code
- BM25
- GGUF
- wiki
- 索引
- 要約
- ベクトル検索
- 全文検索
- 再ランク
- RRF
- クエリ展開
- 埋め込み
- markdown
- Andrej Karpathy
- Tobi Lütke
- Microsoft Research
- QuALITY
- 知識グラフ
- MCP
目次
手元には、論文、仕様書、議事録、過去に自分が書いた覚書といった文書がたまっていく。どれも捨てられない。しかし、必要なときに必要な一つを取り出せなければ、文書が無いのとほとんど変わらない。
この取り出す作業を機械に任せる方法は、大きく二つに分かれる。一つは、質問が来てから資料の山を探しにいく方法である。もう一つは、資料を読んで整理した文書を先に作っておき、質問にはその整理済みの文書で答える方法である。前者は探す手間を質問のたびに払い、後者は整理する手間を先に払う。
探す方法では、どの資料のどこにどんな語や内容があるかを引ける表を先に作っておく。この表を索引と呼ぶ。質問が来たら索引で資料を探し、見つけた資料の断片をLLM(Large Language Model、大規模言語モデル。文章を読んで文章で答えるAI)に渡して答えさせる。この方式をRAG(Retrieval-Augmented Generation、検索拡張生成)と呼ぶ。
どちらの方法でも、資料が書き換わると、それに追いつく作業が要る。整理した文書は、書き直すまで古い内容で答える。索引は、作り直すまで古い資料を引く。
本稿は、Andrej Karpathyが公開したllm-wikiと、Tobi Lütkeが公開したqmdを例に取る。前者はLLMに資料を先に編纂させる(資料を読ませ、整理した文書の集まりであるwikiを書かせる)設計、後者は質問のたびに検索する設計である。
llm-wikiとqmdは、LLMの知識ベースの作り方として何が違うのか。
資料100件に週10件の質問が来る
※ この節の例は、説明のために作った架空のものです。
二つの設計の違いは、LLMが元の資料を読む回数が、質問の数で増えるか、資料の数と書き換えの数で増えるかに出る。手元に資料が100件あり、週に10件の質問が来て、週に2件の資料が書き換わるとする。数えるのは、LLMが元の資料を読む回数である。
先に編纂する設計(llm-wiki)では、最初に100件を読んで、整理した文書(wikiのページ)を書く。ここで100回読む。質問には、wikiのページを読んで答える。この例では、質問のときに元の資料は読まないとする。週に2件の資料が新しい版に変わると、その2件の新しい版を資料として取り込んで読み、2件に触れていたページを書き直す。毎週2回読むので、10週では2回×10週の20回に最初の100回を足して120回になる。書き直すまでは、その2件に関わる質問に、LLMは古い整理のまま答える。
その場で検索する設計(qmd)では、最初に100件の索引を作るだけで、整理した文書は作らない。その代わり、質問のたびに資料を探して読む。1件の質問に答えるために、LLMが見つけた資料を5件読むとする。10件の質問それぞれで5件を読むので、毎週50回、10週では500回になる。週に2件の資料が書き換わると、索引を作り直す。作り直すまでは、書き換わった2件が古い中身のまま検索に掛かる。
この例から言えることは三つある。
- 編纂する設計で元の資料を読む回数は、資料の数と書き換えの数で決まり、質問の数では増えない。検索する設計では質問の数に比例する。質問が週20件に増えると、llm-wikiは週2回のまま、qmdは週100回になる。
- どちらの設計にも、書き換えに追いつく作業が残る。書き換わった2件について、llm-wikiはページの書き直し、qmdは索引の作り直しが要る。
- 追いつくまでのあいだは、どちらも古い内容を使う。llm-wikiは古い整理で答え、qmdは古い中身を検索で引く。
この数には、資料を丸ごと読む1回と断片を読む1回の量の差も、wikiのページを読む作業も入っていない。この例が示すのは、作業が質問の数と資料の数のどちらで増えるかであって、どちらの設計が安いかではない。
編纂する設計
Andrej Karpathyが2026年4月4日(UTC)に公開したllm-wikiは、「LLMを使って個人の知識ベースを構築するためのパターン」だと自ら述べている1。実装ではなく、自分のLLMエージェントに貼り付けて使うための考え方を書いた文書だと明記されている。Karpathyは、OpenAIの創業メンバーでのちにTeslaのAI部門を率いた研究者で、これを会社の製品ではなく個人のgist(GitHubで一つの文書やコード片を公開する仕組み)として置いており、GitHubの表示ではstarが5,000件以上ある31。
出発点は、既存のやり方への観察である。Karpathyは、多くの人の経験が「ファイルの集まりをアップロードし、LLMが質問時に関連する断片を取得して答を生成する」形だと書き、それが機能することは認める。そのうえで、この形では「LLMが質問のたびに知識をゼロから再発見している。蓄積が無い」と指摘する。
提案する構造は三層からなる。第一層は生の資料で、これは「不変であり、LLMは読むが決して変更しない」。第二層がwikiで、LLMが生成する markdown ファイルの集まりである。第三層がスキーマで、wikiがどう構造化されているかをLLMに伝える文書を指す。Claude CodeならCLAUDE.md、CodexならAGENTS.mdが例として挙がっている。
操作は三つある。資料を取り込むIngest、wikiに問うQuery、そしてLintである。Queryについては、よい答えを新しいページとしてwikiへ書き戻せることを「重要な洞察」として挙げ、wikiは資料を足すたびにも質問するたびにも豊かになるとしている1。Lintの中身は具体的に書かれている。ページ間の矛盾、新しい資料によって置き換えられた古い主張、入ってくるリンクの無い孤立ページ、言及はあるが独立したページを持たない重要概念、欠けた相互参照、Web検索で埋められるデータの穴を、定期的に探させる。
なぜこの設計が成り立つのかについて、Karpathyは維持コストの所在で説明する。「知識ベースを維持するとき面倒なのは、読むことでも考えることでもない。事務作業のほうだ」。そして「人間がwikiを放棄するのは、維持の負担が価値より速く増えるからだ」と書く。事務作業をLLMが引き受けられるなら、人間が維持をやめていたwikiを維持できる、という筋である。
Karpathyはここで強い言い方をしている。「LLMは退屈しないし、相互参照の更新を忘れないし、一度に15のファイルに触れる。wikiが維持され続けるのは、維持の費用がほぼゼロだからだ」1。ただしこの一文が指すのは事務作業をLLMが引き受ける分で、同じ節は直後に「人間の仕事は、資料を選び、分析の方向を決め、よい問いを立て、それが何を意味するかを考えることだ。LLMの仕事はそれ以外のすべてだ」と人間の側の仕事を切り分けている1。
検索する設計
tobi/qmdは、Shopifyの創業者でCEOのTobi Lütkeが個人名義で公開しているコマンドライン検索エンジンである4。リポジトリの説明文は「ドキュメント、知識ベース、議事録などのための小さなCLI検索エンジン。すべてローカルで動かしながら現在のsotaな手法を追う」となっている2。sotaはstate of the artの略で、その時点の最先端を指す。2025年12月8日に作成され、2026年9月12日時点でstarは29,679件だった。
qmdは要約を先に作らないので、どの文書を答えに使うかを質問が来てから選ぶ。そこで解くべき課題が二つある。質問と違う言い回しで書かれた文書を取りこぼさないことと、高価なLLMに全文書を読ませないことである。本稿は、READMEが並べる手順をこの二つの課題に分けて説明する2。
取りこぼしを防ぐのが前半である。質問をそのまま使うと、言い換えられた文書に当たらない。そこでLLMに、質問を言い換えたクエリを作らせる(クエリ展開)。
検索の方式も一つではなく、語の一致を見る全文検索と、意味の近さを見るベクトル検索の二つがある。ベクトル検索は、文章を数値の並び(ベクトル)に変え、質問のベクトルに近い文書を探す。文章をベクトルに変える処理を埋め込みと呼ぶ。展開したクエリは全文検索向けとベクトル検索向けに型を分けて書かせ、それぞれ一方の検索だけに流す。元の質問は両方の検索に流し、その結果には2倍の重みを掛ける。
こうして複数の順位表ができるので、順位の逆数を足す ()で一本にまとめる。この融合の方式をRRF(Reciprocal Rank Fusion)と呼ぶ。ただし展開には副作用があり、READMEは「純粋なRRFは、展開したクエリが一致しないときに完全一致を薄めうる」と書く。それを受けて、いずれかの一覧で1位だった文書に0.05、2位から3位に0.02を足す加点を置き、狙いを「元のクエリに対して1位を取った文書を保つ」ことだと説明する2。
費用を抑えるのが後半である。まとめた上位の候補(実装とREADMEのパラメータ表の既定は40件で、READMEの手順の説明と図は30件と書く)だけをLLMへ回し、各文書が質問に答えているかを採点させる。この採点を再ランクと呼ぶ。
再ランクにも副作用がある。検索の側で確信度の高かった文書を、LLMの採点が押し下げてしまうことがある。対策は、順位帯によって二つの採点の混ぜ方を変えることである。
- 1位から3位:検索75パーセント、再ランク25パーセント(READMEの注記は「完全一致を保つ」)
- 4位から10位:検索60パーセント、再ランク40パーセント
- 11位以降:検索40パーセント、再ランク60パーセント(同じく「再ランクをより信頼する」)
READMEはこの狙いを「位置を考慮した混合は、再ランクが確信度の高い検索結果を壊すのを防ぐ」と書いている。
三段の比を並べると、方針は一つである。上位ほど検索の一致を信じ、下位ほどLLMの判断を信じる。
qmdは、手元の計算機で動かすモデルを三つ使う。どれもGGUF(ローカル実行向けに言語モデルを1ファイルに収める形式)で、初回利用時に自動で取得する。埋め込みのembeddinggemma-300M-Q8_0が約300MB、再ランクのqwen3-reranker-0.6b-q8_0が約640MB、クエリ展開のqmd-query-expansion-1.7B-q4_k_mが約1.1GBで、合計およそ2GBになる2。すべてローカルで動く代わりに、この分は最初に置いておく必要がある。
二つは競合していない
llm-wikiのgistは、qmdを名前を挙げて推薦している。「ある時点で、LLMがwikiをもっと効率よく操作できるよう、小さなツールを作りたくなるだろう。wikiのページを対象にした検索エンジンが最もわかりやすい。小規模なら索引ファイルで足りるが、wikiが大きくなると本格的な検索が欲しくなる。qmdは良い選択肢だ」1。コマンドラインで使えることと、MCPサーバーとしても動くことも、推薦の理由として挙げられている。MCP(Model Context Protocol)は、LLMのエージェントが外部のツールを呼び出すための標準の仕組みである。ただしこの推薦は「任意のCLIツール」という見出しの下にあり、直後に「もっと単純なものを自分で作ってもよい」と続く。文書末尾の注記も、挙げたものはすべて任意で組み替え可能であり、wikiが小さければ索引ファイルだけで足りて検索エンジンは要らない、と書いている1。
規模の目安も同じ文書に書かれている。索引ファイルによる方式は「およそ100件の資料、数百ページという中規模ではうまく働き、埋め込みベースのRAG基盤を不要にする」。この記述は、索引ファイルで足りる範囲と、検索エンジンが要る範囲の境目を、著者自身が引いていることを示す。規模の目安はほかにもあり、Anthropicは20万トークン(約500ページ)より小さい知識ベースなら、RAGのような手法を使わずにプロンプトへ丸ごと入れればよいと書いている5。
qmdの側も、wikiを検索の対象に置く使い方を例に含めている。同梱する設定例には、wikiという名前のコレクションが入っている。~/reference/wiki配下のmarkdownを再帰的に拾う指定で、git pull --ff-onlyを更新コマンドに置き、説明文には「外部のwiki。qmd updateのたびに自動で取得される」と書かれている。同じ設定例が置くグローバルコンテキストも「関連する[[WikiWord]]を見かけたら、そのWikiWordを検索してさらにコンテキストを得られる」で、wiki風の記法を前提にしている2。ただし設定例もREADMEもllm-wikiの名を挙げてはいない。これはwiki一般への対応であって、llm-wikiという特定の設計を想定した記述ではない。
したがって、読者が迫られる選択は「どちらの製品を採用するか」ではない。資料の規模と、更新の手間を先に払うか後に払うかの配分である。両方を使う場合は、上のgistの目安を超えてwikiが大きくなり、本格的な検索が要るようになった時点で、その検索の道具としてqmdを足すのがgistの書く組み合わせである1。
同じ選択は検索研究の側でも起きている
検索の研究で提案された手法も、質問が来る前にLLMに何を書かせておくかで並べられる。以下の四つの手法は、索引を作る段階でLLMに書かせるものがそれぞれ違う。
Stanford大学のSarthiらがICLR 2024で発表したRAPTORは、文書の断片を「再帰的に埋め込み、クラスタリングし、要約して、下から上へ異なる要約水準を持つ木を構築する」手法である6。質問時にはこの木から、原文の断片と上位の要約の両方を取り出す。著者らは、平均5,000トークンほどの文章を読んでから答える選択式の読解ベンチマークQuALITYで、GPT-4と組み合わせると最良成績を絶対値で20ポイント上げたと報告する。木を作る費用は文書長に対して線形で、しかも家庭用のハードウェアで収まる範囲にとどまる。原典は付録で、その確認のために16GBのM1 Macを使ったと書いている。要約を先に作っておくという点で、これはllm-wikiと同じ側に立つ。ただし作るのはwikiではなく、検索のための索引である。
Microsoft ResearchのEdgeらが2024年4月にプレプリントで発表したGraphRAGは、索引を作る段階で、LLMに知識グラフと要約の両方を作らせる。著者らは、従来の検索型RAGは「データセットの主題は何か」のような、コーパス(検索の対象になる文書の集まり全体)に向けた問いに答えられないと指摘し、その理由を、これが「検索の課題ではなく、質問に焦点を絞った要約の課題」だからだと説明する7。索引の作り方はこうである。まず資料から実体の知識グラフを取り出し、次に関連する実体のまとまりごとに要約をあらかじめ生成しておく。質問が来ると、各要約から部分回答を作り、それを再び要約して答える。100万トークン規模のデータセットで、答えの網羅性と多様性が従来のRAGを大きく上回ったと著者らは報告する。
ただし同じ論文は、グラフ索引を作らずに質問時に原文を直接要約する方式とも比べている。事前に作った要約がこの方式に対して示した改善を、著者らは「小さいが一貫した」ものと書き、最上位の要約だけを使う条件ではその改善も見られなかった。差がはっきり出たのは質問あたりのトークン量で、同じ最上位の条件では97パーセント以上少なかった7。この比較から読めるのは、先に編纂した利得が、答えられる問いの広さよりも、同じ問いに質問時に払う費用の軽さに出たということである。
同じグループは7か月後の2024年11月に、LazyGraphRAGを発表した8。ブログは「資料の事前要約を必要とせず、利用者や用途によっては法外になりうる前払いの索引費用を避ける」と書き、索引の費用は「ベクトルRAGと同一で、完全なGraphRAGの0.1パーセント」だとする。設計は「LLMの使用をすべて質問時まで遅らせる」もので、費用と品質の釣り合いは「関連性検査の予算」という一つのパラメータで調整する。llm-wikiとqmdの間の選択で言えば、同じ研究グループが7か月で、編纂の側(GraphRAG)に続いて検索の側(LazyGraphRAG)の設計も出したことになる。ただしブログは、グラフを使うRAGをすべて遅延型にすべきかという問いに「答えはノーだと考える」と書き、理由を三つ挙げる8。事前に作った要約の索引は報告として読む価値も持ち、それに遅延型の検索を組み合わせれば単独より良い結果になる見込みが高く、遅延型の検索に合わせた新しい索引が最良になる見込みが高い、という理由である。
原典は、索引の費用のほかに質問時の費用も報告している。ブログは、大域的な問いでは完全なGraphRAGの大域検索と同等の答えの品質で質問時の費用が700分の1以下になり、局所的な問いではベクトルRAGと同程度の質問費用で競合手法をすべて上回るとも書いている8。索引時の手間が質問時へ移ったのなら質問時の費用は上がるはずで、そうなっていない。ここで起きたのは移動ではなく、両方の時点での減少である。設計を入れ替えれば総量が減ることはあり、作業を取り込み時と質問時のどちらに置くかという見方では、それは説明できない。
粒度をもっと下げた例もある。Anthropicが2024年9月に公開したContextual Retrievalは、断片ごとにその断片を説明する短いコンテキストをLLMに書かせてから埋め込みとBM25の索引を作る5。BM25(Best Matching 25)は、質問の語が文書に現れる回数、その語の珍しさ、文書の長さをもとに文書へ点を付ける、全文検索の標準的な採点方式である。索引時にLLMを使う点は編纂の側だが、作るのは要約ではなく、検索の取りこぼしを減らすための注釈である。同社は取り出しの失敗が49パーセント減り、再ランクを足すと67パーセント減ったと報告し、プロンプトキャッシュを使う前提で、注釈を作る一度きりの費用を文書100万トークンあたり1.02米ドルと見積もっている。前払いの手間に値段が付いている例として読める。
これらを並べると、編纂と検索の間には段階がある。wiki全体を書く(llm-wiki)、要約の木を作る(RAPTOR)、実体グラフとまとまりの要約を作る(GraphRAG)、断片に注釈を付ける(Contextual Retrieval)、索引時にはLLMに何も書かせない(qmd、LazyGraphRAG)。どれもLLMの仕事をどの時点に置くかの選択である。同じ手法の中で事前の要約の有無を比べれば、先に置いた分だけ、質問時に払うと高くつく答え(コーパス全体の主題、複数段の要約)が安く出せ、その分は資料が変わるたびに古くなる。ただし手法をまたぐとこの関係は保たれず、事前に要約しないLazyGraphRAGは、大域的な問いの質問時の費用でもGraphRAGを下回った8。
編纂の側で落ちるものと、足されるもの
編纂は、資料を読んだ時点で内容を書き換える。原典の文はwikiの中では要約と相互参照に置き換わり、読者がふだん読むのは原典ではなくその要約である。gistは生の資料を変更しない「信頼できる情報源」として第一層に保ち、質問への答えには引用を付けさせる1。本稿の推論では、ここで二つのことが起きうる。原典が手法に付けていた適用条件が要約から落ちることと、原典に無い情報が要約に足されることである。後者は、要約の木を作るRAPTORが実際に測っている6。
gistは取り込みの段の運用を利用者に委ねている。著者自身は資料を「一つずつ取り込み、関与を保つ」ほうを好み、要約を読み、更新を確かめると書く一方で、監督の薄い一括取り込みも選べるとしている1。wikiの健全性検査(lint)を定期的に回すことは、操作の一つとして設計に含めている。取り込みの段で人間が要約を読むのは、著者が好む運用であって、設計が課す条件ではない。一括取り込みを選んでその読みを省けば、落ちた条件と足された情報は、要約だけを読む限りは見分けがつかない。
要約を先に作る側の研究がこれをどこまで測っているかは、研究ごとに違う。RAPTORは生成した要約150ノードを人手で注釈し、4パーセントにあたる6ノードが何らかの幻覚を含み、その多くは元の本文に無い情報を足すか、情報を誤って外挿するものだったと報告したうえで、その幻覚は上位層へ伝播せず質問応答の成績にも影響しなかったとする6。一方GraphRAGの評価基準は網羅性・多様性・読者への助けであり、論文は「忠実さ」を「大域的な全体把握には関係ない」基準として評価から外している7。
検索の側で利用者が行う作業
qmdの側にも、索引を作ったあとに利用者が行う作業がある。READMEは索引の更新について注意を明示している。「index.ymlの編集は、QMDがどのディレクトリとモデルを使うかを変えるが、それ自体では再索引しない」。path、pattern、ignoreを変えたらqmd updateを、models.embedを変えたらqmd embedを実行するよう求めている2。ただし、利用者が担うのはqmd updateを打つ判断であって、同期そのものではない。上流との同期は組み込まれていて、各コレクションのupdate欄に書いたコマンドが再索引の前に走る。READMEはこれを「組み込みの更新フック」と呼び、qmdを自分で包まなくても上流と同期が保てると書く2。設定ファイルを編集しても再索引が起きないのは、この同期とは別の話である。
既定の埋め込みモデルには言語の制約がある。READMEは、中国語・日本語・韓国語を含む多言語コーパスではembeddinggemma-300Mの網羅が限られると書き、既定を英語最適化と位置づけている。差し替えは環境変数QMD_EMBED_MODELで行うが、ベクトルはモデル間で互換ではないので、全コレクションをqmd embed -fで埋め直す必要がある2。日本語の資料にqmdを当てる読者は、索引を作る前にこの差し替えを検討することになる。
分割の仕方は、利用者が手を入れなくてもmarkdownに合わせてある。READMEによれば、qmdは見出し・段落・コードブロックの境目に点数を付け、約900トークンに近づくとその手前の範囲でいちばん点の高い境目で切り、15パーセントの重なりを付けて埋め込む。tree-sitterを使う構文木単位の分割はコードファイルにこの境目を足す仕組みで、READMEは「markdownとその他のファイル形式は、戦略にかかわらず常に正規表現ベースの分割を使う」と書く2。llm-wikiが生成するmarkdownのページにも、この方式が当たる。
出典8件
-
Andrej Karpathy「llm-wiki.md」GitHub gist, 2026. https://gist.github.com/karpathy/442a6bf555914893e9891c11519de94f — LLMにmarkdownのwikiを編纂・維持させる考え方の文書。三層の構造、Ingest・Query・Lint、規模の目安、任意のツールとしてのqmdの推薦を書く。star数は2026年9月12日にgistの表示で取得。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12
-
tobi/qmd リポジトリとREADME, GitHub, 2025. https://github.com/tobi/qmd — 作者はTobi Lütke。markdown向けのローカルCLI検索エンジン。融合と再ランクの7段、3つのGGUFモデル、再索引の注記を書く。作成日・star数は2026年9月12日にGitHub APIで取得。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10
-
Andrej Karpathy本人のサイトの経歴欄, 2026. https://karpathy.ai/ — OpenAIの創業メンバーで、のちにTeslaのAI部門を率いたと書く(2026年9月12日取得)。立ち位置の出所としてのみ引く。 ↩
-
Tobi Lütke本人のサイトの自己紹介, 2026. https://tobi.lutke.com/pages/about — ShopifyのCEOで創業者と書く(2026年9月12日取得)。立ち位置の出所としてのみ引く。 ↩
-
Anthropic「Introducing Contextual Retrieval」2024. https://www.anthropic.com/news/contextual-retrieval — 断片ごとにコンテキストを書き足してから索引を作る。検索失敗49%減(再ランク併用で67%減)と注釈の費用見積もりは同社自身の測定。 ↩ ↩2
-
P. Sarthi ほか「RAPTOR: Recursive Abstractive Processing for Tree-Organized Retrieval」ICLR, 2024. https://arxiv.org/abs/2401.18059 — 要約の木を作って検索する手法。要約の4%に幻覚があったが、上位へ伝播せず成績に影響しなかったと報告する。 ↩ ↩2 ↩3
-
D. Edge ほか「From Local to Global: A Graph RAG Approach to Query-Focused Summarization」arXiv, 2024. https://arxiv.org/abs/2404.16130 — プレプリント。網羅性・多様性はLLMジャッジの自己測定。原文の直接要約に対する改善は小さく、差は主に質問ごとのトークン量に出た。 ↩ ↩2 ↩3
-
D. Edge ほか「LazyGraphRAG: Setting a new standard for quality and cost」Microsoft Research Blog, 2024. https://www.microsoft.com/en-us/research/blog/lazygraphrag-setting-a-new-standard-for-quality-and-cost/ — LLMの使用を質問時へ遅らせた設計。質問時の費用も下がったと同グループが報告する。 ↩ ↩2 ↩3 ↩4
この記事はAIを使用して執筆されました。内容には誤りが含まれる可能性があります。事実や数字の出典は脚注から確かめられます。