RAGとは?資料を検索してからAIに答えさせる仕組み

社内の規程やマニュアルについてAIに聞いても、AIはその中身を知りません。学習したデータに含まれていないためです。かといって、資料を毎回すべて貼り付けるのは手間がかかります。
そこで使われるのが、関係する部分だけを検索してAIに渡すRAGという仕組みです。本記事では、RAGを提案した論文と、AIの開発元の資料をもとに、その仕組みを解説します。
RAGとは
RAG(Retrieval-Augmented Generation、検索拡張生成)は、質問に関係する資料を検索し、それを読ませてからLLMに答えさせる仕組みです。
利用者が質問すると、まず手元の資料の中から、質問に関係する部分を探します。見つかった部分を質問と一緒にLLMに渡し、LLMはそれを読んで答えを作る流れです。答えのもとになった資料が分かっているため、出典を示すこともできます。
学習した知識だけに頼らず、渡された資料をもとに答えるので、もっともらしい誤り(ハルシネーション)を減らす方法としても有効です。
生まれた背景
RAGという名前は、2020年に発表された論文で使われました。
この論文は、学習で身に付けたモデルの中の知識には、正確に取り出して使う力に限りがあると指摘しました。知識を新しくすることや答えの根拠を示すことも、課題に挙げています。そこで、モデルの中の知識に、検索で取り出せる外の資料(この論文ではWikipedia)を組み合わせたのです。論文によると、この方法では、より具体的で事実に沿った文章を作れました。
外の資料は、差し替えればすぐに新しくなります。モデルを学習し直さなくても、最新の規程や新製品の情報で答えられる点が、RAGの利点です。
資料を小分けにして、意味で探す
RAGでは、質問のたびに資料をすべて読むのではなく、前もって探しやすい形に整えておきます。
準備の段階では、資料を小さなまとまり(チャンク)に分けます。それぞれを、意味を表す数値の並び(埋め込み、ベクトル)に変えて保存しておくのが一般的です。OpenAIのドキュメントでは、初期設定で800トークンずつに分け、前後を400トークン重ねていました。
質問が来たら、質問も同じように数値の並びに変え、意味の近い小分けを探して、上位のものをLLMに渡します。意味で探すので、質問と資料で言葉がほとんど一致しなくても、関係する部分を見つけられるのが特徴です。Anthropicの技術記事は、これに言葉の一致で探す昔ながらの検索を組み合わせると、エラーコードのような特定の文字列も見つけやすくなると説明していました。
使うときの注意
RAGを使っても、答えが必ず正しくなるわけではありません。
まず、検索で関係する部分を取りこぼすことがあります。Anthropicの技術記事は、資料を小分けにすると前後の文脈が失われ、たとえば「売り上げが3%伸びた」という一文だけでは、どの会社のいつの話か分からなくなる問題を挙げていました。検索した部分の中身が古かったり、誤っていたりすれば、AIの答えもそのまま誤ります。
また、読ませた資料に悪意のある指示が紛れていると、AIがそれに従ってしまうかもしれません。プロンプトインジェクションと呼ばれる攻撃です。大事な判断に使うときは、示された出典を開いて確かめましょう。
資料が少ないなら、RAGを使わずに済む場合もあります。Anthropicの技術記事は、資料が20万トークン(約500ページ)より少なければ、全部をプロンプトに入れればよいとしていました。いまのAIは一度に読める量(コンテキストウィンドウ)が大きくなったため、まず全部を渡してみて、収まらないときにRAGを考える、という順番が手軽です。
製品での使われ方
AIの開発元は、RAGを組み立てる部品をAPIで提供しています。OpenAIのAPIでは、ファイルを入れると自動で小分けにして保存し、意味で探せるようにする機能がありました。
チャットのAIがWeb検索の結果を読んでから答える仕組みも、検索してから答えるという点で、RAGと同じ考え方です。学習の締め切り(ナレッジカットオフ)のあとの情報を補う方法としても使われています。