WiCERとは?LLMの長文知識をWiki-memoryとして圧縮・改善する仕組み

WiCERの全体像
WiCERの全体像

LLMに長い社内文書や大量の記事を読ませる方法として、RAG(検索拡張生成)と長文コンテキストがよく使われます。

しかし、検索すれば取りこぼしが起き、全部入れれば推論コストやattention dilution(長い文脈の中で重要情報が薄まる現象)が問題になります。

本記事では、arXiv論文「WiCER: Wiki-memory Compile, Evaluate, Refine」をもとに、長文知識をWiki-memory(LLMが参照しやすい構造化された知識メモリ)へ圧縮し、欠落した事実を診断しながら改善する仕組みを解説します。

3文要約

WiCER論文の3文要約

WiCERは、元文書をそのままLLMへ入れるのではなく、ドメイン知識をWiki-memoryとしてコンパイルし、KV cache inference(事前に読み込んだ文脈の注意計算状態を再利用する推論方式)で高速に参照するための手法です。

単純に文書をWikiへ要約すると、重要な事実が落ちるcompilation gap(圧縮時に回答に必要な事実が失われる問題)が起きるため、WiCERは診断用の質問で欠落を見つけ、次のコンパイルでその事実を保持するように反復します。

論文では、17個のRepLiQAドメイン、6,800問の評価で、1〜2回の反復によりblind compilation(診断なしの単純コンパイル)で失われた品質の80%を回復し、catastrophic failure(致命的な回答失敗)を相対的に55%減らしたと報告されています。

論文情報

項目 内容
論文タイトル WiCER: Wiki-memory Compile, Evaluate, Refine Iterative Knowledge Compilation for LLM Wiki Systems
著者 Juan M. Huerta
発表年 2026年
arXiv arXiv:2605.07068v1
公開日 2026年5月8日
分野 Computation and Language, Artificial Intelligence
論文リンク WiCER: Wiki-memory Compile, Evaluate, Refine
DOI 10.48550/arXiv.2605.07068

本記事の目的

この記事の目的は、WiCERを「新しいRAG手法」としてではなく、LLMに知識を持たせる方法の設計問題として理解することです。

LLMアプリケーションでは、次のような悩みがよく出ます。

  1. RAGで検索したchunk(文書を分割した断片)に必要情報が入らない
  2. 長文コンテキストに全部入れると遅い、または重要情報が埋もれる
  3. 要約やWiki化をすると、回答に必要な細かい事実が消える
  4. 社内ナレッジを更新しても、どの情報がLLM回答に効いているか分かりにくい

WiCERは、この4つ目の問題に踏み込んでいます。

つまり「知識を圧縮したら終わり」ではなく、「圧縮した知識で実際に答えさせ、失敗した質問からWikiを直す」という閉ループを作ります。

背景:RAG、Full-context KV cache、Wiki-memoryの違い

RAG、Full-context KV cache、Wiki-memoryの比較

LLMに外部知識を与える代表的な方法は、RAGとfull-context KV cacheです。

RAGは、質問のたびに関連しそうな文書断片を検索し、その断片だけをプロンプトへ入れます。

一方、full-context KV cacheは、ドメイン文書全体を先にコンテキストへ読み込み、そのKV cacheを保存しておき、質問時には短い質問だけを追加して答えます。

方式 知識の入れ方 強み 弱み 向きやすい場面
RAG 質問ごとに関連chunkを検索する トークン量を抑えやすい 検索失敗、chunk境界、retriever調整が問題になる 大規模で頻繁に更新される文書群
Full-context KV cache 文書全体を先に読み込み、KV cacheを再利用する 検索漏れがなく、TTFTを短くしやすい 長文化でattention dilutionが起きる curated corpus(整理済み文書群)が短めに収まる場合
Wiki-memory 元文書を構造化Wikiへ圧縮し、cacheで参照する 知識を管理しやすく、長期運用に向く 圧縮時の事実欠落が問題になる 社内FAQ、製品仕様、ドメイン知識ベース

論文では、30本のPolicygenius記事、約67K tokensのcurated knowledgeでは、full-context KV cacheがRAGより高い平均スコアを示しています。

具体的には、5点満点の評価でfull-contextが4.38、RAGが4.08です。

また、TTFT(Time To First Token、最初のトークンが返るまでの時間)はfull-contextが0.857秒、RAGが6.277秒で、full-contextのほうが7.3倍速いと報告されています。

ただし、これは「整理済みの短めの知識」ではうまくいく、という話です。

RepLiQAのように80文書、55K〜95K tokens、17ドメインへ広げると、full-contextはattention dilutionによりRAGを下回ります。

