

# Uso de incrustaciones de Amazon Nova
<a name="embeddings"></a>

Amazon Nova Multimodal Embeddings es un modelo de incrustaciones multimodales para aplicaciones búsqueda semántica y RAG agéntica. Admite texto, documentos, imágenes, video y audio en un único modelo, lo que permite la recuperación intermodal. Nova Multimodal Embeddings asigna cada uno de estos tipos de contenido a un espacio semántico unificado, lo que le permite llevar a cabo operaciones vectoriales unimodales, intermodales y multimodales.

Cuando un contenido pasa por las incrustaciones de Nova, el modelo convierte ese contenido en un formato numérico universal, denominado vector. Un vector es un conjunto de valores numéricos que se pueden utilizar para diversas funcionalidades de búsqueda. Al contenido similar se le asigna un vector más cercano que al contenido menos similar. 

 Aplicaciones:
+ Recuperación y recomendación de contenido semántico: genere incrustaciones para su contenido y utilícelas para buscar elementos similares u ofrecer recomendaciones personalizadas. 
+ Búsqueda multimodal: combine incrustaciones de diferentes tipos de contenido para facilitar capacidades de búsqueda intermodal.
+ RAG: genere incrustaciones a partir de contenido multimodal, como documentos con texto e imágenes intercalados, para potenciar el flujo de trabajo de recuperación de las aplicaciones GenAI.

## Características principales de
<a name="embeddings-features"></a>

 Estas características clave distinguen a Nova Embeddings: 
+ Soporte de texto, imagen, imagen de documento, video y audio en un espacio semántico unificado. La longitud máxima del contexto es de 8000 tokens o 30 segundos de video y 30 segundos de audio.
+ API sincrónicas y asincrónicas: la API admite el uso sincrónico y asincrónico.
+ Segmentación de archivos grandes: la API asincrónica facilita el trabajo con entradas de gran tamaño al proporcionar una segmentación creada por la API para texto, video y audio largos, controlada mediante parámetros que define el usuario. El modelo generará una incrustación única para cada segmento.
+ Video con audio: procese video y audio de forma simultánea. Especifique si desea una sola incrustación que represente ambas modalidades o dos incrustaciones independientes. 
+ Propósito de la incrustación: optimice sus incrustaciones en función de la aplicación descendiente prevista (recuperación, RAG, búsqueda, clasificación, agrupación en clústeres). 
+ Tamaños: 4 tamaños para compensar la precisión de incrustación y el costo de almacenamiento vectorial: 3072, 1024, 384 y 256.
+ Métodos de entrada: para transmitir contenido a fin de incrustarlo, especifique un URI de S3 o en línea como codificación base64.

## Generación de incrustaciones
<a name="embeddings-examples"></a>

 Complete lo siguiente para generar incrustaciones. 

Incrustación sincrónica para texto: 

```
import boto3
import json

# 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))
```

 pruebe: 

```
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: 
    print(e) 
 
print('Request ID:', response.get('ResponseMetadata').get('RequestId')) 
response_body = json.loads(response.get('body').read()) 
print(json.dumps(response_body, indent=2))
```

 Incrustación asíncrona para video: 

```
 import boto3 
 
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://my-bucket/path/to/video.mp4'} 
            }, 
            'segmentationConfig': { 
                'durationSeconds': 15  # Segment into 15 second chunks 
            }, 
        }, 
    }, 
}
```

 pruebe: 

```
response = bedrock_runtime.start_async_invoke( 
        modelId='amazon.nova-2-multimodal-embeddings-v1:0', 
        modelInput=model_input, 
        outputDataConfig={ 
            's3OutputDataConfig': { 
                's3Uri': 's3://my-bucket' 
            } 
        }, 
    ) 
except Exception as e: 
    print(e) 
 
print('Request ID:', response.get('ResponseMetadata').get('RequestId')) 
print('Invocation ARN:', response.get('invocationArn'))
```

**Inferencia en lotes**

 Con la inferencia en lotes, puede enviar varias solicitudes y generar respuestas de forma asíncrona. La inferencia en lotes le permite procesar varias solicitudes de manera eficiente al enviar una sola solicitud y generar respuestas en un bucket de Amazon S3. 
+  Una vez definidas las entradas del modelo en los archivos que cree, los archivos se cargan a un bucket de S3. 
+  A continuación, envía una solicitud de inferencia por lotes y especifica el bucket de S3. 
+ Una vez finalizado el trabajo, podrá recuperar los archivos de salida de S3. 
+  Puede utilizar la inferencia por lotes para mejorar el rendimiento de la inferencia de modelos en conjuntos de datos de gran tamaño. 

**Formateo y carga de los datos de la inferencia por lotes**

Debe añadir los datos de inferencia en lotes a la ubicación de S3 que elija o especifique al enviar un trabajo de invocación de modelos. La ubicación de S3 debe contener los siguientes elementos: 

 Al menos un archivo JSONL que defina las entradas del modelo. Un JSONL contiene filas de objetos JSON. El archivo JSONL debe terminar con la extensión .jsonl y tener el siguiente formato: 

```
{
    "recordId": "record001",
    "modelInput": {
        "taskType": "SINGLE_EMBEDDING",
        "singleEmbeddingParams": {
            "embeddingPurpose": "GENERIC_INDEX",
            "embeddingDimension": 3072,
            "text": {
                "source": {
                    "s3Location": {
                        "uri": "s3://batch-inference-input-bucket/text_001.txt",
                        "bucketOwner": "111122223333"
                    }
                },
                "truncationMode": "END"
            }
        }
    }
}
```

** Tipos de entradas de archivos admitidos **
+ Formatos de imagen: PNG, JPEG, WEBP, GIF
+ Formatos de audio: MP3, WAV, OGG
+ Formatos de video: MP4, MOV, MKV, WEBM, FLV, MPEG, MPG, WMV, 3GP