お客様と対話するインテリジェントなボットをビジネスに導入することを想像してみてください。チャットボットは一般的に、顧客と対話し、彼らに助けや情報を提供するために使用されます。しかし、通常のチャットボットは複雑な質問に答えるのに苦労することがあります。
RAG とは
Retrieval Augmented Generation (RAG) は、チャットボットが難しい質問を理解し、応答する能力を向上 させる方法です。この生成AIデザインパターンは、大規模言語モデル(LLM)と外部知識の取得を組み合わせています。 これにより、リアルタイムデータを生成プロセス(推論時間)中にAIアプリケーションに統合することが可能になります。この文脈情報をLLMに提供することで、RAGは生成された出力の精度と品質を大幅に向上させます。
RAGを使用する利点の一部は次のとおりです:
AIアプリケーションの精度と品質の向上: RAGがLLMにリアルタイムデータをコンテキストとして提供することで、AIアプリケーションの精度と品質が向上します。 これは、LLMがより多くの情報にアクセスでき、それを使用してより情報的で関連性のある応答を生成できるためです。
さまざまなタイプのデータを処理する能力: RAGは、ドキュメントやメールのような非構造化データや、テーブルのような構造化データを含むさまざまなタイプのデータを処理できます。これにより、さまざまなアプリケーションで使用できる汎用的なツールになります。
ユーザーのクエリに対するよりダイナミックで柔軟なレスポンス: RAGは、ユーザーの興味やデータアクセス制御に基づいてレスポンスを制限するなど、ユーザーのクエリに対するよりダイナミックで柔軟なレスポンスを生成することができます。これにより、RAGチャットボットはセキュリティコントロールを持ちつつ、ユーザーにとってより魅力的で役立つものになります。
初期費用の削減と開発の高速化: RAGは、大規模な開発作業やLLMの微調整なしに迅速かつ簡単にデプロイできます。
DatabricksとPinecone
Pineconeの ベクトルデータベースは、複雑なデータ検索をピンポイントで管理するのに優れている一方、Databricksのデータインテリジェンスプラットフォーム は、大量のデータセットの取り扱いと分析を効率化します。
Pineconeとの統合はシームレスで、Databricksが大規模にベクトル埋め込みを効率的に保存および取得できます。 この統合により、PineconeとDatabricksを活用した高性能ベクトル検索アプリケーションの開発が簡素化されます。
DatabricksとPineconeを一緒に使用することで、従来のチャットボットよりも正確で効率的なチャットボットを作成することができます。
ステップバイステップの実装
このブログでは、Databricksのドキュメントやホワイトペーパーを活用して、Databricksに関するあらゆる質問に答えられるチャットボットの構築方法をご紹介します。
チャットボットの構築には、4つの重要なステージがあります。最初のステージは、データのインジェストと準備です。次に、効率的な情報検索のために、データをPineconeのようなベクターデータベースに保存します。3つ目のステージでは、Pineconeを使った検索と、Llama 3.1のようなLLM(大規模言語モデル)を使用して応答を生成するRAGリトリーバーとチェーンを設定します。最後に、チャットボットをDatabricks Unity Catalogに登録し、Databricks Mosaic AI Model Servingを通じてデプロイします。このプロセスの詳細な手順については、続きをご覧ください。
ステップ1:Databricksでデータを準備する
クラウドストレージにある生のファイルをDatabricks Autoloaderを使用して取り込みます。
私たちはDatabricks autoloader を使用しています。これは、新しいファイルがクラウドストレージに着陸すると自動的に処理するハンズオフアプローチを提供し、手動の状態管理の必要性なしに効率性とフォールトトレランスを確保します。Databricks Autoloaderは、数十億のファイルにスケールするように設計されており、ネイティブクラウドAPIを利用したファイル検出によりコストを抑えることができます。さらに、Auto Loaderはスキーマの変更に適応する組み込みのスキーマ推論と進化機能を備えたインテリジェントなものです。大量のデータを扱っている場合や、ほぼリアルタイムの取り込みが必要な場合でも、Auto Loaderはデータ取り込みプロセスを簡素化し、加速します。ストリーミングテーブル は、特にストリーミングやインクリメンタルなデータ処理を扱う際に、よりシンプルな体験を提供します。
pdf / htmlファイルからテキストを抽出します。
まず、PDFファイルのバイトコンテンツを読み取り可能なテキストに変換し、テキストから特定のセグメントを取得する必要があります。この参照実装では、Spark UDFと組み合わせてPyPdfまたはUnstructuredIOライブラリを使用し、テキスト抽出プロセスを簡素化します。 テキストを管理しやすいチャンクに分割するためのテキストスプリッターも使用します。
ベクトル埋め込みを作成し、それらをDeltaテーブルに保存します。
ベクトル埋め込みを作成するために、Databricks Mosaic AI Foundational Model API経由で利用可能なBGE埋め込みモデルを使用します。 Python UDFは、基礎となるモデルエンドポイントを使用して埋め込みを計算します。PDFから抽出したデータと埋め込みは、Deltaテーブルに保存されます。
ステップ2:データをPineconeベクトルデータベースに保存します
Pineconeクライアント設定の初期化。
Pineconeにベクトル埋め込みをアップサートするとき、最初にインデックスを作成します。 インデックスは、次元数が同じ埋め込みのグループで、通常は同種のユースケースの基礎となるデータセットを表します。 Pineconeにログインして、Pinecone APIキーを作成します。
Databricks Secrets は、Databricksのノートブック、ジョブ、データパイプライン内で使用する可能性のあるパスワード、APIキー、その他の資格情報などの機密情報を安全に管理および保存します。 Pinecone APIキーなどの必要な認証情報など、機密情報を保存するためにDatabricksのシークレットを使用します。
以下に、Databricksのシークレットを使用して、Pinecone APIキーなどの機密情報を取得する方法を示します 。次に、Pinecone APIキーと環境を使用して、Pineconeへのクライアント接続を初期化します。
次に、Pinecone UIまたはAPIを使用してPineconeインデックスを作成します。
Pineconeに必要なスキーマにデータを変換します。
Pineconeでは、インデックス内のベクトルにメタデータのキーと値のペアを付加することができます。これを使用して、元のドキュメントとそのメタデータを保存したり、追加のフィルター表現を指定したりできます。Pineconeに書き込む前に、データを変換し、デルタテーブルにメタデータ列を追加して、元のドキュメントの内容やスニペット、ドキュメントのソースやIDなどの追加メタデータをPineconeのスキーマ 要件に従ってキャプチャします。
Pineconeのインデックスに書き込みます。
ドキュメンテーション に記載されているように、Pineconeのスパークコネクタをインストールします。Pineconeのスパークコネクタを使用して、エンベッディングをPineconeのインデックスに書き込みます。モード "append" を使用すると、新しいデータをインデックスに追加することもできます。
ステップ3:Pineconeベクトルデータベースのクエリ
次に、クエリAPIを使用してPineconeのベクトルイ ンデックスをクエリすることができます。このAPIは、質問のエンベッディングを入力として受け取ります。
APIを通じてPineconeを直接クエリすることで、PineconeとDatabricksを任意のコードに統合できます。
次のセクションでは、人気のあるLangChainフレームワークを使用してこのワークフローを簡素化する方法を示します。
ステップ4:LangChainを使用してPineconeベクトルデータベースをクエリします
Langchain は、LLM(大規模言語モデル)によるアプリケーション構築を簡素化するフレームワークです。Databricksの埋め込みは、埋め込みモデルとの対話を簡素化し、Pineconeとの統合は簡素化されたクエリインターフェースを提供します。
Langchainのラッパーは、すべての基礎的なロジックとAPI呼び出しを処理することで、簡単にします。下記のLangChainコードは、クエリテキストをベクトルに明示的に変換する必要性を抽象化します。
ステップ5:PineconeとLangChainのためのリトリーバーを作成します
上記では、Pineconeベクトルインデックスでの類似性検索の方法を示しました。RAGチャットボットを作成するために、LangChain Retriever インターフェースを使用してインデックスをラップします。
まず、APIキーと環境を設定するためにPineconeを初期化します 。次に、正しいネームスペースとキーを持つ既存のPineconeインデックスからVectorStoreインスタンスを作成します。
ステップ6: チャットボットチェーンの組み立て
これで、チャットボットを定義するチェーンにリトリーバーを入れることができます!
チャットボットがチャットメッセージから質問を正しく抽出し、Pineconeから関連するコンテキストを取得できるかどうかを見てみましょう。
ステップ7:チャットボットをモデルとしてデプロイする
チャットボットを反復処理するにつれて、モデルオブジェクト、モデルバージョン、メタデータを追跡し、アクセス制御を管理することが求められます。そのためには、Unity Catalogと統合されたMLflowのModel Registryを使用します。
Unityカタログを使用して、チャットボットチェーンをmlflow.langchain.log_model
を使用してモデルとして登録できます。モデルのシグネチャは、mlflowのinfer_signature
を使用して推測することができます。 pinecone-client
を依存関係に入れることを忘れないでください。チェーンを定義したノートブックで"mlflow.models.set_model(model=full_chain)"
を設定します。新しいドライバーノートブックで、チャットボットを登録し、モデルサービングにチャットボットをデプロイします。
モデルはDatabricksのUnity Catalog