Wird geladen

Beim Erstellen von Chat-Anwendungen mit Claude gibt es eine erhebliche Herausforderung für die Benutzererfahrung: Antworten können 10-30 Sekunden zur Generierung benötigen, wodurch Nutzer auf einen Lade-Spinner starren. Die Lösung ist Antwort-Streaming, das es Nutzern ermöglicht, Text Stück für Stück erscheinen zu sehen, während Claude ihn generiert, was ein deutlich reaktionsschnelleres Gefühl erzeugt.

Das Problem mit Standardantworten

In einem typischen Chat-Setup sendet dein Server eine Benutzernachricht an Claude und wartet auf die vollständige Antwort, bevor er etwas an den Client zurücksendet. Dies erzeugt eine unangenehme Verzögerung, bei der Nutzer keine Rückmeldung haben, dass überhaupt etwas passiert.

Wie Streaming funktioniert

Mit aktiviertem Streaming sendet Claude sofort eine erste Antwort zurück, die anzeigt, dass deine Anfrage empfangen wurde und die Textgenerierung beginnt. Anschließend erhältst du eine Reihe von Events, die jeweils ein kleines Stück der Gesamtantwort enthalten.

Dein Server kann diese Textstücke an deine Client-Anwendung weiterleiten, sobald sie eintreffen, sodass Nutzer sehen können, wie sich die Antwort Wort für Wort aufbaut. Alle diese Events sind Teil einer einzigen Anfrage an Claude.

Stream-Events verstehen

Wenn du Streaming aktivierst, sendet Claude mehrere Arten von Events zurück:

  • MessageStart - Eine neue Nachricht wird gesendet
  • ContentBlockStart - Beginn eines neuen Blocks mit Text, Tool-Nutzung oder anderem Inhalt
  • ContentBlockDelta - Stücke des tatsächlich generierten Texts
  • ContentBlockStop - Der aktuelle Inhaltsblock wurde abgeschlossen
  • MessageDelta - Die aktuelle Nachricht ist vollständig
  • MessageStop - Ende der Informationen zur aktuellen Nachricht

Die ContentBlockDelta-Events enthalten den tatsächlich generierten Text, den du den Nutzern anzeigen möchtest.

Grundlegende Streaming-Implementierung

Um Streaming zu aktivieren, füge stream=True zu deinem messages.create-Aufruf hinzu:

python
messages = []
add_user_message(messages, "Write a 1 sentence description of a fake database")

stream = client.messages.create(
    model=model,
    max_tokens=1000,
    messages=messages,
    stream=True
)

for event in stream:
    print(event)

Vereinfachtes Text-Streaming

Anstatt Events manuell zu parsen, kannst du die vereinfachte Streaming-Schnittstelle des SDK verwenden, die nur den Textinhalt extrahiert:

python
with client.messages.stream(
    model=model,
    max_tokens=1000,
    messages=messages
) as stream:
    for text in stream.text_stream:
        print(text, end="")

Dieser Ansatz filtert automatisch alles außer dem tatsächlichen Textinhalt heraus, was normalerweise das ist, was du zur Anzeige von Antworten für Nutzer benötigst.

Die endgültige Nachricht abrufen

Während Streaming großartig für die Benutzererfahrung ist, benötigst du oft die vollständige Nachricht zur Speicherung oder weiteren Verarbeitung. Nachdem das Streaming abgeschlossen ist, kannst du die zusammengesetzte endgültige Nachricht abrufen:

python
with client.messages.stream(
    model=model,
    max_tokens=1000,
    messages=messages
) as stream:
    for text in stream.text_stream:
        pass  # Send to client in real application
    
    final_message = stream.get_final_message()

Dies gibt dir sowohl die Streaming-Fähigkeit für die Benutzererfahrung als auch das vollständige Nachrichtenobjekt für die Datenbankspeicherung oder den Gesprächsverlauf.

Praktische Überlegungen

Jedes Textstück im Stream kann mehrere Wörter oder sogar vollständige Sätze enthalten - es ist nicht garantiert, dass du genau ein Wort pro Event erhältst. Die Größe des Stücks hängt davon ab, wie schnell Claude jeden Teil des Texts generiert.

In Produktionsanwendungen leitest du diese Textstücke typischerweise sofort über WebSockets oder Server-Sent Events an deine Client-Anwendung weiter, sodass Nutzer Antworten in Echtzeit erscheinen sehen können, während der vollständige Gesprächsverlauf auf deinem Server erhalten bleibt.