生成的データ インテリジェンス

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

日付:

In 第1部 このシリーズでは、 Amazon Titan マルチモーダル埋め込み モデルを使用して、スライドデッキの個々のスライドを埋め込みに変換します。埋め込みをベクトル データベースに保存し、 大規模な言語および視覚アシスタント (LLaVA 1.5-7b) ベクトル データベースから取得した最も類似したスライドに基づいて、ユーザーの質問に対するテキスト応答を生成するモデル。 AWS のサービスを利用しました。 アマゾンの岩盤, アマゾンセージメーカー, Amazon OpenSearch サーバーレス このソリューションでは。

この投稿では、別のアプローチを示します。私たちが使用するのは、 人間のクロード 3 ソネット モデルを使用して、スライドデッキ内の各スライドのテキスト説明を生成します。これらの説明は、 Amazon Titan テキスト埋め込み モデルを作成し、ベクトル データベースに保存します。次に、Claude 3 Sonnet モデルを使用して、ベクトル データベースから取得した最も関連性の高いテキスト説明に基づいてユーザーの質問に対する回答を生成します。

データセットに対して両方のアプローチをテストし、結果を評価して、どちらのアプローチが最良の結果をもたらすかを確認できます。このシリーズのパート 3 では、両方の方法の結果を評価します。

ソリューションの概要

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

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

  • Amazon Titan Text Embeddings は、単一の単語、フレーズ、さらには大きなドキュメントを含む自然言語テキストを、意味的類似性に基づいた検索、パーソナライゼーション、クラスタリングなどのユースケースを強化するために使用できる数値表現に変換するテキスト埋め込みモデルです。
  • Claude 3 Sonnet は、Anthropic の次世代の最先端モデルです。 Sonnet は、複雑な推論や分析から迅速な出力、そして膨大な量の情報にわたる効率的な検索や取得まで、幅広いタスクを処理できる多用途ツールです。
  • OpenSearch Serverless は、Amazon OpenSearch Service のオンデマンドのサーバーレス構成です。 Amazon Titan Text Embeddings モデルによって生成された埋め込みを保存するためのベクトル データベースとして OpenSearch Serverless を使用します。 OpenSearch Serverless コレクションで作成されたインデックスは、RAG ソリューションのベクター ストアとして機能します。
  • Amazon OpenSearch の取り込み (OSI) は、OpenSearch サービス ドメインおよび OpenSearch サーバーレス コレクションにデータを配信する、フルマネージドのサーバーレス データ コレクターです。この投稿では、OSI パイプライン API を使用して、OpenSearch サーバーレス ベクター ストアにデータを配信します。

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

ユーザー対話フェーズでは、ユーザーからの質問がテキスト埋め込みに変換されます。類似性検索がベクトル データベースで実行され、ユーザーの質問に対する回答が含まれている可能性があるスライドに対応するテキスト説明が検索されます。次に、スライドの説明とユーザーの質問を Claude 3 Sonnet モデルに提供して、クエリに対する回答を生成します。この投稿のコードはすべて次の場所にあります。 GitHubの レポ。

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

ワークフローは次の手順で構成されます。

  1. スライドは JPG 形式の画像ファイル (スライドごとに 3 つ) に変換され、Claude XNUMX Sonnet モデルに渡されてテキストの説明が生成されます。
  2. データは Amazon Titan Text Embeddings モデルに送信され、埋め込みが生成されます。このシリーズではスライドデッキを使用しています AWS Trainium と AWS Inferentia を使用した Stable Diffusion のトレーニングとデプロイ 2023 年 31 月にトロントで開催された AWS サミットから、ソリューションのデモンストレーションを行いました。サンプルデッキには 31 枚のスライドがあるため、それぞれ 1536 次元を持つ XNUMX セットのベクトル埋め込みを生成します。 OpenSearch の強力な検索機能を使用して豊富な検索クエリを実行するために、追加のメタデータ フィールドを追加します。
  3. 埋め込みは、API 呼び出しを使用して OSI パイプラインに取り込まれます。
  4. OSI パイプラインは、データをドキュメントとして OpenSearch サーバーレス インデックスに取り込みます。インデックスはこのパイプラインのシンクとして構成され、OpenSearch サーバーレス コレクションの一部として作成されます。

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

