Definire se utilizzare Claude per l’instradamento dei ticket

Ecco alcuni indicatori chiave che suggeriscono di utilizzare un LLM come Claude invece dei tradizionali approcci di machine learning per l’attività di classificazione:


Costruisci e implementa il tuo flusso di lavoro di supporto LLM

Comprendi il tuo attuale approccio di supporto

Prima di immergerti nell’automazione, è fondamentale comprendere il tuo sistema di ticketing esistente. Inizia indagando su come il tuo team di supporto gestisce attualmente l’instradamento dei ticket.

Considera domande come:

  • Quali criteri vengono utilizzati per determinare quale SLA/offerta di servizio viene applicata?
  • L’instradamento dei ticket viene utilizzato per determinare a quale livello di supporto o specialista di prodotto viene assegnato un ticket?
  • Esistono già regole o flussi di lavoro automatizzati? In quali casi falliscono?
  • Come vengono gestiti i casi limite o i ticket ambigui?
  • Come il team assegna la priorità ai ticket?

Più conosci su come gli umani gestiscono determinati casi, meglio sarai in grado di lavorare con Claude per svolgere l’attività.

Definisci le categorie di intenti degli utenti

Un elenco ben definito di categorie di intenti degli utenti è fondamentale per un’accurata classificazione dei ticket di supporto con Claude. La capacità di Claude di instradare efficacemente i ticket all’interno del tuo sistema è direttamente proporzionale a quanto bene sono definite le categorie del tuo sistema.

Ecco alcune categorie e sottocategorie di esempio di intenti degli utenti.

Oltre all’intento, l’instradamento e la priorità dei ticket possono essere influenzati anche da altri fattori come l’urgenza, il tipo di cliente, gli SLA o la lingua. Assicurati di considerare altri criteri di instradamento quando costruisci il tuo sistema di instradamento automatizzato.

Stabilisci i criteri di successo

Collabora con il tuo team di supporto per definire chiari criteri di successo con benchmark, soglie e obiettivi misurabili.

Ecco alcuni criteri e benchmark standard quando si utilizzano LLM per l’instradamento dei ticket di supporto:

Ecco alcuni criteri di successo comuni che possono essere utili indipendentemente dall’utilizzo o meno di un LLM:

Scegli il modello Claude giusto

La scelta del modello dipende dai compromessi tra costo, accuratezza e tempo di risposta.

Molti clienti hanno trovato claude-3-haiku-20240307 un modello ideale per l’instradamento dei ticket, in quanto è il modello più veloce ed economico nella famiglia Claude 3 pur fornendo risultati eccellenti. Se il tuo problema di classificazione richiede una profonda conoscenza della materia o un grande volume di categorie di intenti con ragionamento complesso, potresti optare per il modello Sonnet più grande.

Costruisci un prompt efficace

L’instradamento dei ticket è un tipo di attività di classificazione. Claude analizza il contenuto di un ticket di supporto e lo classifica in categorie predefinite in base al tipo di problema, all’urgenza, all’esperienza richiesta o ad altri fattori rilevanti.

Scriviamo un prompt di classificazione dei ticket. Il nostro prompt iniziale dovrebbe contenere il contenuto della richiesta dell’utente e restituire sia il ragionamento che l’intento.

Prova il generatore di prompt sulla Anthropic Console per far scrivere a Claude una prima bozza per te.

Ecco un esempio di prompt di classificazione per l’instradamento dei ticket:

