🧠

RAG(検索拡張生成)とは?仕組みからメリット、活用例までやさしく解説

に公開

初めまして!株式会社 HIBARI の中野と申します。これからの取り組みとしてテックブログを書き始めることにしました。よろしくお願いします!

RAG とは?

RAG(Retrieval-Augmented Generation)は日本語では「検索拡張生成」などと言われています。大規模言語モデル(LLM)の持つ文章生成能力と、外部の知識を検索する能力を組み合わせた技術です。

なぜ RAG が必要なのか

LLM 単体では特定のドメインに特化した情報を回答することができません。例えば社内会議の情報や会社独自の知識などを答えることができません。LLM 自体が学んでいないことを回答しようとするともっともらしい嘘「ハルシネーション」を引き起こすことがあります。RAG はこれらを解決することができます。

RAG の仕組み

RAGのイメージ図

RAG の処理のフローは大きく分けて「検索 (Retriever)」と「生成 (Generator)」の2つに分かれます。

まずはユーザーからの質問をベクトルに変換します。このベクトルを検索します。次に検索した情報と元の質問を合体して LLM へ新しいプロンプトを入力します。

検索(Retriever)

RAG における検索は、単なるキーワード検索ではありません。文章の「意味」を理解し、関連性の高い情報を見つけ出そうとしています。

そのために、チャンクへの分割ベクトル化 (Embedding)、ベクトルデータベースという 3 つの要素が連携しています。

チャンクへの分割

チャンクへの分割のイメージ図

LLM に参照させたいデータは数百ページに及ぶ書類や、長文の Web サイトなど、非常に大きい場合があります。このドキュメントをそのまま扱おうとすると検索精度が落ちたり、LLM には入力できる量が決まっているので、そもそもLLM が処理出来なかったりと、問題が生じます。

そこでチャンキング (Chunking)という前処理を行います。

チャンキング (Chunking)とは、大きなドキュメントを意味のある小さな塊(チャンク)に分割することです。

例えば以下のような単位で分割します。

  • 段落ごと
  • 見出しごと
  • 文字数や単語数

このチャンク単位で情報を扱うことで検索精度と効率が向上します。

ベクトル化(Embedding)

ベクトル化(Embedding)とは、分割したチャンク 1 つひとつを、その意味をとらえた数値の羅列(ベクトル)に変換することです。この変換は、「埋め込みモデル(Embedding Model)」という AI モデルが行います。

以下の 2 つの特徴があります。

  1. 意味の近さを距離で表現
    意味の近いチャンクはベクトル空間上で近くに配置されます。例えば「東京」と「大阪」は意味的に似ているので近くに配置されます。

  2. 文脈を理解できる
    キーワードが一致していなくても、文脈が一致していれば関連性が高いと判断できる。

データベース

RAG が参照する情報は「ベクトルデータベース」と呼ばれる専用のデータベースに保存されます。

このデータベースには、社内ドキュメントや議事録、問い合わせ履歴など、LLM に参照させたいデータを格納します。この格納する際に「ベクトル化 (Embedding)」を行います。これにより関連性の高い情報を見つけやすくなります。

生成(Generator)

生成(Generator)とは、検索ステップで得られたユーザの質問に最も関連性の高い情報(チャンク)を活用して、最終的な回答を作成することです。

このプロセスは大きく分けてプロンプトの拡張と、LLM による回答生成という 2 つの要素が連携しています。

プロンプトの拡張

検索で得られた情報を、ユーザが最初に入力した質問(プロンプト)に付け加えます。

例:

  • 元の質問
    「昨日の会議では何を作ることになったか教えて。」

  • 検索して得られた情報
    「検索のできるエージェントと数値計算のできるエージェントの 2 つを作りたいね」

  • LLM に渡すプロンプト

    以下の情報を参考にして、質問に答えてください。
    
    情報:検索のできるエージェントと数値計算のできるエージェントの 2 つを作りたいね
    
    質問:昨日の会議では何を作ることになったか教えて。
    

このように LLM が参照すべき情報を明確に提示することで、LLM の仕事が「提示された情報をもとに回答する」ということになります。

LLM による回答生成

次に、拡張されたプロンプトが LLM に渡されます。LLM は与えられたプロンプトを最優先とし、ユーザにとって自然でわかりやすい文章を生成します。

生成される文章例:

昨日の会議では、検索のできるエージェントと数値計算のできるエージェントの2つを作ることになりました。

これは LLM の性能に依存するため、できるだけ性能の良い LLM を使うと良いです。

ファインチューニングとの違い

RAG のおさらい

