人工知能入門:RAG
今週は、RAG(Retrieval-Augmented Generation)について解説します。LLM(大規模言語モデル)は、大量のテキストデータを学習データとして与えたニューラルネットであるため、単に優れた言語能力を持つだけではなく、大量の知識も保有しています。人工知能の研究者の中には、ニューラルネットの学習プロセスとは、データの圧縮以外の何物でもない、と指摘する人すらいます。
そのため、LLMは、学習データに含まれる事柄について質問されると、正しい答えを返して来ますが、そうでない場合には、答えられなかったり、出鱈目な答えを返して来ます。学習データには含まれない、新すぎる情報だとか、企業内部に保管されていて一般には公開されいない情報などです。
そんなケースに使われるのが、RAG(Retrieval-Augmented Generation)です。
一般的に、RAGは、
1. 汎用的なLLM
2. LLMが知らない情報
3. その情報に関するユーザーからの質問
の三つがある際に、そこからユーザが必要としている質問への答えを導き出す時に使われる手法です。
1のデータが小さい場合には、LLMに渡すプロンプトに全てのデータを含めた上で、「このデータに基づいて以下の質問に答えてください」のように指示をすれば、LLMは良い仕事をしてくれます。
しかし、プロンプトのサイズには限界があるため、なんらかの仕組みを使って、1のデータの中から質問に関連する部分だけを抜き出して(retrieveして)プロンプトの一部として渡し、LLMに答えさせるのが、RAGです。
イメージとして、一度も勉強したことがないジャンルの試験を受ける際に、質問ごとにその質問のトピックに関連する教科書のページが数ページ、カンニングペーパーとして渡されるところを想像しても良いと思います。LLMは、こんな風に、その場でプロンプトの一部として与えられた知識に基づいた回答をすることが得意で、"Context Learning"とも呼ばれます。
上に、「なんらかの仕組みを使って、1のデータの中から質問に関連する部分だけを抜き出して」と書きましたが、ここではさまざまなテクニックが使われます。通常の文字列検索も可能ですが、それだと一字一句一致する必要があるため、必ずしも良い結果が得られません。
広く使われているのは、2ヶ月ほど前にこのメルマガで解説したEmbedding Vectorを活用した、セマンティック・サーチ(意味的検索)です。あらかじめ、データを複数のチャンク(塊)に分解し、それぞれのEmbedding Vectorを求めて専用のデータベースに格納しておき、ユーザーから質問が与えられると、そのEmbedding Vectorを求めた上で、そのEmbedding Vectorと近いチャンク(意味的に似通っているもの)を見つけ出して、それらをプロンプトに嵌め込むのです。
ちなみに、Embeddingsを活用したセマンティック・サーチをさらに改良しようとする試みも行われています。Microsoft Rearchが最近になって発表した「GrapRAG」は、その一つで、あらかじめデータをKnowledge-Graphの形にまとめて置き、データを取り出す際には、それを利用するというテクニックです。
【追記】Embedding Vectorについて解説したのは5月14日号ですが、そこまで遡っていただくのも大変なので、Noteに「人工知能入門:Text Embedding Vector、「似ている言葉」の話」として公開ました。