{"notes":[{"id":"retrieval-augmented-generation/rag","category":"retrieval-augmented-generation","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"RAG","subtitle":"どうして雑巾？","author":"Z. Yuan","paperDate":"2020-05-22","publishedOn":"2026-05-17","world":"external/rag","paperTitle":"Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks","paperUrl":"https://arxiv.org/abs/2005.11401","bibliography":{"title":"Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks","authors":["Patrick Lewis","Ethan Perez","Aleksandra Piktus","Fabio Petroni","Vladimir Karpukhin","Naman Goyal","Heinrich Küttler","Mike Lewis","Wen-tau Yih","Tim Rocktäschel","Sebastian Riedel","Douwe Kiela"],"url":"https://arxiv.org/abs/2005.11401","pdfUrl":"https://arxiv.org/pdf/2005.11401v4","codeUrl":null,"preprint":{"id":"2005.11401","submittedOn":"2020-05-22","url":"https://arxiv.org/abs/2005.11401"},"publication":{"venue":"NeurIPS","year":2020,"kind":"conference","url":"https://proceedings.neurips.cc/paper/2020/hash/6b493230205f780e1bc26945df7481e5-Abstract.html"},"citation":"@misc{retrievalaugmentedgenerationrag2020,\n  title = {{Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks}},\n  author = {Patrick Lewis and Ethan Perez and Aleksandra Piktus and Fabio Petroni and Vladimir Karpukhin and Naman Goyal and Heinrich Küttler and Mike Lewis and Wen-tau Yih and Tim Rocktäschel and Sebastian Riedel and Douwe Kiela},\n  year = {2020},\n  eprint = {2005.11401},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/2005.11401}\n}\n","citationPath":"/content/papers/citations/retrieval-augmented-generation/rag.85ab2502cd0c.bib"},"thumbnail":{"src":"/content/papers/assets/05c7bcd1d2c3f13c0726dfa7180e85f043b7cd64a0c61fa595b954d979a6550e.png","width":1122,"height":358},"locale":"ja","path":"/content/papers/ja/retrieval-augmented-generation/rag.d544b05477d2.md","headings":[{"id":"問題の定義","text":"問題の定義","depth":2},{"id":"問題の解決","text":"問題の解決","depth":2},{"id":"モデル構成","text":"モデル構成","depth":3},{"id":"外部記憶wikipediaの2100万段落","text":"外部記憶：Wikipediaの2,100万段落","depth":3},{"id":"文書を確率変数として扱う","text":"文書を確率変数として扱う","depth":3},{"id":"ラベルなしで検索器はどう学ぶのか","text":"ラベルなしで検索器はどう学ぶのか","depth":3},{"id":"推論時のデコード","text":"推論時のデコード","depth":3},{"id":"考察","text":"考察","depth":2},{"id":"オープンドメイン質問応答","text":"オープンドメイン質問応答","depth":3},{"id":"jeopardyの問題生成二つの文書を組み合わせる","text":"Jeopardyの問題生成：二つの文書を組み合わせる","depth":3},{"id":"学習した検索器は役立つか","text":"学習した検索器は役立つか","depth":3},{"id":"インデックスを替えると知識が更新される","text":"インデックスを替えると知識が更新される","depth":3},{"id":"うまくいかなかった点","text":"うまくいかなかった点","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[]}],"text":"最近、「言語モデルに会社の文書を読ませる」という話をすると、たいていRAGという言葉が出てきます。\n\nその名前の出発点が、この2020年の論文です。\n\nただし、英単語のragは、もともと雑巾やぼろ布のことです。後にAI業界全体へ広まった技術の名前を直訳すると「雑巾」。なんとも言えない名前です。\n\n第一著者のPatrick Lewisも、後の[**NVIDIAのインタビュー**](https://blogs.nvidia.com/blog/what-is-retrieval-augmented-generation/)で、この響きのよくない略称について謝っています。これほど広く使われると知っていたら、もっと命名に時間をかけたはずだ、と。もともと良い名前を考えるつもりだったものの、論文を書いている間に誰も良い案を思いつかなかったそうです。\n\nそのまま名前は定着しました。\n\nChatGPT以降にRAGを知った人がこの論文を読むと、少し意外に感じるかもしれません。現在よく言うRAGは、「文章をいくつか検索し、プロンプトに貼り付け、大規模言語モデルに答えさせる」ものです。この論文のRAGは、4億パラメータのBARTを使い、検索器と生成器を一緒に学習し、検索した文書を**確率変数**として扱います。\n\n今回は、この名前が最初に指していたものへ戻ってみます。\n\n## 問題の定義\n\n2020年前後には、事前学習済み言語モデルが、パラメータの中にかなりの事実知識を記憶することが分かっていました。T5などは、参考資料を一切渡さずに質問しても、一部には正しく答えられます。\n\nこれは**closed-book**と呼ばれます。知識をすべて頭の中に入れて受ける、持ち込み不可の試験のようなものです。\n\nただし、いくつか困りごとがあります。\n\n1. **知識を更新しにくい**。世界が変わっても、パラメータ内の知識は変わらず、再学習が必要です。\n2. **根拠を示せない**。正解しても、どこで学んだ知識かは分かりません。\n3. **真顔で話を作る**。後に広く知られるようになったハルシネーションです。\n\nもう一つの道は、外部資料を持ち込ませる**open-book**です。これ以前にも、REALMやORQAが微分可能な検索器をマスク言語モデルへ接続していました。ただし対象は**抽出型質問応答**でした。答えは原文中の一節であり、モデルはその範囲を選びます。\n\n著者らが目指したのは、もっと広い用途です。\n\n- **一般的な生成モデル（seq2seq）にも検索可能な外部記憶を持たせ、同じ方法でさまざまなタスクへファインチューニングできるか？**\n\nさらに難しい条件があります。学習データには「質問」と「答え」しかなく、「どの文書を探すべきか」というアノテーションはありません。\n\nでは、検索器はどう学べばよいのでしょうか。\n\n## 問題の解決\n\n### モデル構成\n\n[![RAGの全体構成：Query Encoderで入力をq(x)へ変換し、MIPSでDocument Indexからtop-K文書を検索、Generatorへ渡して文書について周辺化する](/content/papers/assets/05c7bcd1d2c3f13c0726dfa7180e85f043b7cd64a0c61fa595b954d979a6550e.png)](/content/papers/assets/05c7bcd1d2c3f13c0726dfa7180e85f043b7cd64a0c61fa595b954d979a6550e.png)\n\n*原論文Figure 1。[**v4 PDFの2ページ**](https://arxiv.org/pdf/2005.11401v4#page=2)から抜粋。左側に三つのタスクの入力、右側に対応する出力があります。*\n\n左から右へ読みます。\n\n一番左は入力$x$です。質問（「中耳を定義せよ」）、検証する主張、あるいはJeopardyの問題を作るための答えの語（「神曲」）などが入ります。\n\n緑の枠は**検索器**$p_\\eta$です。Query Encoderが入力をベクトル$q(x)$へ変換し、Document Indexには各文書の事前計算済みベクトル$d(z)$が保存されています。MIPSがそこから関連性の高い文書$z_1,\\dots,z_4$を選びます。\n\n青い枠は**生成器**$p_\\theta$です。入力を各文書とそれぞれ連結し、回答を生成します。最後の「Marginalize」が、複数文書から得た結果を一つの予測へまとめます。\n\n上の破線には「End-to-End Backprop through **q** and $p_\\theta$」と書かれています。学習時の勾配はQuery Encoderと生成器まで伝わります。Document Indexはここに含まれていません。この点には後で戻ります。\n\n著者らは、この二つを二種類の記憶と呼びます。\n\n- **パラメトリック記憶（parametric memory）**：生成器のパラメータ、つまりBART自身が覚えた知識。\n- **ノンパラメトリック記憶（non-parametric memory）**：直接差し替えられる外部文書インデックス。\n\n### 外部記憶：Wikipediaの2,100万段落\n\n外部知識は、2018年12月版の英語Wikipediaです。\n\n各記事を重複のない100語（word）の段落へ分割し、約2,100万件の「文書」にします。文書エンコーダで各文書のベクトルを計算し、FAISSで構築したインデックスへ保存します。\n\n検索器は[**DPR**](https://arxiv.org/abs/2004.04906)（Dense Passage Retriever）です。質問用と文書用の二つのBERT-baseエンコーダを持ち、関連性を二つのベクトルの内積で表します。\n\n$$\np_\\eta(z\\mid x)\\propto \\exp\\!\\left(d(z)^\\top q(x)\\right),\\quad d(z)=\\text{BERT}_d(z),\\ q(x)=\\text{BERT}_q(x)\n$$\n\n2,100万個のベクトルから内積が最大の上位$K$件を探すのが、**MIPS**（Maximum Inner Product Search、最大内積探索）です。\n\n\n> [!TIP]\n> \n> **毎回、2,100万個すべてを計算するの？**\n> \n> その必要はありません。著者らはFAISSとHNSW（Hierarchical Navigable Small World）による近似探索を使います。先にベクトルを多層の近傍グラフへまとめ、検索時にはグラフをたどって目標へ近づきます。全ベクトルとの内積計算を省き、厳密な上位$K$件を取り逃す可能性と引き換えに、劣線形の検索時間を得ます。\n> \n> 付録によると、インデックス全体には153億個の数値があり、8ビット精度で保存することでメモリとディスクの使用量を減らせます。\n\n\n生成器は約4億パラメータのBART-largeです。入力$x$と文書$z$をつなぎ、答えを生成させます。手順自体は単純です。\n\n### 文書を確率変数として扱う\n\nここからが、この論文の中心です。\n\n学習データには「正しい文書」のラベルがありません。著者らは、文書を一つに**決めずに扱う**方法を選びます。検索された文書$z$を観測できない潜在変数（latent variable）とし、候補となる文書について重み付き平均を取ります。\n\n検索器が各文書の確率$p_\\eta(z\\mid x)$を出し、生成器がその文書を条件とした回答の確率$p_\\theta(y\\mid x,z)$を出します。両者を掛けて足し合わせると、回答の確率になります。\n\n足し合わせ方には、二つの版があります。\n\n**RAG-Sequence**：回答全体で同じ文書を使います。各文書を条件とした文全体の確率を計算してから、文書の確率で重み付けします。\n\n$$\np_{\\text{RAG-Sequence}}(y\\mid x)\\approx\\sum_{z\\in\\text{top-}k}p_\\eta(z\\mid x)\\prod_{i}^{N}p_\\theta(y_i\\mid x,z,y_{1:i-1})\n$$\n\n**RAG-Token**：tokenごとに異なる文書を参照できます。各ステップで文書について重み付けしてtokenの確率を求め、それから全tokenの確率を掛け合わせます。\n\n$$\np_{\\text{RAG-Token}}(y\\mid x)\\approx\\prod_{i}^{N}\\sum_{z\\in\\text{top-}k}p_\\eta(z\\mid x)\\,p_\\theta(y_i\\mid x,z,y_{1:i-1})\n$$\n\n違いは$\\sum$と$\\prod$の順番だけです。順番が変わると、結果はどう変わるのでしょう。\n\n小さな数値例で計算してみます。\n\n検索器が二つの文書を見つけ、doc1に0.6、doc2に0.4の確率を与えたとします。答えは二つのtokenです。\n\n- doc1を条件とすると、生成器は第1 tokenに0.9、第2 tokenに0.2を与える。\n- doc2では逆に、第1 tokenが0.3、第2 tokenが0.8になる。\n\nつまり、答えの前半に必要な情報はdoc1、後半はdoc2にあります。\n\n```python\n# 検索器が二つの文書に与える確率\np_z = {\"doc1\": 0.6, \"doc2\": 0.4}\n\n# 各文書を条件として、生成器が二つの回答tokenに与える確率\np_y = {\n    \"doc1\": [0.9, 0.2],  # 第1 tokenはdoc1に沿うが、第2 tokenはそうではない\n    \"doc2\": [0.3, 0.8],  # 逆の関係\n}\n\n# RAG-Sequence：文全体で同じ文書を使い、その後に文書について重み付け\nseq = sum(p_z[z] * p_y[z][0] * p_y[z][1] for z in p_z)\n\n# RAG-Token：tokenごとに文書について重み付けし、その後に掛け合わせる\ntok = 1.0\nfor i in range(2):\n    tok *= sum(p_z[z] * p_y[z][i] for z in p_z)\n\nprint(f\"RAG-Sequence: {seq:.4f}\")\nprint(f\"RAG-Token:    {tok:.4f}\")\n\n# RAG-Sequence: 0.2040\n# RAG-Token:    0.2904\n```\n\nRAG-Sequenceでは、一つの文書で回答全体を支える必要があります。doc1は前半を支えられても後半は苦手で、doc2はその逆です。どちらも確率が下がります。\n\nRAG-Tokenなら、第1 tokenは主にdoc1、第2 tokenは主にdoc2を使えるので、この「組み合わせた」答えの確率が高くなります。\n\n後のJeopardyの問題生成でRAG-Tokenが良い結果を出す理由もここにあります。実際の例は考察で見てみましょう。\n\n\n> [!NOTE]\n> \n> **分類タスクでは？**\n> \n> 事実検証の「支持」「反駁」「情報不足」など、分類ラベルを長さ1の答えとして扱う場合、tokenは一つです。$\\sum$と$\\prod$の順番による違いはなくなり、二つのRAGは同じになります。\n\n\n### ラベルなしで検索器はどう学ぶのか\n\n学習目標は単純です。正解の周辺確率を最大化する、つまり$-\\log p(y\\mid x)$を最小化します。\n\n式をもう一度見ると、和の中に$p_\\eta(z\\mid x)$があるため、そこへ勾配が伝わります。ある文書によって生成器が正解を出しやすくなるなら、その文書の確率を上げることで全体の周辺確率も上がります。学習を通じて、検索器は役立つ文書に高いスコアを付けるようになります。\n\nどの文書が正しいかを教わらなくても、どの文書が役立ったかから学べるのです。\n\nただし、更新するのは**質問エンコーダ**$\\text{BERT}_q$とBARTだけで、**文書エンコーダとインデックスは凍結**します。\n\n理由は実務的です。文書エンコーダを変えると、2,100万文書のベクトルを再計算してインデックスを再構築する必要があります。REALMは事前学習時に定期的な再構築を行いますが、著者らは、それを省いても十分な成績を得られると判断しました。\n\n\n> [!TIP]\n> \n> **「検索器をエンドツーエンドで学習する」の範囲**\n> \n> RAGが検索器をエンドツーエンドで学習すると紹介されることがあります。正確には、学習で更新されるのは質問側です。文書側はDPRで初期化した後、変更しません。また、DPR自体はNatural QuestionsとTriviaQAの検索ラベルで学習済みです。著者らも結果の節で、この点を明記しています。\n\n\n### 推論時のデコード\n\nRAG-Tokenは各ステップで次のtokenの確率を計算できるため、通常のbeam searchにそのまま使えます。\n\nRAG-Sequenceは少し複雑です。文全体の確率をtokenごとの確率へ分解できません。各文書についてbeam searchを実行して候補回答を集め、各候補について他の文書を条件とした確率も追加計算し、最後に重み付き和を取ります。これが「Thorough Decoding」です。\n\n候補が増えると追加の順伝播が高くつくため、近似版の「Fast Decoding」も用意します。ある文書のbeamに現れなかった候補は、その文書の下では確率0とみなし、追加計算を省きます。\n\n## 考察\n\n### オープンドメイン質問応答\n\n評価対象はNatural Questions（NQ）、TriviaQA（TQA）、WebQuestions（WQ）、CuratedTrec（CT）の四つです。指標は、答えが完全一致する割合、Exact Matchです。\n\n[![原論文Table 1：closed-bookのT5、open-bookのREALMとDPR、RAG-TokenとRAG-SequenceのNQ・TQA・WQ・CTでのスコア](/content/papers/assets/e4210dd8d6a0578d12df7e28472ad4aec7137a2aa87c895aad1e7044d0bfcdd6.png)](/content/papers/assets/e4210dd8d6a0578d12df7e28472ad4aec7137a2aa87c895aad1e7044d0bfcdd6.png)\n\n*原論文Table 1。[**v4 PDFの6ページ**](https://arxiv.org/pdf/2005.11401v4#page=6)から抜粋。TQAの左列は標準のオープンドメインテスト、右列はTQA-Wikiです。*\n\n表は三つに分かれています。上がclosed-bookのT5、中段がopen-bookのREALMとDPR、下がRAGです。\n\nNQではRAG-Sequenceが44.5、closed-bookのT5-11Bが34.5です。\n\nパラメータ数も見ておきましょう。T5-11Bの学習可能パラメータは110億です。RAG全体は約6.26億で、二つのBERT-baseが各1.1億、BARTが約4億です。ただし文書エンコーダは実際には学習しません。付録によると、規模が近いT5-large（7.7億）のNQスコアは28.9でした。\n\nもう一つの比較対象であるDPRの質問応答システムは、cross-encoderによる再順位付けと抽出型readerも使います。RAGはどちらも使わず、NQで3ポイント上回ります。\n\n生成型には、抽出型にはない利点もあります。文書に手がかりだけがあり、答えの文字列そのものがなくても、正解を生成できる可能性があります。NQで、検索したどの文書にも正解が含まれない問題のうち、RAGは11.8%に正解しました。この条件で抽出型モデルの正解率は必ず0%になります。\n\n### Jeopardyの問題生成：二つの文書を組み合わせる\n\nJeopardyは米国のクイズ番組で、答えを渡して、それに対応するヒント文を作るという独特の形式です。答えが「The World Cup」なら、「1986年、メキシコはこの国際大会を2度開催した最初の国になった」といったヒントです。\n\nヒント文には複数の事実が含まれることが多く、RAG-Tokenの組み合わせ能力を試せます。下図は「Hemingway」を入力し、五つの文書を検索したとき、各tokenの生成にどの文書が役立ったとモデルが判断したかを示します。\n\n[![Hemingwayを入力したJeopardy問題生成で、RAG-Tokenの各tokenに対する五つの文書の事後確率ヒートマップ](/content/papers/assets/bc3d0fd74e0299ec9fc8eae15768959cef1e43472643f9449c1f7002164a42db.png)](/content/papers/assets/bc3d0fd74e0299ec9fc8eae15768959cef1e43472643f9449c1f7002164a42db.png)\n\n*原論文Figure 2。[**v4 PDFの7ページ**](https://arxiv.org/pdf/2005.11401v4#page=7)から抜粋。横軸は生成token、縦軸は五つの検索文書で、濃い色ほど事後確率が高くなっています。*\n\n左には二つの文書が示されています。Document 1は『武器よさらば』（A Farewell to Arms）、Document 2は『日はまた昇る』（The Sun Also Rises）に言及しています。\n\n右のヒートマップを見ると、「Sun」の生成時にはDoc 2の行が特に濃く、「A」を生成して「A Farewell to Arms」を書き始めると、Doc 1が最も濃くなります。\n\n先ほどの手計算と同じです。一文の前後を、異なる文書が支えています。\n\nさらに面白いのは、書名の最初のtokenが出た後、色が薄くなることです。著者らは、その先はBART自身が補えると解釈しています。検索なしのBARTに「\"The Sun」だけを与えると、実際に書名の続きを生成しました。検索した文書が方向を示し、パラメータ内の知識が続きを書く。二種類の記憶の協力です。\n\nBARTとRAG-Tokenが作った452組の問題を人手で比較すると、BARTの方が事実に正確とされた割合は7.1%、RAGの方が正確とされた割合は42.7%でした（原論文Table 4）。\n\n### 学習した検索器は役立つか\n\n著者らは、検索器を凍結する場合と、BM25のキーワード検索に置き換える場合を比較しました。\n\nNQ開発セットのRAG-Sequenceでは、次の結果です（Table 6）。\n\n1. **BM25へ置換**：31.8。\n2. **検索器を凍結**：41.2。\n3. **共同学習**：44.0。\n\n学習した検索器は、質問応答で大きく役立っています。\n\nただし、FEVERの事実検証は例外です。BM25の3クラス分類精度は75.1で、学習した検索器の74.5を少し上回ります。著者らは、FEVERの主張には特定の実体に関するものが多く、名前が一致すれば見つかるため、キーワード照合に向いていると推測しています。\n\n### インデックスを替えると知識が更新される\n\n外部記憶の役割が最もよく分かる実験です。\n\n著者らは2016年12月のWikipediaでもインデックスを構築しました。そして2016年から2018年の間に交代した世界の指導者82人分を用意し、「Who is {position}?」という形式、例えば「Who is the President of Peru?」で質問します。\n\n| インデックス | 2016年の指導者を質問 | 2018年の指導者を質問 |\n| --- | ---: | ---: |\n| 2016年のインデックス | 70% | 4% |\n| 2018年のインデックス | 12% | 68% |\n\n*原論文§4.5をもとに整理。*\n\nインデックスと質問の年が一致すると約7割正解し、一致しないと1桁台か1割強へ落ちます。\n\nモデルのパラメータは一つも変更せず、外部記憶だけを替えると答えも変わりました。closed-bookモデルにはできないことです。\n\n### うまくいかなかった点\n\n1. **検索件数を増やせばよいとは限らない**。NQではRAG-Sequenceはテスト時の文書数を増やすと改善しますが、RAG-Tokenは10件前後でピークを迎えます。\n2. **検索が崩壊することがある**。付録の物語生成などの初期実験では、入力にかかわらず同じ文書群を返す検索器になりました。生成器は文書を無視するようになり、全体が普通のBARTへ戻ります。著者らは、事実知識の必要性が弱いか、答えが長すぎて検索器へ届く勾配が役立ちにくい可能性を挙げています。\n3. **Wikipediaでは答えられない質問もある**。MS-MARCOには「カリフォルニア州Volcanoの今の天気は？」という質問があります。このような検索の恩恵を受けにくい問題で、モデルは決まった文書群を返していました。\n\n## 結論\n\nこの論文は、事前学習済み生成モデルに検索可能な外部記憶を接続し、同じ方法で質問応答、問題生成、事実検証へファインチューニングしました。\n\n特に説得力があるのは、次の点です。\n\n1. **小さなモデルと外部記憶で、はるかに大きなclosed-bookモデルに勝つ**。NQでは6.26億パラメータのRAG-Sequenceが44.5、110億のT5-11Bが34.5です。\n2. **検索すべき文書のラベルが不要**。文書を潜在変数として周辺化すると、検索器は回答の確率から何を探すべきか学べます。\n3. **インデックスの交換で知識を更新できる**。2016年版と2018年版を入れ替えると、パラメータを変えずに指導者の答えが変わります。\n\n現在のRAGにも、「先に検索して文書を生成器へ渡す」「外部記憶を交換できる」という二つの考えは残りました。一方、検索器と生成器の共同学習や文書についての周辺化は、プロンプトへの貼り付けを中心とする後のLLM応用では少なくなりました。モデルが大きくファインチューニングしにくくなり、検索器にも既成のembeddingモデルや検索エンジンが使われるようになったためです。\n\nここは、その後の発展についての整理です。原論文が提案した範囲は、先ほど見た構成です。\n\n名前だけは、ずっとそのままです。\n","imageSizes":{"/content/papers/assets/05c7bcd1d2c3f13c0726dfa7180e85f043b7cd64a0c61fa595b954d979a6550e.png":{"width":1122,"height":358},"/content/papers/assets/e4210dd8d6a0578d12df7e28472ad4aec7137a2aa87c895aad1e7044d0bfcdd6.png":{"width":561,"height":375},"/content/papers/assets/bc3d0fd74e0299ec9fc8eae15768959cef1e43472643f9449c1f7002164a42db.png":{"width":1122,"height":210}}}