RAG は一言でいうと「カンペを見ながら回答するチャットボット」のようなものです。

回答する時に、データベースから関連性の高い情報を探し出します。その情報を「カンペ」として LLM に渡すことで正確性の高い回答を生成します。

また、モデル自体は変更せず、外部の知識となるデータベースを利用します。ハルシネーションを避けたい場合に特に有効です。

ファインチューニングとは

ファインチューニングは一言でいうと「特定の分野の専門家として再教育されたチャットボット」のようなものです。

既存の広域な知識を持つ LLM に対して、特定のタスクやドメインに特化した追加のデータセットを用いて再学習を行います。これにより、モデル内部のパラメータが調整され、特定の文体や専門性を身につけることができます。

モデルの「性格」や「話し方」、「思考スタイル」を直接的に変えます。そのため特定の役割を担わせたい場合に力を発揮します。

比較表

項目 RAG (検索拡張生成) ファインチューニング
知識の源 外部データベース(Vector DB など) モデル内部の重み
知識の更新 簡単(DB を更新するだけ) 大変(再学習が必要)
ハルシネーション抑制 得意(根拠情報に基づくため) 苦手(学習データに依存)
得意なこと 事実に基づく回答、最新情報の反映 特定のスタイル・文体の模倣、暗黙知の学習
コスト 学習コストは低いが、検索・推論時に都度コストがかかる 学習コスト(時間・計算資源)が高い
応答速度 検索処理が入るため、やや遅い傾向 高速

RAG のメリット・デメリット

メリット

  • ハルシネーションの抑制
    LLM が不確かな知識や記憶に頼って、事実に基づかない回答(ハルシネーション)を作り出してしまうのを防ぎます。あくまで「与えられた情報」をベースにするため、回答の信頼性が向上します。

  • 最新かつ正確な情報の提示
    データベースの情報を常に最新状態に保っておけば、LLM 本体を再学習することなく、常に新しい情報に基づいた回答ができます。

  • 出典の明示
    どの情報をもとに回答を生成したかが明確です。そのため、情報の引用元を示すことができます。そのため、ユーザは受け取った回答を検証したり、安心したりできます。

デメリット

  • 検索の質が回答精度に直結する
    RAG は、検索した情報に基づいて回答を生成するため、検索結果の質が回答の質を大きく左右します。適切な情報を見つけ出すための工夫が必要です。

  • システム構築と運用が複雑
    LLM を単独で利用する場合と比べ、RAG は外部データベースとの連携するため、そのため検索システムやデータの前処理等、システム全体が複雑になります。導入後の保守・運用にも専門的な知識が必要になり、コストが増加する可能性があります。

  • 応答速度が遅くなる
    LLM 単体で使う場合はユーザからの質問に対して回答するだけです。しかし RAG はデータベースを検索し、プロンプトを構築して LLM が回答を生成します。そのため LLM 単体で使う場合に比べ、応答に時間がかかる場合があります。

RAG の活用例

社内ナレッジ検索システム

社内の資料は多く、探すのに時間がかかることが多いです。これを解決するために、社内について何でも知っているチャットボットを RAG を用いて構築できます。

データベースには、業務マニュアル、社内規定、過去のプロジェクト資料、議事録などのドキュメントを活用します。

カスタマーサポート

顧客からの問い合わせ対応は企業の大きな負担になります。これに RAG を導入することで高精度な回答のできるチャットボットが実現します。

データベースには製品情報や過去の対応履歴を活用します。

まとめ

この記事では、LLM の新しい可能性である RAG について、その仕組みからメリット・デメリット、活用例までを解説しました。

RAG の重要なポイントは、LLM のもとから持っている知識に加えて、外部のデータベースからリアルタイムで情報を検索し、その状況を根拠として回答を生成する点にあります。

LLM 単体では難しかった、社内情報や専門知識などのドメイン特化された情報、最新情報への対応、ハルシネーションの抑制などができます。

システムの構築が複雑になるなどのデメリットもありますが、回答の信頼性や透明性を飛躍的に向上させる RAG は、社内ナレッジ検索やカスタマーサポートなど、ビジネスの様々な場面でその真価を発揮します。1 つ作ってみてはどうでしょうか。

参考文献

P. Lewis et al. "Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks." In Advances in Neural Information Processing Systems, vol. 33, pp. 9459-9474. Curran Associates, Inc., 2020.

新納 浩幸 (2024). 『LLM のファインチューニングと RAG: チャットボット開発による実践』 オーム社.

GitHubで編集を提案
株式会社HIBARI

Discussion