def classify_support_request(ticket_contents):
    # Definisci il prompt per l'attività di classificazione
    classification_prompt = f"""Agirai come un sistema di classificazione dei ticket di supporto clienti. Il tuo compito è analizzare le richieste di supporto dei clienti e restituire l'intento di classificazione appropriato per ogni richiesta, insieme al tuo ragionamento.

        Ecco la richiesta di supporto clienti che devi classificare:

        <request>{ticket_contents}</request>

        Analizza attentamente la richiesta di cui sopra per determinare l'intento principale e le esigenze del cliente. Considera ciò che il cliente sta chiedendo o di cui ha preoccupazioni.

        Innanzitutto, scrivi il tuo ragionamento e la tua analisi su come classificare questa richiesta all'interno dei tag <reasoning>.

        Quindi, restituisci l'etichetta di classificazione appropriata per la richiesta all'interno di un tag <intent>. Gli intenti validi sono:
        <intents>
        <intent>Supporto, Feedback, Reclamo</intent>
        <intent>Tracciamento ordine</intent>
        <intent>Rimborso/Cambio</intent>
        </intents>

        Una richiesta può avere UN SOLO intento applicabile. Includi solo l'intento più applicabile alla richiesta.

        Ad esempio, considera la seguente richiesta:
        <request>Ciao! Sabato ho fatto installare la fibra ad alta velocità e il mio installatore, Kevin, è stato assolutamente fantastico! Dove posso inviare la mia recensione positiva? Grazie per l'aiuto!</request>

        Ecco un esempio di come dovrebbe essere formattato il tuo output (per la richiesta di esempio di cui sopra):
        <reasoning>L'utente cerca informazioni per lasciare un feedback positivo.</reasoning>
        <intent>Supporto, Feedback, Reclamo</intent>

        Ecco alcuni altri esempi:
        <examples>
        <example 2>
        Input esempio 2:
        <request>Volevo scrivere per ringraziarvi personalmente per la compassione che avete mostrato verso la mia famiglia durante il funerale di mio padre lo scorso fine settimana. Il vostro staff è stato così premuroso e disponibile durante tutto questo processo; ci ha davvero tolto un peso dalle spalle. I libretti del funerale erano bellissimi. Non dimenticheremo mai la gentilezza che ci avete dimostrato e vi siamo molto grati per la fluidità con cui si sono svolte le procedure. Grazie ancora, Amarantha Hill a nome della famiglia Hill.</request>

        Output esempio 2:
        <reasoning>L'utente lascia una recensione positiva della sua esperienza.</reasoning>
        <intent>Supporto, Feedback, Reclamo</intent>
        </example 2>
        <example 3>

        ...

        </example 8>
        <example 9>
        Input esempio 9:
        <request>Il vostro sito web continua a inviare popup pubblicitari che bloccano l'intero schermo. Mi ci sono voluti venti minuti solo per trovare finalmente il numero di telefono per chiamare e lamentarmi. Come posso accedere alle informazioni del mio account con tutti questi popup? Potete accedere al mio account per me, visto che il vostro sito web non funziona? Ho bisogno di sapere quale indirizzo è registrato.</request>

        Output esempio 9:
        <reasoning>L'utente richiede aiuto per accedere alle informazioni del suo account web.</reasoning>
        <intent>Supporto, Feedback, Reclamo</intent>
        </example 9>

        Ricorda di includere sempre il tuo ragionamento di classificazione prima dell'output effettivo dell'intento. Il ragionamento dovrebbe essere racchiuso nei tag <reasoning> e l'intento nei tag <intent>. Restituisci solo il ragionamento e l'intento.
        """

Analizziamo le componenti chiave di questo prompt:

  • Usiamo le f-string di Python per creare il template del prompt, consentendo l’inserimento di ticket_contents nei tag <request>.
  • Diamo a Claude un ruolo chiaramente definito come sistema di classificazione che analizza attentamente il contenuto del ticket per determinare l’intento principale e le esigenze del cliente.
  • Istruiamo Claude sulla formattazione corretta dell’output, in questo caso fornendo il suo ragionamento e la sua analisi all’interno dei tag <reasoning>, seguiti dall’etichetta di classificazione appropriata all’interno dei tag <intent>.
  • Specifichiamo le categorie di intenti validi: “Supporto, Feedback, Reclamo”, “Tracciamento ordine” e “Rimborso/Cambio”.
  • Includiamo alcuni esempi (noto come few-shot prompting) per illustrare come dovrebbe essere formattato l’output, il che migliora l’accuratezza e la coerenza.

Il motivo per cui vogliamo che Claude divida la sua risposta in varie sezioni di tag XML è per poter utilizzare le espressioni regolari per estrarre separatamente il ragionamento e l’intento dall’output. Ciò ci consente di creare passaggi successivi mirati nel flusso di lavoro di instradamento dei ticket, come utilizzare solo l’intento per decidere a quale persona instradare il ticket.

Implementa il tuo prompt

È difficile sapere quanto bene funziona il tuo prompt senza implementarlo in un ambiente di produzione di prova ed eseguire valutazioni.

Costruiamo la struttura di implementazione. Inizia definendo la firma del metodo per avvolgere la nostra chiamata a Claude. Prenderemo il metodo che abbiamo già iniziato a scrivere, che ha ticket_contents come input, e ora restituiremo una tupla di reasoning e intent come output. Se hai un’automazione esistente che utilizza il machine learning tradizionale, vorrai seguire invece quella firma del metodo.

import anthropic
import re

