

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Evaluación de la exactitud del resumen de texto de un modelo de Amazon Bedrock.
<a name="clarify-foundation-model-evaluate-auto-tutorial-two"></a>

Puede usar un `ModelRunner` contenedor de alto nivel para crear una evaluación personalizada basada en un modelo alojado fuera de él. JumpStart

En este tutorial, se muestra cómo cargar el [modelo Anthropic Claude 2](https://www.anthropic.com/index/claude-2), que está disponible en Amazon Bedrock, y cómo pedirle a este modelo que resuma peticiones de texto. A continuación, en este tutorial se muestra cómo evaluar la exactitud de la respuesta del modelo utilizando las métricas [https://huggingface.co/spaces/evaluate-metric/rouge](https://huggingface.co/spaces/evaluate-metric/rouge), [https://huggingface.co/spaces/evaluate-metric/meteor](https://huggingface.co/spaces/evaluate-metric/meteor) y [https://huggingface.co/spaces/evaluate-metric/bertscore](https://huggingface.co/spaces/evaluate-metric/bertscore). 

Los tutoriales le enseñan a realizar lo siguiente:
+ Configure el entorno.
+ Ejecutar la evaluación del modelo.
+ Ver los resultados del análisis.

## Configure su entorno
<a name="clarify-foundation-model-evaluate-auto-tutorial-two-setup"></a>

**Requisitos previos**
+ Utilice un entorno de kernel base Python 3.10 y una instancia de `ml.m5.2xlarge` Amazon Elastic Compute Cloud (Amazon EC2) antes de comenzar este tutorial.

  Para obtener información adicional sobre los tipos de instancias y sus casos de uso recomendados, consulte [Tipos de instancias disponibles para su uso con las libretas clásicas de Amazon SageMaker Studio](notebooks-available-instance-types.md).

**Configuración de Amazon Bedrock**

Para poder utilizar un modelo de Amazon Bedrock, tiene que solicitar acceso a él.

1. Inicie sesión en su. Cuenta de AWS

   1. Si no tienes una AWS cuenta, consulta [Cómo crear una AWS cuenta](https://docs.aws.amazon.com/bedrock/latest/userguide/setting-up.html#sign-up-for-aws) en **Configurar Amazon Bedrock**.

1. Abra la [consola de Amazon Bedrock](https://console.aws.amazon.com/bedrock).

1. En la sección **Te damos la bienvenida a Amazon Bedrock** que se abre, seleccione **Administrar el acceso a modelos**.

1. En la sección **Acceso a modelos** que aparece, seleccione **Administrar el acceso a modelos**.

1. En la sección **Modelos base** que aparece, marque la casilla situada junto a **Claude** que aparece en la subsección **Anthropic** de **Modelos**.

1. Elija **Solicitar acceso al modelo**.

1. Si la solicitud se ha realizado correctamente, aparecerá una marca de verificación con el texto **Acceso concedido** en **Estado de acceso**, junto al modelo seleccionado.

1. Es posible que tengas que volver a iniciar sesión en tu cuenta Cuenta de AWS para poder acceder al modelo.

**Instalación de las bibliotecas necesarias**

1. En el código, instale las bibliotecas `fmeval` y `boto3` de la siguiente manera:

   ```
   !pip install fmeval
   !pip3 install boto3==1.28.65
   ```

1. Importe bibliotecas, establezca un factor de paralelización e invoque un cliente de Amazon Bedrock de la siguiente manera:

   ```
   import boto3
   import json
   import os
   
   # Dependent on available hardware and memory
   os.environ["PARALLELIZATION_FACTOR"] = "1"
   
   # Bedrock clients for model inference
   bedrock = boto3.client(service_name='bedrock')
   bedrock_runtime = boto3.client(service_name='bedrock-runtime')
   ```

   En el ejemplo de código anterior, se aplica lo siguiente:
   + `PARALLELIZATION_FACTOR`: un multiplicador del número de lotes simultáneos enviados a la instancia de computación. Si su hardware permite la paralelización, puede configurar este número para multiplicar el número de invocaciones para su trabajo de evaluación. Por ejemplo, si tiene `100` invocaciones y `PARALLELIZATION_FACTOR` está configurado en `2`, su trabajo ejecutará `200` invocaciones. Puede aumentar `PARALLELIZATION_FACTOR` hasta `10` o eliminar la variable por completo. Para leer un blog sobre cómo utiliza AWS Lambda, `PARALLELIZATION_FACTOR` consulte Nuevos [controles de escalado de Lambda para las fuentes de eventos de Kinesis](https://aws.amazon.com/blogs/compute/new-aws-lambda-scaling-controls-for-kinesis-and-dynamodb-event-sources/) y DynamoDB.

1. Descargue el conjunto de datos de ejemplo `JSON Lines`, [sample-dataset.jsonl](https://github.com/aws/fmeval/blob/8da27af2f20369fd419c03d5bb0707ab24010b14/examples/xsum_sample.jsonl) en su directorio de trabajo actual.

1. Compruebe que su entorno contiene el archivo de entrada de ejemplo de la siguiente manera:

   ```
   import glob
   
   # Check for the built-in dataset
   if not glob.glob("sample-dataset.jsonl"):
   print("ERROR - please make sure file exists: sample-dataset.jsonl")
   ```

**Envíe una solicitud de inferencia de ejemplo a su modelo.**

1. Defina el modelo y el tipo `MIME` tipo de su petición. En el caso de un [modelo de Anthropic Claude 2](https://www.anthropic.com/index/claude-2) alojado en Amazon Bedrock, la petición debe estar estructurada de la siguiente manera:

   ```
   import json
   model_id = 'anthropic.claude-v2'
   accept = "application/json"
   contentType = "application/json"
   # Ensure that your prompt has the correct format
   prompt_data = """Human: Who is Barack Obama?
   Assistant:
   """
   ```

   Para obtener más información sobre cómo estructurar el cuerpo de su solicitud, consulte [Campo del cuerpo de la solicitud de invocación del modelo](https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-claude.html#model-parameters-claude-request-body). Es posible que otros modelos tengan formatos diferentes.

1. Envíe una solicitud de ejemplo a su modelo. El cuerpo de la solicitud contiene la petición y cualquier parámetro adicional que desee configurar. Este es un ejemplo de solicitud con `max_tokens_to_sample` establecido en `500`:

   ```
   body = json.dumps({"prompt": prompt_data, "max_tokens_to_sample": 500})
   response = bedrock_runtime.invoke_model(
   body=body, modelId=model_id, accept=accept, contentType=contentType
   )
   response_body = json.loads(response.get("body").read())
   print(response_body.get("completion"))
   ```

   En el ejemplo de código anterior, puede establecer los siguientes parámetros:
   + `temperature`: controla el grado de asignación al azar del texto generado y acepta valores positivos. Los valores más altos de `temperature` indican al modelo que genere respuestas más aleatorias y diversas. Los valores más bajos generan respuestas más predecibles. Los rangos para `temperature` se encuentran entre `0` y `1`, con un valor predeterminado de 0,5.
   + `topP`: controla el grado de asignación al azar al limitar el conjunto de tokens que se deben tener en cuenta al generar el siguiente token. Los valores más altos de `topP` permiten un conjunto que contenga un vocabulario más amplio y los valores más bajos restringen el conjunto de token a palabras más probables. Los rangos para `topP` van de `0` a `1`, con un valor predeterminado de `1`.
   + `topK`: limita las predicciones del modelo a los `k` tokens más probables. Los valores más altos de `topK` permiten respuestas más ingeniosas. Los valores más bajos generan respuestas más coherentes. Los rangos para `topK` van de `0` a `500`, con un valor predeterminado de `250`.
   + `max_tokens_to_sample`: limita la longitud de la respuesta al limitar la cantidad de tokens que devuelve el modelo. Los rangos para `max_tokens_to_sample` van de `0` a `4096`, con un valor predeterminado de `200`.
   + `stop_sequences`: especifica una lista de secuencias de caracteres que indican al modelo que deje de generar una respuesta. La salida del modelo se detiene la primera vez que se encuentra alguna de las cadenas de la lista en la salida. La respuesta no contiene la secuencia de parada. Por ejemplo, puede utilizar una secuencia de saltos de línea para limitar la respuesta del modelo a una sola línea. Puede configurar hasta `4` secuencias de parada.

   Para obtener más información sobre los parámetros que puede especificar en una solicitud, consulte [Modelos Anthropic Claude](https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-claude.html).

**Configurar FMEval**

1. Cargue las bibliotecas necesarias para que se ejecuten de la FMEval siguiente manera:

   ```
   from fmeval.data_loaders.data_config import DataConfig
   from fmeval.model_runners.bedrock_model_runner import BedrockModelRunner
   from fmeval.constants import MIME_TYPE_JSONLINES
   from fmeval.eval_algorithms.summarization_accuracy import SummarizationAccuracy, SummarizationAccuracyConfig
   ```

1. Realice la configuración de datos para su conjunto de datos de entrada.

   El siguiente ejemplo de entrada es una línea de `sample-dataset.jsonl`:

   ```
   {
   "document": "23 October 2015 Last updated at 17:44
       BST\nIt's the highest rating a tropical storm
       can get and is the first one of this magnitude
       to hit mainland Mexico since 1959.\nBut how are
       the categories decided and what do they mean?
       Newsround reporter Jenny Lawrence explains.",
   "summary": "Hurricane Patricia has been rated as
       a category 5 storm.",
   "id": "34615665",
   }
   ```

   La entrada de ejemplo anterior contiene el texto que se debe resumir dentro de la clave `document`. La referencia con la que evaluar la respuesta del modelo está en la clave `summary`. Debe usar estas claves en la configuración de datos para especificar qué columnas contienen la información FMEval necesaria para evaluar la respuesta del modelo.

   La configuración de datos debe identificar el texto que debe resumir el modelo en `model_input_location`. Debe identificar el valor de referencia con `target_output_location`. 

   El siguiente ejemplo de configuración de datos hace referencia al ejemplo de entrada anterior para especificar las columnas necesarias para una tarea de resumen de texto, el nombre, el identificador uniforme de recursos (URI) y el tipo `MIME`:

   ```
   config = DataConfig(
   dataset_name="sample-dataset",
   dataset_uri="sample-dataset.jsonl",
   dataset_mime_type=MIME_TYPE_JSONLINES,
   model_input_location="document",
   target_output_location="summary"
   )
   ```

   Para obtener más información sobre la información de las columnas necesaria para otras tareas, consulte la sección **Uso de un conjunto de datos de entrada personalizado** en [Evaluación del modelo automática](clarify-foundation-model-evaluate-auto.md).

1. Configure un `ModelRunner` personalizado como se muestra en el ejemplo de código siguiente.

   ```
   bedrock_model_runner = BedrockModelRunner(
   model_id=model_id,
   output='completion',
   content_template='{"prompt": $prompt, "max_tokens_to_sample": 500}'
   )
   ```

   En el ejemplo de código anterior especifica lo siguiente:
   + `model_id`: el identificador utilizado para especificar el modelo.
   + `output`: captura la salida del modelo [Anthropic Claude 2](https://www.anthropic.com/index/claude-2), que devuelve su respuesta en una clave `completion`.
   + `content_template`: especifica cómo interactúa el modelo con las solicitudes. La plantilla de configuración del ejemplo se detalla a continuación únicamente para explicar el ejemplo anterior y no es obligatoria.
     +  En el ejemplo de `content_template` anterior, se aplica lo siguiente:
       + La variable `prompt` especifica la petición de entrada, que captura la solicitud realizada por el usuario. 
       + La variable `max_tokens_to_sample` especifica el número máximo de tokens en `500` para limitar la longitud de la respuesta. 

         Para obtener más información sobre los parámetros que puede especificar en su solicitud, consulte [Modelos Anthropic Claude](https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters-claude.html).

       El formato del parámetro `content_template` depende de las entradas y los parámetros admitidos por su LLM. En este tutorial, el [modelo Anthropic Claude 2](https://www.anthropic.com/index/claude-2) utiliza la `content_template` siguiente:

       ```
          "content_template": "{\"prompt\": $prompt, \"max_tokens_to_sample\": 500}"
       ```

       Como otro ejemplo, el [modelo Falcon 7b](https://huggingface.co/tiiuae/falcon-7b) puede admitir la `content_template` siguiente.

       ```
       "content_template": "{\"inputs\": $prompt, \"parameters\":{\"max_new_tokens\": \
       10, \"top_p\": 0.9, \"temperature\": 0.8}}"
       ```

## Ejecución de la evaluación del modelo
<a name="clarify-foundation-model-evaluate-auto-tutorial-two-run"></a>

**Definición y ejecución de su algoritmo de evaluación**

1. Defina su algoritmo de evaluación. El siguiente ejemplo muestra cómo definir un algoritmo `SummarizationAccuracy`, que se utiliza para determinar la exactitud de las tareas de resumen de texto:

   ```
   eval_algo = SummarizationAccuracy(SummarizationAccuracyConfig())
   ```

   Para ver ejemplos de algoritmos que calculan métricas para otras tareas de evaluación, consulte **Evaluate your model** en [Uso de la biblioteca `fmeval` para ejecutar una evaluación automática](clarify-foundation-model-evaluate-auto-lib.md).

1. Ejecute su algoritmo de evaluación. En el siguiente ejemplo de código, se usa la configuración de datos que se definió previamente y un `prompt_template` que usa las teclas `Human` y `Assistant`:

   ```
   eval_output = eval_algo.evaluate(model=bedrock_model_runner,
   dataset_config=config,
   prompt_template="Human: $feature\n\nAssistant:\n", save=True)
   ```

   En el ejemplo de código anterior, `feature` contiene la petición en el formato que espera el modelo Amazon Bedrock.

## Visualización de los resultados del análisis
<a name="clarify-foundation-model-evaluate-auto-tutorial-two-view"></a>

1. Analice un informe de evaluación a partir del objeto `eval_output` devuelto por el algoritmo de evaluación de la siguiente manera:

   ```
   # parse report
   print(json.dumps(eval_output, default=vars, indent=4))
   ```

   El comando anterior devuelve la siguiente salida:

   ```
   [
   {
       "eval_name": "summarization_accuracy",
       "dataset_name": "sample-dataset",
       "dataset_scores": [
           {
               "name": "meteor",
               "value": 0.2048823008681274
           },
           {
               "name": "rouge",
               "value": 0.03557697913367101
           },
           {
               "name": "bertscore",
               "value": 0.5406564395678671
           }
       ],
       "prompt_template": "Human: $feature\n\nAssistant:\n",
       "category_scores": null,
       "output_path": "/tmp/eval_results/summarization_accuracy_sample_dataset.jsonl",
       "error": null
   }
   ]
   ```

   En la salida del ejemplo anterior, se muestran las tres puntuaciones de exactitud, [https://huggingface.co/spaces/evaluate-metric/meteor](https://huggingface.co/spaces/evaluate-metric/meteor), [https://huggingface.co/spaces/evaluate-metric/rouge](https://huggingface.co/spaces/evaluate-metric/rouge) y [https://huggingface.co/spaces/evaluate-metric/bertscore](https://huggingface.co/spaces/evaluate-metric/bertscore), la entrada `prompt_template`, una `category_score`, si ha solicitado una, cualquier error y la`output_path`. Utilizará `output_path` para crear un `Pandas DataFrame` en el paso siguiente.

1. Importe los resultados y léalos en un `DataFrame`, y asocie las puntuaciones de exactitud a la entrada del modelo, a la salida del modelo y a la salida objetivo de la siguiente manera:

   ```
   import pandas as pd
   
   data = []
   with open("/tmp/eval_results/summarization_accuracy_sample_dataset.jsonl", "r") as file:
   for line in file:
       data.append(json.loads(line))
   df = pd.DataFrame(data)
   df['meteor_score'] = df['scores'].apply(lambda x: x[0]['value'])
   df['rouge_score'] = df['scores'].apply(lambda x: x[1]['value'])
   df['bert_score'] = df['scores'].apply(lambda x: x[2]['value'])
   df
   ```

   En esta invocación, el ejemplo de código anterior devuelve el siguiente resultado (resumido por motivos de brevedad):

   ```
   model_input     model_output     target_output     prompt     scores     meteor_score     rouge_score     bert_score
   0     John Edward Bates, formerly of Spalding, Linco...     I cannot make any definitive judgments, as th...     A former Lincolnshire Police officer carried o...     Human: John Edward Bates, formerly of Spalding...     [{'name': 'meteor', 'value': 0.112359550561797...     0.112360     0.000000     0.543234 ...
   1     23 October 2015 Last updated at 17:44 BST\nIt'...     Here are some key points about hurricane/trop...     Hurricane Patricia has been rated as a categor...     Human: 23 October 2015 Last updated at 17:44 B...     [{'name': 'meteor', 'value': 0.139822692925566...     0.139823     0.017621     0.426529 ...
   2     Ferrari appeared in a position to challenge un...     Here are the key points from the article:\n\n...     Lewis Hamilton stormed to pole position at the...     Human: Ferrari appeared in a position to chall...     [{'name': 'meteor', 'value': 0.283411142234671...     0.283411     0.064516     0.597001 ...
   3     The Bath-born player, 28, has made 36 appearan...     Okay, let me summarize the key points from th...     Newport Gwent Dragons number eight Ed Jackson ...     Human: The Bath-born player, 28, has made 36 a...     [{'name': 'meteor', 'value': 0.089020771513353...     0.089021     0.000000     0.533514 ...
   ...
   ```

   La salida de su modelo podría ser diferente a la del ejemplo anterior.

   Para ver un cuaderno que contenga los ejemplos de código que se proporcionan en esta sección, consulte [bedrock-claude-summarization-accuracy.ipnyb.](https://github.com/aws/fmeval/blob/main/examples/bedrock-claude-summarization-accuracy.ipynb) 