Azure Databricks 上の取得拡張生成 (RAG)
この記事では、取得拡張生成 (RAG) の概要と、Azure Databricks での RAG アプリケーションのサポートについて説明します。
Retrieval Augmented Generation (検索により強化された文章生成) とは?
RAG は、大規模言語モデル (LLM) と外部知識検索を組み合わせる生成 AI 設計パターンです。 RAG は、リアルタイム データを生成 AI アプリケーションに接続するために必要です。 これにより、推論時にデータがコンテキストとして LLM に提供されるため、アプリケーションの精度と品質が向上します。
Databricks プラットフォームには、次の RAG シナリオをサポートする統合ツール セットが用意されています。
RAG の種類 | 説明 | ユース ケースの例 |
---|---|---|
非構造化データ | ドキュメントの使用 - PDF、Wiki、Web サイト コンテンツ、Google または Microsoft Office ドキュメントなど。 | 製品ドキュメントに関するチャットボット |
構造化データ | 表形式データの使用 - 差分テーブル、既存のアプリケーション API のデータ。 | 注文状態を確認するチャットボット |
ツールと関数呼び出し | サード パーティまたは内部の API を呼び出して、特定のタスクを実行したり、状態を更新したりします。 たとえば、計算の実行やビジネス ワークフローのトリガーなどです。 | 注文するチャットボット |
エージェント | LLM を使って一連のアクションを選ぶことで、ユーザーのクエリに応答する方法を動的に決定します。 | カスタマー サービス エージェントを置き換えるチャットボット |
RAG アプリケーションのアーキテクチャ
RAG アプリケーションを構成するコンポーネントを次に示します。
RAG アプリケーションには、次のことを実行するためのパイプラインとチェーン コンポーネントが必要です。
- インデックス作成: ソースからデータを取り込み、インデックスを作成するパイプライン。 このデータは構造化でも非構造化でもかまいません。
- 取得と生成: これは実際の RAG チェーンです。 ユーザー クエリを受け取り、インデックスから同様のデータを取得してから、そのデータをクエリと共に LLM モデルに渡します。
次の図は、これらのコア コンポーネントを示しています。
非構造化データ RAG の例
次のセクションでは、非構造化データ RAG の例のコンテキストで、インデックス作成パイプラインと RAG チェーンの詳細について説明します。
RAG アプリのインデックス作成パイプライン
次の手順では、インデックス作成パイプラインについて説明します。
- 独自のデータ ソースからデータを取り込みます。
- データを、基本的な LLM のコンテキスト ウィンドウに収まるチャンクに分割します。 この手順には、データの解析とメタデータの抽出も含まれます。 このデータは一般にナレッジ ベースと呼ばれ、基本的な LLM のトレーニングに使われます。
- 埋め込みモデルを使って、データ チャンクのベクトル埋め込みを作成します。
- 埋め込みとメタデータをベクトル データベースに保存して、RAG チェーンによるクエリにアクセスできるようにします。
RAG チェーンを使った取得
インデックスの準備が完了すると、アプリケーションの RAG チェーンで質問に応答できるようになります。 以下の手順と図は、RAG アプリケーションが受信要求にどのように応答するかを示しています。
- ナレッジ ベースにデータを埋め込むために使ったものと同じ埋め込みモデルを使って要求を埋め込みます。
- ベクトル データベースに対してクエリを実行して、埋め込み要求とベクトル データベース内の埋め込みデータ チャンクの間の類似性検索を実行します。
- 要求に最も関連するデータ チャンクを取得します。
- 関連するデータ チャンクと要求をカスタマイズされた LLM にフィードします。 データ チャンクは、LLM が適切な応答を生成するのに役立つコンテキストを提供します。 多くの場合、LLM には応答の書式設定方法に関するテンプレートがあります。
- 応答を生成します。
このプロセスを説明する図を次に示します。
Azure Databricks を使って RAG アプリケーションを開発する
Databricks には、RAG アプリケーションの開発に役立つ次の機能があります。
- データ、機能、モデル、関数を対象にした、ガバナンス、検出、バージョン管理、アクセス制御のための Unity Catalog。
- データ パイプラインの作成とオーケストレーションのためのノートブックとワークフロー。
- 構造化データと非構造化データのチャンクと埋め込みを保存するための差分テーブル。
- ベクトル検索には、埋め込みベクトルを保存するクエリ可能なベクトル データベースが用意されており、ナレッジ ベースと自動的に同期するように構成できます。
- LLM のデプロイと RAG チェーンのホストに使われる Databricks モデル。 Foundation Model API または外部モデルでサードパーティのモデルを使って、最先端のオープン LLM にアクセスするための専用モデル サービス エンドポイントを構成できます。
- RAG チェーン開発の追跡と LLM 評価用の MLflow。
- 特徴エンジニアリングとサービス提供。 通常、これは構造化データの RAG シナリオに適用されます。
- オンライン テーブル。 オンライン テーブルを低遅延の API として提供して、RAG アプリケーションにデータを含めることができます。
- 推論テーブルによる自動ペイロード ログを使って、データの監視と、モデルの予測品質とドリフトを追跡するためのレイクハウス監視。
- API プレイグラウンド。 LLM をテストおよび比較するためのチャットベースの UI。
Azure Databricks を使う RAG アーキテクチャ
次のアーキテクチャ図は、どこに各 Azure Databricks 機能が RAG ワークフローに適合するかを示しています。 例については、取得拡張生成を使って LLM チャットボットをデプロイする方法のデモを参照してください。
非構造化データと Databricks で管理される埋め込みを処理する
非構造化データと Databricks で管理される埋め込みを処理する場合、次の図の手順と図に示すとおりです。
- 独自のデータ ソースからのデータ インジェスト。 このデータは、Delta テーブルまたは Unity Catalog ボリュームに保存できます。
- その後、データは、基本的な LLM のコンテキスト ウィンドウに収まるチャンクに分割されます。 この手順には、データの解析とメタデータの抽出も含まれます。 Databricks ワークフロー、Databricks ノートブック、Delta ライブ テーブルを使用して、これらのタスクを実行できます。 このデータは一般にナレッジ ベースと呼ばれ、基本的な LLM のトレーニングに使われます。
- 解析されてチャンクに分割されたデータは、ベクトル埋め込みを作成するために埋め込みモデルによって使用されます。 このシナリオでは、Model Serving を使用して埋め込みモデルを提供するベクトル検索機能の一部として、Databricks によって埋め込みが計算されます。
- 埋め込みはベクトル検索によって計算された後、Databricks によって Delta テーブルに保存されます。
- また、ベクトル検索の一部として、埋め込みとメタデータはインデックス付けされてベクトル データベースに保存され、RAG チェーンによるクエリでアクセスできるようになります。 ベクトル検索は、ソース データ テーブルに追加された新しいデータの埋め込みを自動的に計算し、ベクトル検索インデックスを更新します。
非構造化データとカスタマーマネージド埋め込みを処理する
非構造化データとカスタマーマネージド埋め込みを処理する場合、次の手順と図に示すとおりです。
- 独自のデータ ソースからのデータ インジェスト。 このデータは、Delta テーブルまたは Unity Catalog ボリュームに保存できます。
- その後、データを、基本的な LLM のコンテキスト ウィンドウに収まるチャンクに分割できます。 この手順には、データの解析とメタデータの抽出も含まれます。 Databricks ワークフロー、Databricks ノートブック、Delta ライブ テーブルを使用して、これらのタスクを実行できます。 このデータは一般にナレッジ ベースと呼ばれ、基本的な LLM のトレーニングに使われます。
- 次に、解析されてチャンクに分割されたデータは、ベクトル埋め込みを作成するために埋め込みモデルによって使用されます。 このシナリオでは、埋め込みを自分で計算し、Model Serving を使用して埋め込みモデルを提供できます。
- 埋め込みを計算した後は、ベクトル検索と同期できる Delta テーブルに保存できます。
- ベクトル検索の一部として、埋め込みとメタデータはインデックス付けされてベクトル データベースに保存され、RAG チェーンによるクエリでアクセスできるようになります。 ベクトル検索は、Delta テーブルに追加された新しい埋め込みを自動的に同期し、ベクトル検索インデックスを更新します。
構造化データを処理する
構造化データを処理する場合は、次の手順と図に示すとおりです。
- 独自のデータ ソースからのデータ インジェスト。 このデータは、Delta テーブルまたは Unity Catalog ボリュームに保存できます。
- 特徴エンジニアリングでは、Databricks ノートブック、Databricks ワークフロー、Delta ライブ テーブルを使用できます。
- 特徴テーブルを作成します。 特徴テーブルは、主キーを持つ Unity Catalog 内の Delta テーブルです。
- オンライン テーブルを作成し、特徴量提供エンドポイントでホストします。 エンドポイントは、特徴テーブルと自動的に同期された状態を維持します。
RAG アプリケーションのオンライン テーブルと機能サービスの使用を説明するノートブックの例については、RAG サンプル ノートブックの Databricks オンライン テーブルと機能サービス エンドポイントに関する記事を参照してください。
RAG チェーン
インデックスの準備が完了すると、アプリケーションの RAG チェーンで質問に応答できるようになります。 次の手順と図は、受信した質問に対する RAG チェーンの動作を示しています。
- ナレッジ ベースにデータを埋め込むために使ったものと同じ埋め込みモデルを使って、受信した質問を埋め込みます。 Model Serving は、埋め込みモデルを提供するために使用されます。
- 質問が埋め込まれた後、ベクトル検索を使用して、埋め込み質問とベクトル データベース内の埋め込みデータ チャンクの間の類似性検索を実行できます。
- ベクトル検索が要求に最も関連するデータ チャンクを取得した後、それらのデータ チャンクと Feature Serving の関連する特徴と埋め込み質問は、応答が生成される前に、後処理のためにカスタマイズされた LLM で使用されます。
- データ チャンクと特徴は、LLM が適切な応答を生成するのに役立つコンテキストを提供します。 多くの場合、LLM には応答の書式設定方法に関するテンプレートがあります。 ここでも、Model Serving が LLM の提供に使用されます。 Unity Catalog と Lakehouse Monitoring を使用して、ログを保存し、チェーン ワークフローをそれぞれ監視することもできます。
- 応答を生成します。
利用可能なリージョン
Databricks 上で RAG アプリケーション開発をサポートする機能は、サービスを提供するモデルと同じリージョンで使用できます。
RAG アプリケーション開発の一部として Foundation Model API を使う予定の場合は、Foundation Model API でサポートされているリージョンに制限されます。