# Crea un'istanza del client API di Anthropic
client = anthropic.Anthropic()

# Imposta il modello predefinito
DEFAULT_MODEL="claude-3-haiku-20240307"

def classify_support_request(ticket_contents):
    # Definisci il prompt per l'attività di classificazione
    classification_prompt = f"""Agirai come un sistema di classificazione dei ticket di supporto clienti.
        ...
        ... Il ragionamento dovrebbe essere racchiuso nei tag <reasoning> e l'intento nei tag <intent>. Restituisci solo il ragionamento e l'intento.
        """
    # Invia il prompt all'API per classificare la richiesta di supporto.
    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

    # Usa la libreria delle espressioni regolari di Python per estrarre `reasoning`.
    reasoning_match = re.search(
        r"<reasoning>(.*?)</reasoning>", reasoning_and_intent, re.DOTALL
    )
    reasoning = reasoning_match.group(1).strip() if reasoning_match else ""

    # Allo stesso modo, estrai anche `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

Questo codice:

  • Importa la libreria Anthropic e crea un’istanza del client utilizzando la tua chiave API.
  • Definisce una funzione classify_support_request che accetta una stringa ticket_contents.
  • Invia ticket_contents a Claude per la classificazione utilizzando classification_prompt
  • Restituisce reasoning e intent del modello estratti dalla risposta.

Poiché dobbiamo attendere che l’intero testo di ragionamento e intento venga generato prima di eseguire il parsing, impostiamo stream=False (il valore predefinito).


Valuta il tuo prompt

Il prompting spesso richiede test e ottimizzazione per essere pronto per la produzione. Per determinare la prontezza della tua soluzione, valuta le prestazioni in base ai criteri di successo e alle soglie stabilite in precedenza.

Per eseguire la valutazione, avrai bisogno di casi di test su cui eseguirla. Il resto di questa guida presuppone che tu abbia già sviluppato i tuoi casi di test.

Costruisci una funzione di valutazione

La nostra valutazione di esempio per questa guida misura le prestazioni di Claude lungo tre metriche chiave:

  • Accuratezza
  • Costo per classificazione

Potresti dover valutare Claude su altri assi a seconda di quali fattori sono importanti per te.

Per valutare ciò, dobbiamo prima modificare lo script che abbiamo scritto e aggiungere una funzione per confrontare l’intento previsto con l’intento effettivo e calcolare la percentuale di previsioni corrette. Dobbiamo anche aggiungere funzionalità di calcolo dei costi e misurazione del tempo.

import anthropic
import re

# Crea un'istanza del client API di Anthropic
client = anthropic.Anthropic()

# Imposta il modello predefinito
DEFAULT_MODEL="claude-3-haiku-20240307"

def classify_support_request(request, actual_intent):
    # Definisci il prompt per l'attività di classificazione
    classification_prompt = f"""Agirai come un sistema di classificazione dei ticket di supporto clienti.
        ...
        ...Il ragionamento dovrebbe essere racchiuso nei tag <reasoning> e l'intento nei tag <intent>. Restituisci solo il ragionamento e l'intento.
        """

    message = client.messages.create(
        model=DEFAULT_MODEL,
        max_tokens=500,
        temperature=0,
        messages=[{"role": "user", "content": classification_prompt}],
    )
    usage = message.usage  # Ottieni le statistiche di utilizzo per la chiamata API su quanti token di input e output sono stati utilizzati.
    reasoning_and_intent = message.content[0].text

    # Usa la libreria delle espressioni regolari di Python per estrarre `reasoning`.
    reasoning_match = re.search(
        r"<reasoning>(.*?)</reasoning>", reasoning_and_intent, re.DOTALL
    )
    reasoning = reasoning_match.group(1).strip() if reasoning_match else ""

    # Allo stesso modo, estrai anche `intent`.
    intent_match = re.search(r"<intent>(.*?)</intent>", reasoning_and_intent, re.DOTALL)
    intent = intent_match.group(1).strip() if intent_match else ""

      # Verifica se la previsione del modello è corretta.
    correct = actual_intent.strip() == intent.strip()

    # Restituisci il ragionamento, l'intento, il flag corretto e l'utilizzo.
    return reasoning, intent, correct, usage

Analizziamo le modifiche che abbiamo apportato:

  • Abbiamo aggiunto actual_intent dai nostri casi di test nel metodo classify_support_request e impostato un confronto per valutare se la classificazione dell’intento di Claude corrisponde alla nostra classificazione dell’intento golden.
  • Abbiamo estratto le statistiche di utilizzo per la chiamata API per calcolare il costo in base ai token di input e output utilizzati

