Entscheiden Sie, ob Sie Claude für das Ticket-Routing verwenden möchten

Hier sind einige Schlüsselindikatoren dafür, dass Sie für Ihre Klassifizierungsaufgabe ein LLM wie Claude anstelle von traditionellen ML-Ansätzen verwenden sollten:


Erstellen und implementieren Sie Ihren LLM-Support-Workflow

Verstehen Sie Ihren aktuellen Support-Ansatz

Bevor Sie sich in die Automatisierung stürzen, ist es entscheidend, Ihr bestehendes Ticketsystem zu verstehen. Untersuchen Sie zunächst, wie Ihr Support-Team derzeit das Ticket-Routing handhabt.

Berücksichtigen Sie Fragen wie:

  • Welche Kriterien werden verwendet, um zu bestimmen, welche SLA/welches Serviceangebot angewendet wird?
  • Wird das Ticket-Routing verwendet, um zu bestimmen, an welche Support-Stufe oder an welchen Produktspezialisten ein Ticket geht?
  • Gibt es bereits automatisierte Regeln oder Workflows? In welchen Fällen versagen sie?
  • Wie werden Sonderfä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 Benutzerabsichtskategorien

Eine klar 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 routen, steht in direktem Verhältnis dazu, wie gut die Kategorien Ihres Systems definiert sind.

Hier sind einige Beispiele für Benutzerabsichtskategorien und Unterkategorien.

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

Legen Sie Erfolgskriterien fest

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

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

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

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-haiku-20240307 ein ideales Modell für das Ticket-Routing ist, da es das schnellste und kosteneffektivste Modell in der Claude 3-Familie ist und dennoch hervorragende Ergebnisse liefert. Wenn Ihr Klassifizierungsproblem tiefgreifendes Fachwissen oder eine große Anzahl von Absichtskategorien mit komplexer Logik erfordert, können Sie sich für das größere Sonnet-Modell entscheiden.

Erstellen Sie einen starken Prompt

Das Ticket-Routing ist eine Art von 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 anfänglicher 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, Kundensupport-Anfragen zu analysieren und die entsprechende Klassifizierungsabsicht für jede Anfrage zusammen mit Ihrer Begründung auszugeben.

        Hier ist die Kundensupport-Anfrage, 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. Überlegen Sie, worum der Kunde bittet und was er für Bedenken hat.

        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>Auftragsverfolgung</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 habe am Samstag Hochgeschwindigkeits-Glasfaser-Internet installiert und mein Installateur, Kevin, war absolut fantastisch! Wo kann ich meine positive Bewertung abgeben? Danke 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 ein paar 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 entgegengebracht haben, nie vergessen und 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>Der 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. Ich habe zwanzig Minuten gebraucht, um endlich die Telefonnummer zu finden, um anzurufen und mich zu beschweren. Wie soll ich bei all diesen Popups auf meine Kontoinformationen zugreifen können? Können Sie für mich auf mein Konto zugreifen, da Ihre Website nicht funktioniert? 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 Hauptbestandteile dieses Prompts aufschlüsseln:

  • Wir verwenden Python f-Strings, um die Prompt-Vorlage zu erstellen, sodass 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 formatiert werden soll, in diesem Fall soll es seine Begründung und Analyse innerhalb von <reasoning>-Tags angeben, gefolgt von dem entsprechenden Klassifizierungslabel innerhalb von <intent>-Tags.
  • Wir geben die gültigen Absichtskategorien an: “Support, Feedback, Beschwerde”, “Auftragsverfolgung” und “Rückerstattung/Umtausch”.
  • Wir fügen ein paar Beispiele (sogenanntes Few-Shot-Prompting) ein, um zu veranschaulichen, wie die Ausgabe formatiert werden soll, was die Genauigkeit und Konsistenz verbessert.

Der Grund, warum wir möchten, dass Claude seine Antwort in verschiedene XML-Tag-Abschnitte aufteilt, 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, z. B. nur die Absicht zu verwenden, um zu entscheiden, an welche Person das Ticket weitergeleitet werden soll.

Stellen Sie Ihren Prompt bereit

Es ist schwierig zu wissen, wie gut Ihr Prompt funktioniert, ohne ihn in einer Testproduktionsumgebung bereitzustellen und Auswertungen durchzuführen.

Lassen Sie uns die Bereitstellungsstruktur aufbauen. Beginnen Sie damit, die Methodensignatur für das Wrapping unseres Aufrufs an Claude zu definieren. Wir nehmen die Methode, die wir bereits zu schreiben begonnen haben, die ticket_contents als Eingabe hat, und geben nun ein Tupel von reasoning und intent als Ausgabe zurück. 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()

