Entscheiden Sie, ob Claude für Ticket-Routing verwendet werden sollte

Hier sind einige wichtige Indikatoren dafür, dass Sie ein LLM wie Claude anstelle traditioneller ML-Ansätze für Ihre Klassifizierungsaufgabe verwenden sollten:


Erstellen und implementieren Sie Ihren LLM-Support-Workflow

Verstehen Sie Ihren aktuellen Support-Ansatz

Bevor Sie in die Automatisierung eintauchen, ist es entscheidend, Ihr bestehendes Ticketing-System zu verstehen. Beginnen Sie damit, zu untersuchen, wie Ihr Support-Team derzeit das Ticket-Routing handhabt.

Berücksichtigen Sie Fragen wie:

  • Welche Kriterien werden verwendet, um zu bestimmen, welches SLA/Serviceangebot angewendet wird?
  • Wird Ticket-Routing verwendet, um zu bestimmen, zu welcher Support-Ebene oder welchem Produktspezialisten ein Ticket geht?
  • Gibt es bereits automatisierte Regeln oder Workflows? In welchen Fällen versagen sie?
  • Wie werden Grenzfälle oder mehrdeutige Tickets behandelt?
  • Wie priorisiert das Team Tickets?

Je mehr Sie darüber wissen, wie Menschen bestimmte Fälle behandeln, desto besser können Sie mit Claude zusammenarbeiten, um die Aufgabe zu erledigen.

Definieren Sie Kategorien für Benutzerabsichten

Eine gut definierte Liste von Benutzerabsichtskategorien ist entscheidend für eine genaue Klassifizierung von Support-Tickets mit Claude. Claudes Fähigkeit, Tickets effektiv innerhalb Ihres Systems zu leiten, ist direkt proportional dazu, wie gut definiert die Kategorien Ihres Systems sind.

Hier sind einige Beispielkategorien und Unterkategorien für Benutzerabsichten.

Neben der Absicht können auch andere Faktoren wie Dringlichkeit, Kundentyp, SLAs oder Sprache das Ticket-Routing und die Priorisierung beeinflussen. Berücksichtigen Sie unbedingt weitere Routing-Kriterien beim Aufbau Ihres automatisierten Routing-Systems.

Erfolgskriterien festlegen

Arbeiten Sie mit Ihrem Support-Team zusammen, um klare Erfolgskriterien zu definieren mit messbaren Benchmarks, Schwellenwerten und Zielen.

Hier sind einige Standardkriterien und Benchmarks bei der Verwendung von LLMs für das Support-Ticket-Routing:

Hier sind einige gängige Erfolgskriterien, die unabhängig davon nützlich sein können, ob ein LLM verwendet wird:

Wählen Sie das richtige Claude-Modell

Die Wahl des Modells hängt von den Kompromissen zwischen Kosten, Genauigkeit und Antwortzeit ab.

Viele Kunden haben festgestellt, dass claude-3-5-haiku-20241022 ein ideales Modell für Ticket-Routing ist, da es das schnellste und kosteneffektivste Modell in der Claude 3-Familie ist und dennoch hervorragende Ergebnisse liefert. Wenn Ihr Klassifizierungsproblem tiefes Fachwissen oder eine große Anzahl von Absichtskategorien mit komplexem Reasoning erfordert, können Sie sich für das größere Sonnet-Modell entscheiden.

Erstellen Sie einen starken Prompt

Ticket-Routing ist eine Art Klassifizierungsaufgabe. Claude analysiert den Inhalt eines Support-Tickets und klassifiziert es in vordefinierte Kategorien basierend auf dem Problemtyp, der Dringlichkeit, der erforderlichen Expertise oder anderen relevanten Faktoren.

Lassen Sie uns einen Ticket-Klassifizierungs-Prompt schreiben. Unser erster Prompt sollte den Inhalt der Benutzeranfrage enthalten und sowohl die Begründung als auch die Absicht zurückgeben.

Probieren Sie den Prompt-Generator auf der Anthropic Console aus, um Claude einen ersten Entwurf für Sie schreiben zu lassen.

Hier ist ein Beispiel für einen Ticket-Routing-Klassifizierungs-Prompt:

def classify_support_request(ticket_contents):
    # Definieren Sie den Prompt für die Klassifizierungsaufgabe
    classification_prompt = f"""Sie werden als Kundensupport-Ticket-Klassifizierungssystem agieren. Ihre Aufgabe ist es, Kundensupportanfragen zu analysieren und die entsprechende Klassifizierungsabsicht für jede Anfrage auszugeben, zusammen mit Ihrer Begründung.

        Hier ist die Kundensupportanfrage, die Sie klassifizieren müssen:

        <request>{ticket_contents}</request>

        Bitte analysieren Sie die obige Anfrage sorgfältig, um die Kernabsicht und die Bedürfnisse des Kunden zu ermitteln. Berücksichtigen Sie, worum der Kunde bittet oder worüber er besorgt ist.

        Schreiben Sie zunächst Ihre Begründung und Analyse, wie diese Anfrage zu klassifizieren ist, innerhalb von <reasoning>-Tags.

        Geben Sie dann das entsprechende Klassifizierungslabel für die Anfrage innerhalb eines <intent>-Tags aus. Die gültigen Absichten sind:
        <intents>
        <intent>Support, Feedback, Beschwerde</intent>
        <intent>Bestellverfolgung</intent>
        <intent>Rückerstattung/Umtausch</intent>
        </intents>

        Eine Anfrage darf NUR EINE zutreffende Absicht haben. Geben Sie nur die Absicht an, die am besten auf die Anfrage zutrifft.

        Betrachten Sie als Beispiel die folgende Anfrage:
        <request>Hallo! Ich hatte am Samstag Hochgeschwindigkeits-Glasfaser-Internet installiert und mein Installateur, Kevin, war absolut fantastisch! Wo kann ich meine positive Bewertung abgeben? Vielen Dank für Ihre Hilfe!</request>

        Hier ist ein Beispiel dafür, wie Ihre Ausgabe formatiert sein sollte (für die obige Beispielanfrage):
        <reasoning>Der Benutzer sucht nach Informationen, um positives Feedback zu hinterlassen.</reasoning>
        <intent>Support, Feedback, Beschwerde</intent>

        Hier sind noch einige weitere Beispiele:
        <examples>
        <example 2>
        Beispiel 2 Eingabe:
        <request>Ich wollte Ihnen persönlich für das Mitgefühl danken, das Sie meiner Familie während der Beerdigung meines Vaters am vergangenen Wochenende entgegengebracht haben. Ihr Personal war während des gesamten Prozesses so rücksichtsvoll und hilfsbereit; es hat uns wirklich eine Last von den Schultern genommen. Die Besuchsbroschüren waren wunderschön. Wir werden die Freundlichkeit, die Sie uns gezeigt haben, nie vergessen, und wir sind so dankbar dafür, wie reibungslos die Abläufe verliefen. Nochmals vielen Dank, Amarantha Hill im Namen der Familie Hill.</request>

        Beispiel 2 Ausgabe:
        <reasoning>Benutzer hinterlässt eine positive Bewertung seiner Erfahrung.</reasoning>
        <intent>Support, Feedback, Beschwerde</intent>
        </example 2>
        <example 3>

        ...

        </example 8>
        <example 9>
        Beispiel 9 Eingabe:
        <request>Ihre Website sendet ständig Werbe-Popups, die den gesamten Bildschirm blockieren. Es hat mich zwanzig Minuten gekostet, endlich die Telefonnummer zu finden, um mich zu beschweren. Wie kann ich möglicherweise auf meine Kontoinformationen zugreifen mit all diesen Popups? Können Sie für mich auf mein Konto zugreifen, da Ihre Website kaputt ist? Ich muss wissen, welche Adresse hinterlegt ist.</request>

        Beispiel 9 Ausgabe:
        <reasoning>Der Benutzer bittet um Hilfe beim Zugriff auf seine Web-Kontoinformationen.</reasoning>
        <intent>Support, Feedback, Beschwerde</intent>
        </example 9>

        Denken Sie daran, immer Ihre Klassifizierungsbegründung vor Ihrer eigentlichen Absichtsausgabe anzugeben. Die Begründung sollte in <reasoning>-Tags und die Absicht in <intent>-Tags eingeschlossen sein. Geben Sie nur die Begründung und die Absicht zurück.
        """

Lassen Sie uns die Schlüsselkomponenten dieses Prompts aufschlüsseln:

  • Wir verwenden Python f-Strings, um die Prompt-Vorlage zu erstellen, wodurch der ticket_contents in die <request>-Tags eingefügt werden kann.
  • Wir geben Claude eine klar definierte Rolle als Klassifizierungssystem, das den Ticket-Inhalt sorgfältig analysiert, um die Kernabsicht und die Bedürfnisse des Kunden zu ermitteln.
  • Wir weisen Claude an, wie die Ausgabe zu formatieren ist, in diesem Fall seine Begründung und Analyse innerhalb von <reasoning>-Tags bereitzustellen, gefolgt vom entsprechenden Klassifizierungslabel innerhalb von <intent>-Tags.
  • Wir spezifizieren die gültigen Absichtskategorien: “Support, Feedback, Beschwerde”, “Bestellverfolgung” und “Rückerstattung/Umtausch”.
  • Wir fügen einige Beispiele (auch bekannt als Few-Shot-Prompting) hinzu, um zu veranschaulichen, wie die Ausgabe formatiert werden sollte, was die Genauigkeit und Konsistenz verbessert.

Der Grund, warum wir Claude bitten, seine Antwort in verschiedene XML-Tag-Abschnitte aufzuteilen, ist, dass wir reguläre Ausdrücke verwenden können, um die Begründung und die Absicht separat aus der Ausgabe zu extrahieren. Dies ermöglicht es uns, gezielte nächste Schritte im Ticket-Routing-Workflow zu erstellen, wie z.B. nur die Absicht zu verwenden, um zu entscheiden, an wen das Ticket weitergeleitet werden soll.

Implementieren Sie Ihren Prompt

Es ist schwer zu wissen, wie gut Ihr Prompt funktioniert, ohne ihn in einer Test-Produktionsumgebung zu implementieren und Evaluierungen durchzuführen.

Lassen Sie uns die Implementierungsstruktur aufbauen. Beginnen wir mit der Definition der Methodensignatur für die Umhüllung unseres Aufrufs an Claude. Wir werden die Methode, die wir bereits zu schreiben begonnen haben, die ticket_contents als Eingabe hat, verwenden und nun ein Tupel von reasoning und intent als Ausgabe zurückgeben. Wenn Sie eine bestehende Automatisierung mit traditionellem ML haben, sollten Sie stattdessen dieser Methodensignatur folgen.

import anthropic
import re

# Erstellen Sie eine Instanz des Anthropic API-Clients
client = anthropic.Anthropic()

# Setzen Sie das Standardmodell
DEFAULT_MODEL="claude-3-5-haiku-20241022"

def classify_support_request(ticket_contents):
    # Definieren Sie den Prompt für die Klassifizierungsaufgabe
    classification_prompt = f"""Sie werden als Kundensupport-Ticket-Klassifizierungssystem agieren. 
        ...
        ... Die Begründung sollte in <reasoning>-Tags und die Absicht in <intent>-Tags eingeschlossen sein. Geben Sie nur die Begründung und die Absicht zurück.
        """
    # Senden Sie den Prompt an die API, um die Supportanfrage zu klassifizieren.
    message = client.messages.create(
        model=DEFAULT_MODEL,
        max_tokens=500,
        temperature=0,
        messages=[{"role": "user", "content": classification_prompt}],
        stream=False,
    )
    reasoning_and_intent = message.content[0].text

    # Verwenden Sie die reguläre Ausdrucksbibliothek von Python, um `reasoning` zu extrahieren.
    reasoning_match = re.search(
        r"<reasoning>(.*?)</reasoning>", reasoning_and_intent, re.DOTALL
    )
    reasoning = reasoning_match.group(1).strip() if reasoning_match else ""

    # Extrahieren Sie auf ähnliche Weise auch den `intent`.
    intent_match = re.search(r"<intent>(.*?)</intent>", reasoning_and_intent, re.DOTALL)
    intent = intent_match.group(1).strip() if intent_match else ""

    return reasoning, intent

Dieser Code:

  • Importiert die Anthropic-Bibliothek und erstellt eine Client-Instanz mit Ihrem API-Schlüssel.
  • Definiert eine classify_support_request-Funktion, die einen ticket_contents-String entgegennimmt.
  • Sendet den ticket_contents zur Klassifizierung an Claude unter Verwendung des classification_prompt
  • Gibt die reasoning und intent des Modells zurück, die aus der Antwort extrahiert wurden.

Da wir warten müssen, bis der gesamte Reasoning- und Intent-Text generiert wurde, bevor wir ihn parsen, setzen wir stream=False (die Standardeinstellung).


Evaluieren Sie Ihren Prompt

Prompting erfordert oft Tests und Optimierung, um produktionsreif zu sein. Um die Einsatzbereitschaft Ihrer Lösung zu bestimmen, bewerten Sie die Leistung basierend auf den Erfolgskriterien und Schwellenwerten, die Sie zuvor festgelegt haben.

Um Ihre Evaluation durchzuführen, benötigen Sie Testfälle, auf denen Sie sie ausführen können. Der Rest dieser Anleitung geht davon aus, dass Sie bereits Ihre Testfälle entwickelt haben.

Erstellen Sie eine Evaluierungsfunktion

Unsere Beispielevaluierung für diese Anleitung misst Claudes Leistung anhand von drei Schlüsselmetriken:

  • Genauigkeit
  • Kosten pro Klassifizierung

Je nach den für Sie wichtigen Faktoren müssen Sie Claude möglicherweise auf anderen Achsen bewerten.

Um dies zu beurteilen, müssen wir zunächst das von uns geschriebene Skript modifizieren und eine Funktion hinzufügen, um die vorhergesagte Absicht mit der tatsächlichen Absicht zu vergleichen und den Prozentsatz korrekter Vorhersagen zu berechnen. Wir müssen auch Funktionen zur Kostenberechnung und Zeitmessung hinzufügen.

import anthropic
import re

# Erstellen Sie eine Instanz des Anthropic API-Clients
client = anthropic.Anthropic()

# Setzen Sie das Standardmodell
DEFAULT_MODEL="claude-3-5-haiku-20241022"

def classify_support_request(request, actual_intent):
    # Definieren Sie den Prompt für die Klassifizierungsaufgabe
    classification_prompt = f"""Sie werden als Kundensupport-Ticket-Klassifizierungssystem agieren. 
        ...
        ...Die Begründung sollte in <reasoning>-Tags und die Absicht in <intent>-Tags eingeschlossen sein. Geben Sie nur die Begründung und die Absicht zurück.
        """

    message = client.messages.create(
        model=DEFAULT_MODEL,
        max_tokens=500,
        temperature=0,
        messages=[{"role": "user", "content": classification_prompt}],
    )
    usage = message.usage  # Holen Sie sich die Nutzungsstatistiken für den API-Aufruf, wie viele Eingabe- und Ausgabe-Tokens verwendet wurden.
    reasoning_and_intent = message.content[0].text

    # Verwenden Sie die reguläre Ausdrucksbibliothek von Python, um `reasoning` zu extrahieren.
    reasoning_match = re.search(
        r"<reasoning>(.*?)</reasoning>", reasoning_and_intent, re.DOTALL
    )
    reasoning = reasoning_match.group(1).strip() if reasoning_match else ""

    # Extrahieren Sie auf ähnliche Weise auch den `intent`.
    intent_match = re.search(r"<intent>(.*?)</intent>", reasoning_and_intent, re.DOTALL)
    intent = intent_match.group(1).strip() if intent_match else ""

      # Überprüfen Sie, ob die Vorhersage des Modells korrekt ist.
    correct = actual_intent.strip() == intent.strip()

    # Geben Sie die Begründung, Absicht, korrekt und Nutzung zurück.
    return reasoning, intent, correct, usage

Lassen Sie uns die Änderungen aufschlüsseln, die wir vorgenommen haben:

  • Wir haben den actual_intent aus unseren Testfällen in die classify_support_request-Methode aufgenommen und einen Vergleich eingerichtet, um zu beurteilen, ob Claudes Absichtsklassifizierung mit unserer goldenen Absichtsklassifizierung übereinstimmt.
  • Wir haben Nutzungsstatistiken für den API-Aufruf extrahiert, um die Kosten basierend auf den verwendeten Eingabe- und Ausgabe-Tokens zu berechnen.

Führen Sie Ihre Evaluation durch

Eine ordnungsgemäße Evaluation erfordert klare Schwellenwerte und Benchmarks, um zu bestimmen, was ein gutes Ergebnis ist. Das obige Skript gibt uns die Laufzeitwerte für Genauigkeit, Antwortzeit und Kosten pro Klassifizierung, aber wir würden immer noch klar festgelegte Schwellenwerte benötigen. Zum Beispiel:

  • Genauigkeit: 95% (von 100 Tests)
  • Kosten pro Klassifizierung: 50% Reduktion im Durchschnitt (über 100 Tests) gegenüber der aktuellen Routing-Methode

Diese Schwellenwerte ermöglichen es Ihnen, schnell und einfach im großen Maßstab und mit unparteiischer Empirie zu erkennen, welche Methode für Sie am besten geeignet ist und welche Änderungen möglicherweise vorgenommen werden müssen, um Ihre Anforderungen besser zu erfüllen.


Verbessern Sie die Leistung

In komplexen Szenarien kann es hilfreich sein, zusätzliche Strategien zur Leistungsverbesserung über Standard-Prompt-Engineering-Techniken und Implementierungsstrategien für Leitplanken hinaus zu berücksichtigen. Hier sind einige häufige Szenarien:

Verwenden Sie eine taxonomische Hierarchie für Fälle mit mehr als 20 Absichtskategorien

Mit zunehmender Anzahl von Klassen wächst auch die Anzahl der erforderlichen Beispiele, was den Prompt möglicherweise unhandlich macht. Alternativ können Sie die Implementierung eines hierarchischen Klassifizierungssystems mit einer Mischung aus Klassifikatoren in Betracht ziehen.

  1. Organisieren Sie Ihre Absichten in einer taxonomischen Baumstruktur.
  2. Erstellen Sie eine Reihe von Klassifikatoren auf jeder Ebene des Baums, um einen kaskadierenden Routing-Ansatz zu ermöglichen.

Beispielsweise könnten Sie einen Klassifikator der obersten Ebene haben, der Tickets grob in “Technische Probleme”, “Abrechnungsfragen” und “Allgemeine Anfragen” kategorisiert. Jede dieser Kategorien kann dann ihren eigenen Unterklassifikator haben, um die Klassifizierung weiter zu verfeinern.

  • Vorteile - größere Nuancierung und Genauigkeit: Sie können verschiedene Prompts für jeden übergeordneten Pfad erstellen, was eine gezieltere und kontextspezifischere Klassifizierung ermöglicht. Dies kann zu verbesserter Genauigkeit und nuancierterer Bearbeitung von Kundenanfragen führen.

  • Nachteile - erhöhte Latenz: Beachten Sie, dass mehrere Klassifikatoren zu erhöhter Latenz führen können, und wir empfehlen, diesen Ansatz mit unserem schnellsten Modell, Haiku, zu implementieren.

Verwenden Sie Vektordatenbanken und Ähnlichkeitssuchabruf zur Bearbeitung hochvariabler Tickets

Obwohl das Bereitstellen von Beispielen der effektivste Weg ist, um die Leistung zu verbessern, kann es schwierig sein, genügend Beispiele in einem einzigen Prompt aufzunehmen, wenn Supportanfragen stark variieren.

In diesem Szenario könnten Sie eine Vektordatenbank verwenden, um Ähnlichkeitssuchen aus einem Datensatz von Beispielen durchzuführen und die relevantesten Beispiele für eine bestimmte Anfrage abzurufen.

Dieser Ansatz, der in unserem Klassifizierungsrezept detailliert beschrieben wird, hat nachweislich die Leistung von 71% Genauigkeit auf 93% Genauigkeit verbessert.

Berücksichtigen Sie speziell erwartete Grenzfälle

Hier sind einige Szenarien, in denen Claude Tickets falsch klassifizieren könnte (es können andere geben, die für Ihre Situation einzigartig sind). In diesen Szenarien sollten Sie erwägen, explizite Anweisungen oder Beispiele im Prompt zu geben, wie Claude den Grenzfall behandeln sollte:


Integrieren Sie Claude in Ihren größeren Support-Workflow

Eine ordnungsgemäße Integration erfordert, dass Sie einige Entscheidungen darüber treffen, wie Ihr Claude-basiertes Ticket-Routing-Skript in die Architektur Ihres größeren Ticket-Routing-Systems passt. Es gibt zwei Möglichkeiten, dies zu tun:

  • Push-basiert: Das von Ihnen verwendete Support-Ticket-System (z.B. Zendesk) löst Ihren Code aus, indem es ein Webhook-Ereignis an Ihren Routing-Service sendet, der dann die Absicht klassifiziert und weiterleitet.
    • Dieser Ansatz ist web-skalierbarer, erfordert jedoch, dass Sie einen öffentlichen Endpunkt bereitstellen.
  • Pull-basiert: Ihr Code fragt nach den neuesten Tickets basierend auf einem bestimmten Zeitplan ab und leitet sie zum Zeitpunkt des Abrufs weiter.
    • Dieser Ansatz ist einfacher zu implementieren, könnte aber unnötige Aufrufe an das Support-Ticket-System machen, wenn die Abruffrequenz zu hoch ist, oder könnte zu langsam sein, wenn die Abruffrequenz zu niedrig ist.

Für beide Ansätze müssen Sie Ihr Skript in einen Service einbinden. Die Wahl des Ansatzes hängt davon ab, welche APIs Ihr Support-Ticketing-System bereitstellt.