使用 Nova Embeddings
Amazon Nova Multimodal Embeddings 是一种先进的多模态嵌入模型,可用于智能体 RAG 和语义搜索应用程序。这是首个通过单一模型支持文本、文档、图像、视频和音频的统一嵌入模型,可实现具有领先准确性的跨模态检索。Nova Multimodal Embeddings 将各种内容类型映射到统一的语义空间中,使开发人员能够进行单模态、跨模态和多模态向量操作。
Nova Embeddings API 可支持各种应用场景,例如:
-
语义内容检索和推荐:为您的内容生成嵌入,然后用来查找相似项目或向用户提供个性化推荐。
-
多模态搜索:将不同内容类型的嵌入进行组合,实现强大的跨模态搜索功能。
-
RAG:利用多模态内容(例如含有交错文本和图像的文档)生成嵌入,从而支持生成式人工智能应用程序的检索工作流。
主要功能
-
支持在统一的语义空间中使用文本、图像、文档图像、视频和音频。最大上下文长度为 8K 令牌或 30s 视频和 30s 音频。
-
同步和异步 API:该 API 支持同步和异步使用。
-
大文件分段:异步 API 通过为长文本、视频和音频提供 API 构建的分段,并由用户定义的参数进行控制,从而轻松处理大型输入。该模型将为每个分段生成一个嵌入。
-
带音频的视频:同时处理带音频的视频。使用该 API 时,您可以指定同时代表两种模态的单一嵌入,或者分别代表视频和音频流的两个独立嵌入。
-
嵌入目的:Nova Multimodal Embeddings 使您能够根据预期的下游应用优化嵌入。支持的使用案例包括检索(RAG/搜索)、分类和聚类。具体值取决于应用程序(参见最佳实践)。
-
尺寸大小:4 个平衡嵌入准确度要求和向量存储成本的尺寸大小:3072;1024;384;256。
-
输入方法:您可以通过指定 S3 URI 来传递要嵌入的内容,也可将其作为 base64 编码内联嵌入。
Nova Multimodal Embeddings 的工作原理
-
当一段内容通过 Nova 嵌入传递时,模型会将该内容转换为通用的数值格式,称为向量。向量是一组任意数值,然后可用于各种搜索功能。与不太相似的内容相比,为相似内容分配的向量会更加接近。例如,与“悲伤”相比,可描述为“幸福”的内容的向量会更接近于“快乐”的向量。
先决条件
要使用 Multimodal Embeddings,您需要满足以下前提:
-
已安装了 Python
-
已安装了 AWS CLI
-
已使用您的 AWS 账户的凭证配置了 AWS CLI
-
已在您的 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