ゼファーネットのロゴ

Amazon Bedrock と Amazon SageMaker でホストされているマルチモーダル基盤モデルを使用してスライドデッキに話しかける – パート 1 |アマゾン ウェブ サービス

日付:

生成 AI の出現により、大規模言語モデル (LLM) である Claude 2 や Llama 2 などの今日の基盤モデル (FM) は、テキスト データに対する質問応答、要約、コンテンツ作成などのさまざまな生成タスクを実行できるようになりました。ただし、現実世界のデータは、テキスト、画像、ビデオ、オーディオなどの複数の形式で存在します。たとえば、PowerPoint のスライドデッキを考えてみましょう。情報はテキスト形式で含まれることも、グラフ、表、画像に埋め込まれることもあります。

この投稿では、次のようなマルチモーダル FM を使用するソリューションを紹介します。 Amazon Titan マルチモーダル埋め込み モデルと LLaVA 1.5 および AWS サービスを含む アマゾンの岩盤 & アマゾンセージメーカー マルチモーダル データに対して同様の生成タスクを実行します。

ソリューションの概要

このソリューションは、スライドデッキのテキストおよび視覚要素に含まれる情報を使用して質問に答えるための実装を提供します。この設計は、検索拡張生成 (RAG) の概念に基づいています。従来、RAG は LLM で処理できるテキスト データに関連付けられてきました。この投稿では、RAG を拡張して画像も含めます。これにより、テキストとともに表やグラフなどの視覚要素から文脈に関連したコンテンツを抽出する強力な検索機能が提供されます。

画像を含む RAG ソリューションを設計するには、さまざまな方法があります。ここでは 1 つのアプローチを紹介しましたが、この 3 部構成シリーズの 2 番目の投稿で別のアプローチをフォローアップします。

このソリューションには、次のコンポーネントが含まれています。

  • Amazon Titan マルチモーダル埋め込みモデル – この FM は、この投稿で使用されているスライドデッキ内のコンテンツの埋め込みを生成するために使用されます。マルチモーダル モデルとして、この Titan モデルは、テキスト、画像、またはその組み合わせを入力として処理し、埋め込みを生成できます。 Titan Multimodal Embeddings モデルは 1,024 次元のベクトル (埋め込み) を生成し、Amazon Bedrock 経由でアクセスします。
  • 大規模言語視覚アシスタント (LLaVA) – LLaVA は、視覚的および言語理解のためのオープンソースのマルチモーダル モデルであり、グラフや表などの視覚要素を含むスライド内のデータを解釈するために使用されます。 7億パラメータバージョンを使用します LLaVA 1.5-7b このソリューションでは。
  • アマゾンセージメーカー – LLaVA モデルは、SageMaker ホスティング サービスを使用して SageMaker エンドポイントにデプロイされ、結果のエンドポイントを使用して LLaVA モデルに対して推論を実行します。また、このソリューションをエンドツーエンドで調整し、デモするために SageMaker ノートブックも使用します。
  • Amazon OpenSearch サーバーレス – OpenSearch Serverless は、オンデマンドのサーバーレス構成です。 AmazonOpenSearchサービス。 Titan Multimodal Embeddings モデルによって生成されたエンベディングを保存するためのベクトル データベースとして OpenSearch Serverless を使用します。 OpenSearch Serverless コレクションで作成されたインデックスは、RAG ソリューションのベクター ストアとして機能します。
  • Amazon OpenSearch インジェスト (OSI) – OSI は、OpenSearch サービス ドメインおよび OpenSearch サーバーレス コレクションにデータを配信する、フルマネージドのサーバーレス データ コレクターです。この投稿では、OSI パイプラインを使用してデータを OpenSearch サーバーレス ベクター ストアに配信します。

ソリューションのアーキテクチャ