論文では、RAGが3.64、full-contextが3.47という平均スコアになっています。

ここで自然に出てくる発想が、元文書をそのまま入れるのではなく、構造化されたWikiへコンパイルしてからcacheすることです。

論文解説

ここからは、論文の中心であるWiCERを順番に整理します。

大きな流れは、compilation gapを確認し、WiCERのCompile、Evaluate、Refineの反復ループを見て、実験結果と限界を読む、という構成です。

Compilation gap:Wiki化で重要事実が落ちる問題

Compilation gapのイメージ

元文書をWiki-memoryへ圧縮すれば、コンテキスト長を減らしつつ、構造化された知識をLLMへ渡せます。

しかし、LLMに「この文書群をWikiにまとめて」と頼むだけでは、回答に必要な細かい事実が落ちます。

これがcompilation gapです。

たとえば、保険、社内規程、製品仕様のような文書では、次のような情報が重要になります。

文書内の情報 要約で落ちやすい理由 質問応答での影響
例外条件 本文全体では細部に見える 特定ケースの回答を間違える
数値しきい値 文脈上は補足に見える 金額、期間、対象条件を間違える
条件分岐 要約時に一般則へ丸められる 「AならB、CならD」を混同する
文書間の差分 個別文書では小さい違いに見える 類似制度や類似製品を混同する

論文では、blind compilationが2.14〜2.32の平均スコアに落ち、raw full-contextの3.47を大きく下回ったと報告されています。

さらに、catastrophic failure rateは53〜60%に達しています。

これは、単なる文章要約としては読めるWikiでも、質問応答用の知識メモリとしては十分でないことを示しています。

WiCERの基本アイデア:Compile, Evaluate, Refine

WiCERの反復ループ

WiCERは、Wiki-memoryを一度作って終わりにしません。

次の3段階を反復します。

  1. Compile: 元文書からWiki-memoryを作る
  2. Evaluate: 診断用の質問でWiki-memoryを評価する
  3. Refine: 失われた事実を特定し、次のWiki作成で保持するように指示する

論文は、この考え方をCEGAR(Counterexample-Guided Abstraction Refinement、反例で抽象化を改善する手法)になぞらえています。

CEGARでは、抽象化されたモデルで見つかった反例を使って、抽象化が粗すぎた部分を修正します。

WiCERでは、Wiki-memoryが答えられなかった質問を反例のように扱い、どの事実が落ちたのかを特定します。

段階 入力 出力 役割
Compile raw documents wiki draft 長文知識を構造化して短くする
Evaluate wiki draft, diagnostic probes failure cases Wikiだけで答えられない質問を見つける
Diagnose source, failed question, wiki answer missing facts 元文書にはあるがWikiにない情報を特定する
Refine missing facts, previous wiki refined wiki 次回のWikiで重要事実を保持する

この設計の面白い点は、品質改善の単位が「要約をもっと詳しくする」ではないことです。

質問応答で落ちた事実を狙って戻すため、単に全文を長くするよりも、必要な知識を保ちやすくなります。

WiCERを簡略化した擬似コード

論文の考え方を、実装イメージとして書くと次のようになります。

完全な評価系ではありませんが、「失敗した質問から保持すべき事実を次のコンパイルへ渡す」という要点を示しています。

import logging
from dataclasses import dataclass, field

logger = logging.getLogger(__name__)


@dataclass(frozen=True)
class DiagnosticProbe:
    """Wiki-memoryの欠落を調べるための質問。

    Args:
        question: Wiki-memoryだけで答えさせる質問。
        expected_source_id: 正解根拠が含まれる元文書ID。

    Returns:
        DiagnosticProbeインスタンス。

    Raises:
        ValueError: questionが空文字の場合。

    Example:
        >>> probe = DiagnosticProbe("対象外になる条件は?", "policy_001")
        >>> probe.expected_source_id
        'policy_001'
    """

    question: str
    expected_source_id: str

    def __post_init__(self) -> None:
        if not self.question.strip():
            logger.error("empty diagnostic question: source=%s", self.expected_source_id)
            raise ValueError("question must not be empty")


@dataclass
class WicerState:
    """WiCERの反復状態を保持する。"""

    wiki_memory: str
    pinned_facts: list[str] = field(default_factory=list)


