RAG (Retrieval Augmented Generation) の概要
概要
本記事ではRAG (Retrieval Augmented Generation / 検索拡張生成)
の仕組みについてまとめた記事です。RAGの概要/仕組みがざっくりと分かることを目的にしています。
RAGとは?
RAGとは、質問に対して事前に用意したデータをLLMが利用し、質問者が欲しい最適な回答を生成するための手法です。事前に用意したデータに対して「検索(Retrieval)」と「生成(Generation)」を組み合わせたようなものです。
通常のLLMは、学習に用いられた世の中の公開情報についてしか答えることが出来ません。でも、RAGを使えば、外部の知識ベースをリアルタイムで検索し、その内容を参考に回答を生成することが出来ます。例えば社内だったりカスタマーサービスなど、ローカルな問題や特定の領域に特化した正確な回答をすることが求められる分野で需要があります。
ということで、簡単に言うとローカルな特定用途向けのチャットボットを作るために利用されます。
RAGがなぜ必要か?
ChatGPTだったり、llama3などの公開されているLLMを利用した場合、事前に学習したデータの範囲内でしか解凍することが出来ません。しかし、社内などで特定のデータを利用したいなどの場合においては、世の中で提供されているLLMでは対応することが出来ません(知らない知識については回答することが出来ない)。
また、LLMの学習には一般的に大量の計算リソースと時間が必要になります。そのため、追加データを独自に追加した学習済みLLMを作ること自体がハードルが高いです。
一方でRAGの場合は、全体を再学習する必要はなく、追加になる新しいデータだけをRAGの手法で取り込んで参照すれば良いだけのため、データの更新自体が非常に楽でコストがかかりません。
ということで、RAGならLLMが動くリソース(GPU)さえあれば比較的簡単に(精度を上げる課題はあるが)出来る感じです。
別手法のファインチューニング
特定用途向けのチャットボットを作る場合には、RAG以外にもファインチューニング
という手法があります。ファインチューニングとは、公開されている学習済みLLMに対して、独自データを追加してトレーニングするという手法です。
しかし、これの一番の問題点は前述の通り大量のリソースと時間が必要になることと、新しいデータが追加された場合に再度トレーニングが必要になる点です。また、この手法で学習しても思ったように回答精度があまり上がらないことがあったりするらしく、またその場合に解析して精度を向上させるのが困難だったりするという課題もあります。
RAGの流れ
以下がRAGの最もシンプルな構成の場合の流れです。ただし、実際には回答精度を高めるための工夫が必要になり、もう少し複雑な構成になります。
1. 参照データ(ドキュメント)を事前に用意
学習させたい(インプットしたい)ドキュメントを事前に検索しやすい形式のベクトル
に変換し、データベース(ベクタストア
, ベクタデータベース
などと言ったります)に格納しておきます。
なお本記事では、ベクトルという表現で統一しますが、正確にはDNNなどを用いて目的に沿った形のベクトルのことを埋め込み (Embedding)
と言います。
2. 質問(クエリ)を受け、関連ドキュメントを検索
ユーザーからの質問を受け取り、それをベクトルに変換し、事前にベクトル化して保存しておいたドキュメント群から、質問に関連のある情報を取得します。
3. LLMが回答を生成
LLMに検索結果と質問を与え、自然な文章で回答を生成します。
Discussion