ソリューション設計は、取り込みとユーザー対話の 2 つの部分で構成されます。取り込み中に、各スライドを画像に変換することによって入力スライド デッキを処理し、これらの画像の埋め込みを生成して、ベクター データ ストアにデータを追加します。これらのステップは、ユーザー対話ステップの前に完了します。

ユーザー インタラクション フェーズでは、ユーザーからの質問が埋め込みに変換され、ベクトル データベース上で類似性検索が実行され、ユーザーの質問に対する回答が含まれている可能性のあるスライドが検索されます。次に、このスライド (画像ファイルの形式) を LLaVA モデルに提供し、クエリに対する回答を生成するためのプロンプトとしてユーザーの質問を提供します。この投稿のコードはすべて次の場所にあります。 GitHubの レポ。

次の図は、取り込みアーキテクチャを示しています。

インジェストアーキテクチャ図

ワークフローの手順は次のとおりです。

  1. スライドは JPG 形式の画像ファイル (スライドごとに 1 つ) に変換され、Titan Multimodal Embeddings モデルに渡されて埋め込みを生成します。この投稿では、というタイトルのスライドデッキを使用します。 AWS Trainium と AWS Inferentia を使用した Stable Diffusion のトレーニングとデプロイ 2023 年 31 月にトロントで開催された AWS サミットから、ソリューションをデモンストレーションします。サンプルデッキには 31 枚のスライドがあるため、それぞれ 1,024 次元を持つ XNUMX セットのベクトル埋め込みを生成します。これらの生成されたベクトル埋め込みに追加のメタデータ フィールドを追加し、JSON ファイルを作成します。これらの追加のメタデータ フィールドを使用すると、OpenSearch の強力な検索機能を使用して豊富な検索クエリを実行できます。
  2. 生成された埋め込みは 1 つの JSON ファイルにまとめられ、次の場所にアップロードされます。 Amazon シンプル ストレージ サービス (Amazon S3)。
  3. ビア AmazonS3イベント通知、イベントは Amazon シンプル キュー サービス (Amazon SQS)キュー。
  4. SQS キュー内のこのイベントは、OSI パイプラインを実行するトリガーとして機能し、OSI パイプラインはデータ (JSON ファイル) をドキュメントとして OpenSearch サーバーレス インデックスに取り込みます。 OpenSearch サーバーレス インデックスは、このパイプラインのシンクとして構成され、OpenSearch サーバーレス コレクションの一部として作成されることに注意してください。

次の図は、ユーザー対話アーキテクチャを示しています。

ユーザーインタラクションアーキテクチャ

ワークフローの手順は次のとおりです。

  1. ユーザーは、取り込まれたスライドデッキに関連する質問を送信します。
  2. ユーザー入力は、Amazon Bedrock 経由でアクセスされる Titan Multimodal Embeddings モデルを使用して埋め込みに変換されます。 OpenSearch ベクトル検索は、これらの埋め込みを使用して実行されます。 k 最近傍 (k=1) 検索を実行して、ユーザーのクエリに一致する最も関連性の高い埋め込みを取得します。 k=1 に設定すると、ユーザーの質問に最も関連性の高いスライドが取得されます。
  3. OpenSearch Serverless からの応答のメタデータには、最も関連性の高いスライドに対応する画像へのパスが含まれています。
  4. プロンプトはユーザーの質問と画像パスを組み合わせて作成され、SageMaker でホストされている LLaVA に提供されます。 LLaVA モデルは、画像内のデータを調べることでユーザーの質問を理解し、それに答えることができます。
  5. この推論の結果はユーザーに返されます。

これらの手順については、次のセクションで詳しく説明します。を参照してください。 結果 スクリーンショットと出力の詳細についてはセクションを参照してください。

前提条件

この投稿で提供されているソリューションを実装するには、 AWSアカウント FM、Amazon Bedrock、SageMaker、OpenSearch Service に精通していること。