def refine_wiki_prompt(state: WicerState, failed_facts: list[str]) -> str:
    """次のWikiコンパイルで保持すべき事実をプロンプト化する。

    Args:
        state: 現在のWiki-memoryと保持済み事実。
        failed_facts: 評価で欠落していると診断された事実。

    Returns:
        LLMへ渡すRefine用プロンプト。

    Raises:
        ValueError: wiki_memoryが空の場合。

    Example:
        >>> state = WicerState("## 製品仕様\\n- 基本保証は1年")
        >>> prompt = refine_wiki_prompt(state, ["延長保証は購入後30日以内に申請する"])
        >>> "延長保証" in prompt
        True
    """
    if not state.wiki_memory.strip():
        logger.error("wiki memory is empty")
        raise ValueError("wiki_memory must not be empty")

    merged_facts = [*state.pinned_facts, *failed_facts]
    logger.info("building refine prompt with %d pinned facts", len(merged_facts))

    # 欠落事実を明示的に固定することで、次の圧縮で再び消えるのを防ぐ。
    fact_block = "\n".join(f"- {fact}" for fact in merged_facts)
    return (
        "以下のWiki-memoryを、元文書に忠実なまま更新してください。\n"
        "特に、次の事実は質問応答で必要だったため必ず保持してください。\n\n"
        f"{fact_block}\n\n"
        "現在のWiki-memory:\n"
        f"{state.wiki_memory}"
    )

実運用では、診断用プローブの作り方、失敗判定の基準、元文書からmissing factsを抽出する方法が重要になります。

論文では、単に「重要そうな事実を全部固定する」のではなく、質問応答で実際に失敗した事実をtargeted diagnosis(狙いを定めた欠落診断)で戻す点を強調しています。

実験設定:どの条件で比較したのか

WiCERの実験設定

論文では、主に2種類の文書コーパスを使っています。

コーパス 内容 規模 役割
Policygenius 保険や estate planning の編集済み記事 30記事、約67K tokens、240 QA curated knowledgeでfull-contextが強いことを確認
RepLiQA 合成された多ドメインQAベンチマーク 17 topic、1,360文書、6,800 QA scale、compilation gap、WiCERの効果を検証

モデル設定も実運用寄りです。

Llama 3.1 8B Instructを、llama.cpp上で96K context window、q8_0 KV cache、Flash Attentionで動かしています。

評価は、Claude SonnetによるLLM-as-Judge(LLMを評価者として使う方法)で1〜5点のスコアを付けています。

また、100件の人手評価でjudgeの妥当性も確認し、Pearson相関0.94、完全一致75%、1点以内一致99%と報告されています。

実験結果:WiCERは何を改善したのか

WiCERの実験結果とトレードオフ

論文の結果は、次の順番で読むと分かりやすいです。

比較 結果 解釈
curated knowledgeでのfull-context vs RAG 4.38 vs 4.08、TTFTは7.3倍速い 整理済みで短めなら、全部cacheする方式が強い
raw RepLiQAでのfull-context vs RAG 3.47 vs 3.64 長くなるとattention dilutionでfull-contextが落ちる
blind compilation vs raw full-context 2.14〜2.32 vs 3.47 Wiki化だけでは重要事実を落としすぎる
WiCER vs blind compilation +0.95、lost qualityの80%を回復 欠落診断つきの反復が効いている
generic pinning vs targeted diagnosis +0.16 vs +0.95 一般的に詳しくするより、失敗から戻すほうが有効

ここで重要なのは、WiCERがraw full-contextを常に上回ると主張しているわけではないことです。

論文の主張は、blind compilationで大きく落ちた品質を、1〜2回の反復でかなり戻せる、というものです。

平均スコアでは、WiCERが3.24、raw full-contextが3.47です。

つまり、WiCERは「品質を大きく落とさずに、Wiki-memoryという運用しやすい形へ近づける」手法として見るのが自然です。

なぜtargeted diagnosisが効くのか

blind compilationの問題は、LLMが何を落としてはいけないかを知らないまま圧縮している点です。

人間が文書をWiki化するときも、利用者から何度も質問される項目、問い合わせで誤解が多い条件、例外規定は残します。

WiCERは、この利用者質問に相当するものをdiagnostic probesとして作ります。

改善方法 何を固定するか 効き方 トレードオフ
generic pinning 重要そうな文や見出しを一般的に固定 実装は簡単 実際の質問に効くとは限らない
targeted diagnosis 失敗質問に必要だった事実を固定 回答品質に直結しやすい 評価プローブと診断処理が必要
raw full-context 元文書をすべて保持 情報欠落は少ない 長文化、attention dilution、メモリ負荷がある

WiCERは、知識ベースを「読むための要約」ではなく「質問に答えるための実行可能なメモリ」として扱っています。

この視点が、単なる要約技術との違いです。

LLMサービスや社内ナレッジへの応用

