Saltar al contenido

¿Cómo puedo evitar los tiempos de espera de lectura en Python cuando uso LLM en Amazon Bedrock?

4 minutos de lectura
0

Recibo errores de tiempo de espera de lectura cuando uso modelos de lenguaje de gran tamaño (LLM) en Amazon Bedrock para generar texto.

Solución

Nota: Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), consulte Solución de problemas de AWS CLI. Además, asegúrate de utilizar la versión más reciente de la AWS CLI.

Cuando utilizas modelos de lenguaje de gran tamaño (LLM) en Amazon Bedrock para generar texto, es posible que se produzcan errores de tiempo de espera de lectura. Los errores de tiempo de espera se producen cuando el cliente de AWS SDK para Python (Boto3) consulta el LLM pero no recibe una respuesta dentro del periodo de tiempo de espera de lectura predeterminado de botocore. Para resolver los errores de tiempo de espera de lectura, aumenta el tiempo de espera de lectura o utiliza las API de transmisión.

Aumento del tiempo de espera de lectura 

Se recomienda establecer el valor read_timeout para que sea lo suficientemente largo como para permitir que se completen las consultas. Empieza con un valor grande, como 3600 segundos y, luego, ajusta esta duración hasta que ya no aparezca ningún error de tiempo de espera. Para aumentar el valor read_timeout, ejecuta un código similar al siguiente código de ejemplo. Para obtener más información, consulta el parámetro read_timeout en botocore.config.

from boto3 import client
from botocore.config import Config

config = Config(read_timeout=1000)

client = client(service_name='bedrock-runtime',
                      config=config)

Nota: Sustituye 1000 por tu valor de tiempo de espera.

Si usas bibliotecas de terceros, primero crea una instancia de un cliente de SDK para Python (Boto3) con una configuración de botocore. A continuación, pasa esta configuración como parámetro de cliente a una clase de modelo al que se pueda llamar.

Para aumentar el valor del tiempo de espera de lectura al pasar un cliente de Boto3 a una biblioteca de terceros, ejecuta un código similar al del siguiente ejemplo:

from boto3 import client
from botocore.config import Config
from langchain_aws import ChatBedrock

config = Config(read_timeout=1000)

client = client(service_name='bedrock-runtime',
                      config=config)

llm = ChatBedrock(model_id="anthropic.claude-3-5-sonnet-20240620-v1:0",
              client=client)

Los ejemplos anteriores muestran que el tiempo de espera de lectura está establecido en 1000 segundos. El periodo de tiempo de espera de lectura especifica cuánto tiempo espera botocore para recibir una respuesta del servidor antes de devolver una excepción de tiempo de espera de lectura.

Nota: Los LLM como Anthropic Claude 3.7 Sonnet pueden tardar más de 60 segundos en devolver una respuesta. Para Anthropic Claude 3.7 Sonnet, se recomienda establecer un valor de tiempo de espera de al menos 3600 segundos.

Uso de ConverseStream para transmitir las respuestas

Si trabajas con respuestas largas o proporcionas resultados parciales a los usuarios, utiliza la operación de la API ConverseStream para recibir los tokens generados. La operación de la API de ConverseStream devuelve los tokens a medida que se generan, lo que ayuda a evitar que se agoten los tiempos de espera en las respuestas largas.

Para usar la operación de la API de ConverseStream, ejecuta un código similar al siguiente ejemplo:

import json
from boto3 import client
from botocore.config import Config
# Configure the client
config = Config()
client = client(service_name='bedrock-runtime', config=config)
# Create request parameters
request = {
    "modelId": "anthropic.claude-3-5-sonnet-20240620-v1:0",
    "messages": [
        {
            "role": "user",
            "content": [
                {
                    "text": "Could you write very long story?"
                }
            ]
        }
    ]
}
# Call the streaming API
response = client.converse_stream(
    modelId=request["modelId"],
    messages=request["messages"]
)
# Process the streaming response
for event in response['stream']:
    if 'contentBlockDelta' in event:
        print(event['contentBlockDelta']['delta']['text'], end='')

Nota: Sustituye modelID por tu ID de modelo e introduce texto con tu texto.