このソリューションでは、Titan マルチモーダル エンベディング モデルを使用します。このモデルが Amazon Bedrock で使用できるように設定されていることを確認してください。 Amazon Bedrock コンソールで、 モデルアクセス ナビゲーションペインで。 Titan Multimodal Embeddings が有効になっている場合、アクセス ステータスは次のようになります。 アクセスが許可されました.

Amazon Bedrock でモデルへのアクセスを管理する

モデルが利用できない場合は、選択してモデルへのアクセスを有効にします。 モデルアクセスの管理選択する Titan マルチモーダル エンベディング G1、および選択 モデルへのアクセスをリクエストする。モデルはすぐに使用できるようになります。

Amazon Bedrock でモデルへのアクセスをリクエストする

AWS CloudFormation テンプレートを使用してソリューション スタックを作成する

次のいずれかを使用します AWS CloudFormation テンプレート (地域に応じて) を使用して、ソリューション リソースを起動します。

AWSリージョン リンク
us-east-1 us-east-1 の CloudFormation テンプレートへのリンク
us-west-2 us-west-2 の CloudFormation テンプレートへのリンク

スタックが正常に作成されたら、スタックの 出力 AWS CloudFormation コンソールのタブに移動し、次の値をメモします。 MultimodalCollectionEndpoint、後続のステップで使用します。

CloudFormation テンプレートによって作成されたリソース

CloudFormationテンプレートは、次のリソースを作成します。

  • IAMの役割 - 次の AWS IDおよびアクセス管理 (IAM) ロールが作成されます。これらのロールを更新して適用します 最小特権のアクセス許可.
    • SMExecutionRole Amazon S3、SageMaker、OpenSearch Service、Bedrock のフルアクセスを備えています。
    • OSPipelineExecutionRole 特定の Amazon SQS および OSI アクションにアクセスできます。
  • SageMaker ノート – この投稿のコードはすべて、このノートブックを介して実行されます。
  • OpenSearch サーバーレス コレクション – これは、エンベディングを保存および取得するためのベクトル データベースです。
  • OSIパイプライン – これは、OpenSearch Serverless にデータを取り込むためのパイプラインです。
  • S3バケット – この投稿のすべてのデータはこのバケットに保存されます。
  • SQSキュー – OSI パイプラインの実行をトリガーするイベントは、このキューに入れられます。

CloudFormation テンプレートは、ソースとして Amazon S3 および Amazon SQS 処理を使用し、シンクとして OpenSearch サーバーレス インデックスを使用して OSI パイプラインを構成します。指定された S3 バケットとプレフィックス (multimodal/osi-embeddings-json) SQS 通知をトリガーします。この通知は、OSI パイプラインによって OpenSearch サーバーレスにデータを取り込むために使用されます。

CloudFormation テンプレートはまた、 ネットワーク, 暗号化, データアクセス OpenSearch サーバーレス コレクションに必要なポリシー。これらのポリシーを更新して、最小特権のアクセス許可を適用します。

CloudFormation テンプレート名は SageMaker ノートブックで参照されることに注意してください。デフォルトのテンプレート名が変更された場合は、必ず同じものを更新してください。 グローバル.py

ソリューションをテストする

前提条件の手順が完了し、CloudFormation スタックが正常に作成されたら、ソリューションをテストする準備が整いました。

  1. SageMakerコンソールで、 ノートブック ナビゲーションペインに表示されます。
  2. 現在地に最も近い MultimodalNotebookInstance ノートブック インスタンスを選択して JupyterLabを開く.
    Amazon SageMaker のノートブックインスタンス
  3. In ファイルブラウザ、ノートブック フォルダーに移動して、ノートブックとサポート ファイルを表示します。

ノートブックには、実行される順序で番号が付けられます。各ノートブックの指示とコメントは、そのノートブックによって実行されるアクションを説明します。これらのノートブックを 1 つずつ実行します。

  1. 選択する 0_deploy_llava.ipynb JupyterLab で開きます。
  2. ソフトウェア設定ページで、下図のように ラン メニュー、選択 すべてのセルを実行 このノートブックのコードを実行します。

