はじめに
現在、エンジニアとしてRAG(Retrieval-Augmented Generation)システム開発の案件が非常に多くなっています。
AIエンジニアとしての仕事のほとんどはRAGシステムの構築であり、クラウドサービスを活用することで、以前と比べてかなり構築しやすい環境が整ってきています。
今後もRAGの案件はさらに増えていくことが予想されるため、今回は初心者の方にもわかりやすいようにまとめてみました。
RAGとは?
通常のChatGPTなどのLLMは、インターネット上の情報・書籍・その他一般公開されている情報をもとに学習されています。
そのため、企業内の機密情報や社内でクローズドになっている情報に対しては、精度の高い回答を生成することができません。
RAGシステムを活用することで、こういった社内情報などをもとにLLMが回答を生成できるようになります。ユーザーが質問を投げかけた際に、社内のクローズドな情報を参照しながら適切な回答を返すことを目的としたシステム、それがRAGです。
RAGを導入することで得られる主なメリットは以下の通りです。
ハルシネーションのリスクを軽減できる
外部の信頼できるデータソースを参照して回答を生成するため、LLMが「もっともらしい嘘」をついてしまうリスクを抑えられます。
常に最新情報に基づいた回答ができる
LLMの学習データには知識のカットオフがありますが、RAGは外部DBを更新するだけで最新情報を反映できます。
回答の根拠が明確になり、信頼性が上がる
どのドキュメントを参照したかが追跡できるため、回答の説明可能性が向上します。問題が発生した際の原因特定もしやすくなります。
RAGの流れ
RAGの処理は大きく2つのフェーズに分けられます。
① データ準備フェーズ(インデックス化)
データソースから取得したデータをチャンク(小さな単位)に分割し、それをベクトル化してベクトルDBに格納するフェーズです。
② 回答生成フェーズ(検索・生成)
ユーザーが質問を投げかけると、その質問をベクトル化し、ベクトルDBから関連性の高い情報を検索・取得します。その情報をもとにLLMが回答を生成し、ユーザーに返すフェーズです。
データ準備フェーズ(インデックス化)
データソースにあるデータをベクトル化する際、単純にそのままベクトル化するのではなく、まずデータを「1内容1チャンク」となるように適切な単位で分割します。
分割したチャンクをembeddingモデルを使ってベクトル化し、ベクトルデータベースに格納します。
embeddingモデルの有名なものとしては、Cohere社のEmbeddingモデルなどがあります。
この工程によって、ベクトルデータベース内に「チャンク」と「それに紐づくベクトル」の対応関係が保存された状態になります。この対応関係は、後述の回答生成フェーズで関連チャンクを抽出する際に活用されます。
回答生成フェーズ(検索・生成)
まず、ユーザーの質問をembeddingモデルを使ってベクトル化します。
次に、そのベクトルとベクトルデータベース内に格納されているベクトルを比較し、意味的に近いベクトルを抽出します。
抽出されたベクトルに対応するチャンクを取得し、ユーザーの質問とそのチャンクをセットでLLMに投げます。LLMとしては Claude、Gemini、OpenAIのモデルなどが代表的な例として挙げられます。
LLMから返ってきた回答を最終的にユーザーへ返すことで、一連の処理が完了します。
ここで重要なのは、RAGはあくまでも業務知識をモデルに学習させているわけではないという点です。社内情報などの業務知識をチャンクとして取得し、それをLLMへのプロンプトとして渡すことで、LLMがその情報をもとに回答を生成しています。つまり、ユーザーが受け取る回答は、モデルが自ら学習した知識ではなく、社内データを参照した上でLLMが生成したものです。
① プロンプト投げ : ユーザーがオーケストレーションツールに向かってプロンプトを投げます
② 類似ベクトル検索 : ユーザーの質問をエンベディングモデルでベクトル化し、ベクトルデータベースに対して類似ベクトルの検索をかけます
③ チャンク取得 : ベクトルデータベースから類似ベクトルに紐づくチャンクをオーケストレーションに渡します
④ プロンプティング・回答生成 : ユーザーの質問と類似検索で導かれたチャンクを合わせてLLMにプロンプティングし、LLMが回答を生成します
⑤ 回答返却 : LLMが生成した回答をユーザーに返します
RAGの精度向上の方法
実際にRAGシステムを構築しても、思ったような回答が得られなかったり、精度が悪いと感じる場面がしばしばあります。
そういった問題を解決するために代表的な方法が主に3つあります。
リランキング
ユーザーの質問をもとにベクトルデータベースから意味的に近いチャンクを取得する際、まず多めにチャンクを取得しておきます。
その取得した複数のチャンクに対してリランキングモデルを使用し、質問に対して関連性の高いものを上位に並べ替えます。その上位のチャンクのみをLLMに渡すように設定することで、回答精度の向上が期待できます。
つまりリランキングとは、ベクトルデータベースから取得した情報を「実際に役立ちそうな順」に並べ替えるという手法です。
ハイブリッド検索
通常のRAGでは、意味的な近さをもとにチャンクを取得する「セマンティック検索」が一般的です。しかしこの方法はキーワード検索に弱いという弱点があります。
例えば「リンゴ」というキーワードで検索した場合、セマンティック検索では必ずしも
「リンゴ」という単語を含むチャンクが取得できるとは限りません。
そこで、全文検索(キーワードによるgrep的な検索)とセマンティック検索を組み合わせた「ハイブリッド検索」を行い、最終的にリランキングモデルで関連性の高いものを絞り込むという手法がよく使われます。
チャンク戦略
データをベクトルデータベースに格納する際のチャンキング(分割)の方法は、RAGの精度に大きく影響します。まとまりのない状態でエンベディングしてしまうと、ユーザーの質問に対して正しいチャンクが取得できない可能性があります。
基本的には「1内容1チャンク」を意識してチャンキング戦略を立てることが重要です。
チャンキングの手法には、固定チャンキング・セマンティックチャンキング・親子チャンキングなど様々な種類があり、データの内容や用途に応じて適切な手法を選ぶことが精度向上のカギとなります。
- 固定チャンキング : 一定の文字数またはトークン数をもとに、機械的にテキストを分割する方法
- セマンティックチャンキング : 意味のつながりを保つようにテキストを分割する方法
- 親子チャンキング : 小さいチャンク(子)で検索し、見つかったら親となる大きい文脈を返す方法
まとめ
RAGとは、LLMが学習していない社内情報など、通常では回答できないような情報に対しても回答を生成できるようにするシステムです。
RAGの処理フローは主に2つに分かれており、1つ目はデータソースをチャンク化・ベクトル化してベクトルデータベースに格納する「データ準備フェーズ」、2つ目はユーザーの質問をもとに関連チャンクを検索・取得しLLMが回答を生成する「回答生成フェーズ」です。
主要なコンポーネントとしては以下のものが挙げられます。
- データソース : 社内文書など回答の元となる情報
- エンベディングモデル : データソースをベクトルに変換するモデル(例:Cohere Embeddingなど)
- ベクトルデータベース : ベクトル化されたチャンクを格納・検索するDB
- オーケストレーションツール : 各コンポーネントを連携させるクラウド系のツール
-
LLM : 取得したチャンクをもとに回答を生成するモデル(例:Claude・Gemini・OpenAIなど)
これらのコンポーネントを組み合わせることで、社内のクローズドな情報にも対応した回答生成システムを構築することができます。
最後に
今後AIの需要がさらに高まる中で、RAGシステムの案件を担うエンジニアはますます増えていくと思います。
以前はRAGシステムの構築は難易度が高いとされていましたが、最近の3大クラウド(AWS・Azure・GCP)のアップデートにより、より手軽に構築できる環境が整ってきています。
また、RAGの精度向上手法としてリランキング・ハイブリッド検索・チャンク戦略などが普及してきたほか、LLMやembeddingモデルの性能向上、さらにはベクトルを活用したベクトルデータベースやグラフ型データベースを利用したベクトルデータベースなど、精度を高めるための選択肢も以前より大幅に増えています。
こうした技術の進化を背景に、通常のRAGにとどまらず「Advanced RAG」と呼ばれるより高度なシステムを開発できるエンジニアが求められるようになっています。
まずは基本的なRAGの仕組みから学習し、徐々に発展的な内容へとステップアップしていくことが重要です。RAGシステムを活用することで、日本企業が抱える属人化の解消・社内情報の活性化・情報取得にかかる時間の短縮といった課題を解決していける可能性があります。
ぜひこの記事を入口に、RAGシステムの開発に取り組んでいきましょう。


