RAGとは?検索拡張生成をわかりやすく解説
RAG(検索拡張生成)は、AIモデルが自分の情報を使って質問に答えられるようにする方法です。誰かが質問すると、アプリはまず文書の中から最も関連する文章を検索し、その文章を質問と一緒にモデルへ渡します。モデルは、学習中に偶然覚えたことだけに頼るのではなく、その文章をもとに回答を書きます。
AIでアプリを作るときにRAGが重要な理由
大規模言語モデルは世界全般についてよく知っていますが、あなたのビジネスについては何も知りません。価格、方針、製品マニュアル、先週のサポート問い合わせなどです。また学習には締め切りがあるため、最近の出来事もわかりません。それでも質問すると、自信満々でもっともらしい、しかし誤った回答を返すことがあります。
この問題を解決する方法は、大きく3つあります。
| 方法 | 内容 | 向いている用途 |
|---|---|---|
| すべてをプロンプトに貼り付ける | 質問のたびにすべての文書を送る | 数ページ程度の少ない文章 |
| RAG | 文書を検索し、関連する部分だけを送る | ヘルプセンター、マニュアル、メモなど、量が多い、または変化する文書 |
| ファインチューニング | 例を使ってモデルをさらに学習させる | 口調、形式、繰り返しの作業。変化する事実には不向き |
最近のモデルは長いプロンプトを扱えるため、短いFAQなら最初の方法で十分なことが多いです。毎回送る文章が多すぎる場合にRAGの価値が出てきます。送る単語の数だけ費用と時間がかかるからです(LLM APIの料金体系を参照)。
「ドキュメントに質問できる」機能、サポートアシスタント、社内のナレッジツールを作るなら、ほぼ確実に何らかの形のRAGを作ることになります。
日常の例え
オープンブック形式の試験を想像してください。記憶だけで答える学生は、思い違いをしたり、適当に答えたりするかもしれません。一方、先に正しいページをめくって読んでから答えられる学生は、正しいページを見つけられる限り、はるかに信頼できる答えを書けます。
- 学生は言語モデルです。
- 教科書はあなたの文書です。
- 正しいページをめくることが検索(リトリーバル)です。
- そのページをもとに答えを書くことが生成(ジェネレーション)です。
RAGはオープンブックのようなものです。そして試験と同じく、答えの質は正しいページが見つかったかどうかに大きく左右されます。
RAGの仕組み:ステップごとの説明
一般的なRAGには2つの段階があります。
文書の準備(事前に行う):
- 収集: ヘルプ記事、PDF、方針文書、商品データなどの元資料を集めます。
- チャンク分割: 長い文書を、数段落程度の小さな塊に分けます。検索で必要な部分だけを返せるようにするためです。
- 埋め込み: 各チャンクを埋め込みモデルに送り、その意味を表す数値の長いリストである**埋め込み(エンベディング)**に変換します。似た内容のテキストは、似た数値になります。
- 保存: チャンクと埋め込みを、類似度で検索できるデータベース(ベクトルデータベース、またはベクトルインデックスと呼ばれます)に保存します。
質問への回答(毎回行う):
- 質問を埋め込む: 同じ埋め込みモデルを使って、質問を数値に変換します。
- 取得する: 質問の埋め込みに最も近いチャンクを取り出します。例えば上位5件です。
- プロンプトを組み立てる: 指示、取得したチャンク、質問をまとめます。
- 生成する: 言語モデルがそのチャンクをもとに回答を書きます。理想的には、どのチャンクを使ったかも示します。
意味で検索することが、この仕組みの要です。「返金してもらうには」という質問は、単語が一つも一致しなくても、「返金ポリシー」というタイトルのチャンクを見つけられます。
具体例:ジムのヘルプアシスタント
あるジムに、ヘルプ記事が40本あり、ウェブサイトにチャットアシスタントを置きたいとします。会員が次のように尋ねます。「旅行中に会員を一時停止できますか?」
アプリは質問を埋め込み、最も近い3つのチャンクを取り出します。そのうちの1つには次のように書かれています。
Membership freeze: Members on monthly plans can freeze their
membership for up to 2 months per year. Request it at the front
desk or in the app at least 7 days before the freeze starts.
モデルに送られるプロンプトは、次のような形になります。
You are the help assistant for Northside Gym.
Answer only from the sources below. If the answer isn't in them,
say you don't know and suggest contacting the front desk.
Mention which source you used.
[Source 1: Membership freeze] Members on monthly plans can freeze...
[Source 2: Cancelling your membership] ...
[Source 3: Guest passes] ...
Question: Can I pause my membership while I'm travelling?
モデルの回答は、例えば次のようになります。「はい。月額プランなら、年間最大2か月まで会員資格を一時停止できます。停止の開始日の少なくとも7日前までに、受付またはアプリで申し込んでください(情報源:Membership freeze)。」
ジムは何も再学習させていません。停止ポリシーを変更した場合は、記事を更新し、アプリがそのチャンクを埋め込み直せば、次の回答に反映されます。
主な用語
| 用語 | 意味 |
|---|---|
| LLM | 大規模言語モデル。回答を書くAIです。LLMとは何かを参照。 |
| 埋め込み(エンベディング) | テキストの意味を表す数値のリスト。 |
| 埋め込みモデル | 埋め込みを作るモデル。通常、チャットモデルとは別で、はるかに安価です。 |
| チャンク | 文書の一部で、単独で取り出せる大きさに区切ったもの。 |
| ベクトルデータベース/ベクトル検索 | 似た埋め込みを持つ項目を探し出す保存先。一般的なデータベースにも機能として備わっている場合があります。例えばPostgresは、pgvector拡張機能で対応しています。 |
| Top-k | 1回の質問で取り出すチャンクの数。 |
| ハイブリッド検索 | 意味による検索と、通常のキーワード検索を組み合わせたもの。製品コードのような正確な語句の一致に役立ちます。 |
| コンテキストウィンドウ | モデルが1回のリクエストで受け取れるテキストの最大量。 |
| グラウンディング/引用 | 回答を取得した特定の情報源と結びつけ、それを表示すること。 |
よくある誤解
- 「RAGはデータでモデルを学習させる」。 違います。モデル自体は変わりません。質問の時点で追加の文章を読むだけです。
- 「RAGを使えばハルシネーションは起きない」。 起きにくくなるだけです。検索が正しいチャンクを取り逃がしたり、文書に答えがなかったりすると、モデルは依然として推測することがあります。「わからない」と答えるよう指示し、答えがわかっている質問でテストしてください。
- 「専用のベクトルデータベースが必要」。 多くの場合、必要ありません。少量のデータであれば、すでに使っているデータベースのベクトル拡張や、単純なキーワード検索でも十分なことがあります。
- 「チャンクは大きいほど良い」。 大きすぎると、関係のない文章を大量に送ることになり、費用と混乱が増えます。小さすぎると、チャンクが意味を持たせていた文脈を失います。調整が必要になります。
- 「何でもアップロードすればよい」。 古い文書、重複した文書、矛盾する文書があると、矛盾する回答が出ます。元資料を整理することは、多くの場合もっとも効果の大きい改善です。
- 「どの文書も誰でも見られる」。 作り方次第です。特定の利用者だけが見られる文書がある場合、検索そのものが質問者に応じて絞り込まれている必要があります。そうしないと、アシスタントが1人の顧客のデータを別の顧客に引用してしまいます。
費用
RAG機能には通常3つの継続的な費用がかかります。文書の埋め込み(小規模で、ほぼ一度きり)、質問ごとの埋め込み(ごくわずか)、そして言語モデルの呼び出しです。最後のものが主な費用で、送るチャンクの数に応じて増えます。さらに、データベースの保存料金もかかります。AIプロバイダーはこれらをあなた自身のアカウントに請求するため、そちらで利用上限を設定してください。
AIビルダーに頼むこと
- 「RAGを作る前に確認してください。内容はプロンプトに直接入れられるほど少なくないですか?」
- 「ヘルプ記事を数段落ごとのチャンクに分け、各チャンクのタイトルと出典リンクを残し、埋め込みをデータベースに保存してください。」
- 「製品コードも一致するように、意味による検索とキーワード検索を組み合わせたハイブリッド検索を使ってください。」
- 「モデルには、取得した情報源のみに基づいて答え、わからないときはその旨を伝え、各回答の下に情報源を表示するよう指示してください。」
- 「サインイン中のユーザーが閲覧を許可されている文書だけを検索してください。」
- 「文書が編集されるたびに、自動で埋め込み直してください。」
- 「AIプロバイダーのキーは、ブラウザではなくサーバー上の秘密情報として保管してください。」
- 「各質問、取得したチャンク、回答を記録し、不適切な回答を確認できるようにしてください。」
MythexでのRAG
Mythexには、既製のナレッジベースやRAG製品は含まれていません。実際にはアプリの中にRAGのコードを書く機能です。文書と、ご自身のAIプロバイダーのキーを用意します。キーはプロジェクトの秘密情報として保存します。エージェントが検索とチャットの部分を作り、保存にはプロジェクトのPostgresのデータベースを使います。プロバイダーの利用料はMythexのクレジットではなく、プロバイダーのアカウントに請求されます。ドキュメントでは、まず1つのシンプルなAI機能から始め、それがうまく動いてからRAGを追加することを勧めています。詳しくはAIアプリの作成のほか、AIチャットボットアプリの作り方とアプリにAI機能を追加する方法をご覧ください。
よくある質問
RAGとは簡単に言うと何ですか?
RAG(検索拡張生成)は、AIモデルが自分の持つ情報をもとに答えられるようにする方法です。モデルが回答する前に、アプリが文書の中から質問に最も関連する文章を探し、それをプロンプトに含めます。そのため、回答は学習時に覚えたことだけでなく、その文章に基づいたものになります。
RAGはデータでAIを学習させるのですか?
いいえ。RAGはモデル自体をまったく変更しません。質問されたその瞬間に関連する文章を探し、質問と一緒にモデルへ渡します。文書を更新すれば、次の回答から新しい版を使えます。
RAGはファインチューニングと同じですか?
いいえ。ファインチューニングは、例を使ってモデルをさらに学習させ、振る舞いを変える方法です。時間がかかり、口調や形式の調整に向いています。一方RAGは、質問の時点で読むための事実をモデルに渡します。変化する知識や、正確に引用しなければならない情報に向いています。
RAGはAIのハルシネーションを防げますか?
減らすことはできますが、なくすことはできません。検索が誤った文章を見つけた場合や、文書に答えがない場合、モデルは依然として推測してしまいます。良いRAGアプリは、わからないときはその旨を答えるようモデルに指示し、使った情報源も表示します。