このノートブックは、LLaVA-v1.5-7B モデルを SageMaker エンドポイントにデプロイします。このノートブックでは、HuggingFace Hub から LLaVA-v1.5-7B モデルをダウンロードし、inference.py スクリプトを次のように置き換えます。 llava_inference.pyをクリックし、このモデルの model.tar.gz ファイルを作成します。 model.tar.gz ファイルは Amazon S3 にアップロードされ、SageMaker エンドポイントにモデルをデプロイするために使用されます。の llava_inference.py スクリプトには、Amazon S3 から画像ファイルを読み取り、それに対して推論を実行できるようにする追加のコードが含まれています。

  1. 選択する 1_data_prep.ipynb JupyterLab で開きます。
  2. ソフトウェア設定ページで、下図のように ラン メニュー、選択 すべてのセルを実行 このノートブックのコードを実行します。

このノートブックは、 スライドデッキ、各スライドを JPG ファイル形式に変換し、この投稿に使用した S3 バケットにアップロードします。

  1. 選択する 2_データ取り込み.ipynb JupyterLab で開きます。
  2. ソフトウェア設定ページで、下図のように ラン メニュー、選択 すべてのセルを実行 このノートブックのコードを実行します。

このノートブックでは次のことを行います。

  • OpenSearch Serverless コレクションにインデックスを作成します。このインデックスには、スライドデッキの埋め込みデータが保存されます。次のコードを参照してください。
session = boto3.Session()
credentials = session.get_credentials()
auth = AWSV4SignerAuth(credentials, g.AWS_REGION, g.OS_SERVICE)

os_client = OpenSearch(
  hosts = [{'host': host, 'port': 443}],
  http_auth = auth,
  use_ssl = True,
  verify_certs = True,
  connection_class = RequestsHttpConnection,
  pool_maxsize = 20
)

index_body = """
{
  "settings": {
      "index.knn": true
  },
  "mappings": {
      "properties": {
          "vector_embedding": {
              "type": "knn_vector",
              "dimension": 1024,
              "method": {
                  "name": "hnsw",
                  "engine": "nmslib",
                  "parameters": {}
              }
          },
          "image_path": {
              "type": "text"
          },
          "metadata": {
              "properties": {
                  "slide_filename": {
                      "type": "text"
                  },
                  "model_id": {
                      "type": "text"
                  },
                  "slide_description": {
                      "type": "text"
                  }
              }
          }
      }
  }
}
"""
index_body = json.loads(index_body)
try:
  response = os_client.indices.create(index_name, body=index_body)
  logger.info(f"response received for the create index -> {response}")
except Exception as e:
  logger.error(f"error in creating index={index_name}, exception={e}")

  • Titan Multimodal Embeddings モデルを使用して、前のノートブックで作成した JPG 画像をベクター埋め込みに変換します。これらの埋め込みと追加のメタデータ (画像ファイルの S3 パスなど) は JSON ファイルに保存され、Amazon S3 にアップロードされます。単一の JSON ファイルが作成され、埋め込みに変換されたすべてのスライド (画像) のドキュメントが含まれることに注意してください。次のコード スニペットは、画像 (Base64 エンコードされた文字列の形式) がどのように埋め込みに変換されるかを示しています。
def get_multimodal_embeddings(bedrock: botocore.client, image: str) -> np.ndarray:
    body = json.dumps(dict(inputImage=image))
    try:
        response = bedrock.invoke_model(
            body=body, modelId=g.FMC_MODEL_ID, accept=g.ACCEPT_ENCODING, contentType=g.CONTENT_ENCODING
        )
        response_body = json.loads(response.get("body").read())
        embeddings = np.array([response_body.get("embedding")]).astype(np.float32)
    except Exception as e:
        logger.error(f"exception while image(truncated)={image[:10]}, exception={e}")
        embeddings = None

    return embeddings

  • このアクションにより、OpenSearch インジェスト パイプラインがトリガーされ、ファイルが処理されて OpenSearch サーバーレス インデックスに取り込まれます。以下は作成されたJSONファイルのサンプルです。 (コード例には 1,024 次元のベクトルが示されています。Titan マルチモーダル エンベディング モデルは XNUMX 次元を生成します。)