Esegui la tua valutazione

Una valutazione appropriata richiede soglie e benchmark chiari per determinare cosa sia un buon risultato. Lo script di cui sopra ci fornirà i valori di runtime per accuratezza, tempo di risposta e costo per classificazione, ma avremmo comunque bisogno di soglie chiaramente stabilite. Ad esempio:

  • Accuratezza: 95% (su 100 test)
  • Costo per classificazione: riduzione del 50% in media (su 100 test) rispetto al metodo di instradamento attuale

Avere queste soglie ti consente di dire rapidamente e facilmente su larga scala, e con empirismo imparziale, quale metodo è migliore per te e quali cambiamenti potrebbero essere necessari per adattarsi meglio ai tuoi requisiti.


Migliora le prestazioni

In scenari complessi, può essere utile considerare strategie aggiuntive per migliorare le prestazioni oltre alle tecniche standard di prompt engineering e alle strategie di implementazione dei guardrail. Ecco alcuni scenari comuni:

Usa una gerarchia tassonomica per i casi con più di 20 categorie di intenti

Man mano che il numero di classi aumenta, anche il numero di esempi richiesti si espande, rendendo potenzialmente il prompt ingombrante. In alternativa, puoi considerare l’implementazione di un sistema di classificazione gerarchico utilizzando una combinazione di classificatori.

  1. Organizza i tuoi intenti in una struttura ad albero tassonomico.
  2. Crea una serie di classificatori a ogni livello dell’albero, consentendo un approccio di instradamento a cascata.

Ad esempio, potresti avere un classificatore di primo livello che categorizza ampiamente i ticket in “Problemi tecnici”, “Domande di fatturazione” e “Richieste generali”. Ognuna di queste categorie può quindi avere il proprio sotto-classificatore per affinare ulteriormente la classificazione.

  • Pro - maggiore sfumatura e accuratezza: Puoi creare prompt diversi per ogni percorso padre, consentendo una classificazione più mirata e specifica del contesto. Ciò può portare a una maggiore accuratezza e a una gestione più sfumata delle richieste dei clienti.

  • Contro - maggiore latenza: Tieni presente che più classificatori possono portare a una maggiore latenza e consigliamo di implementare questo approccio con il nostro modello più veloce, Haiku.

Usa database vettoriali e recupero di ricerca per similarità per gestire ticket altamente variabili

Nonostante fornire esempi sia il modo più efficace per migliorare le prestazioni, se le richieste di supporto sono altamente variabili, può essere difficile includere abbastanza esempi in un singolo prompt.

In questo scenario, potresti impiegare un database vettoriale per eseguire ricerche di similarità da un set di dati di esempi e recuperare gli esempi più rilevanti per una data query.

Questo approccio, delineato in dettaglio nella nostra ricetta di classificazione, ha dimostrato di migliorare le prestazioni dall’accuratezza del 71% al 93%.

Tieni conto specificamente dei casi limite previsti

Ecco alcuni scenari in cui Claude potrebbe classificare erroneamente i ticket (potrebbero essercene altri unici per la tua situazione). In questi scenari, considera di fornire istruzioni esplicite o esempi nel prompt su come Claude dovrebbe gestire il caso limite:


Integra Claude nel tuo flusso di lavoro di supporto più ampio

Una corretta integrazione richiede che tu prenda alcune decisioni riguardo a come il tuo script di instradamento dei ticket basato su Claude si inserisce nell’architettura del tuo sistema di instradamento dei ticket più ampio. Ci sono due modi in cui potresti farlo:

  • Basato su push: Il sistema di ticket di supporto che stai utilizzando (ad es. Zendesk) attiva il tuo codice inviando un evento webhook al tuo servizio di instradamento, che poi classifica l’intento e lo instrada.
    • Questo approccio è più scalabile sul web, ma richiede di esporre un endpoint pubblico.
  • Basato su pull: Il tuo codice recupera gli ultimi ticket in base a una pianificazione data e li instrada al momento del pull.
    • Questo approccio è più facile da implementare ma potrebbe effettuare chiamate non necessarie al sistema di ticket di supporto quando la frequenza di pull è troppo alta o potrebbe essere troppo lento quando la frequenza di pull è troppo bassa.

Per entrambi questi approcci, dovrai avvolgere il tuo script in un servizio. La scelta dell’approccio dipende dalle API fornite dal tuo sistema di ticketing di supporto.