ワークフローは次の手順で構成されます。

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

次のセクションで両方の段階の手順について説明し、出力の詳細も含めます。

前提条件

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

このソリューションは、Amazon Bedrock でホストされている Claude 3 Sonnet および Amazon Titan Text Embeddings モデルを使用します。に移動して、これらのモデルが使用可能になっていることを確認してください。 モデルアクセス Amazon Bedrock コンソールのページ。

モデルが有効になっている場合、 アクセス状況 述べます アクセスが許可されました.

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

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

AWS CloudFormation を使用してソリューション スタックを作成できます。同じ AWS アカウントでパート 1 のソリューションを作成した場合は、このスタックを作成する前に必ずそれを削除してください。

AWSリージョン リンク
us-east-1
us-west-2

スタックが正常に作成されたら、AWS CloudFormation コンソールでスタックの [出力] タブに移動し、次の値をメモします。 MultimodalCollectionEndpoint および OpenSearchPipelineEndpoint。これらは後続の手順で使用します。

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

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

CloudFormation テンプレートは、ソースとして HTTP、シンクとして OpenSearch サーバーレス インデックスを使用して OSI パイプラインを構成するために必要なパイプライン構成をセットアップします。 SageMaker ノートブック 2_data_ingestion.ipynb を使用してデータをパイプラインに取り込む方法を示します。 つながり申請 HTTPライブラリ。

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

CloudFormation テンプレート名と OpenSearch Service インデックス名は SageMaker ノートブックで参照されます 3_rag_inference.ipynb。デフォルトの名前を変更する場合は、必ずノートブック内でそれらの名前を更新してください。

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

CloudFormation スタックを作成した後、ソリューションをテストできます。次の手順を実行します。

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

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

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

