Amazon Web Services ブログ
AWS Marketplace の Pinecone を Amazon Bedrock のナレッジベースとして利用する
By Kazuki Motohashi, Ph.D., Partner Solutions Architect, AI/ML – AWS Japan
By Yuji Arakawa, Sr. Enterprise Architect, Partner Core Tech – AWS Japan
本稿では、スケーラブルでありながらもコスト効率に優れる Pinecone serverless ベクトルデータベースを Amazon Bedrock のナレッジベースとして利用することでビジネスが生成 AI による新しい体験を迅速にユーザーへ届けることができることを紹介します。RAG (Retrieval Augmented Generation; 検索拡張生成) やベクトルデータベースを活用するアイデアを持ちながらもコストへの懸念やシステム構築の手間から次の一歩をためらっている企業・政府機関などの組織にとって生成 AI ジャーニーへの船出の一助となることを願っています。
はじめに
生成 AI は、人々の生活を豊かにする新しい体験を提供したり、ビジネスの生産性向上と新たな事業機会を生み出すテクノロジーとして期待されています。既存のアプリケーションやサービスに組み込んでユーザー体験を改善したり、全く新しいアプリケーションやサービスの実装など様々な取り組みが進んでいます。生成 AI を活用する際には、最新で正確な情報に基づいたユーザー体験を提供することが求められます。企業や政府機関などの組織においてはセキュリティや知的財産権と並んで重要なテーマとなっています。
RAG・検索拡張生成とは
RAG を使用すると、エンタープライズ検索、データベース、API などの外部知識ソースからデータを取得して、それを元に大規模言語モデル (LLM) により質問への回答生成のようなテキスト生成を行うことができます。質問応答のために生成 AI を使用する場合、RAG の仕組みにより、質問のクエリと最も関連性の高い最新の情報で回答を行います。さらに、その回答が正しいかユーザーが検証できるよう、データソースを引用として表示することもできます。
RAG では、外部の知識ソースとして企業・組織の内外のリレーショナル・データベースや API などを活用することに加えて、蓄積された文書などの膨大な非構造データから知識を検索したり洞察を得るために自然言語を使ったセマンティックサーチができるベクトルデータベースが注目されています。
ベクトルデータベースを使った RAG ソリューションでは、一般に次のようなプロセスが取られます。まず事前の準備として知識ソースのデータを元にベクトルデータベース上にナレッジベースを構築します。最初のステップでは、元のデータを検索に適した小さなセグメントに分割します。このセグメントはチャンクと呼ばれ、このステップはチャンキングと呼ばれます。次に、チャンクをセマンティックサーチが可能なベクトルデータへ変換します。この変換は埋め込み (embedding) モデルを使って行われます。埋め込みモデルは、単語や文章などのテキストデータを、高次元のベクトル空間内の点として表現します。この空間内では、意味的に類似したテキストデータは近くに位置するように学習されます。つまり、似た意味を持つ文章は、ベクトル空間内で近くに位置することになります。このようにして得られたベクトル表現を使うことで、2 つの文章の類似度を計算することができます。次に、このベクトル表現をベクトルデータベースの索引 (index) に登録することでナレッジベースが構築されます。
ナレッジベースから知識を検索したり洞察を得るためにユーザーが質問をすると、その質問文も同じ埋め込みモデルでベクトル化されます。そして、索引の中のベクトル化された文書群から、この質問のベクトルと最も近い文書 (単一、もしくは、複数) が検索されます。次に、検索された関連文書とユーザーの質問を組み合わせたプロンプト (指示文) を用いて LLM に最終的な回答を生成させます。つまり、この RAG システムには埋め込みモデルと LLM の 2 つのモデルが組み合わさっており、埋め込みモデルが関連文書の検索のために利用され、LLM が回答文を生成するという役割分担がなされています。
本稿では、Knowledge base for Amazon Bedrock と、AWS Marketplace からサブスクライブして利用できるベクトルデータベースの Pinecone を利用してナレッジベースを構築する手順について紹介します。
Knowledge base for Amazon Bedrock
Knowledge base for Amazon Bedrock は、Amazon Bedrock で提供される大規模言語モデルと組み合わせてシンプルな手順で迅速にマネージドな RAG システムを構築することができる Amazon Bedrock の機能です。Amazon Simple Storage Service (Amazon S3) にアップロードされたデータソースから情報を取得し、その情報をベクトル化してベクトルデータベース上にナレッジベースを構築します。データを検索に適した小さなセグメントへ分割する操作であるチャンキングや、埋め込みモデルを使ったベクトル化はマネージドサービスとして提供されます。お客様はこれらの仕組みを実装・運用する煩わしさから解放されます。
また、ナレッジベースは、Agents for Amazon Bedrock と容易に統合することができます。これにより、企業や組織内に蓄積されたデータを元に精度の高い情報を回答できる RAG システムや、企業・組織の内外の API とも連携した生成 AI エージェントアプリケーションを迅速に構築することができます。
本稿執筆時点では、Knowledge base for Amazon Bedrock は、 US East (N. Virginia) と US West (Oregon) の 2 つのリージョンで提供されています。また、ベクトルデータベースとして Amazon OpenSearch Serverless 用ベクトルエンジン、Amazon Aurora、Pinecone、Redis Enterprise Cloud をサポートしています。
Pinecone
Pinecone は、高次元のベクトルデータを扱うための、クラウドネイティブでスケーラブルなベクトルデータベースです。
ベクトルデータベースの索引の中のからクエリに最も近い文書を検索する際、総当たりのアルゴリズムを用いることもできますが、非常に多くのコンピューティング資源を消費してしまい、大規模なベクトルデータベースではスケーラビリティに問題があります。Pinecone の基本的なアプローチは、ANN (Approximate Nearest Neighbor; 近似最近傍) 検索に基づいており、大規模なデータセット内でより高速にマッチする文書を効率的に見つけ、ランク付けすることができます。
Pinecone は AWS のソフトウェアパートナーでもあります。AWS re:Invent 2023 のパートナーキーノートにおいて、アメリカの大手投資ファンド会社である Blackstone と Pinecone の協業に関して取り上げられました。
Pinecone のプライシングプラン
本稿執筆時点では、Pinecone には、フリートライアルの Starter プランと、pod と呼ばれるクラウドリソース (vCPU、RAM、disk) をあらかじめ用意する pod ベースの Standard プラン、Enterprise プラン、そして、あらかじめクラウドリソースを用意せず使用量に基づいて課金される Serverless プラン (プレビュー) があります。Starter、Standard、Enterprise プランについてはこちらのドキュメントをご参照ください。Serverless プランについては、こちらをご参照ください。
Serverless プランでは、あらかじめコンピュート資源やストレージ資源を確保しておく必要がなく、課金は実際に消費した Read units (RUs) 、Write units (WUs)、Storage (GB 単位) に基づいて計算されます。そのため、トラフィックが少ないユースケースにおいても固定費を抑えてコスト効率の良いナレッジベースを構築することができます。例えば、Pinecone 社のホームページに掲載されている RAG ユースケースでは、初期アップロードされたベクトルデータのレコード数が 100 万レコード、月間のクエリ回数、書き込み回数がいずれも 1 万回でメタデータのサイズが 500 バイトである場合の月間コストは、 3.82 ドルと試算されています。詳しくはこちらの Estimate your costs をご参照ください。
本稿では、Pinecone serverless を利用する手順を解説します。
AWS Marketplace で Pinecone serverless をサブスクライブする
AWS Marketplace は、AWS 上で動作するサードパーティ製のソフトウェア、データ、サービスを調達し、一元的に管理できるプラットフォームです。AWS Marketplace のカタログには何千ものソフトウェアが掲載されています。イメージとしては、Amazon.com で Kindle の本を買うような手軽さでソフトウェアの調達を行うことができます。しかも、ソフトウェアの料金は AWS の請求と一元化されます。
多くの企業・組織では、ソフトウェアやサービスを購入する際には、調査、見積もり、稟議、承認、予算確保、サプライヤー選定、口座確認、契約、予算執行 (購入)、納期管理、ライセンス管理などの煩雑な作業が発生します。AWS Marketplace では Marketplace で素早く適切なソフトウェア、サービスを見つけることができる上、既に AWS を利用されていて予算が確保されている場合には、新たな予算確保等のプロセスが不要となり迅速な調達が可能となる場合もあります。また、請求の一元化やソフトウェア資産の管理機能等もあり、調達後にもメリットのあるものとなっています。
はじめに AWS マネジメントコンソール を開いて、上部の検索バーに “marketplace” などと入力し、”AWS Marketplace Subscriptions” を開きます。
左ペインの “製品を検出” を開くと、下図のようなカタログの UI が表示されます。右上の検索バーに “Pinecone serverless” などと入力して、”AWS Marketplace: Pinecone Vector Database – Pay As You Go Pricing” をクリックすると Pinecone の製品ページが開きます
右上の “View purchase options” ボタンを押します。
表示される確認画面の “Subscribe” ボタンをクリックします。
画面右上に “Set up your account” というボタンが表示されます。このボタンを押すと、ブラウザの新しいタブに Pinecone のユーザー登録画面が表示されます。
ユーザー登録が完了すると Pinecone のダッシュボードが表示されます。本稿の執筆時点 (2024年3月5日) では、Pinecone serverless の試用に関して 100 ドルのクレジットが提供されており、その旨を知らせるウィンドウが表示されます。
“Get Started” をクリックします。
Project serverless の作成に成功した旨が一瞬表示された後、画面下部に Pinecone の API Key が表示されているのが見えます。“Up to 50x” と表示されているウィンドウの右上の “X” をクリックして閉じます。
AWS Marketplace が表示されているタブに戻ります。“Offer” の下段に “You are currently subscribed to this offer.” と表示されます。表示されていない場合は、ブラウザのリロードを行います。
Pinecone の Index を作成する
Knowledge base for Amazon Bedrock のセットアップの前に Pinecone の Index を作成します。これは Pinecone のコンソールで行います。Pinecone のダッシュボードが表示されたタブへ戻り “Create Index” をクリックします。
“Create a new Index” 画面で “Name” と “Dimension” を入力します。Dimension は、使用する埋め込みモデル毎に異なります。本稿では、埋め込みモデルとして “Titan G1 Embeddings – Text” を使用するため、Dimension には “1536” を入力します。Knowledge base for Amazon Bedrock の Vector Store の前提条件については、ドキュメントをご参照ください。
画面中央の “Capacity Mode” が“Serverless (Public Preview)” であることを確認します。また、画面下部には Pinecone Index を作成する AWS リージョンが表示されているので、意図するリージョンであることを確認します (Pinecone serverless はプレビュー中であり、現在は us-west-2 オレゴンリージョンのみに対応しています)。そして、右下の “Create Index” をクリックします。
Pinecone Index の作成が完了すると下図のような画面が表示されます。通常、数秒から数十秒程度で完了します。
Pinecone Index の作成はこれで完了です。Pinecone コンソールに表示されている “HOST” をメモします。Knowledge base for Amazon Bedrock のナレッジベースが参照するベクトルデータベースを指定する際に必要となります。
Pinecone API Key を AWS Secrets Manager へ登録する
Pinecone のコンソールの左側ナビゲーションペインで “API Keys” をクリックします。右側の “Actions” にあるコピーアイコンをクリックして、API Key をクリップボードにコピーします。
AWS マネジメントコンソールを開いているタブに戻り、上部の検索バーに “Secrets Manager” などと入力して AWS Secrets Manager のコンソールを開き、“新しいシークレットを保存する” をクリックします。
“シークレットのタイプ” として “その他のシークレットのタイプ” を選択し、“キー“ には apiKey
を、”値“ には先程クリップボードにコピーした ”Value“ をペーストします。下図のスクリーンショットではアスタリスクとなっていますが、実際のコンソール上では API Key の値がそのまま表示されます。なお、”キー“ の apiKey
は、大文字小文字が区別されるので注意してください。画面右下の ”次“ をクリックします。
“シークレットの名前” (pinecone-kb-test
など) と“オプションの説明” を入力して、右下の “次” をクリックします。次に表示される “ローテーションを設定 – オプション” は必要に応じて適切に設定し、右下の “次” をクリックします。“レビュー” 画面の内容を確認し “保存” をクリックします。
下図のような画面が表示されれば、シークレットが正常に登録されています。
作成したシークレットをクリックして、“シークレットの詳細” を表示し、 “シークレットの ARN” をメモします。ナレッジベースが参照するベクトルデータベースを指定する際に必要となります。
データソースを準備する
Knowledge base for Amazon Bedrock では、Amazon S3 をデータソースとして、S3 バケットにアップロードされたファイルをベクトルデータベースへ取り込みます。ナレッジベースを作成する前にデータソースとなる S3 バケットを作成し、ファイルをアップロードします。AWS マネジメントコンソールの上部の検索バーに “S3” などと入力して S3 のコンソールを開きます。右側の “バケットを作成” をクリックします。“バケットを作成”の画面が表示されたら “AWS リージョン” を選択 (本稿では、us-west-2 オレゴン) し、“バケット名” を入力して、右下の “バケットを作成” をクリックします。
バケットの作成が完了したら作成したバケット名をクリックすると下図のような画面が表示されます。右側の “アップロード” をクリックします。
“ファイルを追加” をクリックして、ナレッジベースに登録するファイルを指定します。本稿では、Amazon Bedrock のユーザーガイドの PDF ファイルをアップロードします。
右下の “アップロード” をクリックします。アップロードに成功すると、下図のような画面が表示されます。概要欄に表示されている “送信先” (s3://...)
をメモしておきます。右上の “閉じる” をクリックします。
ナレッジベースを作成する
AWS マネジメントコンソールの上部の検索バーに “Bedrock” などと入力して、Amazon Bedrock のコンソールを開きます。左上のハンバーガーメニューをクリックしてナビゲーションペインを開き、“▼オーケストレーション” の下の “ナレッジベース” をクリックします。
右側の “ナレッジベースを作成” をクリックします。
ステップ 1 の “ナレッジベースの詳細を入力” 画面で “ナレッジベース名” (knowledge-base-pinecone-test
など) を入力して、右下の “次へ” をクリックします。
ステップ 2 の “データソースを設定” 画面で “データソース名” (knowledge-base-pincone-test-data-source
など) と “S3 URI” を入力します。“S3 URI” には先ほどの “データソースを準備する” のセクションでメモした S3 URI を指定します (もしくは、 “S3 を参照” をクリックして選択します)。“次へ” をクリックします。
ステップ 3 では “埋め込みモデル” を選択します。本稿では、“Titan Embeddings G1 – Text” を使用します。他の埋め込みモデルを使用する際には、埋め込みモデルの “ベクトルの次元” と Pinecone Index の “Dimension” が一致している必要があることに注意してください。
なお、使用する埋め込みモデルは、Amazon Bedrock サービスでアクセス権が付与されている必要があります。Bedrock コンソールのハンバーガーメニューからナビゲーションメニューを開き、“モデルアクセス” 画面を開きます。ここで、“アクセスが付与されました” となっていない場合 (“リクエスト可能” となっている場合) は、右上の “モデルアクセスを管理“ をクリックして、モデルアクセスをリクエストします。
スクロールダウンして、“ベクトルデータベース” を選択します。Pinecone を使用する場合は、 “作成したベクトルストアを選択” を選択し、“既存のデータベースを選択” 欄で “Pinecone” を選択します。また、“Pinecone を選択することにより、….” の条項に同意いただく必要があります。同意される場合は、チェックボックスにチェックマークを入れます。
さらにスクロールダウンし、“エンドポイント URL” に “Pinecone の Index を作成する” のセクションの最後にメモした “HOST” の URL を入力します。また、“認証情報シークレット ARN” には、“Pinecone API Key を AWS Secrets Manager へ登録する” でメモした “シークレットの ARN” を入力します。“テキストフィールド” には、チャンクに分割されたテキストデータを保存する Pinecone のフィールド名 (text
など) を入力します。“Bedrock マネージドメタデータフィールド” には、Bedrock がメタデータを保存する Pinecone のフィールド名 (metadata
など) を入力します。“次へ” をクリックします。“確認して作成” 画面で入力内容を確認して、右下の “ナレッジベースを作成” をクリックします。
通常、1分程度でナレッジベースが作成されます。この時点ではナレッジベースの枠だけが作成されています。
ナレッジベースをデータストアと同期する
ナレッジベースを作成した直後の場合は下図のような画面が表示されています。“同期” もしくは “データソースを同期“ をクリックして、データソースをナレッジベースへ取り込みます。同期に必要な時間はデータストアのデータ量に依存します。”データソースの同期が完了しました“ と表示されればデータソースのナレッジベースへの取り込みが完了しています。今回の、Amazon Bedrock ユーザーガイドの PDF ファイルひとつの場合には 1 分程度で完了しました。
なお、この画面から移動してしまった場合は、Amazon Bedrock コンソールの左側ハンバーガーメニュー → ナビゲーションメニュー → オーケストレーション → ナレッジベースの順に辿り、テストしたいナレッジベースの名前を選択すると、同様の画面に遷移します。データストアに変更 (データの追加、更新、削除) があった場合には改めて ”同期“ を行う必要があります。API を使って同期する方法についてはドキュメントをご参照ください。
ナレッジベースをテストする
ナレッジベースを作成して同期が完了すると、下図のような画面が表示されます。画面右側の “モデルを選択” をクリックして、クエリへの回答を生成する基盤モデルを選択します。
“モデルを選択“ 画面で、回答生成に使用したい基盤モデルを選択します。本稿では、Anthropic 社の ”Claude 2.1 v.2.1“ を選択します。Amazon Bedrock では Claude 3 が既に利用可能となっていますが、本稿執筆時点では Knowledge base for Amazon Bedrock で利用可能な基盤モデルは下図の 3 モデルとなっています。”適用“ をクリックします。
“ナレッジベースをテスト” の下部にある “ここにメッセージを入力” 欄に質問を入力します。“実行” をクリックします。
ナレッジベースの検索結果を元に、基盤モデルによる回答が生成されました。
回答の元となった情報の出典も確認することができます。
ナレッジベースに API でアクセスする
ナレッジベースに API 経由で質問を送信し回答を得るには、Agents for Amazon Bedrock Runtime の RetrieveAndGenerate API を使用することができます。詳細はドキュメントをご参照ください。
API でアクセスするには、ナレッジベースの ID (図 29 などの “ナレッジベース ID”)と、回答を生成する基盤モデルのモデル ID が必要となります。基盤モデルのモデル ID は、Bedrock コンソール → 左上のハンバーガーメニュー → ナビゲーションメニュー → 基盤モデル → ベースモデルと辿って表示される “ベースモデル” 画面で、基盤モデル名 (このブログの例では Claude v2.1) をクリックして表示される画面の API リクエスト欄で確認することができます (ListFoundationModels API で確認することもできます)。
下記のコードサンプルの modelId
と knowledgebaseId
を、確認した値に修正し、必要に応じて query
を修正します。
import boto3
region = "us-west-2"
modelId = "anthropic.claude-v2:1"
knowledgebaseId = "XXXXXXXXXX"
query = "Bedrockのセキュリティ上のメリットは何ですか?"
modelArn = f'arn:aws:bedrock:{region}::foundation-model/{modelId}'
session = boto3.Session(region_name=region)
client = session.client(service_name='bedrock-agent-runtime')
response = client.retrieve_and_generate(
input={
'text': query
},
retrieveAndGenerateConfiguration={
'type': 'KNOWLEDGE_BASE',
'knowledgeBaseConfiguration': {
'knowledgeBaseId': knowledgebaseId,
'modelArn': modelArn,
},
},
)
print(response['output']['text'])
下図は実行例となります。
ハイブリッドサーチに関する補足
本稿では Knowledge base for Amazon Bedrock と Pinecone serverless を用いてセマンティックサーチを行う方法について取り上げました。ユースケースによっては、セマンティックサーチだけでなく、テキストサーチも組み合わせたハイブリッドサーチが適している場合もあります。Pinecone 自体はハイブリッドサーチをサポートしていますが、本稿執筆時点では、Knowledge base for Amazon Bedrock と Pinecone との組み合わせでは、ハイブリッドサーチはサポートされていません。ハイブリッドサーチを使いたい場合には、Amazon OpenSearch Serverless との組み合わせをご検討ください。また、Pinecone のハイブリッドサーチを使いたい場合には、Knowledge base for Amazon Bedrock を使わずに、Amazon Bedrock の基盤モデルと Pinecone serverless を LangChain などのフレームワークで統合することができます。
まとめ
Knowledge base for Amazon Bedrock と Pinecone serverless を組み合わせることでシステムの担当者は、RAG システムや生成 AI エージェントアプリケーションの構築の手間を大幅に軽減することが可能です。また、ビジネスの担当者はアイデアを迅速に検証し、素早く市場にリーチすることができます。そして、新しいサービスは利用者数や利用頻度を予測することが難しく固定費が大きなアーキテクチャーではプロダクションへの移行の決断が困難となりますが、Pinecone serverless のコンサンプションベースの料金体系により、リスクを最小限に抑えながら新サービスの事業化が可能となります。さらに、事業活動が大きく成長した際にも Pinecone serverless のスケーラビリティが役に立つでしょう。
著者について
本橋 和貴 (Kazuki Motohashi) は、AWS Japan の機械学習パートナーソリューションアーキテクトです。AWS 上で機械学習関連のソフトウェアを開発しているパートナー企業の技術支援を担当をしています。好きなサービスは Amazon SageMaker です。週末は昔の RPG のリメイクゲームの攻略に勤しんでいます。博士 (理学)。
荒川裕二 (Yuji Arakawa) は、APJ (Asia Pacific Japan) Partner Core Tech のシニアエンタープライズアーキテクトです。主に日本のパートナー企業の技術支援を担当しながら Machine Learning TFC (Technical Field Community) の AoD (Area of Depth) としても活動しています。好きなサービスは Amazon Bedrock と Amazon SageMaker Jumpstart です。自由時間のすべてをアニメーション産業の発展のために捧げています。