[
  {
    "image_path": "s3://<your-bucket-name>/path/to/file1.json",
    "metadata": {
      "slide_filename": "mypowerpoint1.pptx",
      "model_id": "amazon.titan-embed-image-v1",
      "slide_description": "This is a test slide deck"
    },
    "vector_embedding": [
      657.6052386529958,
      0.8865137233123771,
      763.870264592026
    ]
  }
] 

  1. 選択する 3_rag_inference.ipynb JupyterLab で開きます。
  2. ソフトウェア設定ページで、下図のように ラン メニュー、選択 すべてのセルを実行 このノートブックのコードを実行します。

このノートブックは RAG ソリューションを実装しています。ユーザーの質問を埋め込みに変換し、ベクター データベースから類似の画像 (スライド) を検索し、取得した画像を LLaVA に提供してユーザーの質問に対する回答を生成します。次のプロンプト テンプレートを使用します。

prompt_template: str = """Pretend that you are a helpful assistant that answers questions about content in a slide deck. 
  Using only the information in the provided slide image answer the following question.
  If you do not find the answer in the image then say I did not find the answer to this question in the slide deck.

  {question}
"""

次のコード スニペットは、RAG ワークフローを提供します。

# create prompt and convert to embeddings
question: str = "As per the AI/ML flywheel, what do the AWS AI/ML services provide?"
prompt = prompt_template.format(question=question)
text_embeddings = get_text_embeddings(bedrock, question)

# vector db search
vector_db_response: Dict = find_similar_data(text_embeddings)

# download image for local notebook display
s3_img_path = vector_db_response.get('hits', {}).get('hits')[0].get('_source').get('image_path')
logger.info(f"going to answer the question="{question}" using the image "{s3_img_path}"")

!aws s3 cp {s3_img_path} .
local_img_path = os.path.basename(s3_img_path)
display(Image(filename=local_img_path))

# Ask LLaVA
data = {
    "image" : s3_img_path,
    "question" : prompt,
    "temperature" : 0.1,
}
output = predictor.predict(data)
logger.info(f"Image={s3_img_path}nQuestion: {question}nAnswer: {output}nn")

結果

以下は、実装によって生成されたいくつかのユーザーの質問と回答をまとめたものです。の 質問 列はユーザ​​ーの質問をキャプチャし、 回答 列は、LLaVA によって生成されたテキスト応答です。 画像 OpenSearch サーバーレス ベクトル検索によって返される k 近似 (k=1) スライド マッチです。このスライドは LLaVA によって解釈され、答えが提供されます。

マルチモーダル RAG の結果

質問 回答 画像
Inf2 のパフォーマンスは、同等の EC2 インスタンスとどのように比較されますか?数字が必要なんです。 スライド資料によると、AWS Inferentia2 による Inf2 インスタンスは、同等の EC4 インスタンスと比較して、最大 10 倍の高いスループットと 2 倍の低いレイテンシを提供します。 結果表の質問 1 の画像
AI/ML フライホイールによると、AWS AI/ML サービスは何を提供しますか? AWS AI/ML サービスは、より優れた $/perfer 機能、新機能、イノベーションへの投資を提供します。 結果表の質問 2 の画像
GPT-2 と比較して、GPT-3 にはどれだけ多くのパラメーターがありますか? GPT-2とGPT-3のパラメータサイズの数値的な違いは何ですか? スライドによると、GPT-3 には 175 億のパラメーターがあるのに対し、GPT-2 には 1.5 億のパラメーターがあります。 GPT-2 と GPT-3 のパラメータ サイズの数値差は 173.5 億です。 結果表の質問 3 の画像
素粒子物理学におけるクォークとは何ですか? この質問に対する答えはスライドデッキには見つかりませんでした。 結果表の質問 4 の画像

