Direkt zum Inhalt

Wie verhindere ich Lese-Timeouts in Python, wenn ich LLMs in Amazon Bedrock verwende?

Lesedauer: 3 Minute
0

Ich erhalte Lese-Timeout-Fehler, wenn ich große Sprachmodelle (LLMs) in Amazon Bedrock verwende, um Text zu generieren.

Behebung

Hinweis: Wenn du beim Ausführen von AWS Command Line Interface (AWS CLI)-Befehlen Fehlermeldungen erhältst, findest du weitere Informationen dazu unter Problembehandlung bei der AWS CLI. Stelle außerdem sicher, dass du die neueste Version der AWS CLI verwendest.

Wenn du große Sprachmodelle (LLMs) in Amazon Bedrock verwendest, um Text zu generieren, erhältst du möglicherweise Lese-Timeout-Fehler. Die Timeout-Fehler treten auf, wenn der AWS-SDK für Python (Boto3)-Client das LLM abfragt, aber innerhalb des standardmäßigen Lese-Timeout-Zeitraums von Botocore keine Antwort erhält. Um Lese-Timeout-Fehler zu beheben, erhöhe das Lese-Timeout oder verwende Streaming-APIs.

Erhöhen des Lese-Timeouts 

Es hat sich bewährt, den Wert read_timeout so einzustellen, dass er lang genug ist, damit die Abfragen abgeschlossen werden können. Beginne mit einem großen Wert, z. B. 3.600 Sekunden, und passe dann diese Dauer an, bis du keinen Timeout-Fehler mehr erhältst. Um den Wert read_timeout zu erhöhen, führe einen Code aus, der dem folgenden Beispielcode ähnelt. Weitere Informationen findest du im Parameter 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)

Hinweis: Ersetze 1000 durch deinen Timeout-Wert.

Wenn du Bibliotheken von Drittanbietern verwendest, instanziiere zunächst ein SDK für Python (Boto3)-Client mit einer Botocore-Konfiguration. Übergib diese Konfiguration dann als Client-Parameter an eine aufrufbare Modellklasse.

Um den Lese-Timeout-Wert zu erhöhen, wenn du einen Boto3-Client an eine Drittanbieterbibliothek übergibst, führe Code ähnlich dem folgenden Beispiel aus:

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)

Die vorangegangenen Beispiele zeigen, dass das Lese-Timeout auf 1.000 Sekunden festgelegt ist. Der Lese-Timeout-Zeitraum gibt an, wie lange botocoreauf auf eine Antwort vom Server wartet, bevor es eine Lese-Timeout-Ausnahme zurückgibt.

Hinweis: Bei LLMs wie Anthropic Claude 3.7 Sonnet kann es länger als 60 Sekunden dauern, bis eine Antwort zurückgegeben wird. Bei Anthropic Claude 3.7 Sonnet hat es sich bewährt, einen Timeout-Wert von mindestens 3.600 Sekunden festzulegen.

Verwenden von ConverseStream, um Antworten zu streamen

Wenn du mit langen Antworten arbeitest oder Benutzern Teilergebnisse zur Verfügung stellst, verwende die API-Operation ConverseStream, um generierte Token zu empfangen. Die ConverseStream-API-Operation gibt Token zurück, sobald sie generiert wurden, wodurch Timeouts bei langen Antworten vermieden werden.

Um die ConverseStream-API-Operation zu verwenden, führe einen Code aus, der dem folgenden Beispiel ähnelt:

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='')

Hinweis: Ersetze modelID durch deine Modell-ID und die Eingabe text durch deinen Text.