WiCERのサービス応用イメージ

WiCERの考え方は、社内FAQや製品サポートのLLMシステムと相性がよいです。

特に、次のような条件では検討する価値があります。

利用場面 WiCERが効きそうな理由 注意点
社内規程QA 例外条件や申請条件が重要 更新履歴と監査ログが必要
製品仕様QA 似た製品の差分をWikiに整理できる 古い仕様が残ると誤回答になる
サポートチャット 実際の問い合わせを診断プローブにできる 個人情報や機密情報の扱いに注意
論文・技術文書QA 長い文献をテーマ別Wikiへ整理できる 数式や表の事実欠落を検出しにくい
法務・保険・医療の補助 条件分岐と根拠参照が重要 高リスク領域では人間確認が必須

実運用で面白いのは、ユーザーから実際に来た質問を、次のRefineの材料にできる点です。

答えられなかった質問や、人間が修正した回答をdiagnostic probesとして蓄積すれば、知識ベースが利用実態に合わせて改善されます。

ただし、自動でWikiを書き換える場合は、元文書への根拠リンク、差分レビュー、公開前評価を入れないと危険です。

WiCERは「LLMに勝手に知識を作らせる」方法ではありません。

元文書にある事実を、回答に必要な形で落とさず保持するための反復フレームワークです。

よくある誤解

WiCERでよくある誤解
誤解 正確な見方
WiCERはRAGを置き換える手法である RAG、full-context KV cache、Wiki-memoryを比較し、Wiki-memoryの弱点であるcompilation gapを埋める手法である
Wiki化すれば長文問題は解決する 単純なWiki化では重要事実が落ち、blind compilationは大きく品質を落とす
要約を長くすればよい generic pinningより、失敗質問から欠落事実を戻すtargeted diagnosisが効いている
KV cacheを使えば常にRAGより良い curated knowledgeでは強いが、文書数が増えるとattention dilutionでRAGを下回る場合がある
WiCERは完全な正解保証を与える 論文は品質回復を示しているが、プローブ品質、judge、元文書品質に依存する

関連技術

WiCERと関連技術の位置づけ

WiCERは、RAG、長文コンテキスト、knowledge graph、agent memoryの中間にあります。

関連技術 目的 WiCERとの違い
RAG 質問時に関連文書を検索する WiCERは検索ではなく、事前にWiki-memoryへ知識をコンパイルする
CAG 知識をコンテキストへ事前ロードしてcacheする WiCERはcacheする知識を反復的に改善する
Knowledge Graph エンティティと関係をグラフで表す WiCERはflat wiki artifactを対象にしている
GraphRAG グラフ構造を使って検索・要約する WiCERは静的な構造化だけでなく、評価失敗から再コンパイルする
Agent Memory エージェントが経験や事実を保持する WiCERは元文書に基づくドメイン知識の保持に焦点を当てる

まとめ

WiCERのまとめと次に読む記事

WiCERは、LLMに長文知識を与える方法を、単なる検索や要約ではなく「知識をコンパイルし、評価し、改善する」問題として扱う論文です。

curated knowledgeではfull-context KV cacheがRAGより高精度かつ高速なTTFTを示しますが、文書数が増えるとattention dilutionが起きます。

そこでWiki-memoryへ圧縮したくなりますが、blind compilationでは重要事実が落ちるcompilation gapが起きます。

WiCERは、診断用質問で欠落事実を見つけ、次のコンパイルで保持することで、このgapを大きく縮めます。

個人的には、RAGの次に来る話題として「検索をどう賢くするか」だけでなく、「知識ベースをLLM向けにどう保守するか」が重要になると感じました。

社内文書、仕様書、サポートログ、研究メモのように、長期的に更新される知識を扱う場合、WiCERのcompile-evaluate-refineの考え方はかなり実務的です。

関連記事へのリンク

現時点では、以下の記事とつなげると読みやすいです。

次に読むべき記事

次に読むなら、RAG評価、長文コンテキスト、LLM memoryの3つが相性のよいテーマです。

記事案 学べること 優先度
RAG評価とは?retrieval failureと回答品質を分けて見る方法 RAGが失敗する場所を分解できる
KV Cacheとは?LLM推論でなぜ高速化できるのか WiCERの推論基盤を理解できる
Long-context LLMのattention dilutionとは? full-context方式の限界を理解できる
GraphRAGとは?Knowledge GraphとRAGを組み合わせる仕組み 構造化知識との比較ができる
Agent Memoryとは?LLMエージェントの記憶設計を整理 WiCERを長期記憶の観点で位置づけられる

コメント

タイトルとURLをコピーしました