大規模言語モデル(大規模言語モデル、LLM とも呼ばれます) に関連して、次の 2 つの側面が常に問題を引き起こします。

  • 古いトレーニング データ セットと

  • 限られた文脈。

検索拡張生成(RAG) は、これらの問題領域を解決することを目的としています。

この記事では、RAG がどのように定義され、問題解決にどの程度貢献するのか、具体的に技術レベルでどのように機能するのかについて説明します。

検索拡張生成 – 定義

検索拡張生成は、Facebook と Meta (PDF) の AI 研究研究所から生まれたテクノロジーであり、特定のデータ ソースを持つ LLM を「基盤」とします。多くの場合、これには元のトレーニング データ セットには含まれていない情報が含まれます。このプロセスは通常、次の 3 つのステップで行われます。

  1. 情報は特定のソースから取得されます ( 「検索」 )。

  2. その後、プロンプトはソースのコンテキストで強化されます ( 「拡張」 )。

  3. モデルと拡張プロンプト ( 「生成」 ) を使用して出力が生成される前。

RAG を実装すると、大規模な言語モデルが生成する結果の品質を向上させることができます。特に、基本的な LLM に最新の情報が欠けていたり、 幻覚が見られ始めたりする場合はそうです。ただし、検索拡張生成を使用しても、大規模言語モデルが幻覚を起こさなくなるという保証はありません。

検索拡張生成 (RAG) とは何ですか?

RAGはこれらの問題を解決したいと考えています

大規模言語モデルをトレーニングするには、多くの時間とリソースが必要です。 Nvidia の H100 などの最先端のサーバー GPUがフルスピードで動作していると、数か月が経過することがあります。新しいデータに基づいて基本モデルを微調整することは可能ですが、再トレーニングによって言語モデルを最新の状態に保つことは不可能です。このプロセスには、独自の欠点が伴う場合があります。たとえば、微調整によって導入された新しい機能によって、基本モデルにすでに存在する機能が制限される可能性があります。

2022 年のデータでトレーニングされた LLM に 2023 年に起こったことについて尋ねる場合、選択肢は 2 つあります。

  • モデルは、要求された情報を認識していないと判断します。その後、通常は古いトレーニング データについて通知されます。

  • モデルはデータを知らないことを知りません。次に、同様の歴史的な質問に基づいて答えを提供しようとします。あるいは、幻覚が現れます。

LLM 幻覚を回避するには、イベントの特定の日付、関連する URL、または対応するドキュメントをプロンプトに含めると役立つ場合があります。この追加情報は、LLM の「コンテキスト制限」に達すると制限に達します。これらのコンテキスト境界は LLM ごとに異なります。

検索拡張生成の仕組み

高レベルでは、検索拡張生成は、言語モデルと Web またはドキュメント検索を組み合わせることによって機能します。これにより、両方の手順を手動で実行した場合に発生する問題が回避されます。たとえば、出力が LLM のコンテキスト制限を超えている場合などです。上記の RAG プロセスの 3 つのステップに基づいて、各フェーズの技術プロセスを次に示します。

  • 検索:インターネット、文書、またはデータベース検索を使用して、ソース情報を高密度の高次元形式にベクトル化します。通常、これは、埋め込みベクトルを作成し、それをベクトル データベースに保存することによって行われます。

  • 拡張:次に、クエリ自体がベクトル化され、 FAISSまたはその他の検索技術 (通常はコサイン類似度メトリックを使用) を使用してベクトル データベースと照合されます。このようにして、ソース情報の最も関連性の高い部分が抽出され、クエリ テキストとともに LLM に提示されます。

  • 生成:最後に、LLM は答えを生成します。

これは複雑に聞こえるかもしれませんが、実際には 5 行の Python コードが作成されるだけです (オーケストレーション目的でLangChain フレームワークを使用している場合)。

from langchain.document_loaders import WebBaseLoader

from langchain.indexes import VectorstoreIndexCreator

loader = WebBaseLoader("https://www.promptingguide.ai/techniques/rag")

index = VectorstoreIndexCreator().from_loaders([loader])

index.query("What is RAG?")