Salta al contenuto

Come posso evitare i timeout di lettura in Python quando utilizzo LLM in Amazon Bedrock?

3 minuti di lettura
0

Ricevo errori di timeout di lettura quando utilizzo modelli linguistici di grandi dimensioni (LLM) in Amazon Bedrock per generare testo.

Risoluzione

Nota: se ricevi errori quando esegui i comandi dell'Interfaccia della linea di comando AWS (AWS CLI), consulta Risoluzione degli errori per AWS CLI. Inoltre, assicurati di utilizzare la versione più recente di AWS CLI.

Quando utilizzi modelli linguistici di grandi dimensioni (LLM) in Amazon Bedrock per generare testo, potresti riscontrare errori di timeout di lettura. Gli errori di timeout si verificano quando il client AWS SDK per Python (Boto3) esegue query sull'LLM ma non riceve una risposta entro il periodo di timeout di lettura predefinito di botocore. Per risolvere gli errori di timeout di lettura, aumenta il timeout di lettura o utilizza API di streaming.

Aumenta il timeout di lettura

È consigliabile impostare il valore read_timeout in modo che sia sufficientemente lungo da consentire il completamento delle query. Inizia con un valore elevato, ad esempio 3.600 secondi, quindi regola la durata finché non ricevi più errori di timeout. Per aumentare il valore read_timeout, esegui un codice simile al seguente esempio. Per ulteriori informazioni, consulta il parametro read_timeout in 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: sostituisci 1000 con il tuo valore di timeout.

Se utilizzi librerie di terze parti, prima crea un'istanza di un client SDK per Python (Boto3) con una configurazione botocore. Quindi passa questa configurazione come parametro client a una classe di modello chiamabile.

Per aumentare il valore del timeout di lettura quando passi un client Boto3 a una libreria di terze parti, esegui un codice simile all'esempio seguente:

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)

Gli esempi precedenti mostrano che il timeout di lettura è impostato su 1.000 secondi. Il periodo di timeout di lettura specifica per quanto tempo botocore attende una risposta dal server prima di restituire un'eccezione di timeout di lettura.

Nota: gli LLM come Anthropic Claude 3.7 Sonnet possono impiegare più di 60 secondi per restituire una risposta. Per Anthropic Claude 3.7 Sonnet, è consigliabile impostare un valore di timeout di almeno 3.600 secondi.

Utilizza ConverseStream per lo streaming delle risposte

Se lavori con risposte lunghe o fornisci risultati parziali agli utenti, utilizza l'operazione API ConverseStream per ricevere i token generati. L'operazione API ConverseStream restituisce i token man mano che vengono generati, il che aiuta a evitare timeout in caso di risposte lunghe.

Per utilizzare l'operazione API ConverseStream, esegui un codice simile all'esempio seguente:

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: sostituisci modelID con l'ID del tuo modello e text con il tuo testo.