このノートブックは、公開されているファイルをダウンロードします。 スライドデッキ、各スライドを JPG ファイル形式に変換し、S3 バケットにアップロードします。

  1. 選択する 2_data_ingestion.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": 1536,
        "method": {
          "name": "hnsw",
          "engine": "nmslib",
          "parameters": {}
        }
      },
      "image_path": {
        "type": "text"
      },
      "slide_text": {
        "type": "text"
      },
      "slide_number": {
        "type": "text"
      },
      "metadata": { 
        "properties" :
          {
            "filename" : {
              "type" : "text"
            },
            "desc":{
              "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}")

Claude 3 Sonnet および Amazon Titan Text Embeddings モデルを使用して、前のノートブックで作成した JPG 画像をベクトル埋め込みに変換します。これらの埋め込みと追加のメタデータ (S3 パスや画像ファイルの説明など) は、埋め込みとともにインデックスに保存されます。次のコード スニペットは、Claude 3 Sonnet が画像の説明を生成する方法を示しています。

def get_img_desc(image_file_path: str, prompt: str):
    # read the file, MAX image size supported is 2048 * 2048 pixels
    with open(image_file_path, "rb") as image_file:
        input_image_b64 = image_file.read().decode('utf-8')
  
    body = json.dumps(
        {
            "anthropic_version": "bedrock-2023-05-31",
            "max_tokens": 1000,
            "messages": [
                {
                    "role": "user",
                    "content": [
                        {
                            "type": "image",
                            "source": {
                                "type": "base64",
                                "media_type": "image/jpeg",
                                "data": input_image_b64
                            },
                        },
                        {"type": "text", "text": prompt},
                    ],
                }
            ],
        }
    )
    
    response = bedrock.invoke_model(
        modelId=g.CLAUDE_MODEL_ID,
        body=body
    )

    resp_body = json.loads(response['body'].read().decode("utf-8"))
    resp_text = resp_body['content'][0]['text'].replace('"', "'")

    return resp_text

画像の説明は Amazon Titan Text Embeddings モデルに渡され、ベクトル埋め込みが生成されます。これらの埋め込みと追加のメタデータ (S3 パスや画像ファイルの説明など) は、埋め込みとともにインデックスに保存されます。次のコードスニペットは、Amazon Titan Text Embeddings モデルの呼び出しを示しています。

def get_text_embedding(bedrock: botocore.client, prompt_data: str) -> np.ndarray:
    body = json.dumps({
        "inputText": prompt_data,
    })    
    try:
        response = bedrock.invoke_model(
            body=body, modelId=g.TITAN_MODEL_ID, accept=g.ACCEPT_ENCODING, contentType=g.CONTENT_ENCODING
        )
        response_body = json.loads(response['body'].read())
        embedding = response_body.get('embedding')
    except Exception as e:
        logger.error(f"exception={e}")
        embedding = None

    return embedding

データは、OSI パイプラインへの API 呼び出しを行うことによって OpenSearch サーバーレス インデックスに取り込まれます。次のコード スニペットは、Requests HTTP ライブラリを使用して行われた呼び出しを示しています。

data = json.dumps([{
    "image_path": input_image_s3, 
    "slide_text": resp_text, 
    "slide_number": slide_number, 
    "metadata": {
        "filename": obj_name, 
        "desc": "" 
    }, 
    "vector_embedding": embedding
}])

r = requests.request(
    method='POST', 
    url=osi_endpoint, 
    data=data,
    auth=AWSSigV4('osis'))

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

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

  llm_prompt: str = """

  Human: Use the summary to provide a concise answer to the question to the best of your abilities. If you cannot answer the question from the context then say I do not know, do not make up an answer.
  <question>
  {question}
  </question>

  <summary>
  {summary}
  </summary>

  Assistant:"""

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

def get_llm_response(bedrock: botocore.client, question: str, summary: str) -> str:
    prompt = llm_prompt.format(question=question, summary=summary)
    
    body = json.dumps(
    {
        "anthropic_version": "bedrock-2023-05-31",
        "max_tokens": 1000,
        "messages": [
            {
                "role": "user",
                "content": [
                    {"type": "text", "text": prompt},
                ],
            }
        ],
    })
        
    try:
        response = bedrock.invoke_model(
        modelId=g.CLAUDE_MODEL_ID,
        body=body)

        response_body = json.loads(response['body'].read().decode("utf-8"))
        llm_response = response_body['content'][0]['text'].replace('"', "'")
        
    except Exception as e:
        logger.error(f"exception while slide_text={summary[:10]}, exception={e}")
        llm_response = None

    return llm_response


# create prompt and convert to embeddings question: str = "How does Inf2 compare in performance to comparable EC2 instances? I need numbers." text_embedding = get_text_embedding(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(filename=local_img_path) # Ask Claude 3 Sonnet slide_text = vector_db_response.get('hits', {}).get('hits')[0].get('_source').get('slide_text') llm_response = get_llm_response(bedrock, question, slide_text) print(llm_response)

結果

次の表には、実装によって生成されたユーザーの質問と回答が含まれています。の 質問 列はユーザ​​ーの質問をキャプチャし、 回答 列は、Claude 3 Sonnet によって生成されたテキスト応答です。の 画像 列は、OpenSearch サーバーレス ベクトル検索によって返された k-NN スライド マッチを示します。

マルチモーダル RAG の結果

質問 回答 画像
Inf2 のパフォーマンスは、同等の EC2 インスタンスとどのように比較されますか?数字が必要なんです。 概要で提供される情報に基づいて、他のインスタンスと比較した Amazon EC2 Inf2 インスタンスの主なパフォーマンス比較数値は次のとおりです。 1. 最大 4 倍の高いスループット。 2. 遅延が最大 10 分の 2 に短縮されます。この概要には、Inf2 インスタンスと他の EC2 インスタンス タイプを比較する具体的な数値は示されていません。ただし、生成 AI モデルを実行する場合の、同等のインスタンスに対する InfXNUMX インスタンスの主なパフォーマンス上の利点として、スループットとレイテンシの向上が強調されています。
AI/ML フライホイールによると、AWS AI/ML サービスは何を提供しますか? 要約に基づいて、AWS AI/ML サービスは AI/ML フライホイールを促進するさまざまな機能を提供します。このフライホイールは、より優れた新しいアルゴリズムを開発するイノベーションで構成され、より多くのユースケースとアプリケーションを可能にし、より広範な採用と需要を促進し、その結果、さらなるイノベーションを推進するための研究と最適化へのさらなる投資につながります。 AWS AI/ML サービスは、人工知能と機械学習の分野におけるイノベーション、アプリケーション開発、導入、再投資の継続的なサイクルをサポートするツール、リソース、インフラストラクチャを提供しているようです。
GPT-2 と比較して、GPT-3 にはどれだけ多くのパラメーターがありますか? GPT-2とGPT-3のパラメータサイズの数値的な違いは何ですか? 概要で提供された情報によると、3 年の GPT-2020 には 175B (175 億) のパラメーターがあり、2 年の GPT-2019 には 1.5B (1.5 億) のパラメーターがありました。したがって、GPT-2 と GPT-3 のパラメーター サイズの数値上の違いは 173.5 億パラメーターです。 GPT-3 には GPT-115 の約 2 倍のパラメータがあります。
素粒子物理学におけるクォークとは何ですか? 残念ながら、与えられた概要には素粒子物理学におけるクォークに関する情報は含まれていません。この概要には、自然言語処理や生成AI技術の進歩に関するイメージが述べられていますが、素粒子物理学やクォークの概念については何も言及されていません。

インデックスをクエリする

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

掃除

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

まとめ

企業は常に新しいコンテンツを生成しており、スライドデッキは組織内で情報を共有し、外部に顧客やカンファレンスで情報を広める一般的な方法です。時間の経過とともに、豊富な情報がこれらのスライドデッキのグラフや表などの非テキスト形式に埋もれ、隠されたままになる可能性があります。

このソリューションと、Amazon Titan Text Embeddings や Claude 3 Sonnet などのマルチモーダル FM の機能を使用して、新しい情報を発見したり、スライドデッキのコンテンツに関する新しい視点を明らかにしたりできます。を更新することで、Amazon Bedrock で利用可能なさまざまな Claude モデルを試すことができます。 CLAUDE_MODEL_ID セクションに globals.py ファイルにソフトウェアを指定する必要があります。

これは 2 部構成のシリーズの第 1 部です。パート 3 では、Amazon Titan マルチモーダル埋め込みと LLaVA モデルを使用しました。パート 1 では、パート 2 とパート XNUMX のアプローチを比較します。

このコードの一部は以下に基づいてリリースされています。 Apache 2.0 ライセンス。


著者について

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

マンジュ・プラサド アマゾン ウェブ サービスのシニア ソリューション アーキテクトです。彼女は、AI/ML を含むさまざまな技術領域での技術指導の提供に重点を置いています。 AWS に入社する前は、金融サービス部門の企業や新興企業向けのソリューションを設計および構築していました。彼女は知識を共有し、新たな才能への関心を高めることに情熱を持っています。

アルチャナ・イナプディ AWS のシニア ソリューション アーキテクトで、戦略的な顧客をサポートしています。彼女は 10 年以上にわたり、戦略的な技術的取り組みを主導する業界横断的な専門知識を持っています。 Archana は、AWS の AI/ML 技術分野コミュニティの意欲的なメンバーです。 Archana は、AWS に入社する前に、ヘルスケア企業で従来のサイロ化されたデータ ソースから Hadoop への移行を主導しました。彼女は、テクノロジーを使用して成長を加速し、顧客に価値を提供し、ビジネス成果を達成することに情熱を持っています。

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

スポット画像

最新のインテリジェンス

スポット画像