このソリューションをスライドデッキに自由に拡張してください。 globals.py の SLIDE_DECK 変数をスライド デッキへの URL で更新し、前のセクションで説明した取り込み手順を実行するだけです。

先端

OpenSearch ダッシュボードを使用して OpenSearch API と対話し、インデックスと取り込まれたデータに対して簡単なテストを実行できます。次のスクリーンショットは、OpenSearch ダッシュボードの GET の例を示しています。

OpenSearch ダッシュボードのビュー

クリーンアップ

今後料金が発生しないようにするには、作成したリソースを削除してください。これを行うには、CloudFormation コンソールからスタックを削除します。

CloudFormationスタックの削除

さらに、LLaVA 推論用に作成された SageMaker 推論エンドポイントを削除します。これを行うには、クリーンアップ ステップのコメントを解除します。 3_rag_inference.ipynb セルを実行するか、SageMaker コンソール経由でエンドポイントを削除します。 推論 & エンドポイント ナビゲーション ペインでエンドポイントを選択して削除します。

まとめ

企業は常に新しいコンテンツを生成しており、スライド デッキは、組織内で情報を共有し、外部で顧客やカンファレンスで情報を共有および配布するために使用される一般的なメカニズムです。時間の経過とともに、豊富な情報がこれらのスライドデッキのグラフや表などの非テキスト形式に埋もれ、隠されたままになる可能性があります。このソリューションと、Titan マルチモーダル エンベディング モデルや LLaVA などのマルチモーダル FM の機能を使用して、新しい情報を発見したり、スライド デッキのコンテンツに関する新しい視点を明らかにしたりできます。

探索してさらに学ぶことをお勧めします Amazon SageMaker ジャンプスタート, アマゾンタイタンモデル、Amazon Bedrock、OpenSearch Service を利用し、この投稿で提供されているサンプル実装を使用してソリューションを構築します。

このシリーズの一部として、さらに 2 つの投稿を予定しています。パート 3 では、スライドデッキについて話すために使用できる別のアプローチについて説明します。このアプローチでは、LLaVA 推論を生成および保存し、それらの保存された推論を使用してユーザーのクエリに応答します。パート XNUMX では、XNUMX つのアプローチを比較します。


著者について

アミット・アロラ は、アマゾン ウェブ サービスの AI および ML スペシャリスト アーキテクトであり、企業顧客がクラウドベースの機械学習サービスを使用してイノベーションを迅速に拡張できるよう支援しています。 彼は、ワシントン DC のジョージタウン大学で修士課程のデータ サイエンスおよび分析プログラムの非常勤講師でもあります。

マンジュ・プラサド アマゾン ウェブ サービスの戦略アカウント部門のシニア ソリューション アーキテクトです。彼女は、主要な M&E 顧客に AI/ML を含むさまざまなドメインで技術的な指導を提供することに重点を置いています。 AWS に入社する前は、金融サービス部門の企業や新興企業向けのソリューションを設計および構築していました。

アルチャナ・イナプディ AWS のシニア ソリューション アーキテクトとして戦略的な顧客をサポートしています。彼女は、顧客のデータ分析およびデータベース ソリューションの設計と構築を支援してきた 10 年以上の経験があります。彼女は、テクノロジーを使用して顧客に価値を提供し、ビジネスの成果を達成することに情熱を持っています。

アンタラ・ライサ テキサス州ダラスを拠点とするアマゾン ウェブ サービスの AI および ML ソリューション アーキテクトで、戦略的な顧客をサポートしています。彼女は、AWS で大規模なエンタープライズ パートナーと協力した経験もあり、デジタル ネイティブの顧客向けのパートナー サクセス ソリューション アーキテクトとして働いていました。

スポット画像

最新のインテリジェンス

スポット画像