3行でいうと

  • RAGは「資料を小さく切る→意味の数値にして保存→質問に近い部分を探す→AIに渡す」の流れ。
  • 決めどころは、チャンクの大きさと重なり、検索の方式、渡す件数、並べ替えの有無、引用の出し方。
  • Anthropicの試験では、検索の取りこぼしを、文脈の付与と並べ替えで約3分の1に減らせた(5.7%から1.9%)。
  • 資料が少量なら、RAGを使わず全文を入れる手もある。ただし長くなると精度が落ちる研究もある。

この記事は、実際に使って確かめた記録ではありません。この記事は公式の文書や論文を読んでまとめたものです。

先に結論

前提:RAGと用語

全体の流れ

Anthropicの記事(2024年9月19日)は、RAGの標準的な流れを次のように説明しています。

  1. 資料(コーパス)を、通常は数百トークン以下のチャンクに分ける。
  2. 埋め込みモデルで、各チャンクをベクトルにする。
  3. ベクトルデータベースに保存する。
  4. 質問が来たら、質問に意味が近いチャンクを探す。
  5. 見つかったチャンクを、AIへの入力に足す。

この記事では、これを「分ける(1〜3)」「探す(4)」「絞る(4の後)」「引用する(5と出力)」の4段に分けて、段ごとの決めどころを見ます。

第0段:そもそもRAGが要るか

Anthropicの記事は、知識ベースが20万トークン未満(約500ページ)なら、RAGなしで全体をプロンプトに入れてよい、と書いています。プロンプトキャッシュ(同じ前置きを安く読む仕組み)と組み合わせると、速くて安い、とも述べています。これは2024年当時の記述で、当時のClaudeの入力が20万トークンだったことが背景にあると思います(僕らの読みです)。

見立てです。今は100万トークンのモデルが増えました。ただし、長い入力では精度が落ちうることが、論文や公式文書で報告されています(別記事「長いコンテキストの実力」)。「入るからRAGは不要」とは限らず、資料の量、更新の頻度、費用、必要な精度で決めるのが現実的です。

第1段:分ける(チャンク)

ここで決めるのは次の3つです。

決めること 公式資料に書かれていること
大きさ OpenAIのベクトルストア(Retrievalの文書)の既定は1チャンク800トークン、重なり400トークン。大きさは100〜4096の範囲で、重なりは大きさの半分以下。Googleの文書の例は、1チャンク200トークン、重なり20トークン(コード例の設定値で、既定値は読んだ範囲では書かれていませんでした)。Anthropicの記事は「通常は数百トークン以下」で、試算の例は800トークン
重なり 隣り合うチャンクの重複。切れ目で意味が分断されるのを減らす。OpenAIの既定は大きさの半分
切れ目 Anthropicの記事は、大きさ・切れ目・重なりが検索の性能に影響しうる、と注意している

最適な値は資料によって違い、公式資料に「これが正解」という数字はありません。OpenAIやGoogleの値は、あくまで既定値や例です。

チャンクが文脈を失う問題。 Anthropicの記事は、従来のRAGの弱点として、チャンクだけを見ても、何の話か分からないことを挙げています。例として、「その会社の売上は前の四半期から3%伸びた」というチャンクは、どの会社のいつの話か書かれていないので、質問「ACME社の2023年第2四半期の売上の伸びは」に結びつけにくい、と説明しています。

文脈つき検索(Contextual Retrieval)。 各チャンクの前に、全体の中での位置づけを説明する短い文を足してから、埋め込みと検索の索引を作る方法です。説明文はClaudeに書かせ、通常50〜100トークンです。Anthropicの記事によると、文書全体をキャッシュしておくことで、費用は100万文書トークンあたり1.02ドル(800トークンのチャンク、8千トークンの文書などの仮定。当時の条件)でした。ただし、一般的な文書要約をチャンクに足す方法は、得られる改善が限られていた、とも書かれています。

メタデータ。 OpenAIの文書は、ファイルに属性(メタデータ)を付けて、検索結果を絞り込めると説明しています。Googleのファイル検索も、ファイルに任意のメタデータを付けられます。

第2段:探す(検索の方式と件数)

日本語の場合、キーワード検索には単語の切り方(分かち書き)が関わります。Elasticsearchには、日本語用の分析プラグイン(kuromoji)と、空白で区切らない言語向けのn-gram(文字を一定の長さで重ねて切る方法)の機能があります。どれが良いかは、資料と質問で変わると思います(見立てです。この点を比べた研究は読んでいません)。

第3段:絞る(並べ替え)

検索で数十〜数百件を取り、並べ替えのモデルで本当に関係の深い上位だけを残す方法があります。Anthropicの試験では、上位150件を取り、並べ替えて、上位20件を渡しました。効果と仕組みは別記事で扱います。並べ替えは追加の処理なので、遅延と費用が少し増える、とAnthropicも書いています。

第4段:渡して引用する

設定を見るときの目安(見立てです)

見立てです。以下は、読んだ資料から組み立てた確認項目です。

症状 まず疑う段
資料にあるはずの答えが出ない 第1段(分け方、文脈の欠落)、第2段(検索方式、件数)
固有名詞や型番が見つからない 第2段(キーワード検索の不足)
関係ない内容が混ざる 第3段(並べ替え)、第2段(しきい値、メタデータ)
出典が示せない/確かめられない 第4段(引用の仕組み)
費用が高い 件数、チャンクの大きさ、並べ替えの数、キャッシュ

つまずきやすい点

気をつけること

出典

更新履歴