使用 Nova Embeddings - Amazon Nova

使用 Nova Embeddings

Amazon Nova Multimodal Embeddings 是適用於 RAG 和語義搜尋應用程式的最先進多模態嵌入模型。它是第一個透過單一模型支援文字、文件、影像、影片和音訊的統一嵌入模型,能夠以領先的準確性實現跨模式擷取。Nova Multimodal Embeddings 會將這些內容類型對應至統一的語義空間,讓開發人員能夠執行單模態、跨模態和多模態向量作業。

Nova Embeddings API 可用於各種應用程式,例如:

  • 語義內容擷取和建議:為您的內容產生嵌入,然後使用它們來尋找類似的項目或為您的使用者提供個人化的建議。

  • 多模態搜尋:結合來自不同內容類型的嵌入,以啟用強大的跨模態搜尋功能。

  • RAG:從多模態內容,例如具有交錯文字和影像的文件產生嵌入,以強化 GenAI 應用程式的擷取工作流程。

主要特色

  • 在統一語意空間中支援文字、影像、文件影像、影片和音訊。上下文長度上限為 8K 個詞元或 30 秒的影片和 30 秒的音訊。

  • 同步和非同步 API:該 API 支援同步和非同步使用。

  • 大型檔案分割:非同步 API 透過為長文字、影片和音訊提供由使用者定義參數控制的 API 內建分割,讓您輕鬆使用大型輸入。模型會為每個區段產生單一嵌入。

  • 含音訊的影片:同時處理影片與音訊。API 可讓您指定要同時代表兩個模態的單一嵌入,還是分別代表影片和音訊串流的兩個個別嵌入。

  • 嵌入目的:Nova Multimodal Embeddings 可讓您根據預期的下游應用程式最佳化嵌入。支援的使用案例包括擷取 (RAG/搜尋)、分類和叢集。特定值取決於應用程式 (請參閱最佳實務)。

  • 維度大小:4 個維度大小,用於權衡嵌入準確度和向量儲存成本:3072;1024;384;256。

  • 輸入方法:您可以透過指定 S3 URI 或 Base64 編碼格式的嵌入來傳遞要嵌入的內容。

Nova Multimodal Embeddings 的運作方式

  • 當一段內容透過 Nova 嵌入傳遞時,模型會將該內容轉換為通用數值格式,也稱為向量。向量是一組任意數值,然後可用於各種搜尋功能。為類似內容指定的向量比為非類似內容指定的向量更接近。例如,為可描述為「高興」的內容指定的向量與為「悲傷」等內容指定的向量相比,更接近於「愉快」等向量。

必要條件

若要使用多模態嵌入,您需要滿足下列條件:

  • 已安裝 Python

  • 已安裝 AWS CLI

  • 為 AWS CLI 設定了您的 AWS 帳戶的存取憑證

  • 您的 AWS 帳戶上已啟用 Nova Multimodal Embeddings 模型

啟用這些項目後,您可以執行非同步或同步嵌入請求。

同步產生嵌入

對於較小的內容項目,可以使用 Bedrock 執行時期 InvokeModel API。這是快速為文字、影像或短音訊/影片檔案產生嵌入的有效選項。

下列範例會為文字「Hello World!」產生同步嵌入

import json import boto3 # Create the Bedrock Runtime client. bedrock_runtime = boto3.client( service_name="bedrock-runtime", region_name="us-east-1", ) # Define the request body. request_body = { "taskType": "SINGLE_EMBEDDING", "singleEmbeddingParams": { "embeddingPurpose": "GENERIC_INDEX", "embeddingDimension": 3072, "text": {"truncationMode": "END", "value": "Hello, World!"}, }, } try: # Invoke the Nova Embeddings model. response = bedrock_runtime.invoke_model( body=json.dumps(request_body, indent=2), modelId="amazon.nova-2-multimodal-embeddings-v1:0", accept="application/json", contentType="application/json", ) except Exception as e: # Add your own exception handling here. print(e) # Print the request ID. print("Request ID:", response.get("ResponseMetadata").get("RequestId")) # Print the response body. response_body = json.loads(response.get("body").read()) print(json.dumps(response_body, indent=2))

輸出看起來像這樣:

Request ID: fde55db5-c129-423b-c62d-7a8b36cf2859 { "embeddings": [ { "embeddingType": "TEXT", "embedding": [ 0.031115104, 0.032478657, 0.10006265, ... ] } ] }

非同步產生嵌入

對於較大的內容檔案,可以使用 Bedrock 執行時期 StartAsyncInvoke 函數以非同步方式產生嵌入。這可讓您提交任務並在稍後擷取結果,而不會封鎖應用程式執行。結果會儲存至 Amazon S3。

下列範例會啟動影片檔案的非同步嵌入產生任務:

import boto3 # Create the Bedrock Runtime client. bedrock_runtime = boto3.client( service_name="bedrock-runtime", region_name="us-east-1", ) model_input = { "taskType": "SEGMENTED_EMBEDDING", "segmentedEmbeddingParams": { "embeddingPurpose": "GENERIC_INDEX", "embeddingDimension": 3072, "video": { "format": "mp4", "embeddingMode": "AUDIO_VIDEO_COMBINED", "source": { "s3Location": {"uri": "s3://amzn-s3-demo-bucket/path/to/video.mp4"} }, "segmentationConfig": { "durationSeconds": 15 # Segment into 15 second chunks }, }, }, } try: # Invoke the Nova Embeddings model. response = bedrock_runtime.start_async_invoke( modelId="amazon.nova-2-multimodal-embeddings-v1:0", modelInput=model_input, outputDataConfig={ "s3OutputDataConfig": { "s3Uri": "s3://amzn-s3-demo-bucket" } }, ) except Exception as e: # Add your own exception handling here. print(e) # Print the request ID. print("Request ID:", response.get("ResponseMetadata").get("RequestId")) # Print the invocation ARN. print("Invocation ARN:", response.get("invocationArn"))

輸出看起來像這樣:

Request ID: 07681e80-5ce0-4723-cf52-68bf699cd23e Invocation ARN: arn:aws:bedrock:us-east-1:111122223333:async-invoke/g7ur3b32a10n

啟動非同步任務後,使用 invocationArn 透過 GetAsyncInvoke 函數檢查任務狀態。若要檢視最近的非同步調用及其狀態,請使用 ListAsyncInvokes 函數。

當非同步嵌入產生完成時,成品會寫入您指定為輸出目的地的 S3 儲存貯體。這些檔案將會有以下結構:

amzn-s3-demo-bucket/ job-id/ segmented-embedding-result.json embedding-audio.jsonl embedding-image.json embedding-text.jsonl embedding-video.jsonl manifest.json