📖

RAG を「In-Context Learning」と呼ぶかは微妙という話

2024/01/23に公開

RAG という手法を「In-Context Learning」と呼んでいる例を見かけますが、それは少し違うかも?ということをまとめておきます。

結論

まず結論として、In-Context Learning という言葉は、元来 Few-shot プロンプティングと同じ意味です。 そのため、RAG を In-Context Learning と呼ぶかはちょっとあやしいです。

前提知識

本題に入る前に、RAG と Few-shot プロンプティングについて簡単に説明しておきます。

RAG とは

LLM を使ったアプリケーション開発で注目されている手法のひとつが RAG (Retrieval Augmented Generation) です。

RAG を簡単に説明すると、文書をベクトル化してベクターストアに保存しておき、ユーザの入力に関係するものをベクトル検索してプロンプトに含めて使う、という手法です。[1]

RAG では以下のようなプロンプトを作成することになります。

以下の文脈を踏まえて質問に回答してください。

{context}

質問: {question}
回答:

Few-shot プロンプティングとは

Few-shot プロンプティングというのは、プロンプトエンジニアリングの定番の手法のひとつです。プロンプトにいくつかのデモンストレーション (質問と回答のペア) を含めることで、言語モデルにねらい通りの出力をさせる手法です。

たとえば ChatGPT に バナナの色は? と聞くと バナナの色は基本的に黄色ですが... などとこちらの期待と異なる長文で回答してきます。以下のように Few-shot プロンプティングを使うと、単に 黄色 と答えさせることができます。

Question: りんごの色は?
Answer: 赤
Question: メロンの色は?
Answer: 緑
Question: バナナの色は?
Answer:

本題

ここからが本題です。

「In-Context Learning」という言葉は、その言葉のひびきだけを考えると、コンテキストにもとづいて回答させる「RAG」という手法を指すようにみえるのではないでしょうか?しかし、元来そういった言葉ではないのです。

In-Context Learning とは

In-Context Learning について調査した論文「A Survey on In-context Learning」には、その定義が次のように書かれています。

In-context learning is a paradigm that allows language models to learn tasks given only a few examples in the form of demonstration.

https://arxiv.org/abs/2301.00234

日本語にすると、次のようになります。

In-Context Learning は、デモンストレーションの形式でいくつかの例を与えられたときに言語モデルがタスクを学習するというパラダイムです。

つまり、In-Context Learning は、Few-shot プロンプティングと同じ意味だということです。

「なぜ In-Context Learning という言葉がそんな意味になるんだ?」と疑問に思うかもしれません。ここから、その背景を説明していきます。

もともとの Few-shot Learning とは

ポイントは、プロンプトエンジニアリングではなく、モデルの学習の手法としての 「Few-shot」にあります。

LLM が流行する以前から、機械学習モデルの学習には「Few-shot Learning」という手法があります。これはその名の通り、少ない学習データでモデルに学習させる、という手法です。

通常、機械学習のモデルに何かを教えるときは、「学習」という処理をします。その学習データが少ない場合「Few-shot Learning」と呼ぶ、ということです。

それに対して、プロンプトにいくつかデモンストレーション (質問と回答のペア) を入れることで言語モデルに「学習したかのように」動作させる手法が「Few-shot プロンプティング」です。

なぜ Few-shot プロンプティングを In-Context Learning と呼ぶのか

このように、「Few-shot」と呼ばれる手法は 2 つあるのです。

  • 少数の学習データからモデルに学習させる「Few-shot Learning」
  • プロンプトにデモンストレーションを入れる「Few-shot プロンプティング」

これらは Few-shot のデータ (質問と回答のペア) の用途が違います。

プロンプト (= context) に学習データのようにデモンストレーションを入れるのは、まるでプロンプト (= context) から学習しているようだと考えられますよね?だから「Few-shot プロンプティング」を「In-Context Learning」とも呼ぶ、ということです。

まとめ

最後にまとめです。

In-Context Learning という言葉は、元来 Few-shot プロンプティングと同じ意味です。そのため、RAG を In-Context Learning と呼ぶかはちょっとあやしいです。

ただ、言葉の定義というのはどうしても変化していくものでもあります。実際に「RAG は In-Context Learning とも呼ばれる」と解説している Web サイトも少なくありません。

個人的にどちらが正しいと主張するつもりはありませんが、少なくとも 2 つの意味で使われていることは意識したほうが良いと思います。とくに In-Context Learning という言葉が Few-shot プロンプティングを指すことは、知らないとなかなか考えつかないと思うので、頭の片隅に置いておくとよいと思います。

また、途中で少しふれましたが、Few-shot Learning という言葉も、プロンプトエンジニアリングの手法を指す場合もあれば、モデルの学習の手法を指す場合もあるのでご注意ください。

脚注
  1. RAG という手法も元来もう少し違うものですが、最近は事実上このような手法が RAG と呼ばれています。 ↩︎

Discussion