# Legen Sie das Standardmodell fest
DEFAULT_MODEL="claude-3-haiku-20240307"

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 Support-Anfrage 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ären Ausdrücke 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 die `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 Funktion classify_support_request, die eine Zeichenfolge ticket_contents annimmt.
  • Sendet ticket_contents zur Klassifizierung an Claude unter Verwendung des classification_prompt
  • Gibt die aus der Antwort extrahierte reasoning und intent des Modells zurück.

Da wir auf den gesamten Begründungs- und Absichtstext warten müssen, bevor wir ihn parsen können, setzen wir stream=False (der Standardwert).


Bewerten Sie Ihren Prompt

Prompting erfordert oft Tests und Optimierungen, damit es produktionsreif ist. Um die Einsatzbereitschaft Ihrer Lösung zu bestimmen, bewerten Sie die Leistung anhand der zuvor festgelegten Erfolgskriterien und Schwellenwerte.

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

Erstellen Sie eine Bewertungsfunktion

Unsere Beispielbewertung für diesen Leitfaden misst Claudes Leistung anhand von drei Schlüsselmetriken:

  • Genauigkeit
  • Kosten pro Klassifizierung

Möglicherweise müssen Sie Claude je nach den für Sie wichtigen Faktoren auch in anderen Bereichen 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 der korrekten 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()

# Legen Sie das Standardmodell fest
DEFAULT_MODEL="claude-3-haiku-20240307"

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-Token verwendet wurden.
    reasoning_and_intent = message.content[0].text

    # Verwenden Sie die regulären Ausdrücke 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 die `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, die Absicht, korrekt und die Nutzung zurück.
    return reasoning, intent, correct, usage

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

  • Wir haben die actual_intent aus unseren Testfällen in die Methode classify_support_request 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-Token zu berechnen.

Führen Sie Ihre Bewertung durch

Eine ordnungsgemäße Bewertung erfordert klare Schwellenwerte und Benchmarks, um zu bestimmen, was ein gutes Ergebnis ist. Das obige Skript liefert uns die Laufzeitwerte für Genauigkeit, Antwortzeit und Kosten pro Klassifizierung, aber wir bräuchten immer noch klar festgelegte Schwellenwerte. Zum Beispiel:

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

Mit diesen Schwellenwerten können Sie schnell und einfach im großen Maßstab und mit unparteiischer Empirie feststellen, 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 die Standard-Prompt-Engineering-Techniken und Strategien zur Implementierung von Leitplanken hinaus in Betracht zu ziehen. Hier sind einige häufige Szenarien:

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

Mit zunehmender Anzahl der Klassen steigt auch die Anzahl der erforderlichen Beispiele, was den Prompt unhandlich machen kann. Als Alternative können Sie die Implementierung eines hierarchischen Klassifizierungssystems mit einer Mischung aus Klassifizierern in Betracht ziehen.

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

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

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

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

Verwenden Sie Vektordatenbanken und Ähnlichkeitssuche, um stark variierende Tickets zu behandeln

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 die Support-Anfragen stark variieren.

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

Dieser Ansatz, der in unserem Klassifizierungsrezept ausführlich beschrieben wird, hat sich als leistungssteigernd erwiesen, von 71 % Genauigkeit auf 93 % Genauigkeit.

Berücksichtigen Sie speziell erwartete Sonderfälle

Hier sind einige Szenarien, in denen Claude Tickets möglicherweise falsch klassifiziert (es kann andere geben, die für Ihre Situation einzigartig sind). Erwägen Sie in diesen Szenarien, explizite Anweisungen oder Beispiele in den Prompt aufzunehmen, wie Claude den Sonderfall behandeln soll:


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

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

  • 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-Dienst sendet, der dann die Absicht klassifiziert und sie weiterleitet.
    • Dieser Ansatz ist webskalierbarer, erfordert aber, dass Sie einen öffentlichen Endpunkt bereitstellen.
  • Pull-basiert: Ihr Code ruft die neuesten Tickets basierend auf einem bestimmten Zeitplan ab und leitet sie zum Zeitpunkt des Abrufs weiter.
    • Dieser Ansatz ist einfacher zu implementieren, kann aber unnötige Aufrufe an das Support-Ticket-System machen, wenn die Abruffrequenz zu hoch ist, oder zu langsam sein, wenn die Abruffrequenz